<?xml version="1.0" encoding="utf-8"?>
<!--
  RFCXML v3 source for the ba64 Internet-Draft, kept in step with
  draft-gaikwad-ba64-00.md. Render or check with
  "xml2rfc **v3 **text draft-gaikwad-ba64-00.xml" (double dash before v3/text).
  Submit this file at https://datatracker.ietf.org/submit/.
-->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-gaikwad-ba64-00"
     ipr="trust200902"
     category="info"
     submissionType="independent"
     version="3"
     tocInclude="true"
     sortRefs="true"
     symRefs="true">

  <front>
    <title abbrev="ba64">ba64: A Binary-to-Text Encoding That Is Never Larger Than Base64</title>
    <seriesInfo name="Internet-Draft" value="draft-gaikwad-ba64-00"/>
    <author fullname="Madhava Gaikwad" initials="M." surname="Gaikwad">
      <organization>Independent</organization>
      <address>
        <email>gaikwad.madhav@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="August" day="16"/>
    <area>Applications and Real-Time</area>
    <keyword>base64</keyword>
    <keyword>compression</keyword>
    <keyword>deflate</keyword>
    <keyword>encoding</keyword>

    <abstract>
      <t>ba64 is a text encoding for binary data that is never larger than
      standard base64. An encoder races DEFLATE compression against plain base64
      and emits whichever final text is shorter. Compressed output is marked by a
      leading "=" character, which is inside the base64 alphabet, so it survives
      every base64-safe channel, yet can never begin a valid base64 string, so the
      two forms are unambiguous. A CRC-32 over the decoded bytes guarantees that a
      ba64 decoder never silently returns wrong data. The plain form is
      byte-identical to base64, so ba64 decoders are a drop-in replacement
      wherever base64 is read today. An optional padding method decouples the
      emitted length from the compressibility of the input.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="introduction">
      <name>Introduction</name>
      <t>Base64 <xref target="RFC4648"/> expands binary data by 33%. Applications
      that embed binary in JSON, cookies, logs, or size-limited message channels
      pay that tax even when the underlying bytes are highly compressible. Ad hoc
      solutions (gzip-then-base64) fork the wire format and lose base64
      compatibility.</t>
      <t>ba64 addresses this with a single rule: emit compressed output only when
      it is strictly shorter than plain base64. The result is an encoding that is
      never larger than base64, is byte-identical to base64 in the common
      (incompressible) case, and is unambiguously self-describing.</t>
      <t>The emitted length depends on the compressibility of the input, which
      exposes the compression side channel of <xref target="CRIME"/>, summarized
      for TLS in <xref target="RFC7457"/>, where an
      adversary controls part of an input carried alongside secret data. <xref
      target="method-pad"/> defines an OPTIONAL padding method that decouples the
      emitted length from compressibility, <xref target="padding"/> specifies the
      policy for selecting a pad, and <xref target="security"/> states the limits
      of the mitigation.</t>
      <t>This document specifies version 1 of the ba64 format. Version 1 is
      intended to be frozen: evolution occurs only through new method identifiers
      assigned by a future revision.</t>
    </section>

    <section anchor="conventions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
      "OPTIONAL" in this document are to be interpreted as described in BCP 14
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
      appear in all capitals, as shown here.</t>
      <t>Throughout, "base64" means canonical base64 as defined in <xref
      target="RFC4648"/>, Section 4: the alphabet A-Z a-z 0-9 + /, "=" padding
      REQUIRED, no whitespace, no other characters, and the unused trailing bits
      of the final symbol set to zero. There is no URL-safe variant of ba64 (<xref
      target="non-goals"/>).</t>
    </section>

    <section anchor="encoded-forms">
      <name>Encoded Forms</name>
      <t>A ba64 text is an ASCII string in exactly one of two forms:</t>
      <artwork type="ascii-art"><![CDATA[
plain form:       base64(input)        ; byte-identical to base64
compressed form:  "=" + base64(frame)
]]></artwork>
      <t>Dispatch is by the first character: "=" selects the compressed form;
      anything else (including the empty string, which decodes to zero bytes)
      selects the plain form.</t>
    </section>

    <section anchor="frame-layout">
      <name>Frame Layout</name>
      <artwork type="ascii-art"><![CDATA[
frame = version || method || decoded_len || crc32 || payload

offset  size       field        value
0       1 byte     version      0x01
1       1 byte     method       see below
2       1-9 bytes  decoded_len  unsigned LEB128
...     4 bytes    crc32        CRC-32 of DECODED bytes, LE
...     rest       payload      method-specific compressed data
]]></artwork>

      <section anchor="decoded-len">
        <name>decoded_len (unsigned LEB128)</name>
        <t>Little-endian base-128; each byte holds 7 value bits with the high bit
        as continuation. It MUST be minimally encoded (if longer than one byte,
        the final byte MUST NOT be 0x00), and MUST NOT exceed 9 bytes (so
        decoded_len &lt; 2^63). Violations yield E_HEADER.</t>
      </section>

      <section anchor="crc32">
        <name>crc32</name>
        <t>CRC-32/ISO-HDLC, the algorithm of gzip <xref target="RFC1952"/>, zlib,
        and PNG: reflected polynomial 0xEDB88320, initial value 0xFFFFFFFF, final
        XOR 0xFFFFFFFF, reflected input and output. Stored little-endian, computed
        over the decoded (original) bytes, so it detects both channel corruption
        and decompressor divergence end-to-end. Anchors:
        CRC32("123456789") = 0xCBF43926, CRC32("") = 0.</t>
      </section>

      <section anchor="method-registry">
        <name>Method Registry</name>
        <table>
          <name>Method identifiers</name>
          <thead>
            <tr><th>ID</th><th>Meaning</th></tr>
          </thead>
          <tbody>
            <tr><td>0x00</td><td>Reserved, never valid</td></tr>
            <tr><td>0x01</td><td>DEFLATE, raw (<xref target="method-deflate"/>)</td></tr>
            <tr><td>0x02</td><td>DEFLATE, raw, with padding (<xref target="method-pad"/>)</td></tr>
            <tr><td>0x03 - 0xEF</td><td>Reserved for future revisions -&gt; E_METHOD</td></tr>
            <tr><td>0xF0 - 0xFF</td><td>Private use -&gt; E_METHOD unless configured</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <section anchor="method-deflate">
      <name>Method 0x01 - Raw DEFLATE</name>
      <t>The payload is exactly one complete raw DEFLATE stream per <xref
      target="RFC1951"/>, with no zlib or gzip wrapper. Normative outcomes:</t>
      <ul>
        <li>Inflater produces MORE than decoded_len bytes: abort at the cap,
        E_LENGTH_MISMATCH.</li>
        <li>Stream completes with FEWER than decoded_len bytes:
        E_LENGTH_MISMATCH.</li>
        <li>Payload exhausted before the final block completes, or malformed:
        E_PAYLOAD.</li>
        <li>Bytes remain after the final block: E_PAYLOAD.</li>
      </ul>
    </section>

    <section anchor="method-pad">
      <name>Method 0x02 - Raw DEFLATE With Padding</name>
      <t>Method 0x02 is method 0x01 with one additional header field and a
      trailing pad. It allows an encoder to select the emitted text length
      independently of the compressibility of the input (<xref target="padding"/>,
      <xref target="security"/>).</t>
      <artwork type="ascii-art"><![CDATA[
frame = version || 0x02 || decoded_len || crc32
                       || pad_len || payload || pad
]]></artwork>
      <ul>
        <li>pad_len is an unsigned LEB128 under the same constraints as
        decoded_len: minimally encoded, at most 9 bytes; violations yield
        E_HEADER.</li>
        <li>pad is exactly pad_len bytes at the end of the frame. If fewer than
        pad_len bytes remain after pad_len itself, the result is E_TRUNCATED.</li>
        <li>payload is everything between pad_len and the pad: one complete raw
        DEFLATE stream, judged by the <xref target="method-deflate"/> rules. The
        pad is removed BEFORE inflating and is never fed to the inflater.</li>
        <li>Encoders MUST write zero bytes for the pad. Decoders MUST NOT inspect
        the pad's content and MUST NOT reject a frame because of it. Pad content
        is therefore not integrity-protected: the CRC covers the decoded bytes
        only.</li>
        <li>pad_len = 0 is valid, and is grammatically distinct from a
        method-0x01 frame carrying the same payload.</li>
      </ul>
      <t>A padded frame occupies the length its encoder selected. Padding
      therefore trades the compression saving for length uniformity.</t>
    </section>

    <section anchor="decoding">
      <name>Decoding Algorithm</name>
      <t>Input: string s, caller limit max_decoded_len (default 67,108,864).
      Checks MUST run in this order, so any invalid input yields one deterministic
      code:</t>
      <artwork type="ascii-art"><![CDATA[
 1. s does not start with "=": canonical-base64-decode s
      (fail -> E_BASE64); return the bytes ("" -> empty bytes).
 2. canonical-base64-decode s[1:]                fail -> E_BASE64
 3. read version (1 byte)  missing -> E_TRUNCATED; !=0x01 -> E_VERSION
 4. read method  (1 byte)  missing -> E_TRUNCATED; unknown -> E_METHOD
 5. read decoded_len (LEB128)
      exhausted -> E_TRUNCATED; non-minimal or >9 bytes -> E_HEADER
 6. decoded_len > max_decoded_len  -> E_LIMIT_EXCEEDED
      (MUST precede any allocation proportional to decoded_len)
 7. read crc32 (4 bytes)    missing -> E_TRUNCATED
7b. method 0x02 only: read pad_len (LEB128)
      exhausted -> E_TRUNCATED; non-minimal or >9 bytes -> E_HEADER
      fewer than pad_len bytes remain -> E_TRUNCATED
      trim the trailing pad_len bytes; the payload is what is left
 8. inflate payload with hard output cap = decoded_len
      (a cap of zero still caps)  -> E_PAYLOAD / E_LENGTH_MISMATCH
 9. CRC32(output) != crc32  -> E_CHECKSUM
10. return output
]]></artwork>
      <t>E_TRUNCATED refers only to the fixed header fields (steps 3-7b);
      truncation inside the DEFLATE stream is E_PAYLOAD. A decoder MUST NOT reject
      a frame merely because a conforming encoder would have chosen the plain
      form: decoders validate the grammar, not encoder optimality.</t>
    </section>

    <section anchor="error-taxonomy">
      <name>Error Taxonomy</name>
      <t>Conformance means the exact code, not merely "an error."</t>
      <table>
        <name>Error codes</name>
        <thead>
          <tr><th>Code</th><th>Fires when</th></tr>
        </thead>
        <tbody>
          <tr><td>E_BASE64</td><td>input or frame body is not canonical base64</td></tr>
          <tr><td>E_TRUNCATED</td><td>frame ends inside the header, or is shorter than its pad</td></tr>
          <tr><td>E_HEADER</td><td>LEB128 non-minimal or longer than 9 bytes</td></tr>
          <tr><td>E_VERSION</td><td>version byte != 0x01</td></tr>
          <tr><td>E_METHOD</td><td>method unknown, reserved, or unconfigured</td></tr>
          <tr><td>E_LIMIT_EXCEEDED</td><td>claimed decoded_len exceeds the caller's limit</td></tr>
          <tr><td>E_PAYLOAD</td><td>DEFLATE stream malformed, short, or has trailing bytes</td></tr>
          <tr><td>E_LENGTH_MISMATCH</td><td>inflated size != decoded_len</td></tr>
          <tr><td>E_CHECKSUM</td><td>CRC-32 of output != stored value</td></tr>
        </tbody>
      </table>
      <t>Implementation note: the boundary between E_PAYLOAD and
      E_LENGTH_MISMATCH for a truncated DEFLATE stream depends on the underlying
      inflate library (some treat premature end of input as end of stream). Both
      codes reject the frame and the CRC still prevents silently-wrong output;
      callers SHOULD treat the two as equivalent "corrupt frame" outcomes.</t>
    </section>

    <section anchor="encoding-requirements">
      <name>Encoding Requirements</name>
      <ol>
        <li>Output MUST be one of the two forms, using canonical base64
        throughout.</li>
        <li>Floor rule: the compressed form MUST be emitted only if its final text
        length is strictly less than the plain form's; ties take plain.
        Consequently len(ba64(x)) &lt;= len(base64(x)) for every input.</li>
        <li>decoded_len MUST equal the true input length, minimally encoded; crc32
        MUST be over the input bytes.</li>
        <li>An encoder MAY skip compression entirely. An encoder that always emits
        plain base64 is degenerate but fully conforming.</li>
        <li>DEFLATE level is the encoder's choice (SHOULD default to 6). Encoded
        output is therefore NOT canonical: the same input may yield different
        valid texts. Any equality, deduplication, cache-keying, or MAC comparison
        MUST operate on the decoded bytes, never on ba64 text.</li>
        <li>Padding is OPTIONAL: an encoder MAY emit method 0x02 (<xref
        target="padding"/>). The floor rule still binds. A decoder MUST accept
        method 0x02 whether or not the encoder ever produces it.</li>
      </ol>
    </section>

    <section anchor="padding">
      <name>The Padding Policy</name>
      <t>Let n be the input length and P = 4*ceil(n/3) the plain-form length. A
      compressed text is 1 + 4k characters and is therefore congruent to 1 modulo
      4, while P is congruent to 0 modulo 4. A compressed text can never equal the
      plain-form length, and the greatest length the floor rule permits is
      P - 3.</t>
      <t>The RECOMMENDED policy takes one parameter, a quantum Q, a positive
      multiple of 4 in characters:</t>
      <ol>
        <li>Build the method-0x02 frame with pad_len = 0; call its text length
        L0.</li>
        <li>Target T = Q*ceil((L0 - 1)/Q) + 1, clamped down to P - 3.</li>
        <li>If T &lt; L0 the compressed form cannot fit under the floor: emit the
        plain form.</li>
        <li>Otherwise pad the frame to F = 3*(T - 1)/4 bytes. Frame lengths F,
        F - 1 and F - 2 all encode to T characters, so an encoder that cannot hit
        F exactly (the pad_len varint changes size as the pad grows) uses
        whichever of the three it can reach.</li>
      </ol>
      <t>Q = 4 pads by at most three bytes. A quantum greater than or equal to P
      yields P - 3 characters for every input that fits under the floor rule, so
      the emitted length is then a function of n alone.</t>
      <t>One bit remains observable at every quantum: whether the input compressed
      enough to fit under the floor rule. An encoder that must not leak that bit
      uses the always-plain mode, whose length is a function of n alone.</t>
    </section>

    <section anchor="limits">
      <name>Limits and Resource Safety</name>
      <t>Decoders MUST enforce max_decoded_len before any allocation proportional
      to the claimed size (step 6) and MUST cap inflation at decoded_len (step 8).
      A cap of zero MUST still cap: some inflate APIs treat an output limit of 0
      as unlimited, so a frame claiming decoded_len = 0 whose payload hides
      megabytes MUST fail after producing at most one byte. A 100-byte frame
      claiming 8 GiB costs O(header) work to reject.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>Integrity is not authenticity: CRC-32 detects accidental corruption, not
      tampering. Where malice is in scope, verify a MAC or signature over the
      decoded bytes at the application layer.</t>
      <t>Compression side channel (CRIME/BREACH class, <xref target="CRIME"/>,
      <xref target="RFC7457"/>):
      where the emitted length is observable to an adversary who controls part of
      an input carried alongside secret data, compression leaks the secret through
      the length. Implementations MUST NOT ba64-compress attacker-influenced data
      concatenated with secret data in such settings; the always-plain encoder
      mode applies there, and its length, 4*ceil(n/3), is a function of the input
      length alone.</t>
      <t>Where compression cannot be disabled, the padding of <xref
      target="method-pad"/> and <xref target="padding"/> quantizes the emitted
      length. At quantum Q, a one-byte change in compressibility is unobservable
      unless it crosses a bucket boundary; at Q &gt;= P all inputs of a given
      length that fit under the floor rule emit P - 3 characters. Padding
      increases the number of observations an attack requires. It does not remove
      the channel: bucket boundaries are still crossed under repeated queries, and
      the bit identified in <xref target="padding"/> still leaks. Padding is
      therefore a secondary control and not a substitute for separating
      attacker-influenced data from secret data.</t>
      <t>The pad is not covered by the CRC-32, which is computed over the decoded
      bytes. An attacker able to rewrite the text can rewrite the pad undetected,
      as with any other part of an unauthenticated message. The decoded output is
      unaffected.</t>
      <t>Decompression bombs are handled structurally by the limit and the hard
      inflate cap. Decoder error messages MUST NOT echo payload or decoded content
      by default: inputs may be secrets and errors end up in logs; the code and an
      offset suffice.</t>
      <t>Canonical base64 plus minimal LEB128 plus the ordered checks of <xref
      target="decoding"/> ensure every ba64 text has exactly one interpretation
      (specific bytes or one specific error). There is no decode-side
      malleability.</t>
    </section>

    <section anchor="interop">
      <name>Interoperability and Migration</name>
      <t>Compatibility is one-directional: a ba64 decoder reads every legacy
      base64 string unchanged (the plain form is base64); a plain base64 decoder
      cannot read the compressed form. Therefore deploy ba64 decoders everywhere
      first (drop-in, no behavior change), enable compressing encoders per channel
      only once every reader decodes ba64, and note that reverting encoders to the
      always-plain mode restores universal readability instantly.</t>
      <t>All ba64 characters are safe verbatim in JSON strings and cookie values.
      In URL components, "+", "/", and "=" MUST be percent-encoded. Transport
      artifacts (MIME line-wrapping, trailing newlines) MUST be stripped by the
      caller before decoding.</t>
    </section>

    <section anchor="non-goals">
      <name>Non-Goals</name>
      <t>No URL-safe or alternative alphabets, no streaming, no compression
      negotiation, no dictionary registry, no public methods beyond the two
      defined here. No version 2 is planned; the version byte is an escape hatch,
      not a roadmap.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. The method registry in this document
      is maintained by revisions of this document, not by IANA.</t>
    </section>

  </middle>

  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="B. Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4648">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author initials="S." surname="Josefsson" fullname="S. Josefsson"/>
          <date year="2006" month="October"/>
        </front>
        <seriesInfo name="RFC" value="4648"/>
        <seriesInfo name="DOI" value="10.17487/RFC4648"/>
      </reference>
      <reference anchor="RFC1951" target="https://www.rfc-editor.org/info/rfc1951">
        <front>
          <title>DEFLATE Compressed Data Format Specification version 1.3</title>
          <author initials="P." surname="Deutsch" fullname="P. Deutsch"/>
          <date year="1996" month="May"/>
        </front>
        <seriesInfo name="RFC" value="1951"/>
        <seriesInfo name="DOI" value="10.17487/RFC1951"/>
      </reference>
      <reference anchor="RFC1952" target="https://www.rfc-editor.org/info/rfc1952">
        <front>
          <title>GZIP file format specification version 4.3</title>
          <author initials="P." surname="Deutsch" fullname="P. Deutsch"/>
          <date year="1996" month="May"/>
        </front>
        <seriesInfo name="RFC" value="1952"/>
        <seriesInfo name="DOI" value="10.17487/RFC1952"/>
      </reference>
    </references>

    <references>
      <name>Informative References</name>
      <reference anchor="CRIME">
        <front>
          <title>The CRIME Attack</title>
          <author initials="J." surname="Rizzo" fullname="J. Rizzo"/>
          <author initials="T." surname="Duong" fullname="T. Duong"/>
          <date year="2012" month="September"/>
        </front>
        <refcontent>ekoparty Security Conference</refcontent>
      </reference>
      <reference anchor="RFC7457" target="https://www.rfc-editor.org/info/rfc7457">
        <front>
          <title>Summarizing Known Attacks on Transport Layer Security (TLS) and Datagram TLS (DTLS)</title>
          <author initials="Y." surname="Sheffer" fullname="Y. Sheffer"/>
          <author initials="R." surname="Holz" fullname="R. Holz"/>
          <author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre"/>
          <date year="2015" month="February"/>
        </front>
        <seriesInfo name="RFC" value="7457"/>
        <seriesInfo name="DOI" value="10.17487/RFC7457"/>
      </reference>
      <reference anchor="OSSFUZZ" target="https://github.com/google/oss-fuzz">
        <front>
          <title>OSS-Fuzz: Continuous Fuzzing for Open Source Software</title>
          <author>
            <organization>Google</organization>
          </author>
          <date year="2016"/>
        </front>
      </reference>
    </references>

    <section anchor="golden">
      <name>Golden Examples</name>
      <t>Every conforming decoder MUST reproduce these exactly.</t>
      <artwork type="ascii-art"><![CDATA[
""                              -> ""     (empty plain form)
"SGVsbG8sIHdvcmxkIQ=="          -> "Hello, world!" (13 bytes)
"=AQECDg4XTQECAP3/SGk="         -> "Hi"   (stored block)
"=AQEAAAAAAAEAAP//"             -> ""     (decoded_len 0)
"=AQICDg4XTQABAgD9/0hp"         -> "Hi"   (0x02, pad_len 0)
"=AQICDg4XTQMBAgD9/0hpAAAA"     -> "Hi"   (0x02, pad_len 3)
"=AQICDg4XTQQBAgD9/0hp/wDerQ==" -> "Hi"   (0x02, nonzero pad)
]]></artwork>
      <t>Error-direction anchors:</t>
      <artwork type="ascii-art"><![CDATA[
"="            -> E_TRUNCATED          "=="        -> E_BASE64
"SGVsbG8"      -> E_BASE64 (padding)   "QR==" -> E_BASE64 (bits)
"SGVs bG8="    -> E_BASE64 (space)     version=2   -> E_VERSION
varint 80 00   -> E_HEADER             claimed 1TB -> E_LIMIT_EXCEEDED
pad_len past end of frame -> E_TRUNCATED
"=AQEAAAAAAAEBAP7/WA==" -> E_LENGTH_MISMATCH (zero-cap trap)
]]></artwork>
    </section>

    <section anchor="vectors">
      <name>Conformance Vectors</name>
      <t>The normative conformance corpus is a set of machine-readable JSON vector
      files (decode passthrough, valid frames of both methods, error cases with
      required codes, encoder invariants, resource-exhaustion frames, and a large
      differential set). They are the executable form of this specification: an
      implementation conforms if and only if it reproduces every decode vector's
      bytes exactly and raises every error vector's exact code. Six independent
      implementations (Python, TypeScript, Go, Rust, Java, C#) are maintained
      against this corpus and agree pairwise over the full differential set. The
      corpus is published alongside this document.</t>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The format's testing discipline follows the SQLite and zlib approach:
      many more lines of tests and vectors than of codec, continuous fuzzing
      (<xref target="OSSFUZZ"/>), and every historical finding frozen into the
      corpus.</t>
    </section>

  </back>
</rfc>
