> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SNS

> SNS APIs with Cloud Adapter.

This page describes how SNS maps to services in the environment where the application runs, including backend choices, supported operations and service-specific behavior.

## Supported environments

* Akamai
* Azure
* DigitalOcean
* Google Cloud
* OCI
* Private Kubernetes
* Scaleway

Check the operation and capability tables for the behavior your application depends on. A supported environment does not imply that every operation of the origin service is available.

## How the backends compare

Each row compares a capability of SNS with its adaptation on each backend.
A dash means this profile does not state the capability for that backend.

### Cloud Adapter

| Capability | SNS | Akamai, Azure, DigitalOcean, OCI, Private Kubernetes, and Scaleway | Google Cloud · Google Cloud Pub/Sub | Google Cloud · Google Cloud SQL for PostgreSQL |
| - | - | - | - | - |
| Delivery guarantee | at least once | at least once | at least once | at least once |
| Topic fan-out · one publication to independent subscriptions | native | one delivery record per selected subscription | the message is saved, then sent to Pub/Sub, which fans out to your subscriptions | one delivery record per selected subscription |
| Delivery protocols · subscription endpoints | SQS / HTTP-S / email / SMS / Lambda / Firehose / application | SQS; other protocols are refused by the served door | SQS; other protocols are refused by the served door | SQS; other protocols are refused by the served door |
| Subscription filtering | message attributes or JSON message body | attribute and JSON-body matching with a restricted set of operators | attribute and JSON-body matching with a restricted set of operators | attribute and JSON-body matching with a restricted set of operators |
| Raw message delivery | SQS and HTTP-S | SQS only | SQS only | SQS only |
| Message durability | AWS-managed | PostgreSQL payload storage followed by a durable publication record | saved in PostgreSQL until Pub/Sub accepts it, then kept under Pub/Sub retention | Cloud SQL payload commit followed by a durable SNS publication record |
| Delivery retry | SNS-owned | SNS retries delivery to SQS; SQS is responsible for a message once it has stored it | SNS retries sending to Pub/Sub and delivery to SQS; Pub/Sub redelivers to its own consumers | SNS retries delivery to SQS; SQS is responsible for a message once it has stored it |
| API coverage | full | partial | partial | partial |

## On Akamai, Azure, DigitalOcean, OCI, Private Kubernetes, and Scaleway

### PostgreSQL

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| At-least-once delivery | Delivery | Supported | - | subscriber outcomes are independent and an uncertain acknowledgement can produce a duplicate |
| Raw message delivery | Delivery | Partial | - | SQS only, subject to the origin's raw-delivery attribute cap; HTTP/S raw delivery is refused |
| Subscriber protocols | Delivery | Partial | - | receiver-authorized SQS delivery is served; HTTP, HTTPS, Lambda, email, SMS, Firehose, mobile push and application are refused |
| Subscription redrive | Delivery | Out of scope | - | RedrivePolicy is refused; bounded retries end in diagnostic state |
| FIFO and ordering | Ordering | Out of scope | - | FIFO topics, deduplication and MessageGroupId are refused |
| Subscription filter policies | Routing | Partial | - | message-attribute and JSON-body scopes use a bounded AWS-compatible grammar subset |
| HTTP/S signature compatibility | Security | Out of scope | - | HTTP and HTTPS subscriptions are refused by the served door |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| AddPermission | Control plane | Out of scope | Full surface | caller and destination grants remain in the environment's existing identity system |
| RemovePermission | Control plane | Out of scope | Full surface | caller and destination grants remain in the environment's existing identity system |
| SetTopicAttributes | Control plane | Partial | Full surface | sets the topic's access Policy, validated as AWS validates it and echoed verbatim, and judged for the owner's own publishes; a statement naming ANOTHER ACCOUNT, or Principal "\*", is validated, stored and echoed but ADMITS NOBODY, because this fabric refuses cross-account bindings and has no unauthenticated door; delivery policy, encryption and delivery-logging changes are refused |
| GetTopicAttributes | Discovery | Partial | Most usage | returns represented attributes and the topic's access Policy, which is AWS's default document for the topic until one is set; delivery-policy values are not fabricated |
| ListSubscriptions | Discovery | Supported | Most usage | tenant-authorized snapshot pages contain no confirmation secrets or receiver handles |
| ListSubscriptionsByTopic | Discovery | Supported | Most usage | tenant-authorized snapshot pages for one topic |
| ListTopics | Discovery | Supported | Common | tenant-authorized snapshot pages contain at most 100 topics |
| Publish | Publish | Partial | Common | stores message bytes in PostgreSQL, then records the publication and selected deliveries in a separate durable write before returning MessageId |
| PublishBatch | Publish | Partial | Most usage | at most ten independently admitted entries within the 256-KiB aggregate budget |
| ConfirmSubscription | Subscriptions | Out of scope | Common | HTTP and HTTPS subscriptions are not served |
| GetSubscriptionAttributes | Subscriptions | Partial | Most usage | returns supported filter, scope and SQS raw-delivery attributes |
| SetSubscriptionAttributes | Subscriptions | Partial | Most usage | supports FilterPolicy, FilterPolicyScope and SQS RawMessageDelivery; redrive is refused |
| Subscribe | Subscriptions | Partial | Common | receiver-authorized SQS queues in the same tenant and region; HTTP, HTTPS and Lambda are refused |
| Unsubscribe | Subscriptions | Supported | Common | authenticated, generation-aware removal blocks new attempts and retires the binding |
| ListTagsForResource | Tags | Supported | Most usage | returns customer tags without internal ownership metadata |
| TagResource | Tags | Supported | Most usage | customer tags cannot alter internal ownership |
| UntagResource | Tags | Supported | Most usage | - |
| CreateTopic | Topics | Partial | Common | creates an idempotent standard topic with its own access Policy; the delivery-logging sample rates are accepted only at their AWS default and every other attribute is refused |
| DeleteTopic | Topics | Partial | Common | generation-aware deletion cannot remove a replacement topic |

#### How it works

Your application keeps its SNS client and points it at an adapter in the target cluster. The message body is stored in PostgreSQL. A separate set of SNS records holds your topics, subscriptions, filter policies, queue permissions and the result of each delivery.

Publish makes two writes. It first saves the message body without sending it, then records the publication and one delivery for each subscription that should receive it. Publish returns a `MessageId` only after both writes succeed. If the process stops between the two writes, the saved body is never sent to anyone. Deliveries that were recorded are picked up again after the delivery workers restart.

![Publish saves the message in PostgreSQL and records one delivery per matching subscription. Before each send, the queue's permission is checked, then the SQS queue receives the message.](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaXNoIHNhdmVzIHRoZSBtZXNzYWdlIGluIFBvc3RncmVTUUwgYW5kIHJlY29yZHMgb25lIGRlbGl2ZXJ5IHBlciBtYXRjaGluZyBzdWJzY3JpcHRpb24uIEJlZm9yZSBlYWNoIHNlbmQsIHRoZSBxdWV1ZSdzIHBlcm1pc3Npb24gaXMgY2hlY2tlZCwgdGhlbiB0aGUgU1FTIHF1ZXVlIHJlY2VpdmVzIHRoZSBtZXNzYWdlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPjxkZWZzPjxtYXJrZXIgaWQ9InBnLXB1Ymxpc2giIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgc3R5bGU9ImZpbGw6Izk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz48dGV4dCB4PSIyNCIgeT0iMjgiIHN0eWxlPSJmb250OjcwMCAxMHB4IEludGVyLHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MS4ycHg7ZmlsbDojNjQ3NDhiIj5UQVJHRVQgQ0xVU1RFUiDCtyBGUk9NIFBVQkxJU0ggVE8gREVMSVZFUlk8L3RleHQ+PHJlY3QgeD0iMjQiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNjYmQ1ZTE7c3Ryb2tlLXdpZHRoOjEuNSIvPjxzdmcgeD0iMTAwIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj48Zz4gPHBhdGggZD0iTTg2LjQsNjYuNGMwLDMuNywwLjQsNi43LDEuMSw4LjljMC44LDIuMiwxLjgsNC42LDMuMiw3LjJjMC41LDAuOCwwLjcsMS42LDAuNywyLjNjMCwxLTAuNiwyLTEuOSwzbC02LjMsNC4yIGMtMC45LDAuNi0xLjgsMC45LTIuNiwwLjljLTEsMC0yLTAuNS0zLTEuNEM3Ni4yLDkwLDc1LDg4LjQsNzQsODYuOGMtMS0xLjctMi0zLjYtMy4xLTUuOWMtNy44LDkuMi0xNy42LDEzLjgtMjkuNCwxMy44IGMtOC40LDAtMTUuMS0yLjQtMjAtNy4yYy00LjktNC44LTcuNC0xMS4yLTcuNC0xOS4yYzAtOC41LDMtMTUuNCw5LjEtMjAuNmM2LjEtNS4yLDE0LjItNy44LDI0LjUtNy44YzMuNCwwLDYuOSwwLjMsMTAuNiwwLjggYzMuNywwLjUsNy41LDEuMywxMS41LDIuMnYtNy4zYzAtNy42LTEuNi0xMi45LTQuNy0xNmMtMy4yLTMuMS04LjYtNC42LTE2LjMtNC42Yy0zLjUsMC03LjEsMC40LTEwLjgsMS4zYy0zLjcsMC45LTcuMywyLTEwLjgsMy40IGMtMS42LDAuNy0yLjgsMS4xLTMuNSwxLjNjLTAuNywwLjItMS4yLDAuMy0xLjYsMC4zYy0xLjQsMC0yLjEtMS0yLjEtMy4xdi00LjljMC0xLjYsMC4yLTIuOCwwLjctMy41YzAuNS0wLjcsMS40LTEuNCwyLjgtMi4xIGMzLjUtMS44LDcuNy0zLjMsMTIuNi00LjVjNC45LTEuMywxMC4xLTEuOSwxNS42LTEuOWMxMS45LDAsMjAuNiwyLjcsMjYuMiw4LjFjNS41LDUuNCw4LjMsMTMuNiw4LjMsMjQuNlY2Ni40eiBNNDUuOCw4MS42IGMzLjMsMCw2LjctMC42LDEwLjMtMS44YzMuNi0xLjIsNi44LTMuNCw5LjUtNi40YzEuNi0xLjksMi44LTQsMy40LTYuNGMwLjYtMi40LDEtNS4zLDEtOC43di00LjJjLTIuOS0wLjctNi0xLjMtOS4yLTEuNyBjLTMuMi0wLjQtNi4zLTAuNi05LjQtMC42Yy02LjcsMC0xMS42LDEuMy0xNC45LDRjLTMuMywyLjctNC45LDYuNS00LjksMTEuNWMwLDQuNywxLjIsOC4yLDMuNywxMC42IEMzNy43LDgwLjQsNDEuMiw4MS42LDQ1LjgsODEuNnogTTEyNi4xLDkyLjRjLTEuOCwwLTMtMC4zLTMuOC0xYy0wLjgtMC42LTEuNS0yLTIuMS0zLjlMOTYuNywxMC4yYy0wLjYtMi0wLjktMy4zLTAuOS00IGMwLTEuNiwwLjgtMi41LDIuNC0yLjVoOS44YzEuOSwwLDMuMiwwLjMsMy45LDFjMC44LDAuNiwxLjQsMiwyLDMuOWwxNi44LDY2LjJsMTUuNi02Ni4yYzAuNS0yLDEuMS0zLjMsMS45LTMuOWMwLjgtMC42LDIuMi0xLDQtMSBoOGMxLjksMCwzLjIsMC4zLDQsMWMwLjgsMC42LDEuNSwyLDEuOSwzLjlsMTUuOCw2N2wxNy4zLTY3YzAuNi0yLDEuMy0zLjMsMi0zLjljMC44LTAuNiwyLjEtMSwzLjktMWg5LjNjMS42LDAsMi41LDAuOCwyLjUsMi41IGMwLDAuNS0wLjEsMS0wLjIsMS42Yy0wLjEsMC42LTAuMywxLjQtMC43LDIuNWwtMjQuMSw3Ny4zYy0wLjYsMi0xLjMsMy4zLTIuMSwzLjljLTAuOCwwLjYtMi4xLDEtMy44LDFoLTguNmMtMS45LDAtMy4yLTAuMy00LTEgYy0wLjgtMC43LTEuNS0yLTEuOS00TDE1NiwyM2wtMTUuNCw2NC40Yy0wLjUsMi0xLjEsMy4zLTEuOSw0Yy0wLjgsMC43LTIuMiwxLTQsMUgxMjYuMXogTTI1NC42LDk1LjFjLTUuMiwwLTEwLjQtMC42LTE1LjQtMS44IGMtNS0xLjItOC45LTIuNS0xMS41LTRjLTEuNi0wLjktMi43LTEuOS0zLjEtMi44Yy0wLjQtMC45LTAuNi0xLjktMC42LTIuOHYtNS4xYzAtMi4xLDAuOC0zLjEsMi4zLTMuMWMwLjYsMCwxLjIsMC4xLDEuOCwwLjMgYzAuNiwwLjIsMS41LDAuNiwyLjUsMWMzLjQsMS41LDcuMSwyLjcsMTEsMy41YzQsMC44LDcuOSwxLjIsMTEuOSwxLjJjNi4zLDAsMTEuMi0xLjEsMTQuNi0zLjNjMy40LTIuMiw1LjItNS40LDUuMi05LjUgYzAtMi44LTAuOS01LjEtMi43LTdjLTEuOC0xLjktNS4yLTMuNi0xMC4xLTUuMkwyNDYsNTJjLTcuMy0yLjMtMTIuNy01LjctMTYtMTAuMmMtMy4zLTQuNC01LTkuMy01LTE0LjVjMC00LjIsMC45LTcuOSwyLjctMTEuMSBjMS44LTMuMiw0LjItNiw3LjItOC4yYzMtMi4zLDYuNC00LDEwLjQtNS4yYzQtMS4yLDguMi0xLjcsMTIuNi0xLjdjMi4yLDAsNC41LDAuMSw2LjcsMC40YzIuMywwLjMsNC40LDAuNyw2LjUsMS4xIGMyLDAuNSwzLjksMSw1LjcsMS42YzEuOCwwLjYsMy4yLDEuMiw0LjIsMS44YzEuNCwwLjgsMi40LDEuNiwzLDIuNWMwLjYsMC44LDAuOSwxLjksMC45LDMuM3Y0LjdjMCwyLjEtMC44LDMuMi0yLjMsMy4yIGMtMC44LDAtMi4xLTAuNC0zLjgtMS4yYy01LjctMi42LTEyLjEtMy45LTE5LjItMy45Yy01LjcsMC0xMC4yLDAuOS0xMy4zLDIuOGMtMy4xLDEuOS00LjcsNC44LTQuNyw4LjljMCwyLjgsMSw1LjIsMyw3LjEgYzIsMS45LDUuNywzLjgsMTEsNS41bDE0LjIsNC41YzcuMiwyLjMsMTIuNCw1LjUsMTUuNSw5LjZjMy4xLDQuMSw0LjYsOC44LDQuNiwxNGMwLDQuMy0wLjksOC4yLTIuNiwxMS42IGMtMS44LDMuNC00LjIsNi40LTcuMyw4LjhjLTMuMSwyLjUtNi44LDQuMy0xMS4xLDUuNkMyNjQuNCw5NC40LDI1OS43LDk1LjEsMjU0LjYsOTUuMXoiIHN0eWxlPSJmaWxsOiMyNTJGM0UiLz4gPGc+IDxwYXRoIGQ9Ik0yNzMuNSwxNDMuN2MtMzIuOSwyNC4zLTgwLjcsMzcuMi0xMjEuOCwzNy4yYy01Ny42LDAtMTA5LjUtMjEuMy0xNDguNy01Ni43Yy0zLjEtMi44LTAuMy02LjYsMy40LTQuNCBjNDIuNCwyNC42LDk0LjcsMzkuNSwxNDguOCwzOS41YzM2LjUsMCw3Ni42LTcuNiwxMTMuNS0yMy4yQzI3NC4yLDEzMy42LDI3OC45LDEzOS43LDI3My41LDE0My43eiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8cGF0aCBkPSJNMjg3LjIsMTI4LjFjLTQuMi01LjQtMjcuOC0yLjYtMzguNS0xLjNjLTMuMiwwLjQtMy43LTIuNC0wLjgtNC41YzE4LjgtMTMuMiw0OS43LTkuNCw1My4zLTUgYzMuNiw0LjUtMSwzNS40LTE4LjYsNTAuMmMtMi43LDIuMy01LjMsMS4xLTQuMS0xLjlDMjgyLjUsMTU1LjcsMjkxLjQsMTMzLjQsMjg3LjIsMTI4LjF6IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkY5OTAwIi8+IDwvZz4gPC9nPjwvc3ZnPjxzdmcgeD0iMTAwIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojRkZGRkZGIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48dGV4dCB4PSIxMTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiMwZjE3MmEiPlNOUyBQdWJsaXNoPC90ZXh0Pjx0ZXh0IHg9IjExMiIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojNjQ3NDhiIj5TYXZlcyB0aGUgbWVzc2FnZTwvdGV4dD48bGluZSB4MT0iMjAwIiB5MT0iMTA4IiB4Mj0iMjI4IiB5Mj0iMTA4IiBtYXJrZXItZW5kPSJ1cmwoI3BnLXB1Ymxpc2gpIiBzdHlsZT0ic3Ryb2tlOiM5NGEzYjg7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iMjI4IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojY2JkNWUxO3N0cm9rZS13aWR0aDoxLjUiLz48dGV4dCB4PSIzMTYiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiMwZjE3MmEiPkRlbGl2ZXJ5IHJlY29yZHM8L3RleHQ+PHRleHQgeD0iMzE2IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM2NDc0OGIiPk9uZSBwZXIgc3Vic2NyaXB0aW9uPC90ZXh0PjxsaW5lIHgxPSI0MDQiIHkxPSIxMDgiIHgyPSI0MzIiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcGctcHVibGlzaCkiIHN0eWxlPSJzdHJva2U6Izk0YTNiODtzdHJva2Utd2lkdGg6MjtmaWxsOm5vbmUiLz48cmVjdCB4PSI0MzIiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNjYmQ1ZTE7c3Ryb2tlLXdpZHRoOjEuNSIvPjx0ZXh0IHg9IjUyMCIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDo2NTAgMTNweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6IzBmMTcyYSI+UGVybWlzc2lvbiBjaGVjazwvdGV4dD48dGV4dCB4PSI1MjAiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6IzY0NzQ4YiI+UXVldWUgc3RpbGwgYWxsb3dzIHRvcGljPC90ZXh0PjxsaW5lIHgxPSI2MDgiIHkxPSIxMDgiIHgyPSI2MzYiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcGctcHVibGlzaCkiIHN0eWxlPSJzdHJva2U6Izk0YTNiODtzdHJva2Utd2lkdGg6MjtmaWxsOm5vbmUiLz48cmVjdCB4PSI2MzYiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNjYmQ1ZTE7c3Ryb2tlLXdpZHRoOjEuNSIvPjxzdmcgeD0iNzEyIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj48Zz4gPHBhdGggZD0iTTg2LjQsNjYuNGMwLDMuNywwLjQsNi43LDEuMSw4LjljMC44LDIuMiwxLjgsNC42LDMuMiw3LjJjMC41LDAuOCwwLjcsMS42LDAuNywyLjNjMCwxLTAuNiwyLTEuOSwzbC02LjMsNC4yIGMtMC45LDAuNi0xLjgsMC45LTIuNiwwLjljLTEsMC0yLTAuNS0zLTEuNEM3Ni4yLDkwLDc1LDg4LjQsNzQsODYuOGMtMS0xLjctMi0zLjYtMy4xLTUuOWMtNy44LDkuMi0xNy42LDEzLjgtMjkuNCwxMy44IGMtOC40LDAtMTUuMS0yLjQtMjAtNy4yYy00LjktNC44LTcuNC0xMS4yLTcuNC0xOS4yYzAtOC41LDMtMTUuNCw5LjEtMjAuNmM2LjEtNS4yLDE0LjItNy44LDI0LjUtNy44YzMuNCwwLDYuOSwwLjMsMTAuNiwwLjggYzMuNywwLjUsNy41LDEuMywxMS41LDIuMnYtNy4zYzAtNy42LTEuNi0xMi45LTQuNy0xNmMtMy4yLTMuMS04LjYtNC42LTE2LjMtNC42Yy0zLjUsMC03LjEsMC40LTEwLjgsMS4zYy0zLjcsMC45LTcuMywyLTEwLjgsMy40IGMtMS42LDAuNy0yLjgsMS4xLTMuNSwxLjNjLTAuNywwLjItMS4yLDAuMy0xLjYsMC4zYy0xLjQsMC0yLjEtMS0yLjEtMy4xdi00LjljMC0xLjYsMC4yLTIuOCwwLjctMy41YzAuNS0wLjcsMS40LTEuNCwyLjgtMi4xIGMzLjUtMS44LDcuNy0zLjMsMTIuNi00LjVjNC45LTEuMywxMC4xLTEuOSwxNS42LTEuOWMxMS45LDAsMjAuNiwyLjcsMjYuMiw4LjFjNS41LDUuNCw4LjMsMTMuNiw4LjMsMjQuNlY2Ni40eiBNNDUuOCw4MS42IGMzLjMsMCw2LjctMC42LDEwLjMtMS44YzMuNi0xLjIsNi44LTMuNCw5LjUtNi40YzEuNi0xLjksMi44LTQsMy40LTYuNGMwLjYtMi40LDEtNS4zLDEtOC43di00LjJjLTIuOS0wLjctNi0xLjMtOS4yLTEuNyBjLTMuMi0wLjQtNi4zLTAuNi05LjQtMC42Yy02LjcsMC0xMS42LDEuMy0xNC45LDRjLTMuMywyLjctNC45LDYuNS00LjksMTEuNWMwLDQuNywxLjIsOC4yLDMuNywxMC42IEMzNy43LDgwLjQsNDEuMiw4MS42LDQ1LjgsODEuNnogTTEyNi4xLDkyLjRjLTEuOCwwLTMtMC4zLTMuOC0xYy0wLjgtMC42LTEuNS0yLTIuMS0zLjlMOTYuNywxMC4yYy0wLjYtMi0wLjktMy4zLTAuOS00IGMwLTEuNiwwLjgtMi41LDIuNC0yLjVoOS44YzEuOSwwLDMuMiwwLjMsMy45LDFjMC44LDAuNiwxLjQsMiwyLDMuOWwxNi44LDY2LjJsMTUuNi02Ni4yYzAuNS0yLDEuMS0zLjMsMS45LTMuOWMwLjgtMC42LDIuMi0xLDQtMSBoOGMxLjksMCwzLjIsMC4zLDQsMWMwLjgsMC42LDEuNSwyLDEuOSwzLjlsMTUuOCw2N2wxNy4zLTY3YzAuNi0yLDEuMy0zLjMsMi0zLjljMC44LTAuNiwyLjEtMSwzLjktMWg5LjNjMS42LDAsMi41LDAuOCwyLjUsMi41IGMwLDAuNS0wLjEsMS0wLjIsMS42Yy0wLjEsMC42LTAuMywxLjQtMC43LDIuNWwtMjQuMSw3Ny4zYy0wLjYsMi0xLjMsMy4zLTIuMSwzLjljLTAuOCwwLjYtMi4xLDEtMy44LDFoLTguNmMtMS45LDAtMy4yLTAuMy00LTEgYy0wLjgtMC43LTEuNS0yLTEuOS00TDE1NiwyM2wtMTUuNCw2NC40Yy0wLjUsMi0xLjEsMy4zLTEuOSw0Yy0wLjgsMC43LTIuMiwxLTQsMUgxMjYuMXogTTI1NC42LDk1LjFjLTUuMiwwLTEwLjQtMC42LTE1LjQtMS44IGMtNS0xLjItOC45LTIuNS0xMS41LTRjLTEuNi0wLjktMi43LTEuOS0zLjEtMi44Yy0wLjQtMC45LTAuNi0xLjktMC42LTIuOHYtNS4xYzAtMi4xLDAuOC0zLjEsMi4zLTMuMWMwLjYsMCwxLjIsMC4xLDEuOCwwLjMgYzAuNiwwLjIsMS41LDAuNiwyLjUsMWMzLjQsMS41LDcuMSwyLjcsMTEsMy41YzQsMC44LDcuOSwxLjIsMTEuOSwxLjJjNi4zLDAsMTEuMi0xLjEsMTQuNi0zLjNjMy40LTIuMiw1LjItNS40LDUuMi05LjUgYzAtMi44LTAuOS01LjEtMi43LTdjLTEuOC0xLjktNS4yLTMuNi0xMC4xLTUuMkwyNDYsNTJjLTcuMy0yLjMtMTIuNy01LjctMTYtMTAuMmMtMy4zLTQuNC01LTkuMy01LTE0LjVjMC00LjIsMC45LTcuOSwyLjctMTEuMSBjMS44LTMuMiw0LjItNiw3LjItOC4yYzMtMi4zLDYuNC00LDEwLjQtNS4yYzQtMS4yLDguMi0xLjcsMTIuNi0xLjdjMi4yLDAsNC41LDAuMSw2LjcsMC40YzIuMywwLjMsNC40LDAuNyw2LjUsMS4xIGMyLDAuNSwzLjksMSw1LjcsMS42YzEuOCwwLjYsMy4yLDEuMiw0LjIsMS44YzEuNCwwLjgsMi40LDEuNiwzLDIuNWMwLjYsMC44LDAuOSwxLjksMC45LDMuM3Y0LjdjMCwyLjEtMC44LDMuMi0yLjMsMy4yIGMtMC44LDAtMi4xLTAuNC0zLjgtMS4yYy01LjctMi42LTEyLjEtMy45LTE5LjItMy45Yy01LjcsMC0xMC4yLDAuOS0xMy4zLDIuOGMtMy4xLDEuOS00LjcsNC44LTQuNyw4LjljMCwyLjgsMSw1LjIsMyw3LjEgYzIsMS45LDUuNywzLjgsMTEsNS41bDE0LjIsNC41YzcuMiwyLjMsMTIuNCw1LjUsMTUuNSw5LjZjMy4xLDQuMSw0LjYsOC44LDQuNiwxNGMwLDQuMy0wLjksOC4yLTIuNiwxMS42IGMtMS44LDMuNC00LjIsNi40LTcuMyw4LjhjLTMuMSwyLjUtNi44LDQuMy0xMS4xLDUuNkMyNjQuNCw5NC40LDI1OS43LDk1LjEsMjU0LjYsOTUuMXoiIHN0eWxlPSJmaWxsOiMyNTJGM0UiLz4gPGc+IDxwYXRoIGQ9Ik0yNzMuNSwxNDMuN2MtMzIuOSwyNC4zLTgwLjcsMzcuMi0xMjEuOCwzNy4yYy01Ny42LDAtMTA5LjUtMjEuMy0xNDguNy01Ni43Yy0zLjEtMi44LTAuMy02LjYsMy40LTQuNCBjNDIuNCwyNC42LDk0LjcsMzkuNSwxNDguOCwzOS41YzM2LjUsMCw3Ni42LTcuNiwxMTMuNS0yMy4yQzI3NC4yLDEzMy42LDI3OC45LDEzOS43LDI3My41LDE0My43eiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8cGF0aCBkPSJNMjg3LjIsMTI4LjFjLTQuMi01LjQtMjcuOC0yLjYtMzguNS0xLjNjLTMuMiwwLjQtMy43LTIuNC0wLjgtNC41YzE4LjgtMTMuMiw0OS43LTkuNCw1My4zLTUgYzMuNiw0LjUtMSwzNS40LTE4LjYsNTAuMmMtMi43LDIuMy01LjMsMS4xLTQuMS0xLjlDMjgyLjUsMTU1LjcsMjkxLjQsMTMzLjQsMjg3LjIsMTI4LjF6IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkY5OTAwIi8+IDwvZz4gPC9nPjwvc3ZnPjxzdmcgeD0iNzEyIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojRkZGRkZGIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48dGV4dCB4PSI3MjQiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiMwZjE3MmEiPlNRUyBxdWV1ZTwvdGV4dD48dGV4dCB4PSI3MjQiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6IzY0NzQ4YiI+UmVjZWl2ZXMgdGhlIG1lc3NhZ2U8L3RleHQ+PC9zdmc+)

![Publish saves the message in PostgreSQL and records one delivery per matching subscription. Before each send, the queue's permission is checked, then the SQS queue receives the message.](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaXNoIHNhdmVzIHRoZSBtZXNzYWdlIGluIFBvc3RncmVTUUwgYW5kIHJlY29yZHMgb25lIGRlbGl2ZXJ5IHBlciBtYXRjaGluZyBzdWJzY3JpcHRpb24uIEJlZm9yZSBlYWNoIHNlbmQsIHRoZSBxdWV1ZSdzIHBlcm1pc3Npb24gaXMgY2hlY2tlZCwgdGhlbiB0aGUgU1FTIHF1ZXVlIHJlY2VpdmVzIHRoZSBtZXNzYWdlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPjxkZWZzPjxtYXJrZXIgaWQ9InBnLXB1Ymxpc2giIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgc3R5bGU9ImZpbGw6IzY0NzQ4YiIvPjwvbWFya2VyPjwvZGVmcz48dGV4dCB4PSIyNCIgeT0iMjgiIHN0eWxlPSJmb250OjcwMCAxMHB4IEludGVyLHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MS4ycHg7ZmlsbDojOTRhM2I4Ij5UQVJHRVQgQ0xVU1RFUiDCtyBGUk9NIFBVQkxJU0ggVE8gREVMSVZFUlk8L3RleHQ+PHJlY3QgeD0iMjQiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiMxZTI5M2I7c3Ryb2tlOiM0NzU1Njk7c3Ryb2tlLXdpZHRoOjEuNSIvPjxzdmcgeD0iMTAwIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojMjUyRjNFIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48c3ZnIHg9IjEwMCIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDMwNCAxODIiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojRkZGRkZGIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48dGV4dCB4PSIxMTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNmMWY1ZjkiPlNOUyBQdWJsaXNoPC90ZXh0Pjx0ZXh0IHg9IjExMiIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojOTRhM2I4Ij5TYXZlcyB0aGUgbWVzc2FnZTwvdGV4dD48bGluZSB4MT0iMjAwIiB5MT0iMTA4IiB4Mj0iMjI4IiB5Mj0iMTA4IiBtYXJrZXItZW5kPSJ1cmwoI3BnLXB1Ymxpc2gpIiBzdHlsZT0ic3Ryb2tlOiM2NDc0OGI7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iMjI4IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojMWUyOTNiO3N0cm9rZTojNDc1NTY5O3N0cm9rZS13aWR0aDoxLjUiLz48dGV4dCB4PSIzMTYiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNmMWY1ZjkiPkRlbGl2ZXJ5IHJlY29yZHM8L3RleHQ+PHRleHQgeD0iMzE2IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM5NGEzYjgiPk9uZSBwZXIgc3Vic2NyaXB0aW9uPC90ZXh0PjxsaW5lIHgxPSI0MDQiIHkxPSIxMDgiIHgyPSI0MzIiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcGctcHVibGlzaCkiIHN0eWxlPSJzdHJva2U6IzY0NzQ4YjtzdHJva2Utd2lkdGg6MjtmaWxsOm5vbmUiLz48cmVjdCB4PSI0MzIiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiMxZTI5M2I7c3Ryb2tlOiM0NzU1Njk7c3Ryb2tlLXdpZHRoOjEuNSIvPjx0ZXh0IHg9IjUyMCIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDo2NTAgMTNweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6I2YxZjVmOSI+UGVybWlzc2lvbiBjaGVjazwvdGV4dD48dGV4dCB4PSI1MjAiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6Izk0YTNiOCI+UXVldWUgc3RpbGwgYWxsb3dzIHRvcGljPC90ZXh0PjxsaW5lIHgxPSI2MDgiIHkxPSIxMDgiIHgyPSI2MzYiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcGctcHVibGlzaCkiIHN0eWxlPSJzdHJva2U6IzY0NzQ4YjtzdHJva2Utd2lkdGg6MjtmaWxsOm5vbmUiLz48cmVjdCB4PSI2MzYiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiMxZTI5M2I7c3Ryb2tlOiM0NzU1Njk7c3Ryb2tlLXdpZHRoOjEuNSIvPjxzdmcgeD0iNzEyIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojMjUyRjNFIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48c3ZnIHg9IjcxMiIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDMwNCAxODIiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojRkZGRkZGIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48dGV4dCB4PSI3MjQiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNmMWY1ZjkiPlNRUyBxdWV1ZTwvdGV4dD48dGV4dCB4PSI3MjQiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6Izk0YTNiOCI+UmVjZWl2ZXMgdGhlIG1lc3NhZ2U8L3RleHQ+PC9zdmc+)

Publish returns a MessageId only after the message and its deliveries are both saved.

#### Delivery and duplicates

When a message is published, SNS decides which active subscriptions receive it, applying their filter policies, and records one delivery for each. Just before sending, it checks that the queue still allows the topic to send to it. After a subscription is deleted, no further deliveries are attempted for it, and a subscription created to replace it does not receive the old one's pending messages.

Each SQS delivery succeeds or fails on its own. Once SQS has stored a message, SQS is responsible for it. If a send to SQS ends without a clear answer, the message can be delivered again with the same `MessageId`, so the code that processes it must handle duplicates.

#### Limitations

* **FIFO topics are not supported.** FIFO ordering, deduplication and `MessageGroupId` are rejected. Only standard topics work.
* **Only SQS subscriptions are delivered.** Subscriptions using HTTP, HTTPS, Lambda, email, SMS or any other protocol are rejected.
* **Filter policies support a subset of SNS syntax.** Attribute and message-body filter policies accept a reduced set of operators. Raw message delivery works only for SQS subscriptions.
* **The queue must keep allowing the topic.** The SQS queue's access policy must allow the topic, and must still allow it at the time of each delivery.
* **Topic policies are enforced; redrive is not supported.** The topic access policy is checked and enforced. You can set it inline on the topic or with one `aws_sns_topic_policy` resource, which is applied with the topic. Unsupported policy statements and a subscription `RedrivePolicy` are rejected.

#### Other considerations

**You run the database.** The deployment operator is responsible for PostgreSQL storage, replication, backups and recovery on the target cluster. Size the database for the messages you keep and the number of connections. Back up and restore the message bodies and the SNS records together.

**Before moving publishers.** Check queue permissions and confirm that pending deliveries resume after a restart, then point publishers at the new endpoint. Deliveries still pending on AWS are not copied into PostgreSQL; let them finish or expire on AWS.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### SNS Standard · SNS publish billing units

Feature: SNS Standard.

Estimated monthly service charges by SNS publish billing units. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![SNS Standard · SNS publish billing units: monthly service charges by SNS publish billing units. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/844bc2b1b0970178bce425fdc4dc656504631d709cf01e848e73db86f525a3d4-light.svg)

![SNS Standard · SNS publish billing units: monthly service charges by SNS publish billing units. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/e165cee38e1554085d6bf4454d0af9356a65d5754cc6d7a48c9d10efa8391b0f-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| SNS publish billing units (per second) | SNS (Simple Notification Service) | Target scenario | PostgreSQL | Difference |
| -: | -: | - | -: | -: |
| 0 | 0.00 | PostgreSQL (one copy) | 80.90 | 80.90 |
| 0 | 0.00 | PostgreSQL (two copies) | 161.79 | 161.79 |
| 1 | 1.31 | PostgreSQL (one copy) | 80.90 | 79.58 |
| 1 | 1.31 | PostgreSQL (two copies) | 161.79 | 160.48 |
| 10 | 13.14 | PostgreSQL (one copy) | 80.90 | 67.76 |
| 10 | 13.14 | PostgreSQL (two copies) | 161.79 | 148.65 |
| 100 | 131.40 | PostgreSQL (one copy) | 80.90 | -50.50 |
| 100 | 131.40 | PostgreSQL (two copies) | 161.79 | 30.39 |
| 1,000 | 1,314.00 | PostgreSQL (one copy) | 1,144.34 | -169.66 |
| 1,000 | 1,314.00 | PostgreSQL (two copies) | 2,288.68 | 974.68 |
| 10,000 | 13,140.00 | PostgreSQL (one copy) | Unpriced | Unavailable |
| 10,000 | 13,140.00 | PostgreSQL (two copies) | Unpriced | Unavailable |

Estimated allocation, not benchmark calibrated: sized from 2 vCPU, 8 GiB memory and 100 GiB SSD at 0 per second to 32 vCPU, 128 GiB memory and 100 GiB SSD at 1,000 per second. From 10,000 per second the workload exceeds the planning range and the target is unpriced.

**Curve assumptions**

| Target scenario | Assumption | Value | Unit |
| - | - | -: | - |
| PostgreSQL (one copy) | Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| PostgreSQL (one copy) | Representative publication size | 1,024 | bytes |
| PostgreSQL (one copy) | Selected delivery subscriptions | 3 | subscriptions/publication |
| PostgreSQL (one copy) | Delivery attempts | 1 | attempts/destination |
| PostgreSQL (one copy) | Native broker consumer copies | 1 | copies |
| PostgreSQL (one copy) | Staging residence window | 60 | seconds |
| PostgreSQL (one copy) | Delivery row size | 256 | bytes |
| PostgreSQL (one copy) | Target price guess · read | 0 | USD/read |
| PostgreSQL (one copy) | Target price guess · write | 0 | USD/write |
| PostgreSQL (one copy) | Target price guess · provider operation | 0 | USD/provider operation |
| PostgreSQL (one copy) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| PostgreSQL (one copy) | Target price guess · published GiB | 0 | USD/published GiB |
| PostgreSQL (one copy) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| PostgreSQL (one copy) | Target list price · network GiB | 0.12 | USD/network GiB |
| PostgreSQL (one copy) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| PostgreSQL (one copy) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| PostgreSQL (one copy) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| PostgreSQL (one copy) | Target price guess · resource-hour | 0 | USD/resource-hour |
| PostgreSQL (one copy) | Target price guess · resource-month | 0 | USD/resource-month |
| PostgreSQL (one copy) | Target price guess · input token | 0 | USD/input token |
| PostgreSQL (one copy) | Target price guess · output token | 0 | USD/output token |
| PostgreSQL (one copy) | Target monthly base charge | 0 | USD/month |
| PostgreSQL (one copy) | Approximate target service minimum | 0 | USD/month |
| PostgreSQL (one copy) | Minimum primary CPU | 2 | vCPU |
| PostgreSQL (one copy) | Minimum primary RAM | 8 | GiB |
| PostgreSQL (one copy) | Minimum primary disk | 100 | GiB |
| PostgreSQL (one copy) | Additional full-price standby copy | 0 | 0 or 1 |
| PostgreSQL (one copy) | Allocated share of provisioned cost | 1 | fraction |
| PostgreSQL (one copy) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| PostgreSQL (one copy) | Planning peak / mean work | 2 | multiplier |
| PostgreSQL (one copy) | Planning primary CPU utilization | 0.7 | fraction |
| PostgreSQL (one copy) | Resident state reserved in RAM | 0.1 | fraction |
| PostgreSQL (one copy) | Planning disk utilization | 0.8 | fraction |
| PostgreSQL (one copy) | Maintenance and log disk reserve | 20 | GiB |
| PostgreSQL (one copy) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| PostgreSQL (one copy) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| PostgreSQL (one copy) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| PostgreSQL (one copy) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| PostgreSQL (one copy) | Dependent object sink write price guess | 0.000005 | USD/write |
| PostgreSQL (two copies) | Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| PostgreSQL (two copies) | Representative publication size | 1,024 | bytes |
| PostgreSQL (two copies) | Selected delivery subscriptions | 3 | subscriptions/publication |
| PostgreSQL (two copies) | Delivery attempts | 1 | attempts/destination |
| PostgreSQL (two copies) | Native broker consumer copies | 1 | copies |
| PostgreSQL (two copies) | Staging residence window | 60 | seconds |
| PostgreSQL (two copies) | Delivery row size | 256 | bytes |
| PostgreSQL (two copies) | Target price guess · read | 0 | USD/read |
| PostgreSQL (two copies) | Target price guess · write | 0 | USD/write |
| PostgreSQL (two copies) | Target price guess · provider operation | 0 | USD/provider operation |
| PostgreSQL (two copies) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| PostgreSQL (two copies) | Target price guess · published GiB | 0 | USD/published GiB |
| PostgreSQL (two copies) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| PostgreSQL (two copies) | Target list price · network GiB | 0.12 | USD/network GiB |
| PostgreSQL (two copies) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| PostgreSQL (two copies) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| PostgreSQL (two copies) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| PostgreSQL (two copies) | Target price guess · resource-hour | 0 | USD/resource-hour |
| PostgreSQL (two copies) | Target price guess · resource-month | 0 | USD/resource-month |
| PostgreSQL (two copies) | Target price guess · input token | 0 | USD/input token |
| PostgreSQL (two copies) | Target price guess · output token | 0 | USD/output token |
| PostgreSQL (two copies) | Target monthly base charge | 0 | USD/month |
| PostgreSQL (two copies) | Approximate target service minimum | 0 | USD/month |
| PostgreSQL (two copies) | Minimum primary CPU | 2 | vCPU |
| PostgreSQL (two copies) | Minimum primary RAM | 8 | GiB |
| PostgreSQL (two copies) | Minimum primary disk | 100 | GiB |
| PostgreSQL (two copies) | Additional full-price standby copy | 1 | 0 or 1 |
| PostgreSQL (two copies) | Allocated share of provisioned cost | 1 | fraction |
| PostgreSQL (two copies) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| PostgreSQL (two copies) | Planning peak / mean work | 2 | multiplier |
| PostgreSQL (two copies) | Planning primary CPU utilization | 0.7 | fraction |
| PostgreSQL (two copies) | Resident state reserved in RAM | 0.1 | fraction |
| PostgreSQL (two copies) | Planning disk utilization | 0.8 | fraction |
| PostgreSQL (two copies) | Maintenance and log disk reserve | 20 | GiB |
| PostgreSQL (two copies) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| PostgreSQL (two copies) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| PostgreSQL (two copies) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| PostgreSQL (two copies) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| PostgreSQL (two copies) | Dependent object sink write price guess | 0.000005 | USD/write |

* Fan-out and retry assumptions remain explicit; this is not destination delivery TPS. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Native Pub/Sub and Service Bus backends also retain durable SNS staging. Price that allocation once; database targets already host the translated writes.
* Native broker subscriptions and SNS delivery claims are distinct surfaces. Supported delivery protocols and delivery consent remain backend-specific.
* Self-hosted target: PostgreSQL (PostgreSQL License, [https://www.postgresql.org/about/licence/](https://www.postgresql.org/about/licence/)). Selected CPU, RAM and physical disk allocation grow with workload; no per-operation price is assumed. No vendor charge: the target runs on the customer's Kubernetes nodes, so CPU, RAM and disk bill at the Kubernetes node reference rates, Compute Engine N2 in us-central1 (USD 0.031611/vCPU-hour, 0.004237/GiB-hour) with pd-balanced disk (0.10/GiB-month) and Premium Tier egress. The cost-optimized E2 series lists 0.02181159/vCPU-hour and 0.00292353/GiB-hour; AWS m6i/r6i and Azure D2s v5/E2s v5 both decompose to 0.033/vCPU-hour and 0.00375/GiB-hour. Requested CPU and RAM are billed; node bin-packing waste, system reservations and the cluster control-plane fee are not.
* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.
* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
* Node bounds: Compute Engine n2-highmem-128 has 128 vCPUs and 864 GB ([https://docs.cloud.google.com/compute/docs/general-purpose-machines](https://docs.cloud.google.com/compute/docs/general-purpose-machines)); a Persistent Disk volume holds up to 64 TiB ([https://docs.cloud.google.com/compute/docs/disks/persistent-disks](https://docs.cloud.google.com/compute/docs/disks/persistent-disks)).
* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.
* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
* AWS Price List API, AmazonSNS offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json)
* Compute Engine general-purpose machine pricing: [https://cloud.google.com/products/compute/pricing/general-purpose](https://cloud.google.com/products/compute/pricing/general-purpose)
* Disk and image pricing: [https://cloud.google.com/compute/disks-image-pricing](https://cloud.google.com/compute/disks-image-pricing)
* Network pricing: [https://cloud.google.com/vpc/network-pricing](https://cloud.google.com/vpc/network-pricing)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* HTTP/email/SMS/mobile delivery prices and destination-service charges; relay submission does not establish managed delivery reputation.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-9063cd5055d0b6404b79cb2941f9fbd779c5669b` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonSNS offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json), [Compute Engine general-purpose machine pricing](https://cloud.google.com/products/compute/pricing/general-purpose), [Disk and image pricing](https://cloud.google.com/compute/disks-image-pricing), [Network pricing](https://cloud.google.com/vpc/network-pricing).

**SNS Standard → PostgreSQL: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: us-central1. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: SNS publish units | 0.00 |
| Target: Provisioned primary CPU | 46.15 |
| Target: Provisioned primary RAM | 24.74 |
| Target: Provisioned primary disk | 10.00 |
| Target: Selected billable network | 0.00 |
| Target: Independent provisioned resources | 0.00 |
| Target: Independent managed resources | 0.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **80.90** |

Estimated allocation, not benchmark calibrated: sized at 2 vCPU, 8 GiB memory and 100 GiB SSD for this scenario.

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* HTTP/email/SMS/mobile delivery prices and destination-service charges; relay submission does not establish managed delivery reputation.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Representative publication size | 1,024 | bytes |
| Selected delivery subscriptions | 3 | subscriptions/publication |
| Delivery attempts | 1 | attempts/destination |
| Native broker consumer copies | 1 | copies |
| Staging residence window | 60 | seconds |
| Delivery row size | 256 | bytes |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.1 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.12 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| SNS publish units | 0 | 64-KiB request units |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Native Pub/Sub and Service Bus backends also retain durable SNS staging. Price that allocation once; database targets already host the translated writes.

* Native broker subscriptions and SNS delivery claims are distinct surfaces. Supported delivery protocols and delivery consent remain backend-specific.

* Self-hosted target: PostgreSQL (PostgreSQL License, [https://www.postgresql.org/about/licence/](https://www.postgresql.org/about/licence/)). Selected CPU, RAM and physical disk allocation grow with workload; no per-operation price is assumed. No vendor charge: the target runs on the customer's Kubernetes nodes, so CPU, RAM and disk bill at the Kubernetes node reference rates, Compute Engine N2 in us-central1 (USD 0.031611/vCPU-hour, 0.004237/GiB-hour) with pd-balanced disk (0.10/GiB-month) and Premium Tier egress. The cost-optimized E2 series lists 0.02181159/vCPU-hour and 0.00292353/GiB-hour; AWS m6i/r6i and Azure D2s v5/E2s v5 both decompose to 0.033/vCPU-hour and 0.00375/GiB-hour. Requested CPU and RAM are billed; node bin-packing waste, system reservations and the cluster control-plane fee are not.

* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.

* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.

* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.

* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.

* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.

* Node bounds: Compute Engine n2-highmem-128 has 128 vCPUs and 864 GB ([https://docs.cloud.google.com/compute/docs/general-purpose-machines](https://docs.cloud.google.com/compute/docs/general-purpose-machines)); a Persistent Disk volume holds up to 64 TiB ([https://docs.cloud.google.com/compute/docs/disks/persistent-disks](https://docs.cloud.google.com/compute/docs/disks/persistent-disks)).

* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.

* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.

* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.

List prices read: 2026-10-22. Model: `plan-9063cd5055d0b6404b79cb2941f9fbd779c5669b` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonSNS offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json), [Compute Engine general-purpose machine pricing](https://cloud.google.com/products/compute/pricing/general-purpose), [Disk and image pricing](https://cloud.google.com/compute/disks-image-pricing), [Network pricing](https://cloud.google.com/vpc/network-pricing).

## On Google Cloud

### Google Cloud Pub/Sub

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| At-least-once delivery | Delivery | Supported | - | subscriber outcomes are independent and an uncertain acknowledgement can produce a duplicate |
| Raw message delivery | Delivery | Partial | - | SQS only, subject to the origin's raw-delivery attribute cap; HTTP/S raw delivery is refused |
| Subscriber protocols | Delivery | Partial | - | receiver-authorized SQS delivery is served; HTTP, HTTPS, Lambda, email, SMS, Firehose, mobile push and application are refused |
| Subscription redrive | Delivery | Out of scope | - | RedrivePolicy is refused; bounded retries end in diagnostic state |
| FIFO and ordering | Ordering | Out of scope | - | FIFO topics, deduplication and MessageGroupId are refused |
| Subscription filter policies | Routing | Partial | - | message-attribute and JSON-body scopes use a bounded AWS-compatible grammar subset |
| HTTP/S signature compatibility | Security | Out of scope | - | HTTP and HTTPS subscriptions are refused by the served door |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| AddPermission | Control plane | Out of scope | Full surface | caller and destination grants remain in the environment's existing identity system |
| RemovePermission | Control plane | Out of scope | Full surface | caller and destination grants remain in the environment's existing identity system |
| SetTopicAttributes | Control plane | Partial | Full surface | sets the topic's access Policy, validated as AWS validates it and echoed verbatim, and judged for the owner's own publishes; a statement naming ANOTHER ACCOUNT, or Principal "\*", is validated, stored and echoed but ADMITS NOBODY, because this fabric refuses cross-account bindings and has no unauthenticated door; delivery policy, encryption and delivery-logging changes are refused |
| GetTopicAttributes | Discovery | Partial | Most usage | returns represented attributes and the topic's access Policy, which is AWS's default document for the topic until one is set; delivery-policy values are not fabricated |
| ListSubscriptions | Discovery | Supported | Most usage | tenant-authorized snapshot pages contain no confirmation secrets or receiver handles |
| ListSubscriptionsByTopic | Discovery | Supported | Most usage | tenant-authorized snapshot pages for one topic |
| ListTopics | Discovery | Supported | Common | tenant-authorized snapshot pages contain at most 100 topics |
| Publish | Publish | Partial | Common | saves the message and one pending delivery per SQS subscription, then returns; the delivery worker later sends the message, with the same MessageId, to the Pub/Sub topic |
| PublishBatch | Publish | Partial | Most usage | at most ten independently admitted entries within the 256-KiB aggregate budget |
| ConfirmSubscription | Subscriptions | Out of scope | Common | HTTP and HTTPS subscriptions are not served |
| GetSubscriptionAttributes | Subscriptions | Partial | Most usage | returns supported filter, scope and SQS raw-delivery attributes |
| SetSubscriptionAttributes | Subscriptions | Partial | Most usage | supports FilterPolicy, FilterPolicyScope and SQS RawMessageDelivery; redrive is refused |
| Subscribe | Subscriptions | Partial | Common | receiver-authorized SQS queues in the same tenant and region; HTTP, HTTPS and Lambda are refused |
| Unsubscribe | Subscriptions | Supported | Common | authenticated, generation-aware removal blocks new attempts and retires the binding |
| ListTagsForResource | Tags | Supported | Most usage | returns customer tags without internal ownership metadata |
| TagResource | Tags | Supported | Most usage | customer tags cannot alter internal ownership |
| UntagResource | Tags | Supported | Most usage | - |
| CreateTopic | Topics | Partial | Common | creates an idempotent standard topic with its own access Policy; the delivery-logging sample rates are accepted only at their AWS default and every other attribute is refused |
| DeleteTopic | Topics | Partial | Common | generation-aware deletion cannot remove a replacement topic |

#### How it works

Your application keeps its SNS client and topic ARNs. When it calls `Publish`, the message body is saved in PostgreSQL, then the deliveries still to be made are recorded: one to the Pub/Sub topic mapped to this SNS topic, and one to each SQS subscription. Publish then returns a `MessageId`. A successful response means the message is saved and its deliveries are queued. It does not mean that Pub/Sub or any consumer has received the message.

A delivery worker in the Cloud Adapter deployment then publishes the message to the Pub/Sub topic, with the SNS `MessageId` in the `sns.message-id` attribute. Pub/Sub delivers it to the subscriptions on that topic. You create and manage those subscriptions; the Cloud Adapter deployment does not create, pull from or acknowledge them. SQS subscriptions do not go through Pub/Sub: the delivery worker sends to each SQS queue directly.

![Publish saves the message and returns a MessageId. A delivery worker then publishes it to the Pub/Sub topic mapped to the SNS topic, and Pub/Sub delivers it to your subscriptions.](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaXNoIHNhdmVzIHRoZSBtZXNzYWdlIGFuZCByZXR1cm5zIGEgTWVzc2FnZUlkLiBBIGRlbGl2ZXJ5IHdvcmtlciB0aGVuIHB1Ymxpc2hlcyBpdCB0byB0aGUgUHViL1N1YiB0b3BpYyBtYXBwZWQgdG8gdGhlIFNOUyB0b3BpYywgYW5kIFB1Yi9TdWIgZGVsaXZlcnMgaXQgdG8geW91ciBzdWJzY3JpcHRpb25zLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPjxkZWZzPjxtYXJrZXIgaWQ9InB1YnN1Yi1kZWxpdmVyeSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBzdHlsZT0iZmlsbDojOTRhM2I4Ii8+PC9tYXJrZXI+PC9kZWZzPjx0ZXh0IHg9IjI0IiB5PSIyOCIgc3R5bGU9ImZvbnQ6NzAwIDEwcHggSW50ZXIsc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzoxLjJweDtmaWxsOiM2NDc0OGIiPkdPT0dMRSBDTE9VRCDCtyBGUk9NIFBVQkxJU0ggVE8gWU9VUiBDT05TVU1FUlM8L3RleHQ+PHJlY3QgeD0iMjQiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNjYmQ1ZTE7c3Ryb2tlLXdpZHRoOjEuNSIvPjxzdmcgeD0iMTAwIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj48Zz4gPHBhdGggZD0iTTg2LjQsNjYuNGMwLDMuNywwLjQsNi43LDEuMSw4LjljMC44LDIuMiwxLjgsNC42LDMuMiw3LjJjMC41LDAuOCwwLjcsMS42LDAuNywyLjNjMCwxLTAuNiwyLTEuOSwzbC02LjMsNC4yIGMtMC45LDAuNi0xLjgsMC45LTIuNiwwLjljLTEsMC0yLTAuNS0zLTEuNEM3Ni4yLDkwLDc1LDg4LjQsNzQsODYuOGMtMS0xLjctMi0zLjYtMy4xLTUuOWMtNy44LDkuMi0xNy42LDEzLjgtMjkuNCwxMy44IGMtOC40LDAtMTUuMS0yLjQtMjAtNy4yYy00LjktNC44LTcuNC0xMS4yLTcuNC0xOS4yYzAtOC41LDMtMTUuNCw5LjEtMjAuNmM2LjEtNS4yLDE0LjItNy44LDI0LjUtNy44YzMuNCwwLDYuOSwwLjMsMTAuNiwwLjggYzMuNywwLjUsNy41LDEuMywxMS41LDIuMnYtNy4zYzAtNy42LTEuNi0xMi45LTQuNy0xNmMtMy4yLTMuMS04LjYtNC42LTE2LjMtNC42Yy0zLjUsMC03LjEsMC40LTEwLjgsMS4zYy0zLjcsMC45LTcuMywyLTEwLjgsMy40IGMtMS42LDAuNy0yLjgsMS4xLTMuNSwxLjNjLTAuNywwLjItMS4yLDAuMy0xLjYsMC4zYy0xLjQsMC0yLjEtMS0yLjEtMy4xdi00LjljMC0xLjYsMC4yLTIuOCwwLjctMy41YzAuNS0wLjcsMS40LTEuNCwyLjgtMi4xIGMzLjUtMS44LDcuNy0zLjMsMTIuNi00LjVjNC45LTEuMywxMC4xLTEuOSwxNS42LTEuOWMxMS45LDAsMjAuNiwyLjcsMjYuMiw4LjFjNS41LDUuNCw4LjMsMTMuNiw4LjMsMjQuNlY2Ni40eiBNNDUuOCw4MS42IGMzLjMsMCw2LjctMC42LDEwLjMtMS44YzMuNi0xLjIsNi44LTMuNCw5LjUtNi40YzEuNi0xLjksMi44LTQsMy40LTYuNGMwLjYtMi40LDEtNS4zLDEtOC43di00LjJjLTIuOS0wLjctNi0xLjMtOS4yLTEuNyBjLTMuMi0wLjQtNi4zLTAuNi05LjQtMC42Yy02LjcsMC0xMS42LDEuMy0xNC45LDRjLTMuMywyLjctNC45LDYuNS00LjksMTEuNWMwLDQuNywxLjIsOC4yLDMuNywxMC42IEMzNy43LDgwLjQsNDEuMiw4MS42LDQ1LjgsODEuNnogTTEyNi4xLDkyLjRjLTEuOCwwLTMtMC4zLTMuOC0xYy0wLjgtMC42LTEuNS0yLTIuMS0zLjlMOTYuNywxMC4yYy0wLjYtMi0wLjktMy4zLTAuOS00IGMwLTEuNiwwLjgtMi41LDIuNC0yLjVoOS44YzEuOSwwLDMuMiwwLjMsMy45LDFjMC44LDAuNiwxLjQsMiwyLDMuOWwxNi44LDY2LjJsMTUuNi02Ni4yYzAuNS0yLDEuMS0zLjMsMS45LTMuOWMwLjgtMC42LDIuMi0xLDQtMSBoOGMxLjksMCwzLjIsMC4zLDQsMWMwLjgsMC42LDEuNSwyLDEuOSwzLjlsMTUuOCw2N2wxNy4zLTY3YzAuNi0yLDEuMy0zLjMsMi0zLjljMC44LTAuNiwyLjEtMSwzLjktMWg5LjNjMS42LDAsMi41LDAuOCwyLjUsMi41IGMwLDAuNS0wLjEsMS0wLjIsMS42Yy0wLjEsMC42LTAuMywxLjQtMC43LDIuNWwtMjQuMSw3Ny4zYy0wLjYsMi0xLjMsMy4zLTIuMSwzLjljLTAuOCwwLjYtMi4xLDEtMy44LDFoLTguNmMtMS45LDAtMy4yLTAuMy00LTEgYy0wLjgtMC43LTEuNS0yLTEuOS00TDE1NiwyM2wtMTUuNCw2NC40Yy0wLjUsMi0xLjEsMy4zLTEuOSw0Yy0wLjgsMC43LTIuMiwxLTQsMUgxMjYuMXogTTI1NC42LDk1LjFjLTUuMiwwLTEwLjQtMC42LTE1LjQtMS44IGMtNS0xLjItOC45LTIuNS0xMS41LTRjLTEuNi0wLjktMi43LTEuOS0zLjEtMi44Yy0wLjQtMC45LTAuNi0xLjktMC42LTIuOHYtNS4xYzAtMi4xLDAuOC0zLjEsMi4zLTMuMWMwLjYsMCwxLjIsMC4xLDEuOCwwLjMgYzAuNiwwLjIsMS41LDAuNiwyLjUsMWMzLjQsMS41LDcuMSwyLjcsMTEsMy41YzQsMC44LDcuOSwxLjIsMTEuOSwxLjJjNi4zLDAsMTEuMi0xLjEsMTQuNi0zLjNjMy40LTIuMiw1LjItNS40LDUuMi05LjUgYzAtMi44LTAuOS01LjEtMi43LTdjLTEuOC0xLjktNS4yLTMuNi0xMC4xLTUuMkwyNDYsNTJjLTcuMy0yLjMtMTIuNy01LjctMTYtMTAuMmMtMy4zLTQuNC01LTkuMy01LTE0LjVjMC00LjIsMC45LTcuOSwyLjctMTEuMSBjMS44LTMuMiw0LjItNiw3LjItOC4yYzMtMi4zLDYuNC00LDEwLjQtNS4yYzQtMS4yLDguMi0xLjcsMTIuNi0xLjdjMi4yLDAsNC41LDAuMSw2LjcsMC40YzIuMywwLjMsNC40LDAuNyw2LjUsMS4xIGMyLDAuNSwzLjksMSw1LjcsMS42YzEuOCwwLjYsMy4yLDEuMiw0LjIsMS44YzEuNCwwLjgsMi40LDEuNiwzLDIuNWMwLjYsMC44LDAuOSwxLjksMC45LDMuM3Y0LjdjMCwyLjEtMC44LDMuMi0yLjMsMy4yIGMtMC44LDAtMi4xLTAuNC0zLjgtMS4yYy01LjctMi42LTEyLjEtMy45LTE5LjItMy45Yy01LjcsMC0xMC4yLDAuOS0xMy4zLDIuOGMtMy4xLDEuOS00LjcsNC44LTQuNyw4LjljMCwyLjgsMSw1LjIsMyw3LjEgYzIsMS45LDUuNywzLjgsMTEsNS41bDE0LjIsNC41YzcuMiwyLjMsMTIuNCw1LjUsMTUuNSw5LjZjMy4xLDQuMSw0LjYsOC44LDQuNiwxNGMwLDQuMy0wLjksOC4yLTIuNiwxMS42IGMtMS44LDMuNC00LjIsNi40LTcuMyw4LjhjLTMuMSwyLjUtNi44LDQuMy0xMS4xLDUuNkMyNjQuNCw5NC40LDI1OS43LDk1LjEsMjU0LjYsOTUuMXoiIHN0eWxlPSJmaWxsOiMyNTJGM0UiLz4gPGc+IDxwYXRoIGQ9Ik0yNzMuNSwxNDMuN2MtMzIuOSwyNC4zLTgwLjcsMzcuMi0xMjEuOCwzNy4yYy01Ny42LDAtMTA5LjUtMjEuMy0xNDguNy01Ni43Yy0zLjEtMi44LTAuMy02LjYsMy40LTQuNCBjNDIuNCwyNC42LDk0LjcsMzkuNSwxNDguOCwzOS41YzM2LjUsMCw3Ni42LTcuNiwxMTMuNS0yMy4yQzI3NC4yLDEzMy42LDI3OC45LDEzOS43LDI3My41LDE0My43eiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8cGF0aCBkPSJNMjg3LjIsMTI4LjFjLTQuMi01LjQtMjcuOC0yLjYtMzguNS0xLjNjLTMuMiwwLjQtMy43LTIuNC0wLjgtNC41YzE4LjgtMTMuMiw0OS43LTkuNCw1My4zLTUgYzMuNiw0LjUtMSwzNS40LTE4LjYsNTAuMmMtMi43LDIuMy01LjMsMS4xLTQuMS0xLjlDMjgyLjUsMTU1LjcsMjkxLjQsMTMzLjQsMjg3LjIsMTI4LjF6IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkY5OTAwIi8+IDwvZz4gPC9nPjwvc3ZnPjxzdmcgeD0iMTAwIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojRkZGRkZGIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48dGV4dCB4PSIxMTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiMwZjE3MmEiPlNOUyBQdWJsaXNoPC90ZXh0Pjx0ZXh0IHg9IjExMiIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojNjQ3NDhiIj5TYXZlcyBtZXNzYWdlLCByZXR1cm5zIElEPC90ZXh0PjxsaW5lIHgxPSIyMDAiIHkxPSIxMDgiIHgyPSIyMjgiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcHVic3ViLWRlbGl2ZXJ5KSIgc3R5bGU9InN0cm9rZTojOTRhM2I4O3N0cm9rZS13aWR0aDoyO2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjIyOCIgeT0iNjAiIHdpZHRoPSIxNzYiIGhlaWdodD0iOTYiIHJ4PSIxMSIgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2NiZDVlMTtzdHJva2Utd2lkdGg6MS41Ii8+PHN2ZyB4PSIzMDQiIHk9IjcyIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzQ3NTU2OTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiPjxsaW5lIHgxPSIyMiIgeTE9IjIiIHgyPSIxMSIgeTI9IjEzIi8+PHBvbHlnb24gcG9pbnRzPSIyMiAyIDE1IDIyIDExIDEzIDIgOSAyMiAyIi8+PC9zdmc+PHRleHQgeD0iMzE2IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojMGYxNzJhIj5EZWxpdmVyeSB3b3JrZXI8L3RleHQ+PHRleHQgeD0iMzE2IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM2NDc0OGIiPlNlbmRzLCByZXRyaWVzIG9uIGZhaWx1cmU8L3RleHQ+PGxpbmUgeDE9IjQwNCIgeTE9IjEwOCIgeDI9IjQzMiIgeTI9IjEwOCIgbWFya2VyLWVuZD0idXJsKCNwdWJzdWItZGVsaXZlcnkpIiBzdHlsZT0ic3Ryb2tlOiM5NGEzYjg7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iNDMyIiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojY2JkNWUxO3N0cm9rZS13aWR0aDoxLjUiLz48c3ZnIHg9IjUwOCIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAtMjUgMjU2IDI1NiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+PGc+IDxwYXRoIGQ9Ik0xNzAuMjUxNyw1Ni44MTg2IEwxOTIuNTA0NywzNC41NjU2IEwxOTMuOTg3NywyNS4xOTU2IEMxNTMuNDM2NywtMTEuNjc3NCA4OC45NzU3LC03LjQ5NjQgNTIuNDIwNywzMy45MTk2IEM0Mi4yNjY3LDQ1LjQyMjYgMzQuNzMzNyw1OS43NjM2IDMwLjcxNjcsNzQuNTcyNiBMMzguNjg2Nyw3My40NDk2IEw4My4xOTE3LDY2LjExMDYgTDg2LjYyNzcsNjIuNTk2NiBDMTA2LjQyNDcsNDAuODU0NiAxMzkuODk3NywzNy45Mjk2IDE2Mi43NTU3LDU2LjQyODYgTDE3MC4yNTE3LDU2LjgxODYgWiIgZmlsbD0iI0VBNDMzNSI+IDwvcGF0aD4gPHBhdGggZD0iTTIyNC4yMDQ4LDczLjkxODIgQzIxOS4wODk4LDU1LjA4MjIgMjA4LjU4ODgsMzguMTQ5MiAxOTMuOTg3OCwyNS4xOTYyIEwxNjIuNzU1OCw1Ni40MjgyIEMxNzUuOTQzOCw2Ny4yMDQyIDE4My40NTY4LDgzLjQzODIgMTgzLjEzNDgsMTAwLjQ2NTIgTDE4My4xMzQ4LDEwNi4wMDkyIEMxOTguNDg1OCwxMDYuMDA5MiAyMTAuOTMxOCwxMTguNDU0MiAyMTAuOTMxOCwxMzMuODA1MiBDMjEwLjkzMTgsMTQ5LjE1NzIgMTk4LjQ4NTgsMTYxLjI5MDIgMTgzLjEzNDgsMTYxLjI5MDIgTDEyNy40NjM4LDE2MS4yOTAyIEwxMjEuOTk3OCwxNjcuMjI0MiBMMTIxLjk5NzgsMjAwLjU2NDIgTDEyNy40NjM4LDIwNS43OTUyIEwxODMuMTM0OCwyMDUuNzk1MiBDMjIzLjA2NDgsMjA2LjEwNjIgMjU1LjY4NjgsMTc0LjMwMTIgMjU1Ljk5NzgsMTM0LjM3MTIgQzI1Ni4xODU4LDExMC4xNjgyIDI0NC4yNTI4LDg3LjQ3ODIgMjI0LjIwNDgsNzMuOTE4MiIgZmlsbD0iIzQyODVGNCI+IDwvcGF0aD4gPHBhdGggZD0iTTcxLjg3MDQsMjA1Ljc5NTcgTDEyNy40NjM0LDIwNS43OTU3IEwxMjcuNDYzNCwxNjEuMjg5NyBMNzEuODcwNCwxNjEuMjg5NyBDNjcuOTA5NCwxNjEuMjg4NyA2NC4wNzM0LDE2MC40Mzc3IDYwLjQ3MTQsMTU4Ljc5MTcgTDUyLjU4NDQsMTYxLjIxMTcgTDMwLjE3NTQsMTgzLjQ2NDcgTDI4LjIyMzQsMTkxLjAzODcgQzQwLjc5MDQsMjAwLjUyNzcgNTYuMTIzNCwyMDUuODYzNyA3MS44NzA0LDIwNS43OTU3IiBmaWxsPSIjMzRBODUzIj4gPC9wYXRoPiA8cGF0aCBkPSJNNzEuODcwNCw2MS40MjU1IEMzMS45Mzk0LDYxLjY2MzUgLTAuMjM2Niw5NC4yMjc1IDAuMDAxNCwxMzQuMTU3NSBDMC4xMzQ0LDE1Ni40NTU1IDEwLjU0ODQsMTc3LjQ0NTUgMjguMjIzNCwxOTEuMDM4NSBMNjAuNDcxNCwxNTguNzkxNSBDNDYuNDgwNCwxNTIuNDcwNSA0MC4yNjM0LDEzNi4wMDU1IDQ2LjU4NDQsMTIyLjAxNTUgQzUyLjkwNDQsMTA4LjAyNTUgNjkuMzcwNCwxMDEuODA4NSA4My4zNTk0LDEwOC4xMjg1IEM4OS41MjQ0LDExMC45MTM1IDk0LjQ2MTQsMTE1Ljg1MTUgOTcuMjQ2NCwxMjIuMDE1NSBMMTI5LjQ5NDQsODkuNzY4NSBDMTE1Ljc3MzQsNzEuODMxNSA5NC40NTM0LDYxLjM0NDUgNzEuODcwNCw2MS40MjU1IiBmaWxsPSIjRkJCQzA1Ij4gPC9wYXRoPiA8L2c+PC9zdmc+PHRleHQgeD0iNTIwIiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojMGYxNzJhIj5QdWIvU3ViIHRvcGljPC90ZXh0Pjx0ZXh0IHg9IjUyMCIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojNjQ3NDhiIj5GYW5zIG91dCB0byBzdWJzY3JpcHRpb25zPC90ZXh0PjxsaW5lIHgxPSI2MDgiIHkxPSIxMDgiIHgyPSI2MzYiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcHVic3ViLWRlbGl2ZXJ5KSIgc3R5bGU9InN0cm9rZTojOTRhM2I4O3N0cm9rZS13aWR0aDoyO2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjYzNiIgeT0iNjAiIHdpZHRoPSIxNzYiIGhlaWdodD0iOTYiIHJ4PSIxMSIgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2NiZDVlMTtzdHJva2Utd2lkdGg6MS41Ii8+PHRleHQgeD0iNzI0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojMGYxNzJhIj5Zb3VyIGNvbnN1bWVyczwvdGV4dD48dGV4dCB4PSI3MjQiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6IzY0NzQ4YiI+UHVsbCBhbmQgYWNrbm93bGVkZ2U8L3RleHQ+PC9zdmc+)

![Publish saves the message and returns a MessageId. A delivery worker then publishes it to the Pub/Sub topic mapped to the SNS topic, and Pub/Sub delivers it to your subscriptions.](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaXNoIHNhdmVzIHRoZSBtZXNzYWdlIGFuZCByZXR1cm5zIGEgTWVzc2FnZUlkLiBBIGRlbGl2ZXJ5IHdvcmtlciB0aGVuIHB1Ymxpc2hlcyBpdCB0byB0aGUgUHViL1N1YiB0b3BpYyBtYXBwZWQgdG8gdGhlIFNOUyB0b3BpYywgYW5kIFB1Yi9TdWIgZGVsaXZlcnMgaXQgdG8geW91ciBzdWJzY3JpcHRpb25zLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPjxkZWZzPjxtYXJrZXIgaWQ9InB1YnN1Yi1kZWxpdmVyeSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBzdHlsZT0iZmlsbDojNjQ3NDhiIi8+PC9tYXJrZXI+PC9kZWZzPjx0ZXh0IHg9IjI0IiB5PSIyOCIgc3R5bGU9ImZvbnQ6NzAwIDEwcHggSW50ZXIsc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzoxLjJweDtmaWxsOiM5NGEzYjgiPkdPT0dMRSBDTE9VRCDCtyBGUk9NIFBVQkxJU0ggVE8gWU9VUiBDT05TVU1FUlM8L3RleHQ+PHJlY3QgeD0iMjQiIHk9IjYwIiB3aWR0aD0iMTc2IiBoZWlnaHQ9Ijk2IiByeD0iMTEiIHN0eWxlPSJmaWxsOiMxZTI5M2I7c3Ryb2tlOiM0NzU1Njk7c3Ryb2tlLXdpZHRoOjEuNSIvPjxzdmcgeD0iMTAwIiB5PSI3MiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMzA0IDE4MiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojMjUyRjNFIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48c3ZnIHg9IjEwMCIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDMwNCAxODIiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojRkZGRkZGIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48dGV4dCB4PSIxMTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNmMWY1ZjkiPlNOUyBQdWJsaXNoPC90ZXh0Pjx0ZXh0IHg9IjExMiIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojOTRhM2I4Ij5TYXZlcyBtZXNzYWdlLCByZXR1cm5zIElEPC90ZXh0PjxsaW5lIHgxPSIyMDAiIHkxPSIxMDgiIHgyPSIyMjgiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcHVic3ViLWRlbGl2ZXJ5KSIgc3R5bGU9InN0cm9rZTojNjQ3NDhiO3N0cm9rZS13aWR0aDoyO2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjIyOCIgeT0iNjAiIHdpZHRoPSIxNzYiIGhlaWdodD0iOTYiIHJ4PSIxMSIgc3R5bGU9ImZpbGw6IzFlMjkzYjtzdHJva2U6IzQ3NTU2OTtzdHJva2Utd2lkdGg6MS41Ii8+PHN2ZyB4PSIzMDQiIHk9IjcyIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6I2NiZDVlMTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiPjxsaW5lIHgxPSIyMiIgeTE9IjIiIHgyPSIxMSIgeTI9IjEzIi8+PHBvbHlnb24gcG9pbnRzPSIyMiAyIDE1IDIyIDExIDEzIDIgOSAyMiAyIi8+PC9zdmc+PHRleHQgeD0iMzE2IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojZjFmNWY5Ij5EZWxpdmVyeSB3b3JrZXI8L3RleHQ+PHRleHQgeD0iMzE2IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM5NGEzYjgiPlNlbmRzLCByZXRyaWVzIG9uIGZhaWx1cmU8L3RleHQ+PGxpbmUgeDE9IjQwNCIgeTE9IjEwOCIgeDI9IjQzMiIgeTI9IjEwOCIgbWFya2VyLWVuZD0idXJsKCNwdWJzdWItZGVsaXZlcnkpIiBzdHlsZT0ic3Ryb2tlOiM2NDc0OGI7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iNDMyIiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojMWUyOTNiO3N0cm9rZTojNDc1NTY5O3N0cm9rZS13aWR0aDoxLjUiLz48c3ZnIHg9IjUwOCIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAtMjUgMjU2IDI1NiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+PGc+IDxwYXRoIGQ9Ik0xNzAuMjUxNyw1Ni44MTg2IEwxOTIuNTA0NywzNC41NjU2IEwxOTMuOTg3NywyNS4xOTU2IEMxNTMuNDM2NywtMTEuNjc3NCA4OC45NzU3LC03LjQ5NjQgNTIuNDIwNywzMy45MTk2IEM0Mi4yNjY3LDQ1LjQyMjYgMzQuNzMzNyw1OS43NjM2IDMwLjcxNjcsNzQuNTcyNiBMMzguNjg2Nyw3My40NDk2IEw4My4xOTE3LDY2LjExMDYgTDg2LjYyNzcsNjIuNTk2NiBDMTA2LjQyNDcsNDAuODU0NiAxMzkuODk3NywzNy45Mjk2IDE2Mi43NTU3LDU2LjQyODYgTDE3MC4yNTE3LDU2LjgxODYgWiIgZmlsbD0iI0VBNDMzNSI+IDwvcGF0aD4gPHBhdGggZD0iTTIyNC4yMDQ4LDczLjkxODIgQzIxOS4wODk4LDU1LjA4MjIgMjA4LjU4ODgsMzguMTQ5MiAxOTMuOTg3OCwyNS4xOTYyIEwxNjIuNzU1OCw1Ni40MjgyIEMxNzUuOTQzOCw2Ny4yMDQyIDE4My40NTY4LDgzLjQzODIgMTgzLjEzNDgsMTAwLjQ2NTIgTDE4My4xMzQ4LDEwNi4wMDkyIEMxOTguNDg1OCwxMDYuMDA5MiAyMTAuOTMxOCwxMTguNDU0MiAyMTAuOTMxOCwxMzMuODA1MiBDMjEwLjkzMTgsMTQ5LjE1NzIgMTk4LjQ4NTgsMTYxLjI5MDIgMTgzLjEzNDgsMTYxLjI5MDIgTDEyNy40NjM4LDE2MS4yOTAyIEwxMjEuOTk3OCwxNjcuMjI0MiBMMTIxLjk5NzgsMjAwLjU2NDIgTDEyNy40NjM4LDIwNS43OTUyIEwxODMuMTM0OCwyMDUuNzk1MiBDMjIzLjA2NDgsMjA2LjEwNjIgMjU1LjY4NjgsMTc0LjMwMTIgMjU1Ljk5NzgsMTM0LjM3MTIgQzI1Ni4xODU4LDExMC4xNjgyIDI0NC4yNTI4LDg3LjQ3ODIgMjI0LjIwNDgsNzMuOTE4MiIgZmlsbD0iIzQyODVGNCI+IDwvcGF0aD4gPHBhdGggZD0iTTcxLjg3MDQsMjA1Ljc5NTcgTDEyNy40NjM0LDIwNS43OTU3IEwxMjcuNDYzNCwxNjEuMjg5NyBMNzEuODcwNCwxNjEuMjg5NyBDNjcuOTA5NCwxNjEuMjg4NyA2NC4wNzM0LDE2MC40Mzc3IDYwLjQ3MTQsMTU4Ljc5MTcgTDUyLjU4NDQsMTYxLjIxMTcgTDMwLjE3NTQsMTgzLjQ2NDcgTDI4LjIyMzQsMTkxLjAzODcgQzQwLjc5MDQsMjAwLjUyNzcgNTYuMTIzNCwyMDUuODYzNyA3MS44NzA0LDIwNS43OTU3IiBmaWxsPSIjMzRBODUzIj4gPC9wYXRoPiA8cGF0aCBkPSJNNzEuODcwNCw2MS40MjU1IEMzMS45Mzk0LDYxLjY2MzUgLTAuMjM2Niw5NC4yMjc1IDAuMDAxNCwxMzQuMTU3NSBDMC4xMzQ0LDE1Ni40NTU1IDEwLjU0ODQsMTc3LjQ0NTUgMjguMjIzNCwxOTEuMDM4NSBMNjAuNDcxNCwxNTguNzkxNSBDNDYuNDgwNCwxNTIuNDcwNSA0MC4yNjM0LDEzNi4wMDU1IDQ2LjU4NDQsMTIyLjAxNTUgQzUyLjkwNDQsMTA4LjAyNTUgNjkuMzcwNCwxMDEuODA4NSA4My4zNTk0LDEwOC4xMjg1IEM4OS41MjQ0LDExMC45MTM1IDk0LjQ2MTQsMTE1Ljg1MTUgOTcuMjQ2NCwxMjIuMDE1NSBMMTI5LjQ5NDQsODkuNzY4NSBDMTE1Ljc3MzQsNzEuODMxNSA5NC40NTM0LDYxLjM0NDUgNzEuODcwNCw2MS40MjU1IiBmaWxsPSIjRkJCQzA1Ij4gPC9wYXRoPiA8L2c+PC9zdmc+PHRleHQgeD0iNTIwIiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojZjFmNWY5Ij5QdWIvU3ViIHRvcGljPC90ZXh0Pjx0ZXh0IHg9IjUyMCIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojOTRhM2I4Ij5GYW5zIG91dCB0byBzdWJzY3JpcHRpb25zPC90ZXh0PjxsaW5lIHgxPSI2MDgiIHkxPSIxMDgiIHgyPSI2MzYiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjcHVic3ViLWRlbGl2ZXJ5KSIgc3R5bGU9InN0cm9rZTojNjQ3NDhiO3N0cm9rZS13aWR0aDoyO2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjYzNiIgeT0iNjAiIHdpZHRoPSIxNzYiIGhlaWdodD0iOTYiIHJ4PSIxMSIgc3R5bGU9ImZpbGw6IzFlMjkzYjtzdHJva2U6IzQ3NTU2OTtzdHJva2Utd2lkdGg6MS41Ii8+PHRleHQgeD0iNzI0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojZjFmNWY5Ij5Zb3VyIGNvbnN1bWVyczwvdGV4dD48dGV4dCB4PSI3MjQiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6Izk0YTNiOCI+UHVsbCBhbmQgYWNrbm93bGVkZ2U8L3RleHQ+PC9zdmc+)

Publish returns once the message is saved, before Pub/Sub has received it.

#### Delivery, retries and duplicates

Pending deliveries survive a restart: the delivery worker picks them up again when it starts. If Pub/Sub is unavailable, the worker retries with capped backoff and reports messages that have been waiting a long time to reach Pub/Sub. If a publish to Pub/Sub ends without a clear answer, the message can arrive twice with the same `sns.message-id` attribute, so consumers must handle duplicates.

Each SQS delivery succeeds or fails on its own. Before sending, the Cloud Adapter deployment checks that the subscription still exists and that the queue's access policy still allows the topic. After a subscription is deleted, no further deliveries are attempted for it, and a subscription created to replace it does not receive the old one's pending messages. Once SQS has stored a message, SQS is responsible for it.

#### Limitations

* **FIFO topics are not supported.** FIFO ordering, deduplication and `MessageGroupId` are rejected. Only standard topics work.
* **SNS delivers only to SQS subscriptions.** Subscriptions using HTTP, HTTPS, Lambda, email, SMS or any other protocol are rejected.
* **You configure the Pub/Sub subscriptions.** Acknowledgement deadlines, retries and dead-letter topics on Pub/Sub subscriptions are set in Pub/Sub, not through SNS.
* **Cross-account callers are not supported.** The topic access policy is checked and enforced for supported callers. You can set it inline on the topic or with one `aws_sns_topic_policy` resource, which is applied with the topic.
* **SNS redrive policies are not supported.** A subscription `RedrivePolicy` is rejected. Pub/Sub's own redelivery and dead-letter settings are separate, and you configure them.

#### Other considerations

**Before going live.** Provision the Pub/Sub topic mapped to each SNS topic, and your Pub/Sub subscriptions, before sending production traffic. Confirm in this deployment that messages reach both your SQS queues and your Pub/Sub consumers before you move publishers.

**What to monitor.** Watch how long messages wait to be sent to Pub/Sub, along with your Pub/Sub backlog and consumer health. An empty Pub/Sub backlog does not mean every published message has reached Pub/Sub; some may still be waiting to be sent.

**Moving from AWS.** Messages still pending on AWS SNS are not transferred. They stay on AWS.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### SNS Standard · SNS publish billing units

Feature: SNS Standard.

Estimated monthly service charges by SNS publish billing units. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![SNS Standard · SNS publish billing units: monthly service charges by SNS publish billing units. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/83834825c40387f8cb8e5a721cacfe07814974d33dc735aaa52212d438978593-light.svg)

![SNS Standard · SNS publish billing units: monthly service charges by SNS publish billing units. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/611208f1706d4ee87695395f953bcb30145d09cde6ae0f5efdf57beeb6f4fb78-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| SNS publish billing units (per second) | SNS (Simple Notification Service) | Target scenario | Pub/Sub | Difference |
| -: | -: | - | -: | -: |
| 0 | 0.00 | Pub/Sub (one staging copy) | 118.18 | 118.18 |
| 0 | 0.00 | Pub/Sub (two staging copies) | 236.36 | 236.36 |
| 1 | 1.31 | Pub/Sub (one staging copy) | 118.37 | 117.06 |
| 1 | 1.31 | Pub/Sub (two staging copies) | 236.55 | 235.24 |
| 10 | 13.14 | Pub/Sub (one staging copy) | 120.14 | 107.00 |
| 10 | 13.14 | Pub/Sub (two staging copies) | 238.31 | 225.17 |
| 100 | 131.40 | Pub/Sub (one staging copy) | 137.76 | 6.36 |
| 100 | 131.40 | Pub/Sub (two staging copies) | 255.94 | 124.54 |
| 1,000 | 1,314.00 | Pub/Sub (one staging copy) | 1,831.68 | 517.68 |
| 1,000 | 1,314.00 | Pub/Sub (two staging copies) | 3,467.52 | 2,153.52 |
| 10,000 | 13,140.00 | Pub/Sub (one staging copy) | Unpriced | Unavailable |
| 10,000 | 13,140.00 | Pub/Sub (two staging copies) | Unpriced | Unavailable |

Estimated allocation, not benchmark calibrated: sized from 2 vCPU, 8 GiB memory and 100 GiB SSD at 0 per second to 32 vCPU, 128 GiB memory and 100 GiB SSD at 1,000 per second. From 10,000 per second the workload exceeds the planning range and the target is unpriced.

**Curve assumptions**

| Target scenario | Assumption | Value | Unit |
| - | - | -: | - |
| Pub/Sub (one staging copy) | Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Pub/Sub (one staging copy) | Representative publication size | 1,024 | bytes |
| Pub/Sub (one staging copy) | Selected delivery subscriptions | 3 | subscriptions/publication |
| Pub/Sub (one staging copy) | Delivery attempts | 1 | attempts/destination |
| Pub/Sub (one staging copy) | Native broker consumer copies | 1 | copies |
| Pub/Sub (one staging copy) | Staging residence window | 60 | seconds |
| Pub/Sub (one staging copy) | Delivery row size | 256 | bytes |
| Pub/Sub (one staging copy) | Target price guess · read | 0 | USD/read |
| Pub/Sub (one staging copy) | Target price guess · write | 0 | USD/write |
| Pub/Sub (one staging copy) | Target price guess · provider operation | 0 | USD/provider operation |
| Pub/Sub (one staging copy) | Target list price · GiB-month | 0.27 | USD/GiB-month |
| Pub/Sub (one staging copy) | Target list price · published GiB | 0.0390625 | USD/published GiB |
| Pub/Sub (one staging copy) | Target list price · delivered GiB | 0.0390625 | USD/delivered GiB |
| Pub/Sub (one staging copy) | Target price guess · network GiB | 0 | USD/network GiB |
| Pub/Sub (one staging copy) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Pub/Sub (one staging copy) | Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Pub/Sub (one staging copy) | Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Pub/Sub (one staging copy) | Target price guess · resource-hour | 0 | USD/resource-hour |
| Pub/Sub (one staging copy) | Target price guess · resource-month | 0 | USD/resource-month |
| Pub/Sub (one staging copy) | Target price guess · input token | 0 | USD/input token |
| Pub/Sub (one staging copy) | Target price guess · output token | 0 | USD/output token |
| Pub/Sub (one staging copy) | Target monthly base charge | 0 | USD/month |
| Pub/Sub (one staging copy) | Approximate target service minimum | 0 | USD/month |
| Pub/Sub (one staging copy) | Minimum primary CPU | 2 | vCPU |
| Pub/Sub (one staging copy) | Minimum primary RAM | 8 | GiB |
| Pub/Sub (one staging copy) | Minimum primary disk | 100 | GiB |
| Pub/Sub (one staging copy) | Additional full-price standby copy | 0 | 0 or 1 |
| Pub/Sub (one staging copy) | Allocated share of provisioned cost | 1 | fraction |
| Pub/Sub (one staging copy) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Pub/Sub (one staging copy) | Planning peak / mean work | 2 | multiplier |
| Pub/Sub (one staging copy) | Planning primary CPU utilization | 0.7 | fraction |
| Pub/Sub (one staging copy) | Resident state reserved in RAM | 0.1 | fraction |
| Pub/Sub (one staging copy) | Planning disk utilization | 0.8 | fraction |
| Pub/Sub (one staging copy) | Maintenance and log disk reserve | 20 | GiB |
| Pub/Sub (one staging copy) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Pub/Sub (one staging copy) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Pub/Sub (one staging copy) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Pub/Sub (one staging copy) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Pub/Sub (one staging copy) | Dependent object sink write price guess | 0.000005 | USD/write |
| Pub/Sub (two staging copies) | Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Pub/Sub (two staging copies) | Representative publication size | 1,024 | bytes |
| Pub/Sub (two staging copies) | Selected delivery subscriptions | 3 | subscriptions/publication |
| Pub/Sub (two staging copies) | Delivery attempts | 1 | attempts/destination |
| Pub/Sub (two staging copies) | Native broker consumer copies | 1 | copies |
| Pub/Sub (two staging copies) | Staging residence window | 60 | seconds |
| Pub/Sub (two staging copies) | Delivery row size | 256 | bytes |
| Pub/Sub (two staging copies) | Target price guess · read | 0 | USD/read |
| Pub/Sub (two staging copies) | Target price guess · write | 0 | USD/write |
| Pub/Sub (two staging copies) | Target price guess · provider operation | 0 | USD/provider operation |
| Pub/Sub (two staging copies) | Target list price · GiB-month | 0.27 | USD/GiB-month |
| Pub/Sub (two staging copies) | Target list price · published GiB | 0.0390625 | USD/published GiB |
| Pub/Sub (two staging copies) | Target list price · delivered GiB | 0.0390625 | USD/delivered GiB |
| Pub/Sub (two staging copies) | Target price guess · network GiB | 0 | USD/network GiB |
| Pub/Sub (two staging copies) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Pub/Sub (two staging copies) | Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Pub/Sub (two staging copies) | Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Pub/Sub (two staging copies) | Target price guess · resource-hour | 0 | USD/resource-hour |
| Pub/Sub (two staging copies) | Target price guess · resource-month | 0 | USD/resource-month |
| Pub/Sub (two staging copies) | Target price guess · input token | 0 | USD/input token |
| Pub/Sub (two staging copies) | Target price guess · output token | 0 | USD/output token |
| Pub/Sub (two staging copies) | Target monthly base charge | 0 | USD/month |
| Pub/Sub (two staging copies) | Approximate target service minimum | 0 | USD/month |
| Pub/Sub (two staging copies) | Minimum primary CPU | 2 | vCPU |
| Pub/Sub (two staging copies) | Minimum primary RAM | 8 | GiB |
| Pub/Sub (two staging copies) | Minimum primary disk | 100 | GiB |
| Pub/Sub (two staging copies) | Additional full-price standby copy | 1 | 0 or 1 |
| Pub/Sub (two staging copies) | Allocated share of provisioned cost | 1 | fraction |
| Pub/Sub (two staging copies) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Pub/Sub (two staging copies) | Planning peak / mean work | 2 | multiplier |
| Pub/Sub (two staging copies) | Planning primary CPU utilization | 0.7 | fraction |
| Pub/Sub (two staging copies) | Resident state reserved in RAM | 0.1 | fraction |
| Pub/Sub (two staging copies) | Planning disk utilization | 0.8 | fraction |
| Pub/Sub (two staging copies) | Maintenance and log disk reserve | 20 | GiB |
| Pub/Sub (two staging copies) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Pub/Sub (two staging copies) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Pub/Sub (two staging copies) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Pub/Sub (two staging copies) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Pub/Sub (two staging copies) | Dependent object sink write price guess | 0.000005 | USD/write |

* Fan-out and retry assumptions remain explicit; this is not destination delivery TPS. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Native Pub/Sub and Service Bus backends also retain durable SNS staging. Price that allocation once; database targets already host the translated writes.
* Native broker subscriptions and SNS delivery claims are distinct surfaces. Supported delivery protocols and delivery consent remain backend-specific.
* Google Pub/Sub bills published and delivered bytes at the Message Delivery Basic rate and retained messages per GiB-month. Each request is billed at no less than 1,000 bytes; the family's batching and delivery assumptions must represent that. The first 10 GiB of combined throughput a month is free per billing account and is not applied. BigQuery and Cloud Storage subscriptions bill USD 50 per TiB instead. Unacknowledged messages younger than one day bill no storage.
* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.
* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
* Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)).
* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.
* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
* AWS Price List API, AmazonSNS offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json)
* Pub/Sub pricing: [https://cloud.google.com/pubsub/pricing](https://cloud.google.com/pubsub/pricing)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* HTTP/email/SMS/mobile delivery prices and destination-service charges; relay submission does not establish managed delivery reputation.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5d3d0327635e1738d279839e37f45523e2cd9b39` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonSNS offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json), [Pub/Sub pricing](https://cloud.google.com/pubsub/pricing).

**SNS Standard → Google Cloud Pub/Sub: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: us-central1. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: SNS publish units | 0.00 |
| Target: Target retained physical data | 0.00 |
| Target: Additional broker replica storage | 0.00 |
| Target: Target ingress events | 0.00 |
| Target: Published bytes | 0.00 |
| Target: Delivered bytes | 0.00 |
| Target: Target native provider operations | 0.00 |
| Target: Execution or worker CPU | 0.00 |
| Target: Execution or worker RAM | 0.00 |
| Target: Selected billable network | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Durable staging CPU | 60.30 |
| Target: Durable staging RAM | 40.88 |
| Target: Durable staging disk | 17.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **118.18** |

Estimated allocation, not benchmark calibrated: sized at 2 vCPU, 8 GiB memory and 100 GiB SSD for this scenario.

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* HTTP/email/SMS/mobile delivery prices and destination-service charges; relay submission does not establish managed delivery reputation.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Representative publication size | 1,024 | bytes |
| Selected delivery subscriptions | 3 | subscriptions/publication |
| Delivery attempts | 1 | attempts/destination |
| Native broker consumer copies | 1 | copies |
| Staging residence window | 60 | seconds |
| Delivery row size | 256 | bytes |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.27 | USD/GiB-month |
| Target list price · published GiB | 0.0390625 | USD/published GiB |
| Target list price · delivered GiB | 0.0390625 | USD/delivered GiB |
| Target price guess · network GiB | 0 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| SNS publish units | 0 | 64-KiB request units |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Native Pub/Sub and Service Bus backends also retain durable SNS staging. Price that allocation once; database targets already host the translated writes.

* Native broker subscriptions and SNS delivery claims are distinct surfaces. Supported delivery protocols and delivery consent remain backend-specific.

* Google Pub/Sub bills published and delivered bytes at the Message Delivery Basic rate and retained messages per GiB-month. Each request is billed at no less than 1,000 bytes; the family's batching and delivery assumptions must represent that. The first 10 GiB of combined throughput a month is free per billing account and is not applied. BigQuery and Cloud Storage subscriptions bill USD 50 per TiB instead. Unacknowledged messages younger than one day bill no storage.

* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.

* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.

* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.

* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.

* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.

* Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)).

* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.

* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.

* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.

List prices read: 2026-10-22. Model: `plan-5d3d0327635e1738d279839e37f45523e2cd9b39` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonSNS offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json), [Pub/Sub pricing](https://cloud.google.com/pubsub/pricing).

### Google Cloud SQL for PostgreSQL

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| At-least-once delivery | Delivery | Supported | - | subscriber outcomes are independent and an uncertain acknowledgement can produce a duplicate |
| Raw message delivery | Delivery | Partial | - | SQS only, subject to the origin's raw-delivery attribute cap; HTTP/S raw delivery is refused |
| Subscriber protocols | Delivery | Partial | - | receiver-authorized SQS delivery is served; HTTP, HTTPS, Lambda, email, SMS, Firehose, mobile push and application are refused |
| Subscription redrive | Delivery | Out of scope | - | RedrivePolicy is refused; bounded retries end in diagnostic state |
| FIFO and ordering | Ordering | Out of scope | - | FIFO topics, deduplication and MessageGroupId are refused |
| Subscription filter policies | Routing | Partial | - | message-attribute and JSON-body scopes use a bounded AWS-compatible grammar subset |
| HTTP/S signature compatibility | Security | Out of scope | - | HTTP and HTTPS subscriptions are refused by the served door |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| AddPermission | Control plane | Out of scope | Full surface | caller and destination grants remain in the environment's existing identity system |
| RemovePermission | Control plane | Out of scope | Full surface | caller and destination grants remain in the environment's existing identity system |
| SetTopicAttributes | Control plane | Partial | Full surface | sets the topic's access Policy, validated as AWS validates it and echoed verbatim, and judged for the owner's own publishes; a statement naming ANOTHER ACCOUNT, or Principal "\*", is validated, stored and echoed but ADMITS NOBODY, because this fabric refuses cross-account bindings and has no unauthenticated door; delivery policy, encryption and delivery-logging changes are refused |
| GetTopicAttributes | Discovery | Partial | Most usage | returns represented attributes and the topic's access Policy, which is AWS's default document for the topic until one is set; delivery-policy values are not fabricated |
| ListSubscriptions | Discovery | Supported | Most usage | tenant-authorized snapshot pages contain no confirmation secrets or receiver handles |
| ListSubscriptionsByTopic | Discovery | Supported | Most usage | tenant-authorized snapshot pages for one topic |
| ListTopics | Discovery | Supported | Common | tenant-authorized snapshot pages contain at most 100 topics |
| Publish | Publish | Partial | Common | holds message bytes in Cloud SQL, then records the publication and selected deliveries in the durable SNS store; success requires both writes |
| PublishBatch | Publish | Partial | Most usage | at most ten independently admitted entries within the 256-KiB aggregate budget |
| ConfirmSubscription | Subscriptions | Out of scope | Common | HTTP and HTTPS subscriptions are not served |
| GetSubscriptionAttributes | Subscriptions | Partial | Most usage | returns supported filter, scope and SQS raw-delivery attributes |
| SetSubscriptionAttributes | Subscriptions | Partial | Most usage | supports FilterPolicy, FilterPolicyScope and SQS RawMessageDelivery; redrive is refused |
| Subscribe | Subscriptions | Partial | Common | receiver-authorized SQS queues in the same tenant and region; HTTP, HTTPS and Lambda are refused |
| Unsubscribe | Subscriptions | Supported | Common | authenticated, generation-aware removal blocks new attempts and retires the binding |
| ListTagsForResource | Tags | Supported | Most usage | returns customer tags without internal ownership metadata |
| TagResource | Tags | Supported | Most usage | customer tags cannot alter internal ownership |
| UntagResource | Tags | Supported | Most usage | - |
| CreateTopic | Topics | Partial | Common | creates an idempotent standard topic with its own access Policy; the delivery-logging sample rates are accepted only at their AWS default and every other attribute is refused |
| DeleteTopic | Topics | Partial | Common | generation-aware deletion cannot remove a replacement topic |

#### How it works

Your application uses the SNS API and keeps its topic and subscription ARNs. Google Cloud SQL for PostgreSQL stores each message body. A separate set of SNS records holds your subscriptions, queue permissions and the result of each delivery.

Publish makes two writes, one to each store. It first saves the message body, then records the publication and one delivery for each subscription that should receive it. Because of this order, a recorded delivery never points to a message that was not saved. If the process stops between the two writes, the saved body is never delivered. Once both writes succeed, the delivery workers find the pending deliveries in the SNS records, even if the process that published the message has stopped.

![Publish stores the message body in Cloud SQL, then records one delivery per matching subscription. Before each send, the queue's permission is checked, then the SQS queue receives the message.](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaXNoIHN0b3JlcyB0aGUgbWVzc2FnZSBib2R5IGluIENsb3VkIFNRTCwgdGhlbiByZWNvcmRzIG9uZSBkZWxpdmVyeSBwZXIgbWF0Y2hpbmcgc3Vic2NyaXB0aW9uLiBCZWZvcmUgZWFjaCBzZW5kLCB0aGUgcXVldWUncyBwZXJtaXNzaW9uIGlzIGNoZWNrZWQsIHRoZW4gdGhlIFNRUyBxdWV1ZSByZWNlaXZlcyB0aGUgbWVzc2FnZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT48ZGVmcz48bWFya2VyIGlkPSJjc3FsLXB1Ymxpc2giIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgc3R5bGU9ImZpbGw6Izk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz48dGV4dCB4PSIyNCIgeT0iMjgiIHN0eWxlPSJmb250OjcwMCAxMHB4IEludGVyLHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MS4ycHg7ZmlsbDojNjQ3NDhiIj5HT09HTEUgQ0xPVUQgwrcgRlJPTSBQVUJMSVNIIFRPIERFTElWRVJZPC90ZXh0PjxyZWN0IHg9IjI0IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojY2JkNWUxO3N0cm9rZS13aWR0aDoxLjUiLz48c3ZnIHg9IjEwMCIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQzMi4wNzEgNDQ1LjM4MyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+PGcgc3R5bGU9ImZpbGwtcnVsZTpub256ZXJvO2NsaXAtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1taXRlcmxpbWl0OjQiPiA8L2c+IDxnIHN0eWxlPSJmaWxsLXJ1bGU6bm9uemVybztjbGlwLXJ1bGU6bm9uemVybztmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjEyLjQ2NTE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQiPiA8cGF0aCBkPSJNMzIzLjIwNSwzMjQuMjI3YzIuODMzLTIzLjYwMSwxLjk4NC0yNy4wNjIsMTkuNTYzLTIzLjIzOWw0LjQ2MywwLjM5MmMxMy41MTcsMC42MTUsMzEuMTk5LTIuMTc0LDQxLjU4Ny03YzIyLjM2Mi0xMC4zNzYsMzUuNjIyLTI3LjcsMTMuNTcyLTIzLjE0OGMtNTAuMjk3LDEwLjM3Ni01My43NTUtNi42NTUtNTMuNzU1LTYuNjU1YzUzLjExMS03OC44MDMsNzUuMzEzLTE3OC44MzYsNTYuMTQ5LTIwMy4zMjIgQzM1Mi41MTQtNS41MzQsMjYyLjAzNiwyNi4wNDksMjYwLjUyMiwyNi44NjlsLTAuNDgyLDAuMDg5Yy05LjkzOC0yLjA2Mi0yMS4wNi0zLjI5NC0zMy41NTQtMy40OTZjLTIyLjc2MS0wLjM3NC00MC4wMzIsNS45NjctNTMuMTMzLDE1LjkwNGMwLDAtMTYxLjQwOC02Ni40OTgtMTUzLjg5OSw4My42MjhjMS41OTcsMzEuOTM2LDQ1Ljc3NywyNDEuNjU1LDk4LjQ3LDE3OC4zMSBjMTkuMjU5LTIzLjE2MywzNy44NzEtNDIuNzQ4LDM3Ljg3MS00Mi43NDhjOS4yNDIsNi4xNCwyMC4zMDcsOS4yNzIsMzEuOTEyLDguMTQ3bDAuODk3LTAuNzY1Yy0wLjI4MSwyLjg3Ni0wLjE1Nyw1LjY4OSwwLjM1OSw5LjAxOWMtMTMuNTcyLDE1LjE2Ny05LjU4NCwxNy44My0zNi43MjMsMjMuNDE2Yy0yNy40NTcsNS42NTktMTEuMzI2LDE1LjczNC0wLjc5NywxOC4zNjdjMTIuNzY4LDMuMTkzLDQyLjMwNSw3LjcxNiw2Mi4yNjgtMjAuMjI0IGwtMC43OTUsMy4xODhjNS4zMjUsNC4yNiw0Ljk2NSwzMC42MTksNS43Miw0OS40NTJjMC43NTYsMTguODM0LDIuMDE3LDM2LjQwOSw1Ljg1Niw0Ni43NzFjMy44MzksMTAuMzYsOC4zNjksMzcuMDUsNDQuMDM2LDI5LjQwNmMyOS44MDktNi4zODgsNTIuNi0xNS41ODIsNTQuNjc3LTEwMS4xMDciIHN0eWxlPSJmaWxsOiMwMDAwMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM3LjM5NTM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXIiLz4gPHBhdGggZD0iTTQwMi4zOTUsMjcxLjIzYy01MC4zMDIsMTAuMzc2LTUzLjc2LTYuNjU1LTUzLjc2LTYuNjU1YzUzLjExMS03OC44MDgsNzUuMzEzLTE3OC44NDMsNTYuMTUzLTIwMy4zMjZjLTUyLjI3LTY2Ljc4NS0xNDIuNzUyLTM1LjItMTQ0LjI2Mi0zNC4zOGwtMC40ODYsMC4wODdjLTkuOTM4LTIuMDYzLTIxLjA2LTMuMjkyLTMzLjU2LTMuNDk2Yy0yMi43NjEtMC4zNzMtNDAuMDI2LDUuOTY3LTUzLjEyNywxNS45MDIgYzAsMC0xNjEuNDExLTY2LjQ5NS0xNTMuOTA0LDgzLjYzYzEuNTk3LDMxLjkzOCw0NS43NzYsMjQxLjY1Nyw5OC40NzEsMTc4LjMxMmMxOS4yNi0yMy4xNjMsMzcuODY5LTQyLjc0OCwzNy44NjktNDIuNzQ4YzkuMjQzLDYuMTQsMjAuMzA4LDkuMjcyLDMxLjkwOCw4LjE0N2wwLjkwMS0wLjc2NWMtMC4yOCwyLjg3Ni0wLjE1Miw1LjY4OSwwLjM2MSw5LjAxOWMtMTMuNTc1LDE1LjE2Ny05LjU4NiwxNy44My0zNi43MjMsMjMuNDE2IGMtMjcuNDU5LDUuNjU5LTExLjMyOCwxNS43MzQtMC43OTYsMTguMzY3YzEyLjc2OCwzLjE5Myw0Mi4zMDcsNy43MTYsNjIuMjY2LTIwLjIyNGwtMC43OTYsMy4xODhjNS4zMTksNC4yNiw5LjA1NCwyNy43MTEsOC40MjgsNDguOTY5Yy0wLjYyNiwyMS4yNTktMS4wNDQsMzUuODU0LDMuMTQ3LDQ3LjI1NGM0LjE5MSwxMS40LDguMzY4LDM3LjA1LDQ0LjA0MiwyOS40MDZjMjkuODA5LTYuMzg4LDQ1LjI1Ni0yMi45NDIsNDcuNDA1LTUwLjU1NSBjMS41MjUtMTkuNjMxLDQuOTc2LTE2LjcyOSw1LjE5NC0zNC4yOGwyLjc2OC04LjMwOWMzLjE5Mi0yNi42MTEsMC41MDctMzUuMTk2LDE4Ljg3Mi0zMS4yMDNsNC40NjMsMC4zOTJjMTMuNTE3LDAuNjE1LDMxLjIwOC0yLjE3NCw0MS41OTEtN2MyMi4zNTgtMTAuMzc2LDM1LjYxOC0yNy43LDEzLjU3My0yMy4xNDh6IiBzdHlsZT0iZmlsbDojMzM2NzkxO3N0cm9rZTpub25lIi8+IDxwYXRoIGQ9Ik0yMTUuODY2LDI4Ni40ODRjLTEuMzg1LDQ5LjUxNiwwLjM0OCw5OS4zNzcsNS4xOTMsMTExLjQ5NWM0Ljg0OCwxMi4xMTgsMTUuMjIzLDM1LjY4OCw1MC45LDI4LjA0NWMyOS44MDYtNi4zOSw0MC42NTEtMTguNzU2LDQ1LjM1Ny00Ni4wNTFjMy40NjYtMjAuMDgyLDEwLjE0OC03NS44NTQsMTEuMDA1LTg3LjI4MSIvPiA8cGF0aCBkPSJNMTczLjEwNCwzOC4yNTZjMCwwLTE2MS41MjEtNjYuMDE2LTE1NC4wMTIsODQuMTA5YzEuNTk3LDMxLjkzOCw0NS43NzksMjQxLjY2NCw5OC40NzMsMTc4LjMxNmMxOS4yNTYtMjMuMTY2LDM2LjY3MS00MS4zMzUsMzYuNjcxLTQxLjMzNSIvPiA8cGF0aCBkPSJNMjYwLjM0OSwyNi4yMDdjLTUuNTkxLDEuNzUzLDg5Ljg0OC0zNC44ODksMTQ0LjA4NywzNC40MTdjMTkuMTU5LDI0LjQ4NC0zLjA0MywxMjQuNTE5LTU2LjE1MywyMDMuMzI5Ii8+IDxwYXRoIGQ9Ik0zNDguMjgyLDI2My45NTNjMCwwLDMuNDYxLDE3LjAzNiw1My43NjQsNi42NTNjMjIuMDQtNC41NTIsOC43NzYsMTIuNzc0LTEzLjU3NywyMy4xNTVjLTE4LjM0NSw4LjUxNC01OS40NzQsMTAuNjk2LTYwLjE0Ni0xLjA2OWMtMS43MjktMzAuMzU1LDIxLjY0Ny0yMS4xMzMsMTkuOTYtMjguNzM5Yy0xLjUyNS02Ljg1LTExLjk3OS0xMy41NzMtMTguODk0LTMwLjMzOCBjLTYuMDM3LTE0LjYzMy04Mi43OTYtMTI2Ljg0OSwyMS4yODctMTEwLjE4M2MzLjgxMy0wLjc4OS0yNy4xNDYtOTkuMDAyLTEyNC41NTMtMTAwLjU5OWMtOTcuMzg1LTEuNTk3LTk0LjE5LDExOS43NjItOTQuMTksMTE5Ljc2MiIgc3R5bGU9InN0cm9rZS1saW5lam9pbjpiZXZlbCIvPiA8cGF0aCBkPSJNMTg4LjYwNCwyNzQuMzM0Yy0xMy41NzcsMTUuMTY2LTkuNTg0LDE3LjgyOS0zNi43MjMsMjMuNDE3Yy0yNy40NTksNS42Ni0xMS4zMjYsMTUuNzMzLTAuNzk3LDE4LjM2NWMxMi43NjgsMy4xOTUsNDIuMzA3LDcuNzE4LDYyLjI2Ni0yMC4yMjljNi4wNzgtOC41MDktMC4wMzYtMjIuMDg2LTguMzg1LTI1LjU0N2MtNC4wMzQtMS42NzEtOS40MjgtMy43NjUtMTYuMzYxLDMuOTk0eiIvPiA8cGF0aCBkPSJNMTg3LjcxNSwyNzQuMDY5Yy0xLjM2OC04LjkxNywyLjkzLTE5LjUyOCw3LjUzNi0zMS45NDJjNi45MjItMTguNjI2LDIyLjg5My0zNy4yNTUsMTAuMTE3LTk2LjMzOWMtOS41MjMtNDQuMDI5LTczLjM5Ni05LjE2My03My40MzYtMy4xOTNjLTAuMDM5LDUuOTY4LDIuODg5LDMwLjI2LTEuMDY3LDU4LjU0OGMtNS4xNjIsMzYuOTEzLDIzLjQ4OCw2OC4xMzIsNTYuNDc5LDY0LjkzOCIvPiA8cGF0aCBkPSJNMTcyLjUxNywxNDEuN2MtMC4yODgsMi4wMzksMy43MzMsNy40OCw4Ljk3Niw4LjIwN2M1LjIzNCwwLjczLDkuNzE0LTMuNTIyLDkuOTk4LTUuNTU5YzAuMjg0LTIuMDM5LTMuNzMyLTQuMjg1LTguOTc3LTUuMDE1Yy01LjIzNy0wLjczMS05LjcxOSwwLjMzMy05Ljk5NiwyLjM2N3oiIHN0eWxlPSJmaWxsOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjQuMTU1O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyIi8+IDxwYXRoIGQ9Ik0zMzEuOTQxLDEzNy41NDNjMC4yODQsMi4wMzktMy43MzIsNy40OC04Ljk3Niw4LjIwN2MtNS4yMzgsMC43My05LjcxOC0zLjUyMi0xMC4wMDUtNS41NTljLTAuMjc3LTIuMDM5LDMuNzQtNC4yODUsOC45NzktNS4wMTVjNS4yMzktMC43Myw5LjcxOCwwLjMzMywxMC4wMDIsMi4zNjh6IiBzdHlsZT0iZmlsbDojRkZGRkZGO3N0cm9rZS13aWR0aDoyLjA3NzU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXIiLz4gPHBhdGggZD0iTTM1MC42NzYsMTIzLjQzMmMwLjg2MywxNS45OTQtMy40NDUsMjYuODg4LTMuOTg4LDQzLjkxNGMtMC44MDQsMjQuNzQ4LDExLjc5OSw1My4wNzQtNy4xOTEsODEuNDM1Ii8+IDxwYXRoIGQ9Ik0wLDYwLjIzMiIgc3R5bGU9InN0cm9rZS13aWR0aDozIi8+IDwvZz48L3N2Zz48dGV4dCB4PSIxMTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiMwZjE3MmEiPkNsb3VkIFNRTDwvdGV4dD48dGV4dCB4PSIxMTIiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6IzY0NzQ4YiI+U3RvcmVzIHRoZSBtZXNzYWdlIGJvZHk8L3RleHQ+PGxpbmUgeDE9IjIwMCIgeTE9IjEwOCIgeDI9IjIyOCIgeTI9IjEwOCIgbWFya2VyLWVuZD0idXJsKCNjc3FsLXB1Ymxpc2gpIiBzdHlsZT0ic3Ryb2tlOiM5NGEzYjg7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iMjI4IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojY2JkNWUxO3N0cm9rZS13aWR0aDoxLjUiLz48dGV4dCB4PSIzMTYiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiMwZjE3MmEiPkRlbGl2ZXJ5IHJlY29yZHM8L3RleHQ+PHRleHQgeD0iMzE2IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM2NDc0OGIiPk9uZSBwZXIgc3Vic2NyaXB0aW9uPC90ZXh0PjxsaW5lIHgxPSI0MDQiIHkxPSIxMDgiIHgyPSI0MzIiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjY3NxbC1wdWJsaXNoKSIgc3R5bGU9InN0cm9rZTojOTRhM2I4O3N0cm9rZS13aWR0aDoyO2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjQzMiIgeT0iNjAiIHdpZHRoPSIxNzYiIGhlaWdodD0iOTYiIHJ4PSIxMSIgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2NiZDVlMTtzdHJva2Utd2lkdGg6MS41Ii8+PHRleHQgeD0iNTIwIiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojMGYxNzJhIj5QZXJtaXNzaW9uIGNoZWNrPC90ZXh0Pjx0ZXh0IHg9IjUyMCIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojNjQ3NDhiIj5RdWV1ZSBzdGlsbCBhbGxvd3MgdG9waWM8L3RleHQ+PGxpbmUgeDE9IjYwOCIgeTE9IjEwOCIgeDI9IjYzNiIgeTI9IjEwOCIgbWFya2VyLWVuZD0idXJsKCNjc3FsLXB1Ymxpc2gpIiBzdHlsZT0ic3Ryb2tlOiM5NGEzYjg7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iNjM2IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojY2JkNWUxO3N0cm9rZS13aWR0aDoxLjUiLz48c3ZnIHg9IjcxMiIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDMwNCAxODIiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHN0eWxlPSJkaXNwbGF5OmlubGluZSI+PGc+IDxwYXRoIGQ9Ik04Ni40LDY2LjRjMCwzLjcsMC40LDYuNywxLjEsOC45YzAuOCwyLjIsMS44LDQuNiwzLjIsNy4yYzAuNSwwLjgsMC43LDEuNiwwLjcsMi4zYzAsMS0wLjYsMi0xLjksM2wtNi4zLDQuMiBjLTAuOSwwLjYtMS44LDAuOS0yLjYsMC45Yy0xLDAtMi0wLjUtMy0xLjRDNzYuMiw5MCw3NSw4OC40LDc0LDg2LjhjLTEtMS43LTItMy42LTMuMS01LjljLTcuOCw5LjItMTcuNiwxMy44LTI5LjQsMTMuOCBjLTguNCwwLTE1LjEtMi40LTIwLTcuMmMtNC45LTQuOC03LjQtMTEuMi03LjQtMTkuMmMwLTguNSwzLTE1LjQsOS4xLTIwLjZjNi4xLTUuMiwxNC4yLTcuOCwyNC41LTcuOGMzLjQsMCw2LjksMC4zLDEwLjYsMC44IGMzLjcsMC41LDcuNSwxLjMsMTEuNSwyLjJ2LTcuM2MwLTcuNi0xLjYtMTIuOS00LjctMTZjLTMuMi0zLjEtOC42LTQuNi0xNi4zLTQuNmMtMy41LDAtNy4xLDAuNC0xMC44LDEuM2MtMy43LDAuOS03LjMsMi0xMC44LDMuNCBjLTEuNiwwLjctMi44LDEuMS0zLjUsMS4zYy0wLjcsMC4yLTEuMiwwLjMtMS42LDAuM2MtMS40LDAtMi4xLTEtMi4xLTMuMXYtNC45YzAtMS42LDAuMi0yLjgsMC43LTMuNWMwLjUtMC43LDEuNC0xLjQsMi44LTIuMSBjMy41LTEuOCw3LjctMy4zLDEyLjYtNC41YzQuOS0xLjMsMTAuMS0xLjksMTUuNi0xLjljMTEuOSwwLDIwLjYsMi43LDI2LjIsOC4xYzUuNSw1LjQsOC4zLDEzLjYsOC4zLDI0LjZWNjYuNHogTTQ1LjgsODEuNiBjMy4zLDAsNi43LTAuNiwxMC4zLTEuOGMzLjYtMS4yLDYuOC0zLjQsOS41LTYuNGMxLjYtMS45LDIuOC00LDMuNC02LjRjMC42LTIuNCwxLTUuMywxLTguN3YtNC4yYy0yLjktMC43LTYtMS4zLTkuMi0xLjcgYy0zLjItMC40LTYuMy0wLjYtOS40LTAuNmMtNi43LDAtMTEuNiwxLjMtMTQuOSw0Yy0zLjMsMi43LTQuOSw2LjUtNC45LDExLjVjMCw0LjcsMS4yLDguMiwzLjcsMTAuNiBDMzcuNyw4MC40LDQxLjIsODEuNiw0NS44LDgxLjZ6IE0xMjYuMSw5Mi40Yy0xLjgsMC0zLTAuMy0zLjgtMWMtMC44LTAuNi0xLjUtMi0yLjEtMy45TDk2LjcsMTAuMmMtMC42LTItMC45LTMuMy0wLjktNCBjMC0xLjYsMC44LTIuNSwyLjQtMi41aDkuOGMxLjksMCwzLjIsMC4zLDMuOSwxYzAuOCwwLjYsMS40LDIsMiwzLjlsMTYuOCw2Ni4ybDE1LjYtNjYuMmMwLjUtMiwxLjEtMy4zLDEuOS0zLjljMC44LTAuNiwyLjItMSw0LTEgaDhjMS45LDAsMy4yLDAuMyw0LDFjMC44LDAuNiwxLjUsMiwxLjksMy45bDE1LjgsNjdsMTcuMy02N2MwLjYtMiwxLjMtMy4zLDItMy45YzAuOC0wLjYsMi4xLTEsMy45LTFoOS4zYzEuNiwwLDIuNSwwLjgsMi41LDIuNSBjMCwwLjUtMC4xLDEtMC4yLDEuNmMtMC4xLDAuNi0wLjMsMS40LTAuNywyLjVsLTI0LjEsNzcuM2MtMC42LDItMS4zLDMuMy0yLjEsMy45Yy0wLjgsMC42LTIuMSwxLTMuOCwxaC04LjZjLTEuOSwwLTMuMi0wLjMtNC0xIGMtMC44LTAuNy0xLjUtMi0xLjktNEwxNTYsMjNsLTE1LjQsNjQuNGMtMC41LDItMS4xLDMuMy0xLjksNGMtMC44LDAuNy0yLjIsMS00LDFIMTI2LjF6IE0yNTQuNiw5NS4xYy01LjIsMC0xMC40LTAuNi0xNS40LTEuOCBjLTUtMS4yLTguOS0yLjUtMTEuNS00Yy0xLjYtMC45LTIuNy0xLjktMy4xLTIuOGMtMC40LTAuOS0wLjYtMS45LTAuNi0yLjh2LTUuMWMwLTIuMSwwLjgtMy4xLDIuMy0zLjFjMC42LDAsMS4yLDAuMSwxLjgsMC4zIGMwLjYsMC4yLDEuNSwwLjYsMi41LDFjMy40LDEuNSw3LjEsMi43LDExLDMuNWM0LDAuOCw3LjksMS4yLDExLjksMS4yYzYuMywwLDExLjItMS4xLDE0LjYtMy4zYzMuNC0yLjIsNS4yLTUuNCw1LjItOS41IGMwLTIuOC0wLjktNS4xLTIuNy03Yy0xLjgtMS45LTUuMi0zLjYtMTAuMS01LjJMMjQ2LDUyYy03LjMtMi4zLTEyLjctNS43LTE2LTEwLjJjLTMuMy00LjQtNS05LjMtNS0xNC41YzAtNC4yLDAuOS03LjksMi43LTExLjEgYzEuOC0zLjIsNC4yLTYsNy4yLTguMmMzLTIuMyw2LjQtNCwxMC40LTUuMmM0LTEuMiw4LjItMS43LDEyLjYtMS43YzIuMiwwLDQuNSwwLjEsNi43LDAuNGMyLjMsMC4zLDQuNCwwLjcsNi41LDEuMSBjMiwwLjUsMy45LDEsNS43LDEuNmMxLjgsMC42LDMuMiwxLjIsNC4yLDEuOGMxLjQsMC44LDIuNCwxLjYsMywyLjVjMC42LDAuOCwwLjksMS45LDAuOSwzLjN2NC43YzAsMi4xLTAuOCwzLjItMi4zLDMuMiBjLTAuOCwwLTIuMS0wLjQtMy44LTEuMmMtNS43LTIuNi0xMi4xLTMuOS0xOS4yLTMuOWMtNS43LDAtMTAuMiwwLjktMTMuMywyLjhjLTMuMSwxLjktNC43LDQuOC00LjcsOC45YzAsMi44LDEsNS4yLDMsNy4xIGMyLDEuOSw1LjcsMy44LDExLDUuNWwxNC4yLDQuNWM3LjIsMi4zLDEyLjQsNS41LDE1LjUsOS42YzMuMSw0LjEsNC42LDguOCw0LjYsMTRjMCw0LjMtMC45LDguMi0yLjYsMTEuNiBjLTEuOCwzLjQtNC4yLDYuNC03LjMsOC44Yy0zLjEsMi41LTYuOCw0LjMtMTEuMSw1LjZDMjY0LjQsOTQuNCwyNTkuNyw5NS4xLDI1NC42LDk1LjF6IiBzdHlsZT0iZmlsbDojMjUyRjNFIi8+IDxnPiA8cGF0aCBkPSJNMjczLjUsMTQzLjdjLTMyLjksMjQuMy04MC43LDM3LjItMTIxLjgsMzcuMmMtNTcuNiwwLTEwOS41LTIxLjMtMTQ4LjctNTYuN2MtMy4xLTIuOC0wLjMtNi42LDMuNC00LjQgYzQyLjQsMjQuNiw5NC43LDM5LjUsMTQ4LjgsMzkuNWMzNi41LDAsNzYuNi03LjYsMTEzLjUtMjMuMkMyNzQuMiwxMzMuNiwyNzguOSwxMzkuNywyNzMuNSwxNDMuN3oiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPHBhdGggZD0iTTI4Ny4yLDEyOC4xYy00LjItNS40LTI3LjgtMi42LTM4LjUtMS4zYy0zLjIsMC40LTMuNy0yLjQtMC44LTQuNWMxOC44LTEzLjIsNDkuNy05LjQsNTMuMy01IGMzLjYsNC41LTEsMzUuNC0xOC42LDUwLjJjLTIuNywyLjMtNS4zLDEuMS00LjEtMS45QzI4Mi41LDE1NS43LDI5MS40LDEzMy40LDI4Ny4yLDEyOC4xeiIgc3R5bGU9ImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6I0ZGOTkwMCIvPiA8L2c+IDwvZz48L3N2Zz48c3ZnIHg9IjcxMiIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDMwNCAxODIiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjxnPiA8cGF0aCBkPSJNODYuNCw2Ni40YzAsMy43LDAuNCw2LjcsMS4xLDguOWMwLjgsMi4yLDEuOCw0LjYsMy4yLDcuMmMwLjUsMC44LDAuNywxLjYsMC43LDIuM2MwLDEtMC42LDItMS45LDNsLTYuMyw0LjIgYy0wLjksMC42LTEuOCwwLjktMi42LDAuOWMtMSwwLTItMC41LTMtMS40Qzc2LjIsOTAsNzUsODguNCw3NCw4Ni44Yy0xLTEuNy0yLTMuNi0zLjEtNS45Yy03LjgsOS4yLTE3LjYsMTMuOC0yOS40LDEzLjggYy04LjQsMC0xNS4xLTIuNC0yMC03LjJjLTQuOS00LjgtNy40LTExLjItNy40LTE5LjJjMC04LjUsMy0xNS40LDkuMS0yMC42YzYuMS01LjIsMTQuMi03LjgsMjQuNS03LjhjMy40LDAsNi45LDAuMywxMC42LDAuOCBjMy43LDAuNSw3LjUsMS4zLDExLjUsMi4ydi03LjNjMC03LjYtMS42LTEyLjktNC43LTE2Yy0zLjItMy4xLTguNi00LjYtMTYuMy00LjZjLTMuNSwwLTcuMSwwLjQtMTAuOCwxLjNjLTMuNywwLjktNy4zLDItMTAuOCwzLjQgYy0xLjYsMC43LTIuOCwxLjEtMy41LDEuM2MtMC43LDAuMi0xLjIsMC4zLTEuNiwwLjNjLTEuNCwwLTIuMS0xLTIuMS0zLjF2LTQuOWMwLTEuNiwwLjItMi44LDAuNy0zLjVjMC41LTAuNywxLjQtMS40LDIuOC0yLjEgYzMuNS0xLjgsNy43LTMuMywxMi42LTQuNWM0LjktMS4zLDEwLjEtMS45LDE1LjYtMS45YzExLjksMCwyMC42LDIuNywyNi4yLDguMWM1LjUsNS40LDguMywxMy42LDguMywyNC42VjY2LjR6IE00NS44LDgxLjYgYzMuMywwLDYuNy0wLjYsMTAuMy0xLjhjMy42LTEuMiw2LjgtMy40LDkuNS02LjRjMS42LTEuOSwyLjgtNCwzLjQtNi40YzAuNi0yLjQsMS01LjMsMS04Ljd2LTQuMmMtMi45LTAuNy02LTEuMy05LjItMS43IGMtMy4yLTAuNC02LjMtMC42LTkuNC0wLjZjLTYuNywwLTExLjYsMS4zLTE0LjksNGMtMy4zLDIuNy00LjksNi41LTQuOSwxMS41YzAsNC43LDEuMiw4LjIsMy43LDEwLjYgQzM3LjcsODAuNCw0MS4yLDgxLjYsNDUuOCw4MS42eiBNMTI2LjEsOTIuNGMtMS44LDAtMy0wLjMtMy44LTFjLTAuOC0wLjYtMS41LTItMi4xLTMuOUw5Ni43LDEwLjJjLTAuNi0yLTAuOS0zLjMtMC45LTQgYzAtMS42LDAuOC0yLjUsMi40LTIuNWg5LjhjMS45LDAsMy4yLDAuMywzLjksMWMwLjgsMC42LDEuNCwyLDIsMy45bDE2LjgsNjYuMmwxNS42LTY2LjJjMC41LTIsMS4xLTMuMywxLjktMy45YzAuOC0wLjYsMi4yLTEsNC0xIGg4YzEuOSwwLDMuMiwwLjMsNCwxYzAuOCwwLjYsMS41LDIsMS45LDMuOWwxNS44LDY3bDE3LjMtNjdjMC42LTIsMS4zLTMuMywyLTMuOWMwLjgtMC42LDIuMS0xLDMuOS0xaDkuM2MxLjYsMCwyLjUsMC44LDIuNSwyLjUgYzAsMC41LTAuMSwxLTAuMiwxLjZjLTAuMSwwLjYtMC4zLDEuNC0wLjcsMi41bC0yNC4xLDc3LjNjLTAuNiwyLTEuMywzLjMtMi4xLDMuOWMtMC44LDAuNi0yLjEsMS0zLjgsMWgtOC42Yy0xLjksMC0zLjItMC4zLTQtMSBjLTAuOC0wLjctMS41LTItMS45LTRMMTU2LDIzbC0xNS40LDY0LjRjLTAuNSwyLTEuMSwzLjMtMS45LDRjLTAuOCwwLjctMi4yLDEtNCwxSDEyNi4xeiBNMjU0LjYsOTUuMWMtNS4yLDAtMTAuNC0wLjYtMTUuNC0xLjggYy01LTEuMi04LjktMi41LTExLjUtNGMtMS42LTAuOS0yLjctMS45LTMuMS0yLjhjLTAuNC0wLjktMC42LTEuOS0wLjYtMi44di01LjFjMC0yLjEsMC44LTMuMSwyLjMtMy4xYzAuNiwwLDEuMiwwLjEsMS44LDAuMyBjMC42LDAuMiwxLjUsMC42LDIuNSwxYzMuNCwxLjUsNy4xLDIuNywxMSwzLjVjNCwwLjgsNy45LDEuMiwxMS45LDEuMmM2LjMsMCwxMS4yLTEuMSwxNC42LTMuM2MzLjQtMi4yLDUuMi01LjQsNS4yLTkuNSBjMC0yLjgtMC45LTUuMS0yLjctN2MtMS44LTEuOS01LjItMy42LTEwLjEtNS4yTDI0Niw1MmMtNy4zLTIuMy0xMi43LTUuNy0xNi0xMC4yYy0zLjMtNC40LTUtOS4zLTUtMTQuNWMwLTQuMiwwLjktNy45LDIuNy0xMS4xIGMxLjgtMy4yLDQuMi02LDcuMi04LjJjMy0yLjMsNi40LTQsMTAuNC01LjJjNC0xLjIsOC4yLTEuNywxMi42LTEuN2MyLjIsMCw0LjUsMC4xLDYuNywwLjRjMi4zLDAuMyw0LjQsMC43LDYuNSwxLjEgYzIsMC41LDMuOSwxLDUuNywxLjZjMS44LDAuNiwzLjIsMS4yLDQuMiwxLjhjMS40LDAuOCwyLjQsMS42LDMsMi41YzAuNiwwLjgsMC45LDEuOSwwLjksMy4zdjQuN2MwLDIuMS0wLjgsMy4yLTIuMywzLjIgYy0wLjgsMC0yLjEtMC40LTMuOC0xLjJjLTUuNy0yLjYtMTIuMS0zLjktMTkuMi0zLjljLTUuNywwLTEwLjIsMC45LTEzLjMsMi44Yy0zLjEsMS45LTQuNyw0LjgtNC43LDguOWMwLDIuOCwxLDUuMiwzLDcuMSBjMiwxLjksNS43LDMuOCwxMSw1LjVsMTQuMiw0LjVjNy4yLDIuMywxMi40LDUuNSwxNS41LDkuNmMzLjEsNC4xLDQuNiw4LjgsNC42LDE0YzAsNC4zLTAuOSw4LjItMi42LDExLjYgYy0xLjgsMy40LTQuMiw2LjQtNy4zLDguOGMtMy4xLDIuNS02LjgsNC4zLTExLjEsNS42QzI2NC40LDk0LjQsMjU5LjcsOTUuMSwyNTQuNiw5NS4xeiIgc3R5bGU9ImZpbGw6I0ZGRkZGRiIvPiA8Zz4gPHBhdGggZD0iTTI3My41LDE0My43Yy0zMi45LDI0LjMtODAuNywzNy4yLTEyMS44LDM3LjJjLTU3LjYsMC0xMDkuNS0yMS4zLTE0OC43LTU2LjdjLTMuMS0yLjgtMC4zLTYuNiwzLjQtNC40IGM0Mi40LDI0LjYsOTQuNywzOS41LDE0OC44LDM5LjVjMzYuNSwwLDc2LjYtNy42LDExMy41LTIzLjJDMjc0LjIsMTMzLjYsMjc4LjksMTM5LjcsMjczLjUsMTQzLjd6IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkY5OTAwIi8+IDxwYXRoIGQ9Ik0yODcuMiwxMjguMWMtNC4yLTUuNC0yNy44LTIuNi0zOC41LTEuM2MtMy4yLDAuNC0zLjctMi40LTAuOC00LjVjMTguOC0xMy4yLDQ5LjctOS40LDUzLjMtNSBjMy42LDQuNS0xLDM1LjQtMTguNiw1MC4yYy0yLjcsMi4zLTUuMywxLjEtNC4xLTEuOUMyODIuNSwxNTUuNywyOTEuNCwxMzMuNCwyODcuMiwxMjguMXoiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPC9nPiA8L2c+PC9zdmc+PHRleHQgeD0iNzI0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojMGYxNzJhIj5TUVMgcXVldWU8L3RleHQ+PHRleHQgeD0iNzI0IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM2NDc0OGIiPlJlY2VpdmVzIHRoZSBtZXNzYWdlPC90ZXh0Pjwvc3ZnPg==)

![Publish stores the message body in Cloud SQL, then records one delivery per matching subscription. Before each send, the queue's permission is checked, then the SQS queue receives the message.](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaXNoIHN0b3JlcyB0aGUgbWVzc2FnZSBib2R5IGluIENsb3VkIFNRTCwgdGhlbiByZWNvcmRzIG9uZSBkZWxpdmVyeSBwZXIgbWF0Y2hpbmcgc3Vic2NyaXB0aW9uLiBCZWZvcmUgZWFjaCBzZW5kLCB0aGUgcXVldWUncyBwZXJtaXNzaW9uIGlzIGNoZWNrZWQsIHRoZW4gdGhlIFNRUyBxdWV1ZSByZWNlaXZlcyB0aGUgbWVzc2FnZS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT48ZGVmcz48bWFya2VyIGlkPSJjc3FsLXB1Ymxpc2giIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgc3R5bGU9ImZpbGw6IzY0NzQ4YiIvPjwvbWFya2VyPjwvZGVmcz48dGV4dCB4PSIyNCIgeT0iMjgiIHN0eWxlPSJmb250OjcwMCAxMHB4IEludGVyLHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6MS4ycHg7ZmlsbDojOTRhM2I4Ij5HT09HTEUgQ0xPVUQgwrcgRlJPTSBQVUJMSVNIIFRPIERFTElWRVJZPC90ZXh0PjxyZWN0IHg9IjI0IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojMWUyOTNiO3N0cm9rZTojNDc1NTY5O3N0cm9rZS13aWR0aDoxLjUiLz48c3ZnIHg9IjEwMCIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQzMi4wNzEgNDQ1LjM4MyIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+PGcgc3R5bGU9ImZpbGwtcnVsZTpub256ZXJvO2NsaXAtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS1taXRlcmxpbWl0OjQiPiA8L2c+IDxnIHN0eWxlPSJmaWxsLXJ1bGU6bm9uemVybztjbGlwLXJ1bGU6bm9uemVybztmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjEyLjQ2NTE7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQiPiA8cGF0aCBkPSJNMzIzLjIwNSwzMjQuMjI3YzIuODMzLTIzLjYwMSwxLjk4NC0yNy4wNjIsMTkuNTYzLTIzLjIzOWw0LjQ2MywwLjM5MmMxMy41MTcsMC42MTUsMzEuMTk5LTIuMTc0LDQxLjU4Ny03YzIyLjM2Mi0xMC4zNzYsMzUuNjIyLTI3LjcsMTMuNTcyLTIzLjE0OGMtNTAuMjk3LDEwLjM3Ni01My43NTUtNi42NTUtNTMuNzU1LTYuNjU1YzUzLjExMS03OC44MDMsNzUuMzEzLTE3OC44MzYsNTYuMTQ5LTIwMy4zMjIgQzM1Mi41MTQtNS41MzQsMjYyLjAzNiwyNi4wNDksMjYwLjUyMiwyNi44NjlsLTAuNDgyLDAuMDg5Yy05LjkzOC0yLjA2Mi0yMS4wNi0zLjI5NC0zMy41NTQtMy40OTZjLTIyLjc2MS0wLjM3NC00MC4wMzIsNS45NjctNTMuMTMzLDE1LjkwNGMwLDAtMTYxLjQwOC02Ni40OTgtMTUzLjg5OSw4My42MjhjMS41OTcsMzEuOTM2LDQ1Ljc3NywyNDEuNjU1LDk4LjQ3LDE3OC4zMSBjMTkuMjU5LTIzLjE2MywzNy44NzEtNDIuNzQ4LDM3Ljg3MS00Mi43NDhjOS4yNDIsNi4xNCwyMC4zMDcsOS4yNzIsMzEuOTEyLDguMTQ3bDAuODk3LTAuNzY1Yy0wLjI4MSwyLjg3Ni0wLjE1Nyw1LjY4OSwwLjM1OSw5LjAxOWMtMTMuNTcyLDE1LjE2Ny05LjU4NCwxNy44My0zNi43MjMsMjMuNDE2Yy0yNy40NTcsNS42NTktMTEuMzI2LDE1LjczNC0wLjc5NywxOC4zNjdjMTIuNzY4LDMuMTkzLDQyLjMwNSw3LjcxNiw2Mi4yNjgtMjAuMjI0IGwtMC43OTUsMy4xODhjNS4zMjUsNC4yNiw0Ljk2NSwzMC42MTksNS43Miw0OS40NTJjMC43NTYsMTguODM0LDIuMDE3LDM2LjQwOSw1Ljg1Niw0Ni43NzFjMy44MzksMTAuMzYsOC4zNjksMzcuMDUsNDQuMDM2LDI5LjQwNmMyOS44MDktNi4zODgsNTIuNi0xNS41ODIsNTQuNjc3LTEwMS4xMDciIHN0eWxlPSJmaWxsOiMwMDAwMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjM3LjM5NTM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXIiLz4gPHBhdGggZD0iTTQwMi4zOTUsMjcxLjIzYy01MC4zMDIsMTAuMzc2LTUzLjc2LTYuNjU1LTUzLjc2LTYuNjU1YzUzLjExMS03OC44MDgsNzUuMzEzLTE3OC44NDMsNTYuMTUzLTIwMy4zMjZjLTUyLjI3LTY2Ljc4NS0xNDIuNzUyLTM1LjItMTQ0LjI2Mi0zNC4zOGwtMC40ODYsMC4wODdjLTkuOTM4LTIuMDYzLTIxLjA2LTMuMjkyLTMzLjU2LTMuNDk2Yy0yMi43NjEtMC4zNzMtNDAuMDI2LDUuOTY3LTUzLjEyNywxNS45MDIgYzAsMC0xNjEuNDExLTY2LjQ5NS0xNTMuOTA0LDgzLjYzYzEuNTk3LDMxLjkzOCw0NS43NzYsMjQxLjY1Nyw5OC40NzEsMTc4LjMxMmMxOS4yNi0yMy4xNjMsMzcuODY5LTQyLjc0OCwzNy44NjktNDIuNzQ4YzkuMjQzLDYuMTQsMjAuMzA4LDkuMjcyLDMxLjkwOCw4LjE0N2wwLjkwMS0wLjc2NWMtMC4yOCwyLjg3Ni0wLjE1Miw1LjY4OSwwLjM2MSw5LjAxOWMtMTMuNTc1LDE1LjE2Ny05LjU4NiwxNy44My0zNi43MjMsMjMuNDE2IGMtMjcuNDU5LDUuNjU5LTExLjMyOCwxNS43MzQtMC43OTYsMTguMzY3YzEyLjc2OCwzLjE5Myw0Mi4zMDcsNy43MTYsNjIuMjY2LTIwLjIyNGwtMC43OTYsMy4xODhjNS4zMTksNC4yNiw5LjA1NCwyNy43MTEsOC40MjgsNDguOTY5Yy0wLjYyNiwyMS4yNTktMS4wNDQsMzUuODU0LDMuMTQ3LDQ3LjI1NGM0LjE5MSwxMS40LDguMzY4LDM3LjA1LDQ0LjA0MiwyOS40MDZjMjkuODA5LTYuMzg4LDQ1LjI1Ni0yMi45NDIsNDcuNDA1LTUwLjU1NSBjMS41MjUtMTkuNjMxLDQuOTc2LTE2LjcyOSw1LjE5NC0zNC4yOGwyLjc2OC04LjMwOWMzLjE5Mi0yNi42MTEsMC41MDctMzUuMTk2LDE4Ljg3Mi0zMS4yMDNsNC40NjMsMC4zOTJjMTMuNTE3LDAuNjE1LDMxLjIwOC0yLjE3NCw0MS41OTEtN2MyMi4zNTgtMTAuMzc2LDM1LjYxOC0yNy43LDEzLjU3My0yMy4xNDh6IiBzdHlsZT0iZmlsbDojMzM2NzkxO3N0cm9rZTpub25lIi8+IDxwYXRoIGQ9Ik0yMTUuODY2LDI4Ni40ODRjLTEuMzg1LDQ5LjUxNiwwLjM0OCw5OS4zNzcsNS4xOTMsMTExLjQ5NWM0Ljg0OCwxMi4xMTgsMTUuMjIzLDM1LjY4OCw1MC45LDI4LjA0NWMyOS44MDYtNi4zOSw0MC42NTEtMTguNzU2LDQ1LjM1Ny00Ni4wNTFjMy40NjYtMjAuMDgyLDEwLjE0OC03NS44NTQsMTEuMDA1LTg3LjI4MSIvPiA8cGF0aCBkPSJNMTczLjEwNCwzOC4yNTZjMCwwLTE2MS41MjEtNjYuMDE2LTE1NC4wMTIsODQuMTA5YzEuNTk3LDMxLjkzOCw0NS43NzksMjQxLjY2NCw5OC40NzMsMTc4LjMxNmMxOS4yNTYtMjMuMTY2LDM2LjY3MS00MS4zMzUsMzYuNjcxLTQxLjMzNSIvPiA8cGF0aCBkPSJNMjYwLjM0OSwyNi4yMDdjLTUuNTkxLDEuNzUzLDg5Ljg0OC0zNC44ODksMTQ0LjA4NywzNC40MTdjMTkuMTU5LDI0LjQ4NC0zLjA0MywxMjQuNTE5LTU2LjE1MywyMDMuMzI5Ii8+IDxwYXRoIGQ9Ik0zNDguMjgyLDI2My45NTNjMCwwLDMuNDYxLDE3LjAzNiw1My43NjQsNi42NTNjMjIuMDQtNC41NTIsOC43NzYsMTIuNzc0LTEzLjU3NywyMy4xNTVjLTE4LjM0NSw4LjUxNC01OS40NzQsMTAuNjk2LTYwLjE0Ni0xLjA2OWMtMS43MjktMzAuMzU1LDIxLjY0Ny0yMS4xMzMsMTkuOTYtMjguNzM5Yy0xLjUyNS02Ljg1LTExLjk3OS0xMy41NzMtMTguODk0LTMwLjMzOCBjLTYuMDM3LTE0LjYzMy04Mi43OTYtMTI2Ljg0OSwyMS4yODctMTEwLjE4M2MzLjgxMy0wLjc4OS0yNy4xNDYtOTkuMDAyLTEyNC41NTMtMTAwLjU5OWMtOTcuMzg1LTEuNTk3LTk0LjE5LDExOS43NjItOTQuMTksMTE5Ljc2MiIgc3R5bGU9InN0cm9rZS1saW5lam9pbjpiZXZlbCIvPiA8cGF0aCBkPSJNMTg4LjYwNCwyNzQuMzM0Yy0xMy41NzcsMTUuMTY2LTkuNTg0LDE3LjgyOS0zNi43MjMsMjMuNDE3Yy0yNy40NTksNS42Ni0xMS4zMjYsMTUuNzMzLTAuNzk3LDE4LjM2NWMxMi43NjgsMy4xOTUsNDIuMzA3LDcuNzE4LDYyLjI2Ni0yMC4yMjljNi4wNzgtOC41MDktMC4wMzYtMjIuMDg2LTguMzg1LTI1LjU0N2MtNC4wMzQtMS42NzEtOS40MjgtMy43NjUtMTYuMzYxLDMuOTk0eiIvPiA8cGF0aCBkPSJNMTg3LjcxNSwyNzQuMDY5Yy0xLjM2OC04LjkxNywyLjkzLTE5LjUyOCw3LjUzNi0zMS45NDJjNi45MjItMTguNjI2LDIyLjg5My0zNy4yNTUsMTAuMTE3LTk2LjMzOWMtOS41MjMtNDQuMDI5LTczLjM5Ni05LjE2My03My40MzYtMy4xOTNjLTAuMDM5LDUuOTY4LDIuODg5LDMwLjI2LTEuMDY3LDU4LjU0OGMtNS4xNjIsMzYuOTEzLDIzLjQ4OCw2OC4xMzIsNTYuNDc5LDY0LjkzOCIvPiA8cGF0aCBkPSJNMTcyLjUxNywxNDEuN2MtMC4yODgsMi4wMzksMy43MzMsNy40OCw4Ljk3Niw4LjIwN2M1LjIzNCwwLjczLDkuNzE0LTMuNTIyLDkuOTk4LTUuNTU5YzAuMjg0LTIuMDM5LTMuNzMyLTQuMjg1LTguOTc3LTUuMDE1Yy01LjIzNy0wLjczMS05LjcxOSwwLjMzMy05Ljk5NiwyLjM2N3oiIHN0eWxlPSJmaWxsOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjQuMTU1O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyIi8+IDxwYXRoIGQ9Ik0zMzEuOTQxLDEzNy41NDNjMC4yODQsMi4wMzktMy43MzIsNy40OC04Ljk3Niw4LjIwN2MtNS4yMzgsMC43My05LjcxOC0zLjUyMi0xMC4wMDUtNS41NTljLTAuMjc3LTIuMDM5LDMuNzQtNC4yODUsOC45NzktNS4wMTVjNS4yMzktMC43Myw5LjcxOCwwLjMzMywxMC4wMDIsMi4zNjh6IiBzdHlsZT0iZmlsbDojRkZGRkZGO3N0cm9rZS13aWR0aDoyLjA3NzU7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXIiLz4gPHBhdGggZD0iTTM1MC42NzYsMTIzLjQzMmMwLjg2MywxNS45OTQtMy40NDUsMjYuODg4LTMuOTg4LDQzLjkxNGMtMC44MDQsMjQuNzQ4LDExLjc5OSw1My4wNzQtNy4xOTEsODEuNDM1Ii8+IDxwYXRoIGQ9Ik0wLDYwLjIzMiIgc3R5bGU9InN0cm9rZS13aWR0aDozIi8+IDwvZz48L3N2Zz48dGV4dCB4PSIxMTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNmMWY1ZjkiPkNsb3VkIFNRTDwvdGV4dD48dGV4dCB4PSIxMTIiIHk9IjEzNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6MTFweCBJbnRlcixzYW5zLXNlcmlmO2ZpbGw6Izk0YTNiOCI+U3RvcmVzIHRoZSBtZXNzYWdlIGJvZHk8L3RleHQ+PGxpbmUgeDE9IjIwMCIgeTE9IjEwOCIgeDI9IjIyOCIgeTI9IjEwOCIgbWFya2VyLWVuZD0idXJsKCNjc3FsLXB1Ymxpc2gpIiBzdHlsZT0ic3Ryb2tlOiM2NDc0OGI7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iMjI4IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojMWUyOTNiO3N0cm9rZTojNDc1NTY5O3N0cm9rZS13aWR0aDoxLjUiLz48dGV4dCB4PSIzMTYiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6NjUwIDEzcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiNmMWY1ZjkiPkRlbGl2ZXJ5IHJlY29yZHM8L3RleHQ+PHRleHQgeD0iMzE2IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM5NGEzYjgiPk9uZSBwZXIgc3Vic2NyaXB0aW9uPC90ZXh0PjxsaW5lIHgxPSI0MDQiIHkxPSIxMDgiIHgyPSI0MzIiIHkyPSIxMDgiIG1hcmtlci1lbmQ9InVybCgjY3NxbC1wdWJsaXNoKSIgc3R5bGU9InN0cm9rZTojNjQ3NDhiO3N0cm9rZS13aWR0aDoyO2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjQzMiIgeT0iNjAiIHdpZHRoPSIxNzYiIGhlaWdodD0iOTYiIHJ4PSIxMSIgc3R5bGU9ImZpbGw6IzFlMjkzYjtzdHJva2U6IzQ3NTU2OTtzdHJva2Utd2lkdGg6MS41Ii8+PHRleHQgeD0iNTIwIiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojZjFmNWY5Ij5QZXJtaXNzaW9uIGNoZWNrPC90ZXh0Pjx0ZXh0IHg9IjUyMCIgeT0iMTM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDoxMXB4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojOTRhM2I4Ij5RdWV1ZSBzdGlsbCBhbGxvd3MgdG9waWM8L3RleHQ+PGxpbmUgeDE9IjYwOCIgeTE9IjEwOCIgeDI9IjYzNiIgeTI9IjEwOCIgbWFya2VyLWVuZD0idXJsKCNjc3FsLXB1Ymxpc2gpIiBzdHlsZT0ic3Ryb2tlOiM2NDc0OGI7c3Ryb2tlLXdpZHRoOjI7ZmlsbDpub25lIi8+PHJlY3QgeD0iNjM2IiB5PSI2MCIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5NiIgcng9IjExIiBzdHlsZT0iZmlsbDojMWUyOTNiO3N0cm9rZTojNDc1NTY5O3N0cm9rZS13aWR0aDoxLjUiLz48c3ZnIHg9IjcxMiIgeT0iNzIiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDMwNCAxODIiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjxnPiA8cGF0aCBkPSJNODYuNCw2Ni40YzAsMy43LDAuNCw2LjcsMS4xLDguOWMwLjgsMi4yLDEuOCw0LjYsMy4yLDcuMmMwLjUsMC44LDAuNywxLjYsMC43LDIuM2MwLDEtMC42LDItMS45LDNsLTYuMyw0LjIgYy0wLjksMC42LTEuOCwwLjktMi42LDAuOWMtMSwwLTItMC41LTMtMS40Qzc2LjIsOTAsNzUsODguNCw3NCw4Ni44Yy0xLTEuNy0yLTMuNi0zLjEtNS45Yy03LjgsOS4yLTE3LjYsMTMuOC0yOS40LDEzLjggYy04LjQsMC0xNS4xLTIuNC0yMC03LjJjLTQuOS00LjgtNy40LTExLjItNy40LTE5LjJjMC04LjUsMy0xNS40LDkuMS0yMC42YzYuMS01LjIsMTQuMi03LjgsMjQuNS03LjhjMy40LDAsNi45LDAuMywxMC42LDAuOCBjMy43LDAuNSw3LjUsMS4zLDExLjUsMi4ydi03LjNjMC03LjYtMS42LTEyLjktNC43LTE2Yy0zLjItMy4xLTguNi00LjYtMTYuMy00LjZjLTMuNSwwLTcuMSwwLjQtMTAuOCwxLjNjLTMuNywwLjktNy4zLDItMTAuOCwzLjQgYy0xLjYsMC43LTIuOCwxLjEtMy41LDEuM2MtMC43LDAuMi0xLjIsMC4zLTEuNiwwLjNjLTEuNCwwLTIuMS0xLTIuMS0zLjF2LTQuOWMwLTEuNiwwLjItMi44LDAuNy0zLjVjMC41LTAuNywxLjQtMS40LDIuOC0yLjEgYzMuNS0xLjgsNy43LTMuMywxMi42LTQuNWM0LjktMS4zLDEwLjEtMS45LDE1LjYtMS45YzExLjksMCwyMC42LDIuNywyNi4yLDguMWM1LjUsNS40LDguMywxMy42LDguMywyNC42VjY2LjR6IE00NS44LDgxLjYgYzMuMywwLDYuNy0wLjYsMTAuMy0xLjhjMy42LTEuMiw2LjgtMy40LDkuNS02LjRjMS42LTEuOSwyLjgtNCwzLjQtNi40YzAuNi0yLjQsMS01LjMsMS04Ljd2LTQuMmMtMi45LTAuNy02LTEuMy05LjItMS43IGMtMy4yLTAuNC02LjMtMC42LTkuNC0wLjZjLTYuNywwLTExLjYsMS4zLTE0LjksNGMtMy4zLDIuNy00LjksNi41LTQuOSwxMS41YzAsNC43LDEuMiw4LjIsMy43LDEwLjYgQzM3LjcsODAuNCw0MS4yLDgxLjYsNDUuOCw4MS42eiBNMTI2LjEsOTIuNGMtMS44LDAtMy0wLjMtMy44LTFjLTAuOC0wLjYtMS41LTItMi4xLTMuOUw5Ni43LDEwLjJjLTAuNi0yLTAuOS0zLjMtMC45LTQgYzAtMS42LDAuOC0yLjUsMi40LTIuNWg5LjhjMS45LDAsMy4yLDAuMywzLjksMWMwLjgsMC42LDEuNCwyLDIsMy45bDE2LjgsNjYuMmwxNS42LTY2LjJjMC41LTIsMS4xLTMuMywxLjktMy45YzAuOC0wLjYsMi4yLTEsNC0xIGg4YzEuOSwwLDMuMiwwLjMsNCwxYzAuOCwwLjYsMS41LDIsMS45LDMuOWwxNS44LDY3bDE3LjMtNjdjMC42LTIsMS4zLTMuMywyLTMuOWMwLjgtMC42LDIuMS0xLDMuOS0xaDkuM2MxLjYsMCwyLjUsMC44LDIuNSwyLjUgYzAsMC41LTAuMSwxLTAuMiwxLjZjLTAuMSwwLjYtMC4zLDEuNC0wLjcsMi41bC0yNC4xLDc3LjNjLTAuNiwyLTEuMywzLjMtMi4xLDMuOWMtMC44LDAuNi0yLjEsMS0zLjgsMWgtOC42Yy0xLjksMC0zLjItMC4zLTQtMSBjLTAuOC0wLjctMS41LTItMS45LTRMMTU2LDIzbC0xNS40LDY0LjRjLTAuNSwyLTEuMSwzLjMtMS45LDRjLTAuOCwwLjctMi4yLDEtNCwxSDEyNi4xeiBNMjU0LjYsOTUuMWMtNS4yLDAtMTAuNC0wLjYtMTUuNC0xLjggYy01LTEuMi04LjktMi41LTExLjUtNGMtMS42LTAuOS0yLjctMS45LTMuMS0yLjhjLTAuNC0wLjktMC42LTEuOS0wLjYtMi44di01LjFjMC0yLjEsMC44LTMuMSwyLjMtMy4xYzAuNiwwLDEuMiwwLjEsMS44LDAuMyBjMC42LDAuMiwxLjUsMC42LDIuNSwxYzMuNCwxLjUsNy4xLDIuNywxMSwzLjVjNCwwLjgsNy45LDEuMiwxMS45LDEuMmM2LjMsMCwxMS4yLTEuMSwxNC42LTMuM2MzLjQtMi4yLDUuMi01LjQsNS4yLTkuNSBjMC0yLjgtMC45LTUuMS0yLjctN2MtMS44LTEuOS01LjItMy42LTEwLjEtNS4yTDI0Niw1MmMtNy4zLTIuMy0xMi43LTUuNy0xNi0xMC4yYy0zLjMtNC40LTUtOS4zLTUtMTQuNWMwLTQuMiwwLjktNy45LDIuNy0xMS4xIGMxLjgtMy4yLDQuMi02LDcuMi04LjJjMy0yLjMsNi40LTQsMTAuNC01LjJjNC0xLjIsOC4yLTEuNywxMi42LTEuN2MyLjIsMCw0LjUsMC4xLDYuNywwLjRjMi4zLDAuMyw0LjQsMC43LDYuNSwxLjEgYzIsMC41LDMuOSwxLDUuNywxLjZjMS44LDAuNiwzLjIsMS4yLDQuMiwxLjhjMS40LDAuOCwyLjQsMS42LDMsMi41YzAuNiwwLjgsMC45LDEuOSwwLjksMy4zdjQuN2MwLDIuMS0wLjgsMy4yLTIuMywzLjIgYy0wLjgsMC0yLjEtMC40LTMuOC0xLjJjLTUuNy0yLjYtMTIuMS0zLjktMTkuMi0zLjljLTUuNywwLTEwLjIsMC45LTEzLjMsMi44Yy0zLjEsMS45LTQuNyw0LjgtNC43LDguOWMwLDIuOCwxLDUuMiwzLDcuMSBjMiwxLjksNS43LDMuOCwxMSw1LjVsMTQuMiw0LjVjNy4yLDIuMywxMi40LDUuNSwxNS41LDkuNmMzLjEsNC4xLDQuNiw4LjgsNC42LDE0YzAsNC4zLTAuOSw4LjItMi42LDExLjYgYy0xLjgsMy40LTQuMiw2LjQtNy4zLDguOGMtMy4xLDIuNS02LjgsNC4zLTExLjEsNS42QzI2NC40LDk0LjQsMjU5LjcsOTUuMSwyNTQuNiw5NS4xeiIgc3R5bGU9ImZpbGw6IzI1MkYzRSIvPiA8Zz4gPHBhdGggZD0iTTI3My41LDE0My43Yy0zMi45LDI0LjMtODAuNywzNy4yLTEyMS44LDM3LjJjLTU3LjYsMC0xMDkuNS0yMS4zLTE0OC43LTU2LjdjLTMuMS0yLjgtMC4zLTYuNiwzLjQtNC40IGM0Mi40LDI0LjYsOTQuNywzOS41LDE0OC44LDM5LjVjMzYuNSwwLDc2LjYtNy42LDExMy41LTIzLjJDMjc0LjIsMTMzLjYsMjc4LjksMTM5LjcsMjczLjUsMTQzLjd6IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkY5OTAwIi8+IDxwYXRoIGQ9Ik0yODcuMiwxMjguMWMtNC4yLTUuNC0yNy44LTIuNi0zOC41LTEuM2MtMy4yLDAuNC0zLjctMi40LTAuOC00LjVjMTguOC0xMy4yLDQ5LjctOS40LDUzLjMtNSBjMy42LDQuNS0xLDM1LjQtMTguNiw1MC4yYy0yLjcsMi4zLTUuMywxLjEtNC4xLTEuOUMyODIuNSwxNTUuNywyOTEuNCwxMzMuNCwyODcuMiwxMjguMXoiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPC9nPiA8L2c+PC9zdmc+PHN2ZyB4PSI3MTIiIHk9IjcyIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAzMDQgMTgyIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiBzdHlsZT0iZGlzcGxheTppbmxpbmUiPjxnPiA8cGF0aCBkPSJNODYuNCw2Ni40YzAsMy43LDAuNCw2LjcsMS4xLDguOWMwLjgsMi4yLDEuOCw0LjYsMy4yLDcuMmMwLjUsMC44LDAuNywxLjYsMC43LDIuM2MwLDEtMC42LDItMS45LDNsLTYuMyw0LjIgYy0wLjksMC42LTEuOCwwLjktMi42LDAuOWMtMSwwLTItMC41LTMtMS40Qzc2LjIsOTAsNzUsODguNCw3NCw4Ni44Yy0xLTEuNy0yLTMuNi0zLjEtNS45Yy03LjgsOS4yLTE3LjYsMTMuOC0yOS40LDEzLjggYy04LjQsMC0xNS4xLTIuNC0yMC03LjJjLTQuOS00LjgtNy40LTExLjItNy40LTE5LjJjMC04LjUsMy0xNS40LDkuMS0yMC42YzYuMS01LjIsMTQuMi03LjgsMjQuNS03LjhjMy40LDAsNi45LDAuMywxMC42LDAuOCBjMy43LDAuNSw3LjUsMS4zLDExLjUsMi4ydi03LjNjMC03LjYtMS42LTEyLjktNC43LTE2Yy0zLjItMy4xLTguNi00LjYtMTYuMy00LjZjLTMuNSwwLTcuMSwwLjQtMTAuOCwxLjNjLTMuNywwLjktNy4zLDItMTAuOCwzLjQgYy0xLjYsMC43LTIuOCwxLjEtMy41LDEuM2MtMC43LDAuMi0xLjIsMC4zLTEuNiwwLjNjLTEuNCwwLTIuMS0xLTIuMS0zLjF2LTQuOWMwLTEuNiwwLjItMi44LDAuNy0zLjVjMC41LTAuNywxLjQtMS40LDIuOC0yLjEgYzMuNS0xLjgsNy43LTMuMywxMi42LTQuNWM0LjktMS4zLDEwLjEtMS45LDE1LjYtMS45YzExLjksMCwyMC42LDIuNywyNi4yLDguMWM1LjUsNS40LDguMywxMy42LDguMywyNC42VjY2LjR6IE00NS44LDgxLjYgYzMuMywwLDYuNy0wLjYsMTAuMy0xLjhjMy42LTEuMiw2LjgtMy40LDkuNS02LjRjMS42LTEuOSwyLjgtNCwzLjQtNi40YzAuNi0yLjQsMS01LjMsMS04Ljd2LTQuMmMtMi45LTAuNy02LTEuMy05LjItMS43IGMtMy4yLTAuNC02LjMtMC42LTkuNC0wLjZjLTYuNywwLTExLjYsMS4zLTE0LjksNGMtMy4zLDIuNy00LjksNi41LTQuOSwxMS41YzAsNC43LDEuMiw4LjIsMy43LDEwLjYgQzM3LjcsODAuNCw0MS4yLDgxLjYsNDUuOCw4MS42eiBNMTI2LjEsOTIuNGMtMS44LDAtMy0wLjMtMy44LTFjLTAuOC0wLjYtMS41LTItMi4xLTMuOUw5Ni43LDEwLjJjLTAuNi0yLTAuOS0zLjMtMC45LTQgYzAtMS42LDAuOC0yLjUsMi40LTIuNWg5LjhjMS45LDAsMy4yLDAuMywzLjksMWMwLjgsMC42LDEuNCwyLDIsMy45bDE2LjgsNjYuMmwxNS42LTY2LjJjMC41LTIsMS4xLTMuMywxLjktMy45YzAuOC0wLjYsMi4yLTEsNC0xIGg4YzEuOSwwLDMuMiwwLjMsNCwxYzAuOCwwLjYsMS41LDIsMS45LDMuOWwxNS44LDY3bDE3LjMtNjdjMC42LTIsMS4zLTMuMywyLTMuOWMwLjgtMC42LDIuMS0xLDMuOS0xaDkuM2MxLjYsMCwyLjUsMC44LDIuNSwyLjUgYzAsMC41LTAuMSwxLTAuMiwxLjZjLTAuMSwwLjYtMC4zLDEuNC0wLjcsMi41bC0yNC4xLDc3LjNjLTAuNiwyLTEuMywzLjMtMi4xLDMuOWMtMC44LDAuNi0yLjEsMS0zLjgsMWgtOC42Yy0xLjksMC0zLjItMC4zLTQtMSBjLTAuOC0wLjctMS41LTItMS45LTRMMTU2LDIzbC0xNS40LDY0LjRjLTAuNSwyLTEuMSwzLjMtMS45LDRjLTAuOCwwLjctMi4yLDEtNCwxSDEyNi4xeiBNMjU0LjYsOTUuMWMtNS4yLDAtMTAuNC0wLjYtMTUuNC0xLjggYy01LTEuMi04LjktMi41LTExLjUtNGMtMS42LTAuOS0yLjctMS45LTMuMS0yLjhjLTAuNC0wLjktMC42LTEuOS0wLjYtMi44di01LjFjMC0yLjEsMC44LTMuMSwyLjMtMy4xYzAuNiwwLDEuMiwwLjEsMS44LDAuMyBjMC42LDAuMiwxLjUsMC42LDIuNSwxYzMuNCwxLjUsNy4xLDIuNywxMSwzLjVjNCwwLjgsNy45LDEuMiwxMS45LDEuMmM2LjMsMCwxMS4yLTEuMSwxNC42LTMuM2MzLjQtMi4yLDUuMi01LjQsNS4yLTkuNSBjMC0yLjgtMC45LTUuMS0yLjctN2MtMS44LTEuOS01LjItMy42LTEwLjEtNS4yTDI0Niw1MmMtNy4zLTIuMy0xMi43LTUuNy0xNi0xMC4yYy0zLjMtNC40LTUtOS4zLTUtMTQuNWMwLTQuMiwwLjktNy45LDIuNy0xMS4xIGMxLjgtMy4yLDQuMi02LDcuMi04LjJjMy0yLjMsNi40LTQsMTAuNC01LjJjNC0xLjIsOC4yLTEuNywxMi42LTEuN2MyLjIsMCw0LjUsMC4xLDYuNywwLjRjMi4zLDAuMyw0LjQsMC43LDYuNSwxLjEgYzIsMC41LDMuOSwxLDUuNywxLjZjMS44LDAuNiwzLjIsMS4yLDQuMiwxLjhjMS40LDAuOCwyLjQsMS42LDMsMi41YzAuNiwwLjgsMC45LDEuOSwwLjksMy4zdjQuN2MwLDIuMS0wLjgsMy4yLTIuMywzLjIgYy0wLjgsMC0yLjEtMC40LTMuOC0xLjJjLTUuNy0yLjYtMTIuMS0zLjktMTkuMi0zLjljLTUuNywwLTEwLjIsMC45LTEzLjMsMi44Yy0zLjEsMS45LTQuNyw0LjgtNC43LDguOWMwLDIuOCwxLDUuMiwzLDcuMSBjMiwxLjksNS43LDMuOCwxMSw1LjVsMTQuMiw0LjVjNy4yLDIuMywxMi40LDUuNSwxNS41LDkuNmMzLjEsNC4xLDQuNiw4LjgsNC42LDE0YzAsNC4zLTAuOSw4LjItMi42LDExLjYgYy0xLjgsMy40LTQuMiw2LjQtNy4zLDguOGMtMy4xLDIuNS02LjgsNC4zLTExLjEsNS42QzI2NC40LDk0LjQsMjU5LjcsOTUuMSwyNTQuNiw5NS4xeiIgc3R5bGU9ImZpbGw6I0ZGRkZGRiIvPiA8Zz4gPHBhdGggZD0iTTI3My41LDE0My43Yy0zMi45LDI0LjMtODAuNywzNy4yLTEyMS44LDM3LjJjLTU3LjYsMC0xMDkuNS0yMS4zLTE0OC43LTU2LjdjLTMuMS0yLjgtMC4zLTYuNiwzLjQtNC40IGM0Mi40LDI0LjYsOTQuNywzOS41LDE0OC44LDM5LjVjMzYuNSwwLDc2LjYtNy42LDExMy41LTIzLjJDMjc0LjIsMTMzLjYsMjc4LjksMTM5LjcsMjczLjUsMTQzLjd6IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkY5OTAwIi8+IDxwYXRoIGQ9Ik0yODcuMiwxMjguMWMtNC4yLTUuNC0yNy44LTIuNi0zOC41LTEuM2MtMy4yLDAuNC0zLjctMi40LTAuOC00LjVjMTguOC0xMy4yLDQ5LjctOS40LDUzLjMtNSBjMy42LDQuNS0xLDM1LjQtMTguNiw1MC4yYy0yLjcsMi4zLTUuMywxLjEtNC4xLTEuOUMyODIuNSwxNTUuNywyOTEuNCwxMzMuNCwyODcuMiwxMjguMXoiIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiNGRjk5MDAiLz4gPC9nPiA8L2c+PC9zdmc+PHRleHQgeD0iNzI0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjY1MCAxM3B4IEludGVyLHNhbnMtc2VyaWY7ZmlsbDojZjFmNWY5Ij5TUVMgcXVldWU8L3RleHQ+PHRleHQgeD0iNzI0IiB5PSIxMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OjExcHggSW50ZXIsc2Fucy1zZXJpZjtmaWxsOiM5NGEzYjgiPlJlY2VpdmVzIHRoZSBtZXNzYWdlPC90ZXh0Pjwvc3ZnPg==)

Publish returns after the first two steps. Your queues receive the message later.

#### Delivery and retries

When a message is published, SNS decides which active subscriptions receive it, applying their filter policies, and records one delivery for each. Before sending, the delivery worker checks that the subscription still exists and that the queue still allows the topic. `Unsubscribe` stops new deliveries; it cannot recall a message a queue has already stored.

Each SQS subscription succeeds or fails on its own. Once SQS has stored a message, SQS is responsible for it. If SQS stores a message but the answer or the delivery record is lost, another attempt can deliver it again with the same `MessageId`. The code that processes messages must handle duplicates safely.

#### Limitations

* **FIFO topics are not supported.** FIFO topics, ordering and deduplication are not provided. Only standard topics work.
* **Filter policies support a subset of SNS syntax.** Message-attribute and message-body filter policies accept a reduced set of operators. A policy using any other operator is rejected.
* **You must keep the queue allowing the topic.** The SQS queue's access policy must allow the topic, and must still allow it at the time of each delivery.
* **Only SQS subscriptions are delivered; redrive is not supported.** Subscriptions using HTTP, HTTPS, Lambda, email, SMS, mobile push or Firehose are rejected, and so is a subscription `RedrivePolicy`.
* **Topic policies are enforced.** The topic access policy is checked and enforced. You can set it inline on the topic or with one `aws_sns_topic_policy` resource, which is applied with the topic. Unsupported policy statements are rejected.

#### Other considerations

**Running the database.** Google operates Cloud SQL maintenance and the database features chosen for the deployment. Configure database capacity, private connectivity, TLS and backups for your workload. A restore must bring back both the message database and the SNS records; a backup of only one of them is not enough.

**Before going live.** Check queue permissions, confirm that your queues receive messages, and test recovery in this configuration before you move publishers.

**What to monitor.** Watch database storage and connections alongside pending deliveries and delivery failures.

**Moving from AWS.** Messages still pending on AWS SNS are not copied into Cloud SQL.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### SNS Standard · SNS publish billing units

Feature: SNS Standard.

Estimated monthly service charges by SNS publish billing units. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![SNS Standard · SNS publish billing units: monthly service charges by SNS publish billing units. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/760fd9d7b454c372e34a0d99273eaf52ecda7ee9b56008009c2c4e4104dda090-light.svg)

![SNS Standard · SNS publish billing units: monthly service charges by SNS publish billing units. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/56b8ae00179515784489abb896d60efac107b8b5c7c8297d47f9bddeb2c42daf-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| SNS publish billing units (per second) | SNS (Simple Notification Service) | Target scenario | Cloud SQL for PostgreSQL | Difference |
| -: | -: | - | -: | -: |
| 0 | 0.00 | Cloud SQL for PostgreSQL (one copy) | 118.18 | 118.18 |
| 0 | 0.00 | Cloud SQL for PostgreSQL (two copies) | 236.36 | 236.36 |
| 1 | 1.31 | Cloud SQL for PostgreSQL (one copy) | 118.18 | 116.86 |
| 1 | 1.31 | Cloud SQL for PostgreSQL (two copies) | 236.36 | 235.04 |
| 10 | 13.14 | Cloud SQL for PostgreSQL (one copy) | 118.18 | 105.04 |
| 10 | 13.14 | Cloud SQL for PostgreSQL (two copies) | 236.36 | 223.22 |
| 100 | 131.40 | Cloud SQL for PostgreSQL (one copy) | 118.18 | -13.22 |
| 100 | 131.40 | Cloud SQL for PostgreSQL (two copies) | 236.36 | 104.96 |
| 1,000 | 1,314.00 | Cloud SQL for PostgreSQL (one copy) | 1,635.85 | 321.85 |
| 1,000 | 1,314.00 | Cloud SQL for PostgreSQL (two copies) | 3,271.70 | 1,957.70 |
| 10,000 | 13,140.00 | Cloud SQL for PostgreSQL (one copy) | Unpriced | Unavailable |
| 10,000 | 13,140.00 | Cloud SQL for PostgreSQL (two copies) | Unpriced | Unavailable |

Estimated allocation, not benchmark calibrated: sized from 2 vCPU, 8 GiB memory and 100 GiB SSD at 0 per second to 32 vCPU, 128 GiB memory and 100 GiB SSD at 1,000 per second. From 10,000 per second the workload exceeds the planning range and the target is unpriced.

**Curve assumptions**

| Target scenario | Assumption | Value | Unit |
| - | - | -: | - |
| Cloud SQL for PostgreSQL (one copy) | Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Cloud SQL for PostgreSQL (one copy) | Representative publication size | 1,024 | bytes |
| Cloud SQL for PostgreSQL (one copy) | Selected delivery subscriptions | 3 | subscriptions/publication |
| Cloud SQL for PostgreSQL (one copy) | Delivery attempts | 1 | attempts/destination |
| Cloud SQL for PostgreSQL (one copy) | Native broker consumer copies | 1 | copies |
| Cloud SQL for PostgreSQL (one copy) | Staging residence window | 60 | seconds |
| Cloud SQL for PostgreSQL (one copy) | Delivery row size | 256 | bytes |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · read | 0 | USD/read |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · write | 0 | USD/write |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · provider operation | 0 | USD/provider operation |
| Cloud SQL for PostgreSQL (one copy) | Target list price · GiB-month | 0.17 | USD/GiB-month |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · published GiB | 0 | USD/published GiB |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Cloud SQL for PostgreSQL (one copy) | Target list price · network GiB | 0.19 | USD/network GiB |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Cloud SQL for PostgreSQL (one copy) | Target list price · vCPU-hour | 0.0413 | USD/vCPU-hour |
| Cloud SQL for PostgreSQL (one copy) | Target list price · GiB-hour | 0.007 | USD/GiB-hour |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · resource-hour | 0 | USD/resource-hour |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · resource-month | 0 | USD/resource-month |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · input token | 0 | USD/input token |
| Cloud SQL for PostgreSQL (one copy) | Target price guess · output token | 0 | USD/output token |
| Cloud SQL for PostgreSQL (one copy) | Target monthly base charge | 0 | USD/month |
| Cloud SQL for PostgreSQL (one copy) | Target service minimum | 9.365 | USD/month |
| Cloud SQL for PostgreSQL (one copy) | Minimum primary CPU | 2 | vCPU |
| Cloud SQL for PostgreSQL (one copy) | Minimum primary RAM | 8 | GiB |
| Cloud SQL for PostgreSQL (one copy) | Minimum primary disk | 100 | GiB |
| Cloud SQL for PostgreSQL (one copy) | Additional full-price standby copy | 0 | 0 or 1 |
| Cloud SQL for PostgreSQL (one copy) | Allocated share of provisioned cost | 1 | fraction |
| Cloud SQL for PostgreSQL (one copy) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Cloud SQL for PostgreSQL (one copy) | Planning peak / mean work | 2 | multiplier |
| Cloud SQL for PostgreSQL (one copy) | Planning primary CPU utilization | 0.7 | fraction |
| Cloud SQL for PostgreSQL (one copy) | Resident state reserved in RAM | 0.1 | fraction |
| Cloud SQL for PostgreSQL (one copy) | Planning disk utilization | 0.8 | fraction |
| Cloud SQL for PostgreSQL (one copy) | Maintenance and log disk reserve | 20 | GiB |
| Cloud SQL for PostgreSQL (one copy) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Cloud SQL for PostgreSQL (one copy) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Cloud SQL for PostgreSQL (one copy) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Cloud SQL for PostgreSQL (one copy) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Cloud SQL for PostgreSQL (one copy) | Dependent object sink write price guess | 0.000005 | USD/write |
| Cloud SQL for PostgreSQL (two copies) | Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Cloud SQL for PostgreSQL (two copies) | Representative publication size | 1,024 | bytes |
| Cloud SQL for PostgreSQL (two copies) | Selected delivery subscriptions | 3 | subscriptions/publication |
| Cloud SQL for PostgreSQL (two copies) | Delivery attempts | 1 | attempts/destination |
| Cloud SQL for PostgreSQL (two copies) | Native broker consumer copies | 1 | copies |
| Cloud SQL for PostgreSQL (two copies) | Staging residence window | 60 | seconds |
| Cloud SQL for PostgreSQL (two copies) | Delivery row size | 256 | bytes |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · read | 0 | USD/read |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · write | 0 | USD/write |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · provider operation | 0 | USD/provider operation |
| Cloud SQL for PostgreSQL (two copies) | Target list price · GiB-month | 0.17 | USD/GiB-month |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · published GiB | 0 | USD/published GiB |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Cloud SQL for PostgreSQL (two copies) | Target list price · network GiB | 0.19 | USD/network GiB |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Cloud SQL for PostgreSQL (two copies) | Target list price · vCPU-hour | 0.0413 | USD/vCPU-hour |
| Cloud SQL for PostgreSQL (two copies) | Target list price · GiB-hour | 0.007 | USD/GiB-hour |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · resource-hour | 0 | USD/resource-hour |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · resource-month | 0 | USD/resource-month |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · input token | 0 | USD/input token |
| Cloud SQL for PostgreSQL (two copies) | Target price guess · output token | 0 | USD/output token |
| Cloud SQL for PostgreSQL (two copies) | Target monthly base charge | 0 | USD/month |
| Cloud SQL for PostgreSQL (two copies) | Target service minimum | 9.365 | USD/month |
| Cloud SQL for PostgreSQL (two copies) | Minimum primary CPU | 2 | vCPU |
| Cloud SQL for PostgreSQL (two copies) | Minimum primary RAM | 8 | GiB |
| Cloud SQL for PostgreSQL (two copies) | Minimum primary disk | 100 | GiB |
| Cloud SQL for PostgreSQL (two copies) | Additional full-price standby copy | 1 | 0 or 1 |
| Cloud SQL for PostgreSQL (two copies) | Allocated share of provisioned cost | 1 | fraction |
| Cloud SQL for PostgreSQL (two copies) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Cloud SQL for PostgreSQL (two copies) | Planning peak / mean work | 2 | multiplier |
| Cloud SQL for PostgreSQL (two copies) | Planning primary CPU utilization | 0.7 | fraction |
| Cloud SQL for PostgreSQL (two copies) | Resident state reserved in RAM | 0.1 | fraction |
| Cloud SQL for PostgreSQL (two copies) | Planning disk utilization | 0.8 | fraction |
| Cloud SQL for PostgreSQL (two copies) | Maintenance and log disk reserve | 20 | GiB |
| Cloud SQL for PostgreSQL (two copies) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Cloud SQL for PostgreSQL (two copies) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Cloud SQL for PostgreSQL (two copies) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Cloud SQL for PostgreSQL (two copies) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Cloud SQL for PostgreSQL (two copies) | Dependent object sink write price guess | 0.000005 | USD/write |

* Fan-out and retry assumptions remain explicit; this is not destination delivery TPS. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Native Pub/Sub and Service Bus backends also retain durable SNS staging. Price that allocation once; database targets already host the translated writes.
* Native broker subscriptions and SNS delivery claims are distinct surfaces. Supported delivery protocols and delivery consent remain backend-specific.
* Cloud SQL Enterprise edition (PostgreSQL) publishes separate vCPU, memory and SSD prices for zonal instances; a high-availability (regional) instance bills exactly twice each, which the standby copy reproduces. Enterprise Plus, committed-use discounts, backups (USD 0.08 per GiB-month) and idle IPv4 addresses (0.01 per hour) are not selected.
* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.
* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
* Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)).
* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.
* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
* AWS Price List API, AmazonSNS offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json)
* Cloud SQL pricing: [https://cloud.google.com/sql/pricing](https://cloud.google.com/sql/pricing)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* HTTP/email/SMS/mobile delivery prices and destination-service charges; relay submission does not establish managed delivery reputation.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-56469bafbc69bb655a97cbd8145f3a1d5d0f6ce1` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonSNS offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json), [Cloud SQL pricing](https://cloud.google.com/sql/pricing).

**SNS Standard → Google Cloud SQL for PostgreSQL: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: us-central1. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: SNS publish units | 0.00 |
| Target: Provisioned primary CPU | 60.30 |
| Target: Provisioned primary RAM | 40.88 |
| Target: Provisioned primary disk | 17.00 |
| Target: Selected billable network | 0.00 |
| Target: Independent provisioned resources | 0.00 |
| Target: Independent managed resources | 0.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **118.18** |

Estimated allocation, not benchmark calibrated: sized at 2 vCPU, 8 GiB memory and 100 GiB SSD for this scenario.

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* HTTP/email/SMS/mobile delivery prices and destination-service charges; relay submission does not establish managed delivery reputation.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · SNS publish units | 0.0000005 | USD/64-KiB request units |
| Representative publication size | 1,024 | bytes |
| Selected delivery subscriptions | 3 | subscriptions/publication |
| Delivery attempts | 1 | attempts/destination |
| Native broker consumer copies | 1 | copies |
| Staging residence window | 60 | seconds |
| Delivery row size | 256 | bytes |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.17 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.19 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target list price · vCPU-hour | 0.0413 | USD/vCPU-hour |
| Target list price · GiB-hour | 0.007 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Target monthly base charge | 0 | USD/month |
| Target service minimum | 9.365 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| SNS publish units | 0 | 64-KiB request units |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Native Pub/Sub and Service Bus backends also retain durable SNS staging. Price that allocation once; database targets already host the translated writes.

* Native broker subscriptions and SNS delivery claims are distinct surfaces. Supported delivery protocols and delivery consent remain backend-specific.

* Cloud SQL Enterprise edition (PostgreSQL) publishes separate vCPU, memory and SSD prices for zonal instances; a high-availability (regional) instance bills exactly twice each, which the standby copy reproduces. Enterprise Plus, committed-use discounts, backups (USD 0.08 per GiB-month) and idle IPv4 addresses (0.01 per hour) are not selected.

* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.

* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.

* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.

* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.

* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.

* Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)).

* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.

* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.

* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.

List prices read: 2026-10-22. Model: `plan-56469bafbc69bb655a97cbd8145f3a1d5d0f6ce1` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonSNS offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonSNS/current/us-east-1/index.json), [Cloud SQL pricing](https://cloud.google.com/sql/pricing).

## Costs

Estimated monthly service charges for each backend with a published cost model, at one sampled workload from that model's cost curve. Adapter hosting and Tensor9 fees are excluded. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method, what the estimates include and how to read their qualifications.

| Backend | Sampled workload | Price basis | Origin USD/month | Backend USD/month | Difference | Mapping |
| - | - | - | -: | -: | -: | - |
| Cloud SQL for PostgreSQL | SNS publish billing units: 100 per second; one copy | Cited list prices, 2026-10-22 | 131.40 | 118.18 | -13.22 | Service adapter |
| PostgreSQL | SNS publish billing units: 100 per second; one copy | Cited list prices, 2026-10-22 | 131.40 | 80.90 | -50.50 | Service adapter |
| Pub/Sub | SNS publish billing units: 100 per second; one staging copy | Cited list prices, 2026-10-22 | 131.40 | 137.76 | +6.36 | Service adapter |

Difference means backend minus origin; a positive difference means the backend costs more. Workloads and target configurations differ by model, so compare each row's difference at its stated workload rather than charges across rows.
Cost curves across workload sizes, with every assumption and exclusion: [SNS (Simple Notification Service) costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/additional-services/aws-sns).

## Service level agreements

> [!WARNING]
>
> These tables show Tensor9's standard service levels and adapters whose standard terms are still being defined. Your signed agreement determines the SLAs, covered adapters and operations, limits, remedies and support terms that apply to your deployment.

Listed terms cover requests sent through this service adapter. They do not cover direct connections to the target service or replace the cloud provider's own SLA. Each origin-to-target pair has its own terms or an explicit pending status.

See the [SLA tables](https://docs.tensor9.com/cloud-adapter-early-access/support/service-adapter-slas.md), [measurement rules](https://docs.tensor9.com/cloud-adapter-early-access/support/service-levels.md), and [scaling conditions](https://docs.tensor9.com/cloud-adapter-early-access/support/scaling-and-limits.md).

### SNS (Simple Notification Service) to Google Cloud SQL for PostgreSQL

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Bounded notification acceptance adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `Publish` | One message at most 4 KiB, at most 20 subscriptions and 20 bounded filter clauses. Measures Publish acceptance, not downstream subscriber completion. |
| Bounded notification batch acceptance adapter-added latency | +50 ms monthly p99 | `aws::1.0.0::sns`: `PublishBatch` | At most 10 messages, 40 KiB aggregate bytes and 20 subscriptions per topic; per-entry results retained. |
| Topic and subscription configuration adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource` | One topic or subscription, at most 50 tags and 32 KiB settings. Subscribe and ConfirmSubscription retain their receiver-consent and protocol restrictions. |
| Bounded topic and subscription pages adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics` | One page with at most 100 entries and 128 KiB encoded response; no traversal of subsequent pages. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::sns`: `Publish`, `PublishBatch`, `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource`, `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics` | A successful Publish must correspond to the documented durable acceptance point. Retries can duplicate downstream delivery, so consumers remain idempotent. Subscription activation must respect receiver consent and supported protocol rules. Filter policy, message attributes and FIFO behavior are limited by this target profile. Unsupported subscription or publish shapes are not implied by the numerical acceptance row. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `google::1.0.0::cloudsql::postgresql`, Publish persists accepted notifications and per-subscription delivery work in a PostgreSQL outbox. Workers deliver later and record their result. The latency row ends at API acceptance, not successful receipt by every subscriber.

#### How the latency targets were chosen

**Bounded notification acceptance: +20 ms monthly p99 (adapter-added).** `Publish`. The PostgreSQL path persists per-subscriber delivery work; native brokers fan out differently. Adapter subscription/authorization/outbox work stays on the fabric clock.

**Bounded notification batch acceptance: +50 ms monthly p99 (adapter-added).** `PublishBatch`. Batch decoding, target calls and delivery scheduling are bounded by both entries and fan-out.

**Topic and subscription configuration: +20 ms monthly p99 (adapter-added).** `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource`. Configuration and authorization state must be persisted; waiting for a human or endpoint confirmation is not promised within this request-response budget.

**Bounded topic and subscription pages: +20 ms monthly p99 (adapter-added).** `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics`. Persistent catalog reads and token/result generation are included.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Bound subscriptions per topic, filter complexity, payload bytes and queued deliveries as well as publish rate. A publish with 20 subscribers creates up to 20 units of delivery work. Scale request handlers and delivery workers independently, and watch outbox age or broker backlog. Subscriber timeouts and provider quotas can limit delivery even when the adapter accepts new work quickly; the agreement must state a separate delivery/backlog objective if one is required.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful Publish must correspond to the documented durable acceptance point. Retries can duplicate downstream delivery, so consumers remain idempotent. Subscription activation must respect receiver consent and supported protocol rules. Filter policy, message attributes and FIFO behavior are limited by this target profile. Unsupported subscription or publish shapes are not implied by the numerical acceptance row.

#### Example and diagnosis

For topic `order-created`, publishing one 2 KiB event to ten subscriptions uses the single-publish row. The request can satisfy its SLA while an unreachable webhook accumulates retries; inspect delivery state separately. If adapter-owned outbox insertion is slow, that is fabric time rather than subscriber time and remains Tensor9's responsibility.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

### SNS (Simple Notification Service) to Google Cloud Pub/Sub

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Bounded notification acceptance adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::sns`: `Publish` | One message at most 4 KiB, at most 20 subscriptions and 20 bounded filter clauses. Measures Publish acceptance, not downstream subscriber completion. |
| Bounded notification batch acceptance adapter-added latency | +10 ms monthly p99 | `aws::1.0.0::sns`: `PublishBatch` | At most 10 messages, 40 KiB aggregate bytes and 20 subscriptions per topic; per-entry results retained. |
| Topic and subscription configuration adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource` | One topic or subscription, at most 50 tags and 32 KiB settings. Subscribe and ConfirmSubscription retain their receiver-consent and protocol restrictions. |
| Bounded topic and subscription pages adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics` | One page with at most 100 entries and 128 KiB encoded response; no traversal of subsequent pages. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::sns`: `Publish`, `PublishBatch`, `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource`, `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics` | A successful Publish must correspond to the documented durable acceptance point. Retries can duplicate downstream delivery, so consumers remain idempotent. Subscription activation must respect receiver consent and supported protocol rules. Filter policy, message attributes and FIFO behavior are limited by this target profile. Unsupported subscription or publish shapes are not implied by the numerical acceptance row. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `google::1.0.0::pubsub`, Publish maps to the native topic service, while adapter workers can pull broker subscriptions and forward notifications to the configured destination. Native topic acceptance and final HTTP/SQS/email delivery are different events; the request SLA covers the first adapter interaction.

#### How the latency targets were chosen

**Bounded notification acceptance: +3 ms monthly p99 (adapter-added).** `Publish`. The PostgreSQL path persists per-subscriber delivery work; native brokers fan out differently. Adapter subscription/authorization/outbox work stays on the fabric clock.

**Bounded notification batch acceptance: +10 ms monthly p99 (adapter-added).** `PublishBatch`. Batch decoding, target calls and delivery scheduling are bounded by both entries and fan-out.

**Topic and subscription configuration: +20 ms monthly p99 (adapter-added).** `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource`. Configuration and authorization state must be persisted; waiting for a human or endpoint confirmation is not promised within this request-response budget.

**Bounded topic and subscription pages: +20 ms monthly p99 (adapter-added).** `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics`. Persistent catalog reads and token/result generation are included.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Bound subscriptions per topic, filter complexity, payload bytes and queued deliveries as well as publish rate. A publish with 20 subscribers creates up to 20 units of delivery work. Scale request handlers and delivery workers independently, and watch outbox age or broker backlog. Subscriber timeouts and provider quotas can limit delivery even when the adapter accepts new work quickly; the agreement must state a separate delivery/backlog objective if one is required.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful Publish must correspond to the documented durable acceptance point. Retries can duplicate downstream delivery, so consumers remain idempotent. Subscription activation must respect receiver consent and supported protocol rules. Filter policy, message attributes and FIFO behavior are limited by this target profile. Unsupported subscription or publish shapes are not implied by the numerical acceptance row.

#### Example and diagnosis

For topic `order-created`, publishing one 2 KiB event to ten subscriptions uses the single-publish row. The request can satisfy its SLA while an unreachable webhook accumulates retries; inspect delivery state separately. If adapter-owned outbox insertion is slow, that is fabric time rather than subscriber time and remains Tensor9's responsibility.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

### SNS (Simple Notification Service) to PostgreSQL

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Bounded notification acceptance adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `Publish` | One message at most 4 KiB, at most 20 subscriptions and 20 bounded filter clauses. Measures Publish acceptance, not downstream subscriber completion. |
| Bounded notification batch acceptance adapter-added latency | +50 ms monthly p99 | `aws::1.0.0::sns`: `PublishBatch` | At most 10 messages, 40 KiB aggregate bytes and 20 subscriptions per topic; per-entry results retained. |
| Topic and subscription configuration adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource` | One topic or subscription, at most 50 tags and 32 KiB settings. Subscribe and ConfirmSubscription retain their receiver-consent and protocol restrictions. |
| Bounded topic and subscription pages adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::sns`: `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics` | One page with at most 100 entries and 128 KiB encoded response; no traversal of subsequent pages. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::sns`: `Publish`, `PublishBatch`, `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource`, `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics` | A successful Publish must correspond to the documented durable acceptance point. Retries can duplicate downstream delivery, so consumers remain idempotent. Subscription activation must respect receiver consent and supported protocol rules. Filter policy, message attributes and FIFO behavior are limited by this target profile. Unsupported subscription or publish shapes are not implied by the numerical acceptance row. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `postgres::1.0.0::database`, Publish persists accepted notifications and per-subscription delivery work in a PostgreSQL outbox. Workers deliver later and record their result. The latency row ends at API acceptance, not successful receipt by every subscriber.

#### How the latency targets were chosen

**Bounded notification acceptance: +20 ms monthly p99 (adapter-added).** `Publish`. The PostgreSQL path persists per-subscriber delivery work; native brokers fan out differently. Adapter subscription/authorization/outbox work stays on the fabric clock.

**Bounded notification batch acceptance: +50 ms monthly p99 (adapter-added).** `PublishBatch`. Batch decoding, target calls and delivery scheduling are bounded by both entries and fan-out.

**Topic and subscription configuration: +20 ms monthly p99 (adapter-added).** `CreateTopic`, `DeleteTopic`, `GetSubscriptionAttributes`, `GetTopicAttributes`, `ListTagsForResource`, `SetSubscriptionAttributes`, `SetTopicAttributes`, `Subscribe`, `TagResource`, `Unsubscribe`, `UntagResource`. Configuration and authorization state must be persisted; waiting for a human or endpoint confirmation is not promised within this request-response budget.

**Bounded topic and subscription pages: +20 ms monthly p99 (adapter-added).** `ListSubscriptions`, `ListSubscriptionsByTopic`, `ListTopics`. Persistent catalog reads and token/result generation are included.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Bound subscriptions per topic, filter complexity, payload bytes and queued deliveries as well as publish rate. A publish with 20 subscribers creates up to 20 units of delivery work. Scale request handlers and delivery workers independently, and watch outbox age or broker backlog. Subscriber timeouts and provider quotas can limit delivery even when the adapter accepts new work quickly; the agreement must state a separate delivery/backlog objective if one is required.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful Publish must correspond to the documented durable acceptance point. Retries can duplicate downstream delivery, so consumers remain idempotent. Subscription activation must respect receiver consent and supported protocol rules. Filter policy, message attributes and FIFO behavior are limited by this target profile. Unsupported subscription or publish shapes are not implied by the numerical acceptance row.

#### Example and diagnosis

For topic `order-created`, publishing one 2 KiB event to ten subscriptions uses the single-publish row. The request can satisfy its SLA while an unreachable webhook accumulates retries; inspect delivery state separately. If adapter-owned outbox insertion is slow, that is fabric time rather than subscriber time and remains Tensor9's responsibility.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

## Install and run

The documentation and SLAs are public. Downloading and running the Cloud Adapter binary requires an entitled customer account. Set `T9_API_KEY` as described in [Install and Authenticate](https://docs.tensor9.com/cloud-adapter-early-access/getting-started/install-and-authenticate.md), then list the adapters your account may use with this origin:

```sh theme={null}
tensor9 adapt svc list \
  -origin aws::1.0.0::sns
```

The result is limited to directed mappings for this origin that your account is entitled to use. Use a returned backend identifier when configuring the adapter or investigating a request.

Request binary access from [hello@tensor9.com](mailto:hello@tensor9.com) if your account does not yet include this direction.

## Existing data and credentials

Selecting a backend does not copy existing data, credentials or access policies. Plan and verify migration separately before changing an application's endpoint. Do not assume an identifier, credential or encrypted value from the origin service works unchanged on the target.

## Configure, tune and debug

Start with [setup](https://docs.tensor9.com/cloud-adapter-early-access/getting-started/overview.md) and [configuration](https://docs.tensor9.com/cloud-adapter-early-access/configuration/overview.md). Use [tuning](https://docs.tensor9.com/cloud-adapter-early-access/tuning/overview.md) to understand supported request tags, [debugging](https://docs.tensor9.com/cloud-adapter-early-access/debugging/overview.md) to investigate a request, and [High Fidelity Cloud Emulators](https://docs.tensor9.com/cloud-adapter-early-access/local-testing/overview.md) to validate a bounded reproduction.

For requests that go through an entitled service adapter, use [tensor9 explain](https://docs.tensor9.com/cloud-adapter-early-access/debugging/explain.md) and [x-t9-explain](https://docs.tensor9.com/cloud-adapter-early-access/debugging/response-headers.md) to inspect the selected mapping.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.