<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Boto3 on Devlog in the SKY</title>
    <link>https://skyoo2003.github.io/en/tags/boto3/</link>
    <description>Recent content in Boto3 on Devlog in the SKY</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 19 Apr 2026 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://skyoo2003.github.io/en/tags/boto3/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Achieving boto3 Compatibility in a Local AWS Emulator</title>
      <link>https://skyoo2003.github.io/en/posts/2026/04/19/local-aws-emulator-boto3-compatibility/</link>
      <pubDate>Sun, 19 Apr 2026 00:00:00 +0900</pubDate>
      <guid>https://skyoo2003.github.io/en/posts/2026/04/19/local-aws-emulator-boto3-compatibility/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Developing cloud-native applications comes with recurring pain points: AWS calls in CI pipelines incur costs, development stops without VPN, and onboarding requires credential setup. &lt;a href=&#34;https://github.com/skyoo2003/devcloud&#34;&gt;DevCloud&lt;/a&gt; is a local AWS emulator that solves these problems entirely offline.&lt;/p&gt;
&lt;p&gt;It achieves &lt;strong&gt;671/699 test cases passing (96%)&lt;/strong&gt; in boto3 compatibility tests. That number isn&amp;rsquo;t just a test pass rate — it&amp;rsquo;s a measure of how precisely the protocol layer replicates AWS behavior. This post explains how a single Go binary achieves this level of compatibility, covering protocol detection, serialization challenges, the plugin architecture, and the path from 96% to production-ready.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Developing cloud-native applications comes with recurring pain points: AWS calls in CI pipelines incur costs, development stops without VPN, and onboarding requires credential setup. <a href="https://github.com/skyoo2003/devcloud">DevCloud</a> is a local AWS emulator that solves these problems entirely offline.</p>
<p>It achieves <strong>671/699 test cases passing (96%)</strong> in boto3 compatibility tests. That number isn&rsquo;t just a test pass rate — it&rsquo;s a measure of how precisely the protocol layer replicates AWS behavior. This post explains how a single Go binary achieves this level of compatibility, covering protocol detection, serialization challenges, the plugin architecture, and the path from 96% to production-ready.</p>
<h2 id="the-problem-why-aws-emulation-is-hard">The Problem: Why AWS Emulation Is Hard</h2>
<p>Before diving into the solution, it&rsquo;s worth understanding why AWS emulation is fundamentally difficult.</p>
<p>Most APIs have one protocol. gRPC services use protobuf, REST APIs use JSON, GraphQL uses its query language. AWS uses <strong>five different protocols</strong> across its services, each with unique serialization rules, error formats, and authentication schemes. A single &ldquo;AWS API&rdquo; doesn&rsquo;t exist — you&rsquo;re really building five protocol implementations that happen to share a service model.</p>
<p>The second challenge is <strong>behavioral fidelity</strong>. It&rsquo;s not enough to return the right JSON structure. Timestamps must be in ISO 8601 with the right precision. Error codes must match AWS&rsquo;s specific strings. Pagination tokens must be parseable by the SDK. XML responses must have the exact namespace declarations boto3 expects. Each of these details is a potential compatibility failure.</p>
<h2 id="5-protocols-one-gateway">5 Protocols, One Gateway</h2>
<p>DevCloud handles all five AWS protocols through a single HTTP gateway:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 672 329"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='0' y='228' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='8' y='228' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>▼</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='16' y='68' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='84' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='16' y='100' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='116' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='132' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='148' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='164' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='180' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='196' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='212' fill='currentColor' style='font-size:1em'>▼</text>
<text text-anchor='middle' x='16' y='228' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='244' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='16' y='260' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='16' y='276' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='16' y='292' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='16' y='308' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='24' y='84' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='24' y='228' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='260' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='24' y='276' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='24' y='292' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='24' y='308' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>G</text>
<text text-anchor='middle' x='32' y='228' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='40' y='84' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='40' y='228' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='260' fill='currentColor' style='font-size:1em'>X</text>
<text text-anchor='middle' x='40' y='276' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='40' y='292' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='40' y='308' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='48' y='100' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='48' y='132' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='48' y='148' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='48' y='164' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='48' y='180' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='48' y='228' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='48' y='260' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='48' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='48' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='48' y='308' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='56' y='100' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='132' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='148' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='164' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='180' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='56' y='228' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='56' y='260' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='56' y='276' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='56' y='292' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='56' y='308' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='64' y='260' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='276' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='64' y='292' fill='currentColor' style='font-size:1em'>V</text>
<text text-anchor='middle' x='64' y='308' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='84' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='100' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='72' y='116' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='72' y='132' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='72' y='148' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='72' y='164' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='72' y='180' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='72' y='228' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='72' y='260' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='72' y='276' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='72' y='292' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='72' y='308' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='80' y='132' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='80' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='164' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='80' y='228' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='260' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='276' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='308' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='88' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='88' y='116' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='88' y='132' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='88' y='148' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='88' y='164' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='88' y='180' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='88' y='228' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='260' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='88' y='276' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='292' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='88' y='308' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>3</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='96' y='132' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='96' y='148' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='96' y='164' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='96' y='180' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='96' y='228' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='260' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='276' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='96' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='104' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='164' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='104' y='228' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='260' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='104' y='276' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='104' y='292' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='112' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='132' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='112' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='164' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='180' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='112' y='228' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='112' y='260' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='112' y='276' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='112' y='292' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='116' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='120' y='132' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='120' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='120' y='164' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='120' y='180' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='120' y='228' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='120' y='260' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='276' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='120' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='128' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='128' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='128' y='148' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='128' y='164' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='128' y='180' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='128' y='228' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='128' y='260' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='276' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='128' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>W</text>
<text text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='136' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='132' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='148' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='136' y='164' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='180' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='136' y='276' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='136' y='292' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='144' y='100' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='144' y='132' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='144' y='164' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='144' y='180' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='144' y='260' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='144' y='292' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>7</text>
<text text-anchor='middle' x='152' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='152' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='116' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='152' y='132' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='148' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='152' y='164' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='152' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='152' y='260' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='276' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='152' y='292' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>4</text>
<text text-anchor='middle' x='160' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='160' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='132' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='160' y='148' fill='currentColor' style='font-size:1em'>X</text>
<text text-anchor='middle' x='160' y='164' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='180' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='260' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='160' y='276' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>7</text>
<text text-anchor='middle' x='168' y='100' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='168' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='132' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='148' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='168' y='164' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='168' y='260' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='168' y='276' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='168' y='292' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='176' y='116' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='176' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='176' y='148' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='176' y='180' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='176' y='260' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='276' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='176' y='292' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='184' y='100' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='184' y='116' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='184' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='184' y='148' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='184' y='164' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='184' y='180' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='184' y='260' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='184' y='276' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='184' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='192' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='192' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='192' y='132' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='192' y='148' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='192' y='164' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='192' y='180' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='192' y='276' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='192' y='292' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='200' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='200' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='200' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='200' y='148' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='200' y='164' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='200' y='180' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='200' y='260' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='200' y='276' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='208' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='208' y='132' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='208' y='148' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='208' y='164' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='208' y='180' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='208' y='260' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='208' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='208' y='292' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='216' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='216' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='216' y='164' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='216' y='180' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='216' y='260' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='216' y='276' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='216' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='224' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='224' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='132' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='224' y='148' fill='currentColor' style='font-size:1em'>q</text>
<text text-anchor='middle' x='224' y='164' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='224' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='224' y='260' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='276' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='224' y='292' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='232' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='232' y='132' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='232' y='148' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='232' y='164' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='232' y='180' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='232' y='260' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='276' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='232' y='292' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='240' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='240' y='132' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='240' y='148' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='240' y='164' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='240' y='180' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='240' y='260' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='240' y='276' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='240' y='292' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='248' y='132' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='248' y='148' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='248' y='164' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='248' y='180' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='248' y='260' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='248' y='276' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='248' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='256' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='256' y='132' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='256' y='148' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='256' y='164' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='256' y='276' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='264' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='264' y='148' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='264' y='164' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='264' y='180' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='276' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='292' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='272' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='272' y='132' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='272' y='148' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='272' y='180' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='276' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='272' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='280' y='116' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='280' y='132' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='280' y='148' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='280' y='164' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='280' y='180' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='280' y='276' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='280' y='292' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='288' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='288' y='132' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='288' y='148' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='288' y='164' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='288' y='180' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='288' y='260' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='288' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='288' y='292' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='296' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='296' y='164' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='296' y='180' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='296' y='276' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='304' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='304' y='116' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='304' y='164' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='304' y='180' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='304' y='260' fill='currentColor' style='font-size:1em'>J</text>
<text text-anchor='middle' x='304' y='276' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='304' y='308' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='312' y='164' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='312' y='180' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='312' y='260' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='312' y='276' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='312' y='292' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='320' y='4' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='320' y='164' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='320' y='180' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='320' y='260' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='320' y='308' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='328' y='164' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='328' y='180' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='328' y='260' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='328' y='276' fill='currentColor' style='font-size:1em'>+</text>
<text text-anchor='middle' x='328' y='292' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='328' y='308' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='336' y='164' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='336' y='292' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='336' y='308' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='344' y='180' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='344' y='260' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='344' y='276' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='344' y='292' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='344' y='308' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='352' y='180' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='352' y='260' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='352' y='276' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='352' y='292' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='352' y='308' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='360' y='180' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='360' y='260' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='360' y='276' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='292' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='360' y='308' fill='currentColor' style='font-size:1em'>X</text>
<text text-anchor='middle' x='368' y='180' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='368' y='260' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='368' y='276' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='368' y='292' fill='currentColor' style='font-size:1em'>J</text>
<text text-anchor='middle' x='368' y='308' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='376' y='180' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='376' y='260' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='376' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='376' y='292' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='376' y='308' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='384' y='260' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='384' y='276' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='384' y='292' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='392' y='260' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='392' y='276' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='392' y='292' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='392' y='308' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='400' y='260' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='400' y='308' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='408' y='276' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='408' y='292' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='408' y='308' fill='currentColor' style='font-size:1em'>3</text>
<text text-anchor='middle' x='416' y='260' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='416' y='292' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='416' y='308' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='424' y='260' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='424' y='276' fill='currentColor' style='font-size:1em'>Q</text>
<text text-anchor='middle' x='424' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='432' y='260' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='432' y='276' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='432' y='292' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='440' y='260' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='440' y='276' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='440' y='292' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='448' y='260' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='448' y='276' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='448' y='292' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='456' y='260' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='456' y='276' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='456' y='292' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='464' y='260' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='464' y='292' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='472' y='260' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='472' y='276' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='480' y='260' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='480' y='276' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='488' y='260' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='488' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='496' y='276' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='504' y='260' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='504' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='512' y='260' fill='currentColor' style='font-size:1em'>Q</text>
<text text-anchor='middle' x='512' y='276' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='520' y='260' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='520' y='276' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='528' y='276' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='536' y='260' fill='currentColor' style='font-size:1em'>J</text>
<text text-anchor='middle' x='544' y='260' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='544' y='276' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='552' y='260' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='552' y='276' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='560' y='260' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='560' y='276' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='568' y='260' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='568' y='276' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='576' y='276' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='592' y='276' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='600' y='276' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='608' y='276' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='616' y='276' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='632' y='276' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='640' y='276' fill='currentColor' style='font-size:1em'>Q</text>
<text text-anchor='middle' x='648' y='276' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='656' y='276' fill='currentColor' style='font-size:1em'>)</text>
</g>

    </svg>
  
</div>
<h3 id="automatic-protocol-detection">Automatic Protocol Detection</h3>
<p>Protocol is determined solely from incoming request headers:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#6272a4">// internal/gateway/protocol.go</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">func</span> <span style="color:#50fa7b">DetectProtocol</span>(r <span style="color:#ff79c6">*</span>http.Request) (protocol <span style="color:#8be9fd">string</span>, serviceID <span style="color:#8be9fd">string</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">// 1. JSON protocol: X-Amz-Target header present</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">if</span> target <span style="color:#ff79c6">:=</span> r.Header.<span style="color:#50fa7b">Get</span>(<span style="color:#f1fa8c">&#34;X-Amz-Target&#34;</span>); target <span style="color:#ff79c6">!=</span> <span style="color:#f1fa8c">&#34;&#34;</span> {
</span></span><span style="display:flex;"><span>        contentType <span style="color:#ff79c6">:=</span> r.Header.<span style="color:#50fa7b">Get</span>(<span style="color:#f1fa8c">&#34;Content-Type&#34;</span>)
</span></span><span style="display:flex;"><span>        proto <span style="color:#ff79c6">:=</span> <span style="color:#50fa7b">jsonProtocolFromContentType</span>(contentType)
</span></span><span style="display:flex;"><span>        service <span style="color:#ff79c6">:=</span> <span style="color:#50fa7b">serviceFromTarget</span>(target)
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">return</span> proto, service
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">// 2. Query protocol: Action= parameter in form-encoded body</span>
</span></span><span style="display:flex;"><span>    contentType <span style="color:#ff79c6">:=</span> r.Header.<span style="color:#50fa7b">Get</span>(<span style="color:#f1fa8c">&#34;Content-Type&#34;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">if</span> strings.<span style="color:#50fa7b">Contains</span>(contentType, <span style="color:#f1fa8c">&#34;application/x-www-form-urlencoded&#34;</span>) {
</span></span><span style="display:flex;"><span>        bodyBytes, err <span style="color:#ff79c6">:=</span> io.<span style="color:#50fa7b">ReadAll</span>(r.Body)
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">if</span> err <span style="color:#ff79c6">==</span> <span style="color:#ff79c6">nil</span> {
</span></span><span style="display:flex;"><span>            r.Body = io.<span style="color:#50fa7b">NopCloser</span>(bytes.<span style="color:#50fa7b">NewReader</span>(bodyBytes))
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">if</span> strings.<span style="color:#50fa7b">Contains</span>(<span style="color:#8be9fd;font-style:italic">string</span>(bodyBytes), <span style="color:#f1fa8c">&#34;Action=&#34;</span>) {
</span></span><span style="display:flex;"><span>                service <span style="color:#ff79c6">:=</span> <span style="color:#50fa7b">serviceFromQueryRequest</span>(r, <span style="color:#8be9fd;font-style:italic">string</span>(bodyBytes))
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">return</span> <span style="color:#f1fa8c">&#34;query&#34;</span>, service
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">// 3. REST-style service extraction from SigV4 signature</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">if</span> svc <span style="color:#ff79c6">:=</span> <span style="color:#50fa7b">serviceFromSigV4</span>(r); svc <span style="color:#ff79c6">!=</span> <span style="color:#f1fa8c">&#34;&#34;</span> <span style="color:#ff79c6">&amp;&amp;</span> svc <span style="color:#ff79c6">!=</span> <span style="color:#f1fa8c">&#34;s3&#34;</span> {
</span></span><span style="display:flex;"><span>        normalized <span style="color:#ff79c6">:=</span> <span style="color:#50fa7b">normalizeServiceID</span>(svc)
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">return</span> <span style="color:#f1fa8c">&#34;rest-json&#34;</span>, normalized
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#6272a4">// 4. Default: REST-XML (S3)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">return</span> <span style="color:#f1fa8c">&#34;rest-xml&#34;</span>, <span style="color:#f1fa8c">&#34;s3&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><p>The detection order matters. <code>X-Amz-Target</code> must be checked first, otherwise JSON protocol services (DynamoDB, Lambda) would be misidentified as Query protocol. SQS is an unusual service that supports both JSON and Query protocols, distinguished by the presence of the <code>X-Amz-Target</code> header.</p>
<h3 id="service-name-normalization">Service Name Normalization</h3>
<p>The gateway maintains an extensive table mapping 100+ AWS service names to internal IDs. There are many special cases:</p>
<ul>
<li>SES → <code>sesv2</code> (REST-JSON, not Query)</li>
<li><code>opensearch</code> vs <code>elasticsearchservice</code> (path-based differentiation)</li>
<li>Service name normalization (whitespace removal, lowercase conversion)</li>
</ul>
<p>This ensures that regardless of how the SDK references a service, it reaches the correct plugin.</p>
<h2 id="protocol-specific-serialization-details">Protocol-Specific Serialization Details</h2>
<p>Serialization differs completely across protocols. The serialization/deserialization layer is the most challenging part of building an emulator. Let&rsquo;s look at specific examples.</p>
<h3 id="rest-xml-s3">REST-XML (S3)</h3>
<p>S3 is the most complex protocol. Operations are determined by HTTP method and path, and responses must be valid XML with specific namespace declarations.</p>
<p><strong>Request routing:</strong></p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 592 89"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>G</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='0' y='68' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='8' y='68' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='16' y='68' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='24' y='68' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='56' y='68' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='72' y='68' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='96' y='68' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>?</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'>?</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='152' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='160' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='168' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='184' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='200' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='200' y='36' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='200' y='68' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='208' y='68' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='216' y='68' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='224' y='36' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='224' y='68' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='232' y='68' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='240' y='68' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='248' y='68' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='256' y='68' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='288' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='296' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='344' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='344' y='20' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='344' y='68' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='360' y='4' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='360' y='20' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='360' y='36' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>H</text>
<text text-anchor='middle' x='360' y='68' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='368' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='368' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='368' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='376' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='376' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='376' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='376' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='384' y='4' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='384' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='384' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='384' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='384' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='392' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='392' y='20' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='392' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='392' y='52' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='392' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='400' y='4' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='400' y='20' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='400' y='52' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='400' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='408' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='408' y='20' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='408' y='36' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='408' y='52' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='408' y='68' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='416' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='416' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='416' y='36' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='416' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='416' y='68' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='424' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='424' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='424' y='36' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='424' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='424' y='68' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='432' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='432' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='432' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='432' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='440' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='440' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='440' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='448' y='20' fill='currentColor' style='font-size:1em'>V</text>
<text text-anchor='middle' x='448' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='448' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='456' y='20' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='456' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='472' y='68' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='480' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='488' y='68' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='496' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='504' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='512' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='520' y='68' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='528' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='536' y='68' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='544' y='68' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='552' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='560' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='568' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='576' y='68' fill='currentColor' style='font-size:1em'>)</text>
</g>

    </svg>
  
</div>
<p><strong>Response XML structure:</strong></p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#ff79c6">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">&lt;ListObjectsV2Output&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;Name&gt;</span>my-bucket<span style="color:#ff79c6">&lt;/Name&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;Prefix&gt;&lt;/Prefix&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;KeyCount&gt;</span>2<span style="color:#ff79c6">&lt;/KeyCount&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;MaxKeys&gt;</span>1000<span style="color:#ff79c6">&lt;/MaxKeys&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;IsTruncated&gt;</span>false<span style="color:#ff79c6">&lt;/IsTruncated&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;Contents&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;Key&gt;</span>hello.txt<span style="color:#ff79c6">&lt;/Key&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;LastModified&gt;</span>2026-04-19T12:00:00.000Z<span style="color:#ff79c6">&lt;/LastModified&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;ETag&gt;</span>&#34;d41d8cd98f00b204e9800998ecf8427e&#34;<span style="color:#ff79c6">&lt;/ETag&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;Size&gt;</span>13<span style="color:#ff79c6">&lt;/Size&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">&lt;StorageClass&gt;</span>STANDARD<span style="color:#ff79c6">&lt;/StorageClass&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">&lt;/Contents&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">&lt;/ListObjectsV2Output&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>boto3 parses this XML using the <code>xmlNamespace</code> trait from the service model. If namespace declarations or element order are wrong, deserialization silently fails or produces incorrect values.</p>
<h3 id="json-1011-dynamodb-lambda">JSON 1.0/1.1 (DynamoDB, Lambda)</h3>
<p>JSON protocols have simpler routing but their own nuances:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 592 73"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>X</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>{</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>B</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>_</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='200' y='20' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>8</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='232' y='20' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='288' y='20' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>[</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='296' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='304' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='312' y='20' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='320' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>]</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='336' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='376' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='384' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='392' y='52' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='400' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='408' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='416' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='424' y='52' fill='currentColor' style='font-size:1em'>D</text>
<text text-anchor='middle' x='432' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='440' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='448' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='456' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='464' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='472' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='480' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='488' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='496' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='504' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='512' y='52' fill='currentColor' style='font-size:1em'>"</text>
<text text-anchor='middle' x='520' y='52' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='536' y='52' fill='currentColor' style='font-size:1em'>[</text>
<text text-anchor='middle' x='544' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='552' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='560' y='52' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='568' y='52' fill='currentColor' style='font-size:1em'>]</text>
<text text-anchor='middle' x='576' y='52' fill='currentColor' style='font-size:1em'>}</text>
</g>

    </svg>
  
</div>
<p>JSON 1.0 uses <code>application/x-amz-json-1.0</code> and follows a specific <code>X-Amz-Target</code> format: <code>ServiceName_APIVersion.OperationName</code>. JSON 1.1 uses <code>application/x-amz-json-1.1</code> with a slightly different target format.</p>
<p>Error responses follow a specific structure:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#ff79c6">&#34;__type&#34;</span>: <span style="color:#f1fa8c">&#34;ResourceNotFoundException&#34;</span>, <span style="color:#ff79c6">&#34;message&#34;</span>: <span style="color:#f1fa8c">&#34;Requested resource not found&#34;</span>}
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="query-iam-sts">Query (IAM, STS)</h3>
<p>The Query protocol encodes all parameters as form-urlencoded:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 392 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>G</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>&amp;</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>V</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='224' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>5</text>
<text text-anchor='middle' x='240' y='4' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>8</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>&amp;</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>U</text>
<text text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='4' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='320' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='336' y='4' fill='currentColor' style='font-size:1em'>=</text>
<text text-anchor='middle' x='344' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='360' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='368' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='376' y='4' fill='currentColor' style='font-size:1em'>e</text>
</g>

    </svg>
  
</div>
<p>This protocol has several unique serialization challenges:</p>
<ul>
<li><strong>ECMAScript date format</strong>: Timestamps encoded as <code>20260419T120000Z</code> (no hyphens or colons) — not ISO 8601</li>
<li><strong>Flattened lists</strong>: <code>member.1=Value1&amp;member.2=Value2</code> — index-based representation, not JSON arrays</li>
<li><strong>Structured map keys</strong>: <code>AttributeName.1.Name=id&amp;AttributeName.1.Value=userId</code> — map keys also index-encoded</li>
<li><strong>Boolean encoding</strong>: <code>true</code> and <code>false</code> as lowercase strings</li>
</ul>
<h2 id="what-96-compatibility-means">What 96% Compatibility Means</h2>
<p>The boto3 compatibility test replays actual AWS SDK requests against the emulator and verifies that responses match the structure the SDK expects. This isn&rsquo;t a unit test — it&rsquo;s a <strong>wire-protocol level integration test</strong>.</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 448 153"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>6</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='68' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='84' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='100' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='116' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='0' y='132' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>9</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>9</text>
<text text-anchor='middle' x='24' y='20' fill='currentColor' style='font-size:1em'>6</text>
<text text-anchor='middle' x='24' y='36' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='24' y='52' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='24' y='68' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='24' y='84' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='24' y='100' fill='currentColor' style='font-size:1em'>│</text>
<text text-anchor='middle' x='24' y='116' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>7</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>8</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='32' y='84' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='32' y='116' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='48' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='56' y='68' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='56' y='100' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='64' y='100' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='64' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='64' y='132' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='72' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='72' y='116' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='72' y='132' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'>N</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='88' y='132' fill='currentColor' style='font-size:1em'>E</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='68' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='96' y='116' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='96' y='132' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='104' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='132' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='112' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='132' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>9</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='120' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='120' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>6</text>
<text text-anchor='middle' x='128' y='68' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='128' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='128' y='116' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='136' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='136' y='116' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='136' y='132' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>0</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='144' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='144' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='132' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>%</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='152' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='152' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='152' y='132' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='160' y='20' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='68' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='160' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='160' y='100' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='160' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='160' y='132' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='176' y='68' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='176' y='100' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='176' y='116' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='176' y='132' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='184' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='184' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='184' y='100' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='184' y='116' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='132' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='192' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='192' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='192' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='200' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='200' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='200' y='100' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='200' y='116' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='200' y='132' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='208' y='68' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='208' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='208' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='208' y='116' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='208' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='216' y='52' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='216' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='216' y='100' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='216' y='116' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='216' y='132' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='224' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='224' y='84' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='224' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='224' y='116' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='224' y='132' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>1</text>
<text text-anchor='middle' x='232' y='68' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='232' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='232' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='232' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='232' y='132' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='240' y='52' fill='currentColor' style='font-size:1em'>2</text>
<text text-anchor='middle' x='240' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='240' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='240' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='240' y='116' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='240' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='248' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='248' y='84' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='248' y='100' fill='currentColor' style='font-size:1em'>,</text>
<text text-anchor='middle' x='248' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='248' y='132' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='256' y='68' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='256' y='84' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='256' y='116' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='256' y='132' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='264' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='264' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='272' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='272' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='272' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='272' y='116' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='132' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='280' y='68' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='280' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='280' y='116' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='280' y='132' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='288' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='288' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='288' y='116' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='288' y='132' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='296' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'>z</text>
<text text-anchor='middle' x='296' y='132' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='304' y='68' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='304' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='304' y='116' fill='currentColor' style='font-size:1em'>8</text>
<text text-anchor='middle' x='312' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='312' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='312' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='312' y='132' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='320' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='320' y='84' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='320' y='100' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='320' y='132' fill='currentColor' style='font-size:1em'>W</text>
<text text-anchor='middle' x='328' y='68' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='328' y='132' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='336' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='336' y='84' fill='currentColor' style='font-size:1em'>8</text>
<text text-anchor='middle' x='336' y='100' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='344' y='68' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='344' y='100' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='352' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='360' y='68' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='360' y='100' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='368' y='100' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='376' y='68' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='376' y='100' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='384' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='384' y='100' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='392' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='392' y='100' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='400' y='68' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='408' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='416' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='424' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='432' y='68' fill='currentColor' style='font-size:1em'>g</text>
</g>

    </svg>
  
</div>
<p>Most of the 28 failures aren&rsquo;t functional errors — they&rsquo;re <strong>format micro-differences</strong>.</p>
<ol>
<li>
<p><strong>Pagination (12 failures)</strong>: boto3 uses a response&rsquo;s <code>NextToken</code> as input for the next request. If the token format differs from AWS, pagination breaks. Our tokens are base64-encoded pointers, while AWS uses opaque encrypted tokens. The SDK can parse them, but round-trips fail in some edge cases.</p>
</li>
<li>
<p><strong>Timestamps (8 failures)</strong>: AWS returns variable-precision timestamps — some with milliseconds (<code>2026-04-19T12:00:00.123Z</code>) and some without (<code>2026-04-19T12:00:00Z</code>). The SDK expects specific formats per field. Our timestamps always have millisecond precision, but some fields expect no decimal point.</p>
</li>
<li>
<p><strong>Error messages (8 failures)</strong>: Error messages like <code>The bucket you are attempting to access must be addressed using the specified endpoint.</code> must match AWS&rsquo;s exact wording. Our messages convey the same meaning but use different phrasing.</p>
</li>
</ol>
<p>These failures don&rsquo;t affect actual application behavior. Applications check error codes (e.g., <code>NoSuchBucket</code>), not error message text — and our error codes match exactly.</p>
<h2 id="service-plugin-architecture">Service Plugin Architecture</h2>
<p>Every service implements the <code>ServicePlugin</code> interface:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">type</span> ServicePlugin <span style="color:#8be9fd;font-style:italic">interface</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">ServiceID</span>() <span style="color:#8be9fd">string</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">ServiceName</span>() <span style="color:#8be9fd">string</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">Protocol</span>() ProtocolType
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">Init</span>(config PluginConfig) <span style="color:#8be9fd">error</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">Shutdown</span>(ctx context.Context) <span style="color:#8be9fd">error</span>
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">HandleRequest</span>(ctx context.Context, op <span style="color:#8be9fd">string</span>, req <span style="color:#ff79c6">*</span>http.Request) (<span style="color:#ff79c6">*</span>Response, <span style="color:#8be9fd">error</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">ListResources</span>(ctx context.Context) ([]Resource, <span style="color:#8be9fd">error</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#50fa7b">GetMetrics</span>(ctx context.Context) (<span style="color:#ff79c6">*</span>ServiceMetrics, <span style="color:#8be9fd">error</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="plugin-registry">Plugin Registry</h3>
<p>Services are registered through a central registry:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">type</span> Registry <span style="color:#8be9fd;font-style:italic">struct</span> {
</span></span><span style="display:flex;"><span>    mu        sync.RWMutex
</span></span><span style="display:flex;"><span>    factories <span style="color:#8be9fd;font-style:italic">map</span>[<span style="color:#8be9fd">string</span>]PluginFactory
</span></span><span style="display:flex;"><span>    active    <span style="color:#8be9fd;font-style:italic">map</span>[<span style="color:#8be9fd">string</span>]ServicePlugin
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">func</span> (r <span style="color:#ff79c6">*</span>Registry) <span style="color:#50fa7b">Register</span>(serviceID <span style="color:#8be9fd">string</span>, factory PluginFactory) {
</span></span><span style="display:flex;"><span>    r.mu.<span style="color:#50fa7b">Lock</span>()
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">defer</span> r.mu.<span style="color:#50fa7b">Unlock</span>()
</span></span><span style="display:flex;"><span>    r.factories[serviceID] = factory
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">func</span> (r <span style="color:#ff79c6">*</span>Registry) <span style="color:#50fa7b">Init</span>(serviceID <span style="color:#8be9fd">string</span>, cfg PluginConfig) (ServicePlugin, <span style="color:#8be9fd">error</span>) {
</span></span><span style="display:flex;"><span>    factory, ok <span style="color:#ff79c6">:=</span> r.factories[serviceID]
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">if</span> !ok {
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">return</span> <span style="color:#ff79c6">nil</span>, fmt.<span style="color:#50fa7b">Errorf</span>(<span style="color:#f1fa8c">&#34;unknown service: %s&#34;</span>, serviceID)
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    p <span style="color:#ff79c6">:=</span> <span style="color:#50fa7b">factory</span>(cfg)
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">if</span> err <span style="color:#ff79c6">:=</span> p.<span style="color:#50fa7b">Init</span>(cfg); err <span style="color:#ff79c6">!=</span> <span style="color:#ff79c6">nil</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">return</span> <span style="color:#ff79c6">nil</span>, fmt.<span style="color:#50fa7b">Errorf</span>(<span style="color:#f1fa8c">&#34;init %s: %w&#34;</span>, serviceID, err)
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    r.active[serviceID] = p
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">return</span> p, <span style="color:#ff79c6">nil</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><p>This separation means adding a new service requires:</p>
<ol>
<li>Run the code generator to produce types and stubs</li>
<li>Implement the <code>ServicePlugin</code> interface</li>
<li>Register with the factory</li>
</ol>
<p>Protocol handling, serialization, and routing are all handled by auto-generated code.</p>
<h2 id="usage-example-zero-code-changes">Usage Example: Zero Code Changes</h2>
<p>With DevCloud running, just change the endpoint — no code modifications needed:</p>
<h3 id="python-boto3">Python (boto3)</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">import</span> boto3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># Production</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># s3 = boto3.client(&#39;s3&#39;, endpoint_url=&#39;https://s3.amazonaws.com&#39;)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># DevCloud local</span>
</span></span><span style="display:flex;"><span>s3 <span style="color:#ff79c6">=</span> boto3<span style="color:#ff79c6">.</span>client(<span style="color:#f1fa8c">&#39;s3&#39;</span>, endpoint_url<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;http://localhost:4747&#39;</span>,
</span></span><span style="display:flex;"><span>                  aws_access_key_id<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;test&#39;</span>,
</span></span><span style="display:flex;"><span>                  aws_secret_access_key<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;test&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>s3<span style="color:#ff79c6">.</span>create_bucket(Bucket<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;my-bucket&#39;</span>)
</span></span><span style="display:flex;"><span>s3<span style="color:#ff79c6">.</span>put_object(Bucket<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;my-bucket&#39;</span>, Key<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;hello.txt&#39;</span>, Body<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">b</span><span style="color:#f1fa8c">&#39;Hello, DevCloud!&#39;</span>)
</span></span><span style="display:flex;"><span>response <span style="color:#ff79c6">=</span> s3<span style="color:#ff79c6">.</span>get_object(Bucket<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;my-bucket&#39;</span>, Key<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;hello.txt&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">print</span>(response[<span style="color:#f1fa8c">&#39;Body&#39;</span>]<span style="color:#ff79c6">.</span>read())  <span style="color:#6272a4"># b&#39;Hello, DevCloud!&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="docker">Docker</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker run -p 4566:4566 skyoo2003/devcloud
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="terraform">Terraform</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">export</span> <span style="color:#8be9fd;font-style:italic">AWS_ENDPOINT_URL</span><span style="color:#ff79c6">=</span>http://localhost:4747
</span></span><span style="display:flex;"><span>terraform apply
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="aws-cli">AWS CLI</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>aws --endpoint-url http://localhost:4747 s3 ls
</span></span></code></pre></td></tr></table>
</div>
</div><p>Any tool using the AWS SDK works without modification. DevCloud implements the same wire protocol as AWS, so from the SDK&rsquo;s perspective, there&rsquo;s no way to distinguish between real AWS and the local emulator.</p>
<h2 id="key-insights">Key Insights</h2>
<h3 id="1-protocols-are-the-core-complexity">1. Protocols Are the Core Complexity</h3>
<p>Serialization/deserialization determines implementation difficulty more than business logic. Manually implementing 5 protocol serializers for 96 services is a maintenance nightmare. Automating it with code generation is the right approach.</p>
<h3 id="2-compatibility-is-won-in-format-precision">2. Compatibility Is Won in Format Precision</h3>
<p>The path from 96% to 99.9% isn&rsquo;t about adding features — it&rsquo;s about timestamps, error messages, and pagination tokens. These details are tedious but essential. Each percentage point past 96% requires increasingly specific format matching.</p>
<h3 id="3-separate-concerns-with-plugin-architecture">3. Separate Concerns with Plugin Architecture</h3>
<p>Decoupling protocol handling from service logic lets both evolve independently. Improving protocol handling on the codegen side doesn&rsquo;t affect service implementations, and service developers can add features without knowing serialization details.</p>
<h3 id="4-test-from-the-sdks-perspective">4. Test from the SDK&rsquo;s Perspective</h3>
<p>The fastest way to build a compatible emulator is to test from the SDK&rsquo;s perspective, not the server&rsquo;s. Record actual SDK requests, replay them against the emulator, and compare responses. This catches format issues that server-centric tests miss.</p>
<h2 id="conclusion">Conclusion</h2>
<p>96% boto3 compatibility means you can use the AWS SDK as-is in local development. Eliminate cloud costs from CI/CD pipelines, enable offline development (flights, restricted networks), and reduce new team member onboarding to a single <code>docker run</code>.</p>
<p>The remaining 4% is format precision — pagination tokens, timestamp formats, error message wording. These are being incrementally improved with weekly Smithy model syncs.</p>
<p>Full source code available at <a href="https://github.com/skyoo2003/devcloud">github.com/skyoo2003/devcloud</a>.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
