<?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.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-dmls-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="DMLS">Decentralized Messaging Layer Security</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-dmls-03"/>
    <author fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <area/>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>security</keyword>
    <keyword>authenticated key exchange</keyword>
    <keyword>end-to-end encryption</keyword>
    <abstract>
      <?line 47?>

<t>Messaging Layer Security (MLS) provides strong end-to-end security guarantees
for group messaging including Forward Secrecy (FS) and Post-Compromise Security
(PCS). To facilitate agreement between group members, MLS requires a Delivery
Service (DS) component that orders of the handshake messages (Commits) that
allow changes to the group state. In decentralized settings without a central
authoritative entity to enforce ordering, group members will likely have to
retain key material so they can process Commits out-of-order.</t>
      <t>Retaining key material, however, significantly reduces the FS of the protocol.
This draft specifies Decentralized MLS (DMLS), based on the Fork-Resilient
Continuous Group Key Agreement protocol FREEK proposed by Alwen et al.
<xref target="FRCGKA"/>. In essence, DMLS extends MLS such that key material can be retained
to process Commits out-of-order with recuded impact to FS, thus allowing safer
deployment in decentralized environments.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://phnx-im.github.io/dmls-spec/draft-kohbrok-mls-dmls.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kohbrok-mls-dmls/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Messaging Layer Security  mailing list (<eref target="mailto:mls@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mls/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mls/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/phnx-im/dmls-spec"/>.</t>
    </note>
  </front>
  <middle>
    <?line 64?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>...</t>
      <t>DMLS allows group members to keep around old group state a little more safely,
because the init secret of old epoch states is punctured. However, keeping an
old epoch state around is still not as safe as deleting it in the first place.
See <xref target="security-considerations"/> for more details.</t>
      <t>While DMLS is thus safer to use in scenarios where members must be able to
process old commits, it is still not as safe as the use of vanilla MLS with its
strict deletion schedule.</t>
      <t>Even when using DMLS, applications should take care that group state forks are
short-lived and group members (and/or assisting servers) endeavour to resolve
forks as soon as possible.</t>
      <t>In contrast scenarios should be avoided where multiple forks are long-lived. For
example, if two or more parts of a group are not in contact with one-another and
effectively run their own fork of the same group.</t>
    </section>
    <section anchor="epoch-identifiers">
      <name>Epoch identifiers</name>
      <t>In MLS, each epoch is identified by a 64 bit unsigned integer, with the epoch
increasing by one with each commit. The integer identifies epochs uniquely as
long as there is only one chain of Commits. However, in a decentralized context
there can be multiple commits for the same epoch, which means that an integer is
not sufficient to uniquely identify an epoch. For example, if two group member
send a commit at the same time with different subsets of group members receiving
a different commit first. After processing the newly arrived Commit, all group
members would be in the same epoch, but in different group states. For
subsequently arriving messages, it is unclear from the integer designating the
epoch, which state the message belongs to. In such scenarios it is important
that epochs are uniquely identifiable.</t>
      <t>The <tt>dmls_epoch</tt> can be used for this purpose.</t>
      <t><tt>pseudocode
dmls_epoch = DeriveSecret(epoch_secret, "epoch")
</tt></t>
      <t>A <tt>dmls_epoch</tt> is represented by byte strings of length <tt>KDF.Nh</tt> (thus depending
on the group's ciphersuite). The byte string identifying an epoch is derived
from the epoch's <tt>epoch_secret</tt>.</t>
    </section>
    <section anchor="dmls-messages">
      <name>DMLS Messages</name>
      <t>As regular MLSMessages only contain integer-based epoch identifiers, this
section introduces DMLSMessages, a simple wrapper that adds a <tt>dmls_epoch</tt>
header to an MLSMessage.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage message;
  opaque dmls_epoch<V>;
} DMLSMessage
]]></sourcecode>
      <t>DMLSMessages MUST NOT contain MLSMessages with WireFormat other than
<tt>mls_public_message</tt> and <tt>mls_private_message</tt>.</t>
    </section>
    <section anchor="dmls-key-schedule">
      <name>DMLS key schedule</name>
      <t>DMLS uses a modified version of the MLS key schedule that allows the derivation
of multiple <tt>init_secret</tt>s, where each init secret can be used to initialize a
subsequent epoch.</t>
      <t>The individual <tt>init_secret</tt>s are derived through a puncturable pseudorandom
function (PPRF, see <xref target="puncturable-pseudorandom-function"/>) keyed by the
<tt>base_init_secret</tt>.</t>
      <figure>
        <name>The DMLS Key Schedule</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="400" viewBox="0 0 400 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 152,88 L 152,176" fill="none" stroke="black"/>
              <path d="M 152,248 L 152,272" fill="none" stroke="black"/>
              <path d="M 152,304 L 152,336" fill="none" stroke="black"/>
              <path d="M 152,128 L 176,128" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="184,128 172,122.4 172,133.6" fill="black" transform="rotate(0,176,128)"/>
              <polygon class="arrowhead" points="160,336 148,330.4 148,341.6" fill="black" transform="rotate(90,152,336)"/>
              <polygon class="arrowhead" points="160,272 148,266.4 148,277.6" fill="black" transform="rotate(90,152,272)"/>
              <polygon class="arrowhead" points="160,176 148,170.4 148,181.6" fill="black" transform="rotate(90,152,176)"/>
              <g class="text">
                <text x="28" y="36">(above</text>
                <text x="72" y="36">the</text>
                <text x="108" y="36">same</text>
                <text x="140" y="36">as</text>
                <text x="168" y="36">the</text>
                <text x="200" y="36">MLS</text>
                <text x="232" y="36">key</text>
                <text x="288" y="36">schedule)</text>
                <text x="152" y="52">|</text>
                <text x="156" y="84">epoch_secret</text>
                <text x="248" y="132">DeriveSecret(.,</text>
                <text x="348" y="132">&lt;label&gt;)</text>
                <text x="192" y="148">=</text>
                <text x="236" y="148">&lt;secret&gt;</text>
                <text x="160" y="196">DeriveSecret(.,</text>
                <text x="284" y="196">"parent_init")</text>
                <text x="152" y="212">|</text>
                <text x="164" y="244">parent_init_secret</text>
                <text x="156" y="292">DeriveChildSecret(.,</text>
                <text x="296" y="292">"child_init",</text>
                <text x="316" y="308">commit_confirmation,</text>
                <text x="304" y="324">GroupContext_[n])</text>
                <text x="160" y="356">init_secret_[n]</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
        (above the same as the MLS key schedule)
                          |
                          V
                     epoch_secret
                          |
                          |
                          +--> DeriveSecret(., <label>)
                          |    = <secret>
                          |
                          V
                    DeriveSecret(., "parent_init")
                          |
                          V
                   parent_init_secret
                          |
                          V
                 DeriveChildSecret(., "child_init",
                          |          commit_confirmation,
                          |          GroupContext_[n])
                          V
                    init_secret_[n]
]]></artwork>
        </artset>
      </figure>
      <sourcecode type="pseudocode"><![CDATA[
commit_confirmation = DeriveSecret(path_secret[n], "conf")

DeriveChildSecret(prf_key, label, input_secret, context) =
  DeriveFSSecret(prf_key, ExpandWithLabel(input_secret, label, context, KDF.Nh))
]]></sourcecode>
    </section>
    <section anchor="puncturable-pseudorandom-function">
      <name>Puncturable pseudorandom function</name>
      <t>A PPRF allows the derivation of keys in a forward secure way. In particular, a
PRF that was evaluated with a given key and input can't be evaluated with those
same parameters again. Storing the original input key thus doesn't harm the
forward secrecy of (deleted) output keys.</t>
      <t>The MLS Secret Tree as defined in <xref target="RFC9420"/> already represents a PPRF an
needs to be modified only slightly for the purpose of this document.</t>
      <t>In the context of MLS, the Secret Tree has as many leaves as the group has
members. To derive child init secrets, the same tree is used but with <tt>KDF.Nh</tt>
leaves.</t>
      <t>The function <tt>DeriveFSSecret(secret, input)</tt> thus follows these steps:</t>
      <ul spacing="normal">
        <li>
          <t>Check if <tt>secret</tt> and <tt>input</tt> are of length <tt>KDF.Nh</tt></t>
        </li>
        <li>
          <t>With <tt>secret</tt> as the root node secret and <tt>input</tt> as the leaf index, derive
the direct path nodes and the copath nodes as defined in Section 9 of
<xref target="RFC9420"/></t>
        </li>
        <li>
          <t>With <tt>leaf_node_secret</tt> as the resulting secret compute the final output using
<tt>DeriveSecret(leaf_node_secret, "pprf")</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The use of a PPRF to derive init secrets for new epochs significantly improves
forward secrecy in scenarios where clients need to be able to process multiple
commits for a given epoch.</t>
      <t>However, PPRF only improves forward secrecy for the init secret. Group members
must still delay the deletion of other secrets such as the (private) decryption
keys for the nodes in the ratchet tree. This delay in deletion compromises the
forward secrecy of the protocol. Conversely, the fact that other group members
might encrypt to those keys in turn weakens the protocol's post-compromise
security.</t>
      <t>It is thus still advisable to delete old epoch states as soon as the functional
requirements of the application allows it.</t>
      <t>A rule that will be safe for most applications, for example, is that an old
epoch state can be deleted once each group member has sent a commit on at least
one fork "upstream" of that epoch state. This signals that all group members
have agreed to continue using this particular fork of the group state.</t>
      <t>For effective forward secrecy and post-compromise security it is thus advisable
to choose a state management algorithm where members converge on a shared fork
rather than continuously using different forks of the same group.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="FRCGKA" target="https://eprint.iacr.org/2023/394.pdf">
          <front>
            <title>Fork-Resilient Continuous Group Key Agreement</title>
            <author initials="J." surname="Alwen" fullname="Joël Alwen">
              <organization/>
            </author>
            <author initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
              <organization/>
            </author>
            <author initials="Y." surname="Tselekounis" fullname="Yiannis Tselekounis">
              <organization/>
            </author>
            <date year="2024" month="February" day="22"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 222?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61Z624buRX+z6dgtUDXQjVykAQF1rsJ1nXibZrLBra7QVEU
FjVDaQiNhrNDjhQl9b5QH6Mv1u8ckqOR4mSLdv3Dkobk4bl+5zJZlglvfKXP
5OiZznXtW1WZD7qQr7VzamnqpXyldrqV1zrvWuN3I6Hm81Zv6MDrV9cjkSuv
l7bdnUlTL6wQhc1rtQbBolULn61sOW/tKltXLivo34NHwnXztXHO2NrvGux8
8fzmUsqvpKqcBV1TF7rR+Ff70USOdGG8bY2q6MeL8z/hw7b4dnVzORJ1t57r
9kwU4OJM5LZ2unadO5O+7bQAl4+EarUC1ZHY2na1bG3X4NfnxVvpHTYWZ0Jm
0sWn9F11vgRHhuQtJHZJ/T4vVb3UtAp2M28zfOBr3u4aD+nERtcd2JLy16+V
MuhiRF/XylT4CnV9b7RfTG27pMeqzUs8Lr1v3NnpKe2iR2ajp2nbKT04hca3
Tp/i/CmdWxpfdnOcbMr6fWbWp2wI1+icVisI5PyAbtw1Dcemxu73n95v1Gnp
19VICNKRbUl1oCvloquq4Asvbd2qAh98jhfBrKrNB0WKOpNvS6tr815e/f4Z
r+qgghWfm8b7voeVlStbU+tpoYWobbvG+Q1ULMj5+l9SXl5d/PDy/IxpedUu
NQRM8ukGFPzUqLxllT188PDR6aNvHk+bYhEOxIi4hMNkV9qZysDy8gL+aurO
dk7+QPaUL+EE58tW6zW5Kh9lP5Sg+Dh78DB7+JAf9mrhv0wGnfzF/vtflTyv
tro+WnmtWq/k646s+2G3Olr9m1F1bZy8cbrSK9vhuxDT6VQIkWXw07lDEOde
iM85mzxB4I5l09qNKbST2G+xaeDCye/lslOtqr3WTkC9wY3luqdr6rzqCvoG
VW1VW9Adrc5xxSVuUCD11jqfXdg1bkPM654JcfL24no8lTdWLlQODXtoTqqk
TTnXfqt13V9JYe4mEpzLVv/cmRaMK/lMVzB4uxPXut2YXMuTZ7g3x3W2Jiq+
VB6eVuCstAv81BIhW7hSrXSUA3ROwN/aeDfm/UJVld3KENtOesvHAh+OuJzK
F7UsDtDSaQ/XWDq5RczYzoO1uBxjgsQDp5IQBHoFUU0OC46ZO5ydHIoKSlUl
K7PS1Q4846i3otVemZrBB66uCRSlY/52Mlc1mTSHUDLKI8FJZhcZXwH/uOLj
ZK4hhYks7VZDixPpzLI2C0Bc7XFrq4suJw1A/MvrpD/c4W1uq6m4KeGFDAiS
sAEHsfkoi8BcJ5QnxhM5Vw5PbB3oHYSW+HJo9XcirJ8/f0k/G0vE5rsQP1JD
4+Do48cQ93d3bCOoAmCsJ5I4AFx7+LZjnlyXl8E5DnRJOpxrGdSsCwEzfUml
bG3szrsCzJh1g7Aj015eT0AcsrAnkb6dWuhWIK1VdscSmWMP0vXGIAxp0U1D
JK9NUVSAua8gC0IUxuCkEmKdRWL67shxwMBK6wbZAtgAhVfF0HnhmYg14Jtc
21YzY9VuIuY6Vx3Ck2wDF/EEAVADGZ0I6MZCYUzASVi96ercd3CQqfxzch66
lGRVtTg6klgxhDXk1rWFvRxfTp8FgMwznrBiiIeFaR3sXqlcTxHcWn78mEAp
oywP4Go5dbi7O0nQxNIUZLiK9PeuNBCRlWRcMAbbgLRDcuIaB/Wr1liEWqlb
3etv3TmCHwBpxUGXPICEyoMXTJjTz0hD7NMVUN0GGa6qFLsc+wrOCsCtgZ8E
oS3xUSLQKsgpnqNgIG5qECB9EP8TqZqmorKDpJUO8AJGPAFYjtImePHQwNDG
Cq7XaoG9rc8IIQvG4kM/OcGjU2hOoRJzrH4HEMXKmFKBVhvbsbqAtLbaaBHp
ggULrvGJGHRmzowj2GAVODNUt9dr5JV0ubGGYiRququ8aaoBq7JCBgqcTgkb
hH6v1tgBRQN1tlYmCzdIjQzlKkpDh8kAJnBAEciaBv5nCgu4kGQXerHQOUEw
AVvHTmZaabc1M5HAzSHDBsJTirvn7MOGKlFCt9axpGwUrbASfByO0G9hTFLy
j4/lHC7S1YSohA3IoUsKEuaNbuKjqFoQZYptjXPgOWxg4sHXkCE5JPn8/h4X
CDhcYX7uSCjlBCkxeiC0ArZsXQWqSGZQEISMMDYIWzxXR1hEigRaikAngmJv
tBgDHHW9zpgbiFcacL7WqnbBMXG2590JMpTrFsgwXFBRLCb2o2Q7OsHE2A/k
sR8MXVg4qlVUZEgqv2fHm3VUZWFg+JZuQ9eBNM3OcxgIAHBtNrCBUIPtkSoD
0VSeL5AiUjIgc9FVtd6S4tuWIyyodkKgHC4QfSpPYRDBbaixeReSQX/vIJRd
iAVmHFripMy3EQOpeklYBESutGrlAoVWhPGgd5R4cELlI9fiwFQBMmh7pAc2
yY0ojXAO5Uy5D+lwF1IdkAVVgmAjR1ekUDy2p1EBIMiJZ9Qq3PLmWfKqjtJ4
8CROKy0lduyfzWaN0x2aSYtKf39QPkGFQfrmQtOf8MPbkKyoV6SfozEdF+L8
8EZDlm6AZmAsxOl8B9kJjkleuEWl6yVcZvby2eX0DU6ccN4IzSi5R6xd2EJf
O5mbBgHiOuP1OITpgGDv0CEl7qGiYPYL0duJV0BuNpRlxvjD+et1NDQEIgmW
1BYQBqXnIcoZ/EwfbVmotvQxgE1Y0YgcriVoNxcWVLgNSMKJUQtS4Mlti/RD
eZOjuSio6h6qVZRaFSGvqnrAFvj/5ZdfpK844aF0kR/Rx+zXk799i6e2UXAa
uaf63U9PvxV3Q5aIWCh6erFf//X6Rr758aYXfbjIsf8OXcIld4UyJAIIUYsZ
XdN0c+TU28jEjNNjWIB1EBL9yt4OVCmmXB3rL3gv6WNti4D9lD1JrTGbHJ+K
SgxFG21gX+DELnCkR9gZVWDJEdwkZk1OCsPabBhCUD8tGUZwqQaYEdE0hKCB
I6Pp61DrHl7CwRtdE6zBw5clJIt1HpdCIR7RDhZ2LRa0QKKevH17dYnOgUu0
wfZsuD1L2+/uxqSREH4ERjPy09shK9FxlHKbZex8JWqVud3oPXjGMutYweP+
wKd///zC2k/3rw0D8n+k/KW1P2TZ00M0m07kd5UCAj/9oiT074n8LjD29DeV
+ZidEQouOBFbaPSbqndA+P9T8T3UgxQX6AGKgSg5/Q6STH5NveEv1AC3ABiU
AWsO1P/yJHexF6GOuv17/Y8vqe5+SwwUQwQYAD+ehdnUkxEFM0MQNcrX0f1H
8i4EzyB13iPCcQ5tlE9ejotIUdgMY4tP1di0i1sE3ESyl1Lx2HS+T7+xbhzL
JyLZ4PL6+OTz9w0w4R3w+RXRODkkEelGShMZUvF4HPD/K/n2M4AkE8JQ2idI
uh9mCZnBhQtV7yIOrbizRKpTOy55qMcwOaVZ5EFBtBi3twAdvVFVxwNgTjBo
Qgy1bIRBlEFYFsLlr7mDPNrtS9Q2gvELV+DDU3GolshdU3lNM+5YV+Lb0tTA
6ECPqIdKxGpHpEvVcukgBgLw1A3SnXBfqYsxTSriaRfRn/wlmEPetDq23gsT
GhTA9++uLi++efzwAVpqVaEvKXb7ionyXNBrLWqtC54zUFuQch9XIa4yy5LK
1NQcxIouZESqfmze0Ywj9Iy0I5qadnBjRc+GTJaKm861qnco0NRGu4T+oVLG
eiq0eZoYkpjkYB+mSzcZtAdEmGpmHiJ1sWVMdZ8I10Sl9ZluduTRyWXZSONZ
MNHC9m7nqBTUjTsTIpMXpc5X1MTMYpoLFQefnXHy/bT+xLF3zFd/JMjdWrRR
NYI7FQIHpMIeiLCgbK/fT6JG6A0DxQJqIhRjFPNMw/HpYIjhwwPXuI7l4jfg
EnSGntIzSTfe0uHbY3a1o8KG5wuhbrFrsKrjnIf8PLoqDz1Af3YAT8eEKSkB
TUbjGQFCP9S+OJgKBdvFMUz0XN87x9At2FXRyaUu5nAGamhwvQnj74NQu2eA
lPMs00kKjxgdcYbUTxFTiSeGTXRCkVSo9a05c81xldiQx2ykOBtINI0j1BgU
gudZYVIFbFC7CIlx+kQDPq6Nkzq44YumO4nV8JgGBOmlFuNnujd4S+xroXtk
Is/hRQ0Rdzt0I08744V5/y7AfQ7DDsbMZFiqq2lMGVyGp6xlX9QvD6UlAErv
4MLwnvAngT5yRy23Wq107Q7u+ZrnWT7bsyfSwJGwyu/HiKxJVWyMS9YNkPvp
oHQwK/MDJFGViK8weNqbJB6M+VLyMoST57Ltewd+KTAPY9s49oRxhwPCCT/e
j032cxiwJ4ZD2dg+xHwBP8tjjzFUKMMv4f9+zkLseQIY5wXNlnh+NuoatHla
rUdBnDQVSG9M2Bl4DlEljtKYpDcdv+XgN0AcPnl4J6DjLDQMCPrUfDC2G76c
EYLnRmnc90nEENwdWXr/vsvs7dxbmN4C5KUlL1JRdUhG6A15kK+qJb3dKddH
U+ScvRZ9LqlLOqTsMOhYCURJ6kWTjLZzCPIg534SFKaj908mX5y/Ob8H8gYZ
li1X27BTseO59I5wrvIVUTnPV7XdVrpYsieivgzv03XxZLSApfQIBeXNj89+
BIG0Exr+D2qtKpo2IAAA

-->

</rfc>
