<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.26 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mcnally-deterministic-cbor-00" category="exp" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="dCBOR">dCBOR: Deterministic CBOR Implementation Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-00"/>
    <author initials="W." surname="McNally" fullname="Wolf McNally">
      <organization>Blockchain Commons</organization>
      <address>
        <email>wolf@wolfmcnally.com</email>
      </address>
    </author>
    <author initials="C." surname="Allen" fullname="Christopher Allen">
      <organization>Blockchain Commons</organization>
      <address>
        <email>christophera@lifewithalacrity.com</email>
      </address>
    </author>
    <date year="2023" month="March" day="08"/>
    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>CBOR has many advantages over other data serialization formats. One of its strengths is specifications and guidelines for serializing data deterministically, such that multiple agents serializing the same data automatically achieve consensus on the exact byte-level form of that serialized data. Nonetheless, determinism is an opt-in feature of the specification, and most existing CBOR codecs put the primary burden of correct deterministic serialization and validation of deterministic encoding during deserialization on the engineer. This document specifies a set of norms and practices for CBOR codec implementors intended to support deterministic CBOR ("dCBOR") at the codec API level.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/BlockchainCommons/WIPs-IETF-draft-dcbor"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The goal of determinism in data encoding is that multiple agents serializing the same data will automatically achieve consensus on the byte-level form of that serialized data. Many data serialization formats give developers wide latitude on the serialized form, for example:</t>
      <ul spacing="normal">
        <li>The use of whitespace in JSON, which may be omitted or used to taste.</li>
        <li>They key-value pairs of map/dictionary structures are usually considered unordered. Therefore their order of serialization is taken to be semantically insignificant and so varies depending on the implementation.</li>
        <li>Standards for the binary encoding of floating point numeric values often include bit patterns that are functionally equivalent, such as <tt>0.0</tt> and <tt>-0.0</tt> or <tt>Nan</tt> and <tt>signalling NaN</tt>.</li>
        <li>Whether to include a field in a key-value structure with <tt>null</tt> as the value, or omit the field from the serialization entirely.</li>
        <li>The number of bytes used to encode an integer or floating point value; e.g., in well-formed CBOR there are four valid ways to encode the integer <tt>1</tt> and three valid ways to encode the floating point value <tt>1.0</tt> giving a total of seven valid ways to encode the semantic concept <tt>1.0</tt>. In JSON the problem is even worse, given that <tt>1</tt>, <tt>1.</tt>, <tt>1.0</tt>, <tt>1.00</tt>, <tt>1.000</tt>, etc. are equivalent representations of the same value.</li>
      </ul>
      <t>Each of these choices made differently by separate agents yield different binary serializations that cannot be compared based on their hash values, and which therefore must be separately parsed and validated semantically field-by-field to decide whether they are identical. Such fast comparison for identicality using hashes is important in certain classes of application, where the hash is published or incorporated into other documents, hence "freezing" the form of the document. Where the hash is known or fixed, it is impossible to substitute a different document for the original that differs by even a single bit.</t>
      <t>The CBOR standard addresses this problem in <xref target="RFC8949"/> §4.2, by narrowing the scope of choices available for encoding various values, but does not specify a set of norms and practices for CBOR codec implementors who value the benefits of deterministic CBOR, hereinafter called "dCBOR".</t>
      <t>This document's goal is to specify such a set of norms and practices for dCBOR codec implementors.</t>
      <t>It is important to stress that dCBOR is <em>not</em> a new dialect of CBOR, and that all dCBOR is well-formed CBOR that can be read by existing CBOR codecs.</t>
      <t>Nonetheless, many existing implementations give little or no guidance at the API level as to whether the CBOR being read conforms to the dCBOR specification, for example by emitting errors or warnings at deserialization time. Conversely, many existing implementations do not carry any burden of ensuring that CBOR is serialized in conformance with the dCBOR specification, again putting that burden on developers.</t>
      <t>The authors of this document believe that for applications where dCBOR correctness is important, the codec itself should carry as much of this burden as possible. This is important both to minimize cognitive load during development, and help ensure interoperability between implementations.</t>
      <t>This document is segmented into three categories. They include norms and practices that:</t>
      <ul spacing="normal">
        <li>
          <bcp14>MUST</bcp14> be implemented in the codec (Serialization level),</li>
        <li>
          <bcp14>MUST</bcp14> be implemented by developers of specifications dependent on dCBOR (Application level).</li>
        <li>are acknowledged to fall under the purview of this document, but which are not yet specified (Future work).</li>
      </ul>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>This specification makes use of the following terminology:</t>
      <dl>
        <dt>byte</dt>
        <dd>
          <t>Used in its now-customary sense as a synonym for "octet".</t>
        </dd>
        <dt>codec</dt>
        <dd>
          <t>"coder-decoder", a software suite that both encodes (serializes) and decodes (deserializes) a data format.</t>
        </dd>
        <dt>dCBOR</dt>
        <dd>
          <t>"deterministic CBOR" encoded in conformance with the CBOR specifications §4.2 <xref target="RFC8949"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="serialization-level">
      <name>Serialization Level</name>
      <t>This section defines requirements and practices falling in the purview of the dCBOR codec.</t>
      <section anchor="general-practices-for-dcbor-codecs">
        <name>General Practices for dCBOR Codecs</name>
        <t>dCBOR codecs <bcp14>SHOULD</bcp14>:</t>
        <ul spacing="normal">
          <li>Make it easy to emit compliant dCBOR.</li>
          <li>Make it hard to emit non-compliant dCBOR.</li>
          <li>Make it an error to read non-compliant dCBOR.</li>
        </ul>
      </section>
      <section anchor="base-requirements">
        <name>Base Requirements</name>
        <t>dCBOR encoders <bcp14>MUST</bcp14> only emit CBOR conforming to the requirements of <xref target="RFC8949"/> §4.2.1. To summarize:</t>
        <ul spacing="normal">
          <li>Variable-length integers <bcp14>MUST</bcp14> be as short as possible.</li>
          <li>Floating-point values <bcp14>MUST</bcp14> use the shortest form that preseves the value.</li>
          <li>Indefinite-length arrays and maps <bcp14>MUST NOT</bcp14> be used.</li>
          <li>Map keys <bcp14>MUST</bcp14> be sorted in bytewise lexicographic order of their deterministic encodings.</li>
        </ul>
        <t>dCBOR codecs <bcp14>MUST</bcp14> validate and return errors for any CBOR that is not conformant.</t>
      </section>
      <section anchor="reduction-of-floating-point-values-to-integers">
        <name>Reduction of Floating Point Values to Integers</name>
        <t>While there is no requirement that dCBOR codecs implement support for floating point numbers, dCBOR codecs that do support them <bcp14>MUST</bcp14> reduce floating point values with no fractional part to the smallest integer value that can accurately represent it. If a numeric value has a fractional part or an exponent that takes it out of the range of representable integers, then it <bcp14>SHALL</bcp14> be encoded as a floating point value.</t>
        <t>This practice still produces well-formed CBOR according to the standard, and all existing implementations will be able to read it. It does exclude a map such as the following from being validated as dCBOR, as it would have a duplicate key:</t>
        <artwork><![CDATA[
{
   10: "ten",
   10.0: "floating ten"
}
]]></artwork>
      </section>
      <section anchor="reduction-of-nans-and-infinities">
        <name>Reduction of NaNs and Infinities.</name>
        <t><xref target="IEEE754"/> defines the <tt>NaN</tt> (Not a Number) value <xref target="NAN"/>. This is usually divided into two categories: <em>quiet NaNs</em> and <em>signalling NaNs</em>. However, the specification also specifies that the floating point sign bit "doesn't matter" and includes a range of "payload" bits. These bit fields could be used to break CBOR determinism.</t>
        <t>dCBOR encoders that support floating point <bcp14>MUST</bcp14> reduce all <tt>NaN</tt> values to the half-width quiet <tt>NaN</tt> value having the canonical bit pattern <tt>0x7e00</tt>.</t>
        <t>Similarly, encoders that support floating point <bcp14>MUST</bcp14> reduce all <tt>+INF</tt> values to the half-width <tt>+INF</tt> having the canonical bit pattern <tt>0x7c00</tt> and likewise with <tt>-INF</tt> to <tt>0xfc00</tt>.</t>
      </section>
      <section anchor="reduction-of-bignums-to-integers">
        <name>Reduction of BigNums to Integers</name>
        <ul spacing="normal">
          <li>While there is no requirement that dCBOR codecs implement support for BigNums &gt;= 2^64 (tags 2 and 3), codecs that do support them <bcp14>MUST</bcp14> use regular integer encodings for values &lt; 2^64.</li>
        </ul>
      </section>
      <section anchor="use-of-null-as-a-map-value">
        <name>Use of Null as a Map Value</name>
        <t>dCBOR codecs <bcp14>MUST</bcp14> reject <tt>null</tt> as a value in map entries. If the encoder API allows placing <tt>null</tt>-valued entries into in-memory maps, it <bcp14>MUST NOT</bcp14> emit a key value pair for such entires at serialization time. If the decoder API reads a <tt>null</tt>-valued entry, it must return an error.</t>
        <t>The rationale is eliminating the choice over whether to encode a key-value pair where the value is <tt>null</tt> or omit it entirely.</t>
        <t>Of course, <tt>null</tt> still has valid uses, e.g., as a placeholder in position-indexed structures like arrays. While of questionable semantics, <tt>null</tt> may also be used as a map key.</t>
      </section>
      <section anchor="api-handling-of-maps">
        <name>API Handling of Maps</name>
        <t>dCBOR APIs <bcp14>SHOULD</bcp14> provide a dCBOR <tt>Map</tt> structure or similar that models the dCBOR canonical key encoding and order.</t>
        <ul spacing="normal">
          <li>Supports insertion of unencoded key-value pairs.</li>
          <li>Supports iteration through entries in dCBOR canonical key order.</li>
          <li>Supports testing for inclusion of duplicate keys, e.g., <tt>10</tt> and <tt>10.0</tt>.</li>
        </ul>
        <t>The dCBOR decoder <bcp14>MUST</bcp14> return an error if it encounters misordered or duplicate map keys.</t>
      </section>
      <section anchor="api-handling-of-numeric-values">
        <name>API Handling of Numeric Values</name>
        <t>The above requirements of this section deal with how dCBOR encoders <bcp14>MUST</bcp14> serialize numeric values, and how dCBOR decoders <bcp14>MUST</bcp14> validate them. It does not specify requirements for the API, but the authors do make the following recommendations:</t>
        <ul spacing="normal">
          <li>The encoder API <bcp14>SHOULD</bcp14> accept any supported numeric type for insertion into the CBOR stream. The CBOR encoder <bcp14>SHALL</bcp14> decide the dCBOR-conformant form for its encoding.</li>
          <li>
            <t>The API <bcp14>SHOULD</bcp14> allow any supported numeric type to be extracted, and return errors when the actual type encountered is not representable in the requested type. For example,
            </t>
            <ul spacing="normal">
              <li>If the encoded value is "1.5" then requesting extraction of the value as floating point will succeed but requesting extraction as an integer will fail.</li>
              <li>Similarly, if the value has a large exponent and therefore can be represented as either a floating point value or a BigNum, then attempting to extract it as a machine integer will fail.</li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="validation-errors">
        <name>Validation Errors</name>
        <t>A dCBOR decoder <bcp14>MUST</bcp14> return errors when it encounters any of these conditions in the input stream. The error symbol names below are informative.</t>
        <ul spacing="normal">
          <li>
            <tt>underrun</tt>: early end of stream</li>
          <li>
            <tt>badHeaderValue</tt>: unsupported CBOR major/minor item header</li>
          <li>
            <tt>nonCanonicalNumeric</tt>: An integer, floating-point value, or BigNum was encoded in non-canonical form</li>
          <li>
            <tt>invalidString</tt>: An invalid UTF-8 string was encountered</li>
          <li>
            <tt>unusedData</tt>: Unused data encountered past the expected end of the input stream</li>
          <li>
            <tt>misorderedMapKey</tt>: A map has keys not in canonical order</li>
          <li>
            <tt>duplicateMapKey</tt>: A map has a duplicate key</li>
        </ul>
      </section>
    </section>
    <section anchor="application-level">
      <name>Application Level</name>
      <section anchor="optionaldefault-values">
        <name>Optional/Default Values</name>
        <ul spacing="normal">
          <li>
            <t>Protocols that depend on dCBOR <bcp14>MUST</bcp14> specify the circumstances under which particular optional fields <bcp14>MUST</bcp14> or <bcp14>MUST NOT</bcp14> be present. Protocols that specify fields using key-value paired structures like CBOR maps, where some fields have default values must choose and document one of the following strategies:
            </t>
            <ul spacing="normal">
              <li>they <bcp14>MUST</bcp14> specify that the absence of the field means choosing the default. This allows the default to be changed later, or</li>
              <li>they <bcp14>MUST</bcp14> encode the field regardless of whether the current default is chosen. This locks in the current value of the default.</li>
            </ul>
          </li>
        </ul>
      </section>
      <section anchor="tagging-items">
        <name>Tagging Items</name>
        <ul spacing="normal">
          <li>Protocols that depend on dCBOR <bcp14>MUST</bcp14> specify the circumstances under which a data item <bcp14>MUST</bcp14> or <bcp14>MUST NOT</bcp14> be tagged.</li>
          <li>The codec API <bcp14>SHOULD</bcp14> specify conveniences such as protocol conformances that allow the association of a associated tag with a particular data type. The encoder <bcp14>MUST</bcp14> use such an associated tag when serializing, and the decoder <bcp14>MUST</bcp14> expect the associated tag when extracting a structure of the that type.</li>
        </ul>
      </section>
    </section>
    <section anchor="future-work">
      <name>Future Work</name>
      <t>The following issues are currently left for future work:</t>
      <ul spacing="normal">
        <li>How to deal with subnormal floating point values <xref target="SUBNORMAL"/>.</li>
      </ul>
    </section>
    <section anchor="reference-implementations">
      <name>Reference Implementations</name>
      <t>This section is informative.</t>
      <t>The current reference implementations that conform to these specifications are:</t>
      <ul spacing="normal">
        <li>Swift implementation <xref target="SwiftDCBOR"/></li>
        <li>Rust implementation <xref target="RustDCBOR"/></li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document inherits the security considerations of CBOR <xref target="RFC8949"/>.</t>
      <t>Vulnerabilities regarding dCBOR will revolve around whether an attacker can find value in either:</t>
      <ul spacing="normal">
        <li>producing semantically different documents that are serialized using identical byte streams, or</li>
        <li>producing semantically equivalent documents that are nonetheless serialized into non-identical byte streams</li>
      </ul>
      <t>The first consideration is unlikely due to the Law of Identity (A is A). The second consideration could indicate the failure of a dCBOR decoder to correctly validate according to this document, or the failure of the developer to properly specify or implement application-level requirements for dCBOR. Whether these possibilities present an identifiable attack surface is an open question that developers should consider.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
      <t>We considered requesting a new media type <xref target="RFC6838"/> for deterministic CBOR, e.g., <tt>application/d+cbor</tt>, but chose not to pursue this as all dCBOR is well-formed CBOR. Therefore, existing CBOR codecs can read dCBOR, and many existing codecs can also write dCBOR if the encoding rules are observed. Protocols that adopt dCBOR will simply have more stringent requirments for the CBOR they emit and ingest.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049.  It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols.  This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE, "IEEE Standard for Floating-Point Arithmetic", IEEE Std 754-2019, DOI 10.1109/IEEESTD.2019.8766229</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="SUBNORMAL" target="https://en.wikipedia.org/wiki/Subnormal_number">
          <front>
            <title>Subnormal number</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="NAN" target="https://en.wikipedia.org/wiki/NaN">
          <front>
            <title>NaN</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SwiftDCBOR" target="https://github.com/BlockchainCommons/BCSwiftDCBOR">
          <front>
            <title>Deterministic CBOR ("dCBOR") for Swift.</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RustDCBOR" target="https://github.com/BlockchainCommons/bc-dcbor-rust">
          <front>
            <title>Deterministic CBOR ("dCBOR") for Rust.</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAHK3CGQAA61b3XYbuZG+76fAMhexHZGSHGfG5mb3RJbtWFmb8lry+ORk
siOwGyQRdzc46G7RXB/P/b7F3uzZ98ij7JPsV1VA/5CU5+dkLkZkswEUCl9V
fVUFj8fjpLZ1bqZqlJ0/vXw7Vc9MbXxhS1vVNlX0TF0U69wUpqx1bV2p3nid
4jdTjRI9n3tzGwePksylpS4wW+b1oh4X+Jbn23HWn3Oczp0fn5wkqa7N0vnt
VJmP66SqvdHFVF08v36RJHbtp6r2TVU/PDl5cvIw0fh1qs7W69ymLEaldJmp
t0bn42tbmGTj/Ield816qmampm/qPf5ny6X6Iz1OPpgtnmZYoYQ0panHz0jI
BCtjpu907koIvjVVUhXa199937jaVFNVumRtp+ovtUuPVOU85FxU+LQt6MNf
k0Q39cr5aaLGicJ/tsSg9xP1Op3R5vmZKOW9yxeDx84vdWn/k/czVU9zl35I
V9qW6twVBbbIL5lC23yqNhj8B/pfUOokdcVgyfOJOstzU/YWPF95qNytV8b3
fvs5q6bdDPoPuV2Yja1XOtept7WIkJTOF5jr1kx54NsX54+fPHoyZejEJ189
/u3jqXp98fo5P7l4/vz51797JAPov4hB+uFIfct/1RWdi/aZWjivXuQOi5TL
8Rtny1qdYf1VYQCnb0dHKryeKUw6fnhy+uRIPbu8UKcnk9PTkyfH9PPV9bMJ
/TJ5/PVXXz18+GTUra390tRTtarrdTU9PrbGAI+582ZCHydQ1zFw3ZABHIfR
AGi5GO776t3T2eXb12ev9nd11cxZSbkqm2Ju/N1rm3KysR/s2mRW88L07bgd
/52M5+Gzs9n+SjM9+7mTY4jIv7GL+hn7gL1pD/iEe9+KzX87us/nw8Mndy++
xHk1c0LMcYe4ALjjp+fd6gIZGP4vl4VG/1JR5uk4YwdFvidJxuOx0nP4Jri8
JOHVVrpShS63Sme3Gj5xaSrlbmFhriY7y3StVWW81XmwMSVIqSbqsjTKLZSt
K0XurlzWq0pZfFmb1C4Gjm3Z2MzktsTktKU4IbkzXmHgUskfwCM16UrBOmtV
NHlt4bMVhCtpsd5oCKkqeAeZBr7LEYp5CqXTlTW3RqWQwpRVg42VPMB8xP7V
fFubcY4Xct4SbYWXi9ObjCedqBlcKYblpoKj7CQtaK+6VG5dj+FuFkbXjTcy
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
Qa8vn132r65Mkv8HYNlDNh84AAA=

-->

</rfc>
