<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.14 (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC3168 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
<!ENTITY RFC9293 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml">
<!ENTITY RFC9260 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9260.xml">
<!ENTITY RFC8261 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8261.xml">
<!ENTITY RFC6679 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml">
<!ENTITY RFC9000 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
<!ENTITY RFC9330 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
<!ENTITY RFC2474 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2474.xml">
]>


<rfc ipr="trust200902" docName="draft-ietf-tsvwg-udp-ecn-03" category="info" submissionType="IETF">
  <front>
    <title abbrev="udp-ecn">Configuring UDP Sockets for ECN for Common Platforms</title>

    <author fullname="Martin Duke">
      <organization>Google</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>

    <date />

    <area>Web and Internet Transport</area>
    <workgroup>Transport and Services Working Group</workgroup>
    <keyword>udp</keyword> <keyword>ecn</keyword>

    <abstract>


<?line 54?>

<t>Explicit Congestion Notification (ECN) applies to all transport protocols in
principle. However, it had limited deployment for UDP until QUIC became widely
adopted. As a result, documentation of UDP socket APIs for ECN on various
platforms is sparse. This document records the results of experimenting with
these APIs in order to get ECN working on UDP for Chromium on Apple, Linux, and
Windows platforms.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://tsvwg.github.io/udp-ecn/draft-ietf-tsvwg-udp-ecn.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-tsvwg-udp-ecn/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Transport and Services Working Group Working Group mailing list (<eref target="mailto:tsvwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/tsvwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/tsvwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/tsvwg/udp-ecn"/>.</t>
    </note>


  </front>

  <middle>


<?line 63?>

<section anchor="introduction"><name>Introduction</name>

<t><xref target="RFC3168"/> defines a two-bit field in the IP header for Explicit Congestion
Notification (ECN), which provides network feedback to endpoint congestion
controllers. This has historically mostly been relevant to TCP (<xref target="RFC9293"/>),
where any incoming ECN codepoints are internally consumed by the kernel, and
therefore imply no application interface except enabling and disabling the
capability.</t>

<t>The Stream Control Transport Protocol (SCTP) (<xref target="RFC9260"/>) has long supported
ECN in its design. SCTP is sometimes carried over DTLS and UDP (<xref target="RFC8261"/>).
In principle, user-space implementers might have leveraged UDP ECN APIs to
deliver ECN codepoints between SCTP and the UDP socket. The author is not aware
of any such efforts.</t>

<t><xref target="RFC6679"/> defines ECN over RTP over UDP. The author is aware of a research
implementation, but cannot confirm any commercial deployments.</t>

<t>However, QUIC <xref target="RFC9000"/> runs over UDP and has seen wider deployment than
SCTP. The Low Latency, Low Loss, Scalable Throughput (L4S) experiment
(<xref target="RFC9330"/>) and QUIC have combined to increase interest in ECN over UDP.</t>

<t>The Chromium Projects (<xref target="CHROMIUM"/>) provide a widely-deployed protocol library
that includes QUIC. An effort to provide ECN support for QUIC on the many
platforms on which Chromium is deployed revealed that many ECN-related UDP
socket interfaces are poorly documented.</t>

<t>This informational document provides a record of that experience, to encourage
further support for ECN in other QUIC implementations, and indeed any consumer
of ECN codepoints that operates over UDP. It is not a standards-track document
and does not bind platforms to any API, or suggest any such API.</t>

<t>Many socket APIs continue to reference the "ToS (Type of Service) byte",
including the IP_TOS label, even though <xref target="RFC2474"/> obsoleted that 25 years
ago. That 8-bit field now contains a 6-bit Differentiated Services Code Point
(DSCP), in addition to the 2-bit ECN field.</t>

<t>This document focuses on the APIs for the C and C++ languages. Other languages
are likely to have different syntax and capabilities.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</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>

<?line -18?>

<t>This document is not a general tutorial on UDP socket programming, and assumes
familiarity with basic socket concepts like binding, socket options, and
common system error codes.</t>

<t>Througout this document, "Apple" refers to both MacOS and iOS.</t>

</section>
<section anchor="receiving-ecn-codepoints"><name>Receiving ECN codepoints</name>

<t>Network devices can change the ECN codepoint in the IP header. Since this
feedback is required at the packet sender, the packet receiver needs to extract
this codepoint from the UDP socket in order to report to the sender.</t>

<t>There are two components to this: setting the socket to report incoming ECN
marks, and retrieving the value for each incoming packet.</t>

<t>Note that Apple platforms additionally provide a framework for network
connections that allows sending and receiving ECN flags when using UDP without
traditional socket option semantics. When sending or receiving UDP datagrams, IP
protocol metadata carries ECN information in both directions. See
<xref target="APPLE-NETWORK-FRAMEWORK"/>.</t>

<section anchor="setting-the-socket-to-report-incoming-ecn-codepoints"><name>Setting the socket to report incoming ECN codepoints</name>

<section anchor="linux-apple-and-freebsd"><name>Linux, Apple, and FreeBSD</name>

<t>To report ECN, applications set a socket option to true using a setsockopt()
call.</t>

<t>IPv6 sockets require a socket option of level IPPROTO_IPV6 and name
IPV6_RECVTCLASS.</t>

<t>IPv4 sockets require a socket option of level IPPROTO_IP and name
IP_RECVTOS.</t>

<t>For dual-stack sockets, on Linux hosts the application sets both the
IPV6_RECVTCLASS and IP_RECVTOS options to receive ECN codepoints on all incoming
packets. On Apple and FreeBSD hosts, the application only sets the
IPPROTO_IPV6-level socket option with name IPV6_RECVTCLASS to receive codepoints
for both v4 and v6; setting an IPPROTO_IP-level socket option on an IPv6 socket
results in an error. In particular this applies to the IPPROTO_IP-level socket
option with the name IP_RECVTOS.</t>

<t>At the time of writing, an example implementation can be found at
<xref target="CHROMIUM-POSIX"/>.</t>

</section>
<section anchor="windows"><name>Windows</name>

<t>Windows documentation recommends using the function WSASetRecvIPEcn() to
enable ECN reporting regardless of the IP version. This function dates to
Windows 10 Build 20348, according to <xref target="WINDOWS-DOC"/>.</t>

<t>However, this can also be accomplished by calling setsockopt() and using
options of level IPPROTO_IP and name IP_RECVECN for IPv4, and IPPROTO_IPV6
and IPV6_RECVECN for IPv6. These options are documented at
<xref target="WINDOWS-SOCKOPT"/>.</t>

<t>For dual-stack sockets, WSASetRecvIPEcn() will not enable ECN reporting for
IPv4. This requires a separate setsockopt() call using the IP_RECVECN option.</t>

<t>If a socket is bound to a IPv6-mapped IPv4 address (i.e. it is of the format
::ffff:&lt;IPv4 address&gt;), calls to WSASetRecvIpEcn() return error EINVAL.
These sockets should instead use an explicit setsockopt() call to set
IP_RECVECN.</t>

<t>At the time of writing, an example implementation can be found at
<xref target="CHROMIUM-WINDOWS"/>.</t>

</section>
</section>
<section anchor="retrieving-ecn-codepoints-on-incoming-packets"><name>Retrieving ECN codepoints on incoming packets</name>

<t>All platforms described in this document require the use of a recvmsg() call to
read data from the socket to retrieve ECN information, because that information
is encoded in the control data that is returned from that function. Those
platforms all return zero or more "cmsg" that contain requested information
about the arriving packet.</t>

<t>Examples of the technique described below can be found at <xref target="CHROMIUM-POSIX"/>
and <xref target="CHROMIUM-WINDOWS"/>.</t>

<section anchor="linux"><name>Linux</name>

<t>If the incoming packet is IPv4, Linux will include a cmsg of level IPPROTO_IP
and type IP_TOS. The cmsg data contains an unsigned char.</t>

<t>If the incoming packet is IPv6, Linux will include a cmsg of level IPPROTO_IPV6
and type IPV6_TCLASS. The cmsg data contains an int.</t>

<t>The resulting report contains the entire IP header byte, which includes other
fields. The ECN codepoint constitutes the two least-significant bits of this
byte.</t>

<t>The same applies to the Linux-specific recvmmsg() call.</t>

</section>
<section anchor="apple-and-freebsd"><name>Apple and FreeBSD</name>

<t>If a UDP message (UDP/IPv4) is received on an IPv4 socket, the ancillary data
will contain a cmsg of level IPPROTO_IP and type IP_RECVTOS. The cmsg data
contains an unsigned char.</t>

<t>If a UDP message (UDP/IPv6 or UDP/IPv4) is received on an IPv6 socket, the
ancillary data will contain a cmsg of level IPPROTO_IPV6 and type IPV6_TCLASS.
The cmsg data contains an int.</t>

<t>The provided data is the entire byte from the IP header, which includes other
fields. The ECN codepoint constitutes the two least-significant bits of this
byte.</t>

</section>
<section anchor="windows-1"><name>Windows</name>

<t>If the incoming packet is IPv4, the socket will include a cmsg of level
IPPROTO_IP and type IP_ECN. The cmsg data contains an int.</t>

<t>If the incoming packet is IPv6, the socket will include a cmsg of level
IPPROTO_IPV6 and type IPV6_ECN. The cmsg data contains an int.</t>

<t>The resulting integer solely consists of the ECN codepoint, and requires no
further bitwise operations.</t>

</section>
</section>
</section>
<section anchor="sending-ecn-codepoints"><name>Sending ECN codepoints</name>

<t>Existing ECN specifications envision a particular connection consistently
sending the same ECN codepoint. It might transition that marking after
successfully completing a handshake, recognizing the path or the peer do not
support ECN, or transitioning to a new path. Therefore, using a socket option
to configure a consistent marking is generally more resource-efficient.</t>

<t>However, some server designs receive all incoming packets on a single socket.
As the many connections that constitute this packet stream may have different
support for ECN, it is suitable to configure outgoing ECN on a per-packet basis.</t>

<t>Note that Apple platforms additionally provide a framework for network
connections that allows sending and receiving ECN flags when using UDP without
traditional socket option semantics. When sending or receiving UDP datagrams, IP
protocol metadata carries ECN information in both directions. See
<xref target="APPLE-NETWORK-FRAMEWORK"/>.</t>

<section anchor="on-a-per-socket-basis"><name>On a per-socket basis</name>

<section anchor="linux-and-apple"><name>Linux and Apple</name>

<t>Both Linux and Apple platforms set the outgoing ECN for IPv4 packets with a
socket option of level IPPROTO_IP and name IP_TOS.</t>

<t>For IPv6 packets, they use level IPPROTO_IPV6 and name IPV6_TCLASS.</t>

<t>This setsockopt() call also sets the Differentiated Services Code Point (DSCP)
bits that make up the rest of the header byte. Applications making this call will
generally want to preserve any existing DSCP setting, which might require a
getsockopt() call.</t>

<t>For dual-stack sockets, Linux requires an additional setsockopt() call with
IP_TOS. Apple sockets do not and will return an error if this call is made.</t>

<t>An example of the technique described above can be found at <xref target="CHROMIUM-POSIX"/>.</t>

</section>
<section anchor="windows-2"><name>Windows</name>

<t>At the time of this writing, Windows does not provide a way to configure
marking on a per-socket basis.</t>

</section>
</section>
<section anchor="on-a-per-packet-basis"><name>On a per-packet basis</name>

<t>Packets can be individually marked with ECN codepoints using the control
information that accompanies a sendmsg() call.</t>

<section anchor="linux-and-apple-1"><name>Linux and Apple</name>

<t>These platforms expect a cmsg with level IPPROTO_IP and type IP_TOS if the
destination is an IPv4 address, or a IPv4-mapped IPv6 address.</t>

<t>Otherwise, they expect a cmsg with level IPPROTO_IPV6 and type IPV6_TCLASS.</t>

<t>The same applies to the Linux-specific sendmmsg() call.</t>

</section>
<section anchor="windows-3"><name>Windows</name>

<t>Windows uses a cmsg with level IPPROTO_IP and type IP_ECN for IPv4 packets.</t>

<t>Windows uses a cmsg with level IPPROTO_IPV6 and type IPV6_ECN for IPv6 packets.</t>

<t>An example of the technique described above can be found at
<xref target="CHROMIUM-WINDOWS"/>.</t>

</section>
</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>The security implications of ECN are documented in <xref target="RFC3168"/> and <xref target="RFC9330"/>.
This document is a guide to enabling these capabilities, which incurs no
additional security considerations.</t>

<t>Note that implementing ECN capabilities on some platforms, but not others, can
help peers identify the operating system in use by a host, which can have
privacy implications. This document aims to mitigate that possibility.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC8174;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="APPLE-NETWORK-FRAMEWORK" target="https://developer.apple.com/documentation/network/nwprotocolip/metadata">
  <front>
    <title>NWProtocolIP.Metadata</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CHROMIUM" target="https://www.chromium.org/chromium-projects/">
  <front>
    <title>The Chromium Projects</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CHROMIUM-POSIX" target="https://source.chromium.org/chromium/chromium/src/+/main:net/socket/udp_socket_posix.cc">
  <front>
    <title>udp_socket_posix.cc</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="CHROMIUM-WINDOWS" target="https://source.chromium.org/chromium/chromium/src/+/main:net/socket/udp_socket_win.cc">
  <front>
    <title>udp_socket_win.cc</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="WINDOWS-DOC" target="https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-wsasetrecvipecn">
  <front>
    <title>WSASetRecvIPEcn function (ws2tcpip.h)</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="WINDOWS-SOCKOPT" target="https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options">
  <front>
    <title>MSDN - IPPROTO_IP socket options</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
&RFC3168;
&RFC9293;
&RFC9260;
&RFC8261;
&RFC6679;
&RFC9000;
&RFC9330;
&RFC2474;


    </references>


<?line 324?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>The author would like to thank Ryan Hamilton, who provided constant advice
through this effort. Randall Meyer from Apple and Nick Grifka from Microsoft
provided useful hints about the behavior of their respective operating systems.
However, the author takes full responsibility for any errors above.</t>

<t>Neal Cardwell, Gorry Fairhurst, Max Franke, Rodney Grimes, Will Hawkins,
Guillaume Hétier, Max Inden, Jonathan Lennox, Colin Perkins, Marten
Seemann, Michael Tuexen, and Greg White made improvements to this draft.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+1b63IbOXb+j6dA6KopO8OLb6v1aDY7q5FkW7u6MKJmnK1U
agrsBkmsmt0doJs0x+V3ybPkyfKdA6AvpHyZZJNf2aodkc1u4Fy/852D9mg0
EpWpMn0sB6dFvjDL2pp8KX86m8pZkdzryslFYeX56TX/PS3W6yKX00xV+Lp2
A6Hmc6s3eLxOy5FO8oFIVKWXhd0dS5MvCmFKeywrW7vq+dOn3z19LkRaJLla
Y8vUqkU1MrpajCq32S5HYY0RlteuEq6er41zpsirXYn7L87vXkv5SKrMFdjR
5KkuNf6TV4OhHOjUVIU1KqMvFyc/4g8kHlzc3r0eiBQrHssPZyd35x+Fslrh
+Xd6LlWeyou80jbXlbyzKndlYauB2Bb2fmmLusR9zWW+e6btxiTayXe4hWz1
hm4biHu9w0PpsZAjCT3oD1QRG53XGhflb1tNSq/y4OD6WpkM19lgfyLbjQu7
pB+UTVb4YVVVpTueTOg+umQ2ehxvm9CFydwWW6cnvMKEnlyaalXP46KTxpNS
ekd0VuU7xv6BsSnivZNPuXK8qtbZQAhVV6vCknGwqpSLOst8DFwpW5lcntX3
mn+BlCo3v6oKXj+Wb4pimfkftFd8zfePV+MUT/xpSRfHSbEWgoLNrvHchsx9
Mp1eno+uz+/e3dz+ZfT69uTqnD6RI2K8X7+b2qIqkiK7mI6vdKUQI4otr+xS
d5VO9UZnRantWJVlpmm/CYK4XiPyWNAJoociZpJvy7CmKSfrZk0hT9/e3lxd
/HRFAjQS3K20PF3ZYm3qtYQwf9NJ5QZ8x74I2+12nIRb2ZPxy6gMz02624ym
N7OLf+ltBof84jilfykLZ96Pk+ThrVxR20Q/vFv7wdlk8i0FWX4M5Sd+5cmD
m3TEendxfXbzbvYpwbbw7P+yWHELIYMso7Ob054872YnM13d6mRzMT1PcsRq
npCT5eOte14lpSnHqycPy5hpZfPx2iS2cMWi4kDR+ah2E2ybIuvo74vnE1Wa
SVxski9G8TM+KKcri71NySnYijm7Of3LzfSuJ+rV7OwaOHMxnd7e3N38cjGV
XktZlCTxJ2Lpa6XEf2m5iSk5qEeQzy8/apYXo9FIqrmrrEoqIc7fl5lJTIU6
kS8BHGS166IyC5Mob0IUkieSssgA86oCUJ6hOEREjMnjUDpEiUqUGMo3+bbY
IgXtUGLplUplZtam0qkE/mfFjtKQqxNVrTqvTCb/+aeLUznXCSBGbk2qs51Q
KaTW6VieOKmk1a7OqqHspbEsFrxGMOLJ9KKtfvh1o6wpaifKWP2kcdKVyjqI
eLfCl7galk9QC6AhMtxv5Whx/R4gYugOgvQtUFTgDqf9VoBBPKQt2QUe4223
Af6xPUnGNTgiBq6dEB4N5aXJ6/dDKijinXehbIQceyetTZoCScUjKne2SGuO
aSE+fPjh9vXpi2dHrz5+hD0XJtdkH8DZaA5rL4zOUpKMNEF8rbQiCdkqh84W
h84eyu3KJCty7QaOcDJApVxonc5Vck/aooiXhYHdknYpfIScWaatC9ZdKfzf
OCryCeJmJ9eFq/BnrnUOK2d6o7AElrs7ncrHXrHvnn/34uPHJ0OxXWmrYaEd
lEHAk03JvkmBGKKtoTR+N0wFeHHs7+DMVM53rPw9cYTMG7mixWADPLAucW9e
+JgOivMqC5VoODzRZQX91DyjLankp8aFb1gGbKlUc5OZagdHUUGYIf3VmoxK
6recRMZqJR/PTu+mT1oNj55CQ7ZOBvNJV5d0v04FKQjXGSgHy5tlPpb0KIdt
geqESHQyUdYaqFkgweTZ3eWMhaRgCxu8en70DBuMxUUum5wcytppO0L0J94I
mqIavkKgLVeUpRstM0patdR+OZKG47wqBDLS0H57LpgjNsiZLCWJQYZvM5Li
AD5kKkFK5AVI1BZ+E8gtcq2rEWl6Ac9UFPde/qOj33/XiW1OZtr7FnvwB2yw
vzKvShnLSKGJNolGS3byUM5rxKvKSYiEqLNdswwIrrW2CXhoB55ImgbEGJyC
854+hfOkrXPXyMKKkzcdmYLQy3aBrlqpXJCBvMyXxVZegqXlyW7ovxTODeUM
GYIo07gHxHG5KiHs48uXsycdDBIxgl684AiifVk2dh70mMNgKSUUnI6gdCE/
kKAUVo0hyX4+dg/IDMVQLP60RUABmNWj8sgrhl0i9APb51bZHXJM0TZJVhNq
kFyA7jx4l4SKa5EcIeYZl1iFwiPWGh7p4DWuejRqBCXQjiKgj9EqI41pa3qU
1h4BWVTlY1iEytAkuEeNsigsUCCiP4oMmcM42XDSIqdwiNWhwUIVCgVFGm/q
nQNnIsEYFxOwHmSQWNSWQKenaEjvgn9grfsh6hisJLVJEN/HJmOapXzZSz3e
njguMf5OXlxUTaZJV2E9hbo2onp/3ygkGNYK7e9D1KRt+eEij62R+dyPuXpJ
CN+mK36Aua74e6fuEvyjqml6HliLqINR2KeDu2ImH9+hPSKzhQbqCWC60oOh
8BET0BUV65e7mxnamDlBN/xLYUH5EPLv+cvfv0T+FXNXZLqKrn/+O7lDzjuh
lgVlGS696lTDHFlG4oFkkguP+Kczs2AhK8PB0vR1pzCxnJKNxeOz2ekUBRE+
UymaVSoV0I7kfM5rcJdNW8T4aSJmgQ9OuxjWDTOhL6fs5dNvv4Wa+bJGtKBg
3nBQNBeo5UVm3SPlaEtO8DRKLN0OyrznZZpyBH42JraAOrQhrQrSFTecEYyy
7M7nPPpeYikgO4Orn2Z31HzTX3l9w59vzxGZt+dn9Hn29uTysvkgwh2ztzc/
XZ61n9onT2+urs6vz/zDuCp7l8Tg6uSvAx/jAzDji5vrk8uB5ypd25Hq0Hke
0Ku07GjlUIRcYs1cM7/58XT6n//x7CXi4h8oLp49o5rhv7x6xkECBpH73Yoc
ZvRfYWZQy7JEuLBfQWdhQlOpjLIPGL4qtrkkugBr/uO/kmX+7Vj+YZ6Uz17+
MVwghXsXo816F9lmh1cOHvZGfODSA9s01uxd37N0X96Tv/a+R7t3Lv7hB5Ab
LUfPXv3wR7EfyA2WLHUOrAH5r/3QJjLcgAGAyKVVa+Jp3ubKEXI5sVBrhCeY
eLVjAi3nypkkPoa0JMLlONYZiXiBflfkOVziR1lu5yq9ltpapBPhoePko6JZ
1FU/lBCFTLgHHpEY2+aAX3mlkhvPm8zNjNMG7aM2m0OWKcR14L+p9gABCiET
1PSlR7fe7QfEGwTOeBw0MEVk0BDR6n+vjaW4rvgJ8DLS2NF4zA67lyxLBnDI
8TiroN/79o11bfdeoETuEbBei2J1GSox3eR38jyAiDYl3bYgFlEWueYKU7DY
x7i1qiJAh3Xb5brsXKyVvQ9VDFmLwriJz21UhtpAEKgVikjzlFcSYqAT0R7N
2WWdghSxl1l+S0gWCDftO5PCxi6FupBcJx7+eDU8Re0VqRsJve35epGppWN0
AEWOs1SKVISTgKHj5v2gxIIgHJVJgN3v6Nm4AWRp16elaKJEqQG7XExFQ5vi
sCnweRfYQcM/yHUcqynCxCuEYNIaJPkTs7KPHymSH+Gmr3RXL8wf4cnQloYm
lUz12mr94+wMUdKsgAeH3e6JbMtko2ceCh4Lj3uTKrqHbsCvj58I6gYh68V0
cxQeaxLiYCFQBmpLss7Q5Ocjlo3mkYK+/QLw+/nu9PJkNvOrvvzvrNpd06/I
0PAaDk1rlY1AppC6YeEhwR+bS67Q1PrBQbelJH29/6hp3JPST7GbXSLOeTdx
tu+zvcKXqug94dOGeEOYKXS95UUaHsjEZZAF8zK19hx5Y/RtxGhNBpH74nfk
7IQQpSFrDPuTNJuj7xvoAGa2+z24G2lINzUhIeIcxvAvDPigt+hpaaKc1Jmy
Hu070ymPvQ/uI7pa0X1Bs46rTzwUU5tNAbJFzQrlDJCriKrvEXauBXOCtZoq
XiXa5skPdENKPpJhyiOacU9/jkVdBbrQHPjuE4bkaOaYewPOx0+oI+cRhY8T
n5j0mNVL0P1MO+c7FK5EqB10JBOGMs2qKTcOWCmK9Oyp/LE24MvPn754+Qpq
J9TqsDQFmFVn/MpqNe2xL0Mq52MeMgc9CDsZt/LTGEp3WqaLARwhrKuI0f+5
nIyOiudalOTDkEZtGAt/IQRr594j7r3RD8e9qNy17Z933d7glpX8VPYfumRr
kJ9ElR50DORgYApOCLDkGBgRz3BF3zpksk4odLT3GhDOLVpUM4Q1FIPUvLHC
ozWR3JQNRRXUUkw8NmM9ppmsaeLD1xtxfLzA/46/yarvu098s6y+RwNE0nB+
ddQuvdoo87UN2SnPL65/PrkcC2/riMGg1DXPJEHcFDld+4wK08hDvbERLopW
6b93bgZPx4J521KVQ9jdYypI4ROI2LKTXlNS7Q2VffEhwUnrMJ5KNmu3bHUF
zsEqTAUaBtct2yyb3qcHQ56W06ph7tL8IiACzSFS3cyBw2jWb+Lvd8FzuCns
iqsRGyhKC6c7gxgSNbj6V20LYjlrGqcOEugy8E+HFpvV1q7i7Vup1NzTc6Ka
1rOjhvudew82QVnpZJUbrNKx7lxn1Mb3nSoPAZcx4JO+DhyHs4d22vMu2cVD
i6/tnNRhpgXfkbIPwRTvSee/YX7hJ318t6d4zfABHDOnwS4UQg9hx18Q5Og3
ChIgMIgCHAys6DPyIM7DMNDXW19GmOk1t5GANFOw3SMFmt/Ew4Jm7MezLcEz
Eed37fdHNNCqDHpI7VelliPTylUjsgofReQ0kapCLKBron2ChI4qwV65Z/uM
XKkTetqnV5tfwekHFCnAJ/FzNKlOoZl7jC8Tcv4Tnx3Mb9KWl0RSGXhVnsAl
yu7YooL9ExPg0/6R3UCJxKPvHPGFYHlY6CPpj9M+p8BRVwHRV0B+pQKBeh8E
mPiaAAu9WwA704sr8nKLf02U/R8GWI+mfQkeOiD9udQUn3A91bQv5uSXkOG3
y3Dgva+So48NNJNb0mC7yHQ4dTOuaqC75404CQhkJy+asTgcsDXMx2iAzc0t
TWFmoYneb07P32OP+EPM9dB96nxjiN9C705n0M4BoogItGwnYpteRTjpbcXj
c38gxofcYebrjxf8wa5aVAhAVycJUpBei+ETJMCL73PkCiq7lboHNhKrR8z9
GvcrFVqPMAQuNZ0SFcQYRTwj4M6afm+2DuRbyVxv+XH2lj/KHLa9dbeRElXh
j7eWNfe9rfaNCoigMM3jM1nL7uW3NUZ6AcMazX5vCD6dPYKR2Q0fbFEeNfDS
60ojRWLIkSRcFiN0LE5cc8AjD4Y0bdZ6ChWnYf5oda12exNwsXesMgyk1tWm
YvbdMwKIx7KI0eMDRdtR2IPGke7/509/x/nTTbRwEJgt3CFfbAM2shA/0g57
Vzump8kSRU3Pg7H/a8KNW3olvn7CE2ma7++4NIa1/AEBs/XPTJ36pc9PzA/b
GG6H47jlK86bpD9vElycAubco3Mo41spVQTZDgMbs80aMMQTHm24JYcQVBlE
m+3b8MZFSafkduNfsNARXWn/OLKJldejYTNHw1p7en6mS/aObZvdvJNLDxiM
36+JDNqHQuwhPVKyA7jWhV4kzoWkWXR0NmSHlGr6Sdsdfqa1QGtCk6wvthb7
JGGvJ2UBmsa0HfSEY9bOUbra9QBKRGAuHsqcvaTqwpYQ05ACQXg6P8EmtUd2
rKpTnx17fW07WQitoehmvsctHuKo3IQpRZ4esOqDbPZ9f5u+dDqeVJGQsCCf
ZcQ0C2VPajrrgx0DErmGgoe5BJdJHnS87Aw6juLPkI/PU4lihIz+ClE+yW2/
tvdgIx1Y6WD0xwfDX22ThxBv/BsWe4jzNWOxzoL/g1T55GgFKJfUfPJ3Siwk
jVwvWDT+SIObBsHCmw57AzoUow8f2vfefI/fvAozPjy0VHJZU7bxSxnt61tO
907MO+1FbZmg9gAqyJf0hO9xhWbm1LDWzuqUz8ydmozwLyERGnAf42i0louV
zkomhE4aejneLPwbbIEc0+TUH3qanCvTfEc8s3BVFJ/8QQSJXsHcqKRv0f1X
HZXxL3msIeNSRUXKwjnTvNf2SF6cXJ884LXuQvTKU174O1USbcMvL9IpJ61y
ktznxTbT6ZJfqhIfjvN6PUcZTP9psEB91IOPPhbCm1xbnhTyWTCnmMrv5e0O
2r2lU+SKxl7bVdE2kswbqaSplKqpqPzLUx6K/ZtHY3lLL8GgLFzpHb0JST1m
Ow+4NihYb6xZ3Ifx21V8zVY0u8DmIPpy5d86bOZYcw2bG0jt88UQ8SIsoDfa
D3wH03QG5o3CFSq847fr+WGyt3cCpygXZ6pvzicehZ5GZJ4qm251lg3lm8Ki
g3+tjF0hgBEQV+q9fI3+gfqP2yLNAX1v6O0xmllT4Xyrtig1bije1NT+w5Py
7TdaJaDe3yNmrV/hgv6RxlD+GXlATpCXOs+L90MEBBJJTrXlNfjfAuhcgBWC
i+J+2G6lgD53tX4f3714Y/USDNVUmosyhSbsyjnTHDH7f1gyFv8FnFOEyt4y
AAA=

-->

</rfc>

