<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-ccwg-rfc8298bis-screamv2-03" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-rfc8298bis-screamv2-03"/>
    <author initials="I." surname="Johansson" fullname="Ingemar Johansson">
      <organization>Ericsson</organization>
      <address>
        <email>ingemar.s.johansson@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Westerlund" fullname="Magnus Westerlund">
      <organization>Ericsson</organization>
      <address>
        <email>magnus.westerlund@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Kühlewind" fullname="Mirja Kühlewind">
      <organization>Ericsson</organization>
      <address>
        <email>mirja.kuehlewind@ericsson.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>WIT</area>
    <workgroup>CCWG</workgroup>
    <abstract>
      <?line 123?>

<t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2), an update to SCReAM congestion control for media streams such as RTP
<xref target="RFC3550"/>. SCReAMv2 includes several algorithm simplifications and adds
support for L4S. The algorithm supports handling of multiple media streams,
typical use cases are streaming for remote control, AR and 3D VR goggles.
This specification obsoletes RFC 8298.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-ccwg-rfc8298bis-screamv2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Congestion Control Working Group (ccwg) Working Group mailing list (<eref target="mailto:ccwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ccwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ccwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/IngJohEricsson/draft-johansson-ccwg-scream-bis"/>.</t>
    </note>
  </front>
  <middle>
    <?line 132?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2). This specification replaces the previous experimental version <xref target="RFC8298"/> of
SCReAM with SCReAMv2. There are many and fairly significant changes to the
original SCReAM algorithm as described in <xref target="sec_changes"/>.</t>
      <t>Both SCReAM and SCReAMv2 estimates the forward queue delay in the same way as Low
Extra Delay Background Transport (LEDBAT) <xref target="RFC6817"/>.
However, while SCReAM is based on the self-clocking principle of TCP,
SCReAMv2 is not entirely self-clocked as it augments self-clocking with pacing
and a minimum send rate.</t>
      <t>Further, SCReAMv2 can take advantage of Explicit
Congestion Notification (ECN) <xref target="RFC3168"/> and Low Latency Low Loss and Scalable
throughput (L4S) <xref target="RFC9330"/> in cases where ECN or L4S is supported by the
network and the hosts. However, ECN or L4S is not required for the basic
congestion control functionality in SCReAMv2.</t>
      <section anchor="sec_changes">
        <name>Updates Compared to SCReAM (version 1)</name>
        <t>The algorithm in this memo differs considerably compared to the previous version of
SCReAM in <xref target="RFC8298"/>. The main differences are:</t>
        <ul spacing="normal">
          <li>
            <t>L4S support added. The L4S algorithm has many similarities with the DCTCP and
Prague congestion control but has a few extra modifications to make it work
well with periodic sources such as video.</t>
          </li>
          <li>
            <t>The delay-based congestion control is changed to implement a pseudo-L4S
approach, this simplifies the delay-based congestion control.</t>
          </li>
          <li>
            <t>The fast increase mode is removed. The reference window additive increase is
replaced with an adaptive multiplicative increase to enhance convergence
speed.</t>
          </li>
          <li>
            <t>The algorithm is more rate based than self-clocked:  </t>
            <ul spacing="normal">
              <li>
                <t>The calculated congestion window is mainly used to calculate proper media bitrates. Bytes in flight is
however allowed to exceed the reference window. Therefore, the term
reference window is used instead of congestion window, as the reference
 window does not set an absolute limit on the bytes in flight.      </t>
                <ul spacing="normal">
                  <li>
                    <t>The self-clocking now acts more like an emergency break
as bytes in flight can exceed the reference window only to a certain
degree. The rationale is to be able to transmit large video frames and avoid
that they are unnecessarily queued up on the sender side, but still prevent a
large network queue.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>The media bitrate calculation is dramatically changed and simplified. In practice
it is manifested with a relatively simple relation between the reference window and RTT.</t>
          </li>
          <li>
            <t>Additional compensation is added to make SCReAMv2 handle cases such as large
changing frame sizes.</t>
          </li>
        </ul>
      </section>
      <section anchor="requirements-media">
        <name>Requirements on the Media and Feedback Protocol</name>
        <t>SCReAM was originally designed to be used with RTP + RTCP where <xref target="RFC8888"/> was
used as recommended feedback. RTP offers unique packet indication with the
sequence number and <xref target="RFC8888"/> offers timestamps of received packets and the
status of the ECN bits.</t>
        <t>SCReAM is however not limited to RTP as long as some requirements are fulfilled:</t>
        <ul spacing="normal">
          <li>
            <t>Media data is split in data units that when encapsulated in IP packets fit in
the network MTU.</t>
          </li>
          <li>
            <t>Each data unit can be uniquely identified.</t>
          </li>
          <li>
            <t>Data units can be queued up in a packet queue before transmission.</t>
          </li>
          <li>
            <t>Feedback can indicate reception time for each data units, or a group of data
units.</t>
          </li>
          <li>
            <t>Feedback can indicate packets that are ECN-CE marked. Unique ECN bits
indication for each packet is not necessary. An ECN-CE counter similar to
what is defined in <xref target="RFC9000"/> is sufficient.</t>
          </li>
        </ul>
      </section>
      <section anchor="ledbat-tfwc">
        <name>Comparison with LEDBAT and TFWC in TCP</name>
        <t>The core SCReAM algorithm, which is still similar in SCReAMv2, has similarities
to the concepts of self-clocking used in TCP-friendly window-based congestion
control <xref target="TFWC"/> and follows the packet conservation principle. The packet
conservation principle is described as a key factor behind the protection of
networks from congestion <xref target="Packet-conservation"/>.</t>
        <t>The reference window decrease is determined in a way similar to
LEDBAT <xref target="RFC6817"/>. However, the window increase is not based on
delay estimates but uses both a linear increase and multiplicative increase function depending
on the time since the last congestion event and introduces use of inflection points in the
reference window increase calculation to achieve reduced delay jitter.
Further, unlike LEDBAT which is a scavenger congestion control mostly designed
for low priority background traffic, SCReAM adjusts the qdelay target to
compete with other loss-based congestion-controlled flows.</t>
        <t>SCReAMv2 adds a new reference window validation technique, as the reference window is used as a basis for the
target bitrate calculation. For that reason, various actions are taken to avoid
that the reference window grows too much beyond the bytes in flight. Additional
contraints are applied when in congested state and when the maximum target bitrate is reached.</t>
        <t>The SCReAM/SCReAMv2 congestion control method uses techniques similar to LEDBAT
<xref target="RFC6817"/> to measure the qdelay. As is the case with LEDBAT, it is not
necessary to use synchronized clocks in the sender and receiver in order to
compute the qdelay. However, it is necessary that they use the same clock
frequency, or that the clock frequency at the receiver can be inferred reliably
by the sender. Failure to meet this requirement leads to malfunction in the
SCReAM/SCReAMv2 congestion control algorithm due to incorrect estimation of the
network queue delay. Use of <xref target="RFC8888"/> as feedback ensures that the same time
base is used in sender and receiver.</t>
      </section>
    </section>
    <section anchor="requirements">
      <name>Requirements Language</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>
    </section>
    <section anchor="scream-overview">
      <name>Overview of SCReAMv2 Algorithm</name>
      <t>SCReAMv2 consists of three main parts: network congestion control, sender
transmission control, and media rate control. All of these parts reside at the
sender side while the receiver is assumed to provide acknowledgements of received
data units and indication of ECN-CE marking, either as an accumulated bytes counter,
or per individual data unit.</t>
      <t>The sender implements media rate control and a data unit queue for each media
type or source, where data units containing encoded media frames are temporarily
stored for transmission. Figure 1 shows the details when a single media source
(or stream) is used. Scheduling and prioritization of multiple streams is not
covered in this document. However, if multiple flows are sent, each data unit queue can be
served based on some defined priority or simply in a round-robin fashion. Alternatively,
a similar approach as coupled congestion control <xref target="RFC6365"/> can be applied.</t>
      <figure anchor="fig-sender-view">
        <name>Sender Functional View</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="472" viewBox="0 0 472 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 8,160 L 8,224" fill="none" stroke="black"/>
              <path d="M 8,320 L 8,384" fill="none" stroke="black"/>
              <path d="M 8,480 L 8,512" fill="none" stroke="black"/>
              <path d="M 64,72 L 64,96" fill="none" stroke="black"/>
              <path d="M 64,120 L 64,160" fill="none" stroke="black"/>
              <path d="M 64,232 L 64,256" fill="none" stroke="black"/>
              <path d="M 64,304 L 64,320" fill="none" stroke="black"/>
              <path d="M 64,392 L 64,416" fill="none" stroke="black"/>
              <path d="M 64,464 L 64,480" fill="none" stroke="black"/>
              <path d="M 112,160 L 112,224" fill="none" stroke="black"/>
              <path d="M 112,320 L 112,384" fill="none" stroke="black"/>
              <path d="M 240,192 L 240,224" fill="none" stroke="black"/>
              <path d="M 240,248 L 240,336" fill="none" stroke="black"/>
              <path d="M 336,320 L 336,384" fill="none" stroke="black"/>
              <path d="M 344,144 L 344,240" fill="none" stroke="black"/>
              <path d="M 384,64 L 384,80" fill="none" stroke="black"/>
              <path d="M 384,128 L 384,136" fill="none" stroke="black"/>
              <path d="M 392,240 L 392,256" fill="none" stroke="black"/>
              <path d="M 392,288 L 392,312" fill="none" stroke="black"/>
              <path d="M 392,384 L 392,416" fill="none" stroke="black"/>
              <path d="M 392,448 L 392,472" fill="none" stroke="black"/>
              <path d="M 440,144 L 440,240" fill="none" stroke="black"/>
              <path d="M 456,320 L 456,384" fill="none" stroke="black"/>
              <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
              <path d="M 464,480 L 464,512" fill="none" stroke="black"/>
              <path d="M 8,32 L 464,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 464,64" fill="none" stroke="black"/>
              <path d="M 344,144 L 440,144" fill="none" stroke="black"/>
              <path d="M 8,160 L 112,160" fill="none" stroke="black"/>
              <path d="M 112,192 L 240,192" fill="none" stroke="black"/>
              <path d="M 8,224 L 112,224" fill="none" stroke="black"/>
              <path d="M 344,240 L 440,240" fill="none" stroke="black"/>
              <path d="M 8,320 L 112,320" fill="none" stroke="black"/>
              <path d="M 336,320 L 456,320" fill="none" stroke="black"/>
              <path d="M 240,336 L 328,336" fill="none" stroke="black"/>
              <path d="M 120,368 L 328,368" fill="none" stroke="black"/>
              <path d="M 8,384 L 112,384" fill="none" stroke="black"/>
              <path d="M 336,384 L 456,384" fill="none" stroke="black"/>
              <path d="M 8,480 L 464,480" fill="none" stroke="black"/>
              <path d="M 8,512 L 464,512" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="400,472 388,466.4 388,477.6" fill="black" transform="rotate(90,392,472)"/>
              <polygon class="arrowhead" points="400,312 388,306.4 388,317.6" fill="black" transform="rotate(90,392,312)"/>
              <polygon class="arrowhead" points="392,136 380,130.4 380,141.6" fill="black" transform="rotate(90,384,136)"/>
              <polygon class="arrowhead" points="336,368 324,362.4 324,373.6" fill="black" transform="rotate(0,328,368)"/>
              <polygon class="arrowhead" points="336,336 324,330.4 324,341.6" fill="black" transform="rotate(0,328,336)"/>
              <polygon class="arrowhead" points="72,392 60,386.4 60,397.6" fill="black" transform="rotate(270,64,392)"/>
              <polygon class="arrowhead" points="72,232 60,226.4 60,237.6" fill="black" transform="rotate(270,64,232)"/>
              <polygon class="arrowhead" points="72,72 60,66.4 60,77.6" fill="black" transform="rotate(270,64,72)"/>
              <g class="text">
                <text x="216" y="52">Media</text>
                <text x="272" y="52">encoder</text>
                <text x="372" y="100">Data</text>
                <text x="412" y="100">unit</text>
                <text x="68" y="116">target_bitrate</text>
                <text x="384" y="116">|</text>
                <text x="64" y="180">Media</text>
                <text x="388" y="180">Data</text>
                <text x="60" y="196">Rate</text>
                <text x="392" y="196">Units</text>
                <text x="64" y="212">Control</text>
                <text x="392" y="212">Queue</text>
                <text x="244" y="244">target_bitrate</text>
                <text x="64" y="276">ref_wnd</text>
                <text x="380" y="276">Data</text>
                <text x="420" y="276">unit</text>
                <text x="64" y="292">RTT</text>
                <text x="56" y="340">Network</text>
                <text x="396" y="340">Sender</text>
                <text x="60" y="356">Congestion</text>
                <text x="184" y="356">ref_wnd</text>
                <text x="396" y="356">Transmission</text>
                <text x="56" y="372">Control</text>
                <text x="392" y="372">Control</text>
                <text x="176" y="388">Bytes</text>
                <text x="212" y="388">in</text>
                <text x="252" y="388">flight</text>
                <text x="44" y="436">Congestion</text>
                <text x="124" y="436">Feedback</text>
                <text x="380" y="436">Data</text>
                <text x="420" y="436">unit</text>
                <text x="40" y="452">Bytes</text>
                <text x="76" y="452">in</text>
                <text x="116" y="452">flight</text>
                <text x="216" y="500">UDP</text>
                <text x="260" y="500">socket</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------+
|                       Media encoder                    |
+----------------------------------------------+---------+
       ^                                       |
       |                                    Data unit
 target_bitrate                                |
       |                                       V
       |                                  +-----------+
+------+-----+                            |           |
|    Media   |                            |   Data    |
|    Rate    +---------------+            |   Units   |
|   Control  |               |            |   Queue   |
+------------+               |            |           |
       ^               target_bitrate     +-----+-----+
       |                     |                  |
    ref_wnd                  |               Data unit
      RTT                    |                  |
       |                     |                  v
+------+-----+               |           +--------------+
|  Network   |               +---------->|    Sender    |
| Congestion |     ref_wnd               | Transmission |
|  Control   |-------------------------->|   Control    |
+------------+     Bytes in flight       +------+-------+
       ^                                        |
       |                                        |
Congestion Feedback                          Data unit
  Bytes in flight                               |
       |                                        v
+------+-------------------------------------------------+
|                        UDP socket                      |
+--------------------------------------------------------+
]]></artwork>
        </artset>
      </figure>
      <t>Media frames are encoded and forwarded to the data unit queue in
<xref target="fig-sender-view"/>. The data units are sent by the sender transmission controller
from the data unit queue.</t>
      <t>The sender transmission controller (in case of multiple flows a transmission
scheduler) sends the data units to the UDP socket. The sender transmission
controller limits the sending rate so
that the number of bytes in flight is less than the reference window albeit with
a slack to avoid that packets are unnecessarily delayed in the Data Units Queue.
The slack avoids unnecessary delays in the Data Units Queue when the link is uncongested. The bytes in flight, however, become more restrained in congested situations to avoid large variations in queue delay and bitrate.
A pacing rate is calculated based on the target bitrate provided by the
media rate controller.</t>
      <t>Feedback about the received bytes as well as metadata to estimate the congestion
level or queuing delay are provided to the network congestion controller.
The network congestion controller calculates the reference window and provides it
together with the bytes in flight to the sender transmission control.</t>
      <t>The reference window and the estimated RTT is further provided to the media rate
control to compute the appropriate target bitrate. The target bitrate is
updated whenever the reference window is updated. Additional parameters are also
communicated to make the rate control more stable when the congestion window is
very small or when L4S is not active.</t>
      <section anchor="network-cc">
        <name>Network Congestion Control</name>
        <t>The network congestion control sets reference window (ref_wnd)
which puts an upper limit on how many bytes can be in
flight, i.e., transmitted but not yet acknowledged. The reference window is
however not an absolute limit as slack is given to efficiently transmit
temporary larger media objects, such as video frames. This means that the
algorithm prefers to build up a queue in the network rather than on the sender
side. Additional congestion that this causes will reflect back and cause a
reduction of the reference window.</t>
        <t>The reference window is reduced if congestion is detected. Similar to
LEDBAT, the reference window is reduced either by a fixed fraction in
case of packet loss or Classic ECN marking, or if the estimated queue
delay exceeds a given threshold, depending on how much the delay
exceeds the threshold.  SCReAMv2 reduces the reference window in
proportion to the fraction of marked packets if L4S is used (scalable
congestion control).</t>
        <t>In each RTT ref_wnd will be reduced at most once if congestion is detected based on the following conditions:</t>
        <t>a) on loss: ref_wnd *=  LOSS_BETA</t>
        <t>b) classic ECN CE: ref_wnd *=  ECN_BETA</t>
        <t>b) on L4S ECN CE or increased delay: ref_wnd *=  1.0 - l4sAlpha / 2.0</t>
        <t>Independent of the congestion detection, ref_wnd is increased by a fix increment for each RTT.</t>
        <t>The reference window increases multiplicatively after a number of congestion free RTTs, this enables a faster convergence to a higher link speed. The increase factor is also adjusted relative to a previous max value.</t>
      </section>
      <section anchor="sender-tc">
        <name>Sender Transmission Control</name>
        <t>The sender transmission control limits sending rate based on the
relation of the estimated link throughput (bytes in flight) and the reference window.</t>
        <artwork><![CDATA[
send_wnd = ref_wnd * ref_wnd_overhead - bytes_in_flight
]]></artwork>
        <t>The respective sending rate is achieved by applying packet pacing: Even
if the send window allows for the transmission of a number of packets,
these packets are not transmitted immediately; rather, they are
transmitted in intervals given by the packet size and the estimated
link throughput. Packets are generally paced at a higher rate than the
target bitrate, this makes it possible to transmit occasionally larger
video frames in a timely manner. Further, this mitigates issues with
ACK compression that can cause increased jitter and/or packet loss in
the media traffic.</t>
      </section>
      <section anchor="media-rate-control">
        <name>Media Rate Control</name>
        <t>The media rate control calculates the media rate based on the reference window and RTT.</t>
        <artwork><![CDATA[
target_bitrate = 8 * ref_wnd / s_rtt [bps]
]]></artwork>
        <t>The media rate needs to ramp up quickly enough to get a fair share of
the system resources when link throughput increases. Further, the
reaction to reduced throughput must be prompt to avoid
getting too much data queued in the data unit queue(s) in the sender.</t>
        <t>For the case that multiple
streams are enabled, the media rate among the streams are distributed according
to relative priorities.</t>
        <t>In cases where the sender's frame queues increase rapidly, such as in the case
of a Radio Access Type (RAT) handover, the SCReAMv2 sender MAY implement
additional actions, such as discarding of encoded media frames or frame skipping
to ensure that the data unit queues are drained quickly. Frame skipping
results in the frame rate being temporarily reduced. Which method to use is a
design choice and is outside the scope of this algorithm description as the actual strategy depends on the application.
 For instance for a video conferencing application it can be better to avoid discarding media frames even though they are late,
  whereas a remote controlled application benefits from low end to end delay, in which case it is better to discard late frames and generate a new keyframe to maintain correct media coder state.</t>
      </section>
    </section>
    <section anchor="scream-detailed-description">
      <name>Detailed Description of SCReAMv2 Sender Algorithm</name>
      <t>This section describes the sender-side algorithm in more detail. It is split
between the network congestion control, sender transmission control, and media
rate control.</t>
      <section anchor="sender-side-state">
        <name>Sender Side State</name>
        <t>The sender needs to maintain sending state and state about the received
feedback, as explained in the following subsections.</t>
        <section anchor="status-update-when-sending-data">
          <name>Status Update When Sending Data</name>
          <t>SCReAMv2 is a window-based and byte-oriented congestion control
protocol, where the number of bytes transmitted is inferred from the
size of the transmitted data units. Thus, a list of transmitted data
units and their respective transmission times (wall-clock time) MUST
be kept for further calculation. Further the following variables are
needed:</t>
          <ul spacing="normal">
            <li>
              <t>data_unit_size (0): Size [byte] of the last transmitted data unit.</t>
            </li>
            <li>
              <t>bytes_in_flight: The number of bytes in flight is computed as the sum of the
sizes of the data units ranging from the data unit most recently transmitted,
down to but not including the acknowledged data unit with the highest sequence
number.</t>
            </li>
            <li>
              <t>bytes_in_flight_prev (0): Number of bytes in flight from previous round [byte].</t>
            </li>
          </ul>
          <t>bytes_in_flight can be also seen as the difference between the highest transmitted
byte sequence number and the highest acknowledged byte sequence number. As an
example: If a data unit with sequence number SN is transmitted and the last
acknowledgement indicates SN-5 as the highest received sequence number, then
bytes_in_flight is computed as the sum of the size of data units with sequence
number SN-4, SN-3, SN-2, SN-1, and SN. It does not matter if, for instance, the
data unit with sequence number SN-3 was lost -- the size of data unit with
sequence number SN-3 will still be considered in the computation of
bytes_in_flight.</t>
          <ul spacing="normal">
            <li>
              <t>ref_wnd_ratio (0.0): Ratio between MSS and ref_wnd capped to not
exceed 1.0 (min(1.0, MSS / ref_wnd)).</t>
            </li>
            <li>
              <t>max_bytes_in_flight (0): The maximum number of bytes in flight in the current
round trip [byte].</t>
            </li>
            <li>
              <t>max_bytes_in_flight_prev (0): The maximum number of bytes in flight in
previous round trip [byte].</t>
            </li>
          </ul>
          <t>As bytes_in_flight can spike when congestion occurs, using the minimum of
max_bytes_in_flight and max_bytes_in_flight_prev
makes it more likely that an uncongested bytes_in_flight is used.</t>
        </section>
        <section anchor="status-update-on-receiving-feedback">
          <name>Status Update on Receiving Feedback</name>
          <t>The feedback from the receiver is assumed to consist of the following elements:</t>
          <ul spacing="normal">
            <li>
              <t>The receiver wall-clock timestamp corresponding to the reception
time of the data unit with the highest sequence number.</t>
            </li>
            <li>
              <t>data_units_acked: A list of received data units' sequence numbers.</t>
            </li>
            <li>
              <t>data_units_acked_ce: An indication if data units are ECN-CE marked.
The ECN status can be either per data unit or an accumulated count of
ECN-CE marked data units.</t>
            </li>
            <li>
              <t>bytes_newly_acked (0): Number of bytes newly ACKed, reset to 0 when congestion
window is updated [byte].</t>
            </li>
            <li>
              <t>bytes_newly_acked_ce (0): Number of bytes newly ACKed and CE marked, reset to
0 when reference window is updated [byte].</t>
            </li>
          </ul>
          <t>bytes_newly_acked is incremented with a value
corresponding to how much the highest sequence number has increased
since the last feedback. As an example: If the previous
acknowledgement indicated the highest sequence number N and the new
acknowledgement indicated N+3, then bytes_newly_acked is incremented
by a value equal to the sum of the sizes of data units with sequence
number N+1, N+2, and N+3. Data units that are lost are also included,
which means that even though, e.g., data unit N+2 was lost, its size
is still included in the update of bytes_newly_acked. The
bytes_newly_acked_ce is, similar to bytes_newly_acked, a counter of
bytes newly acked with the extra condition that they are ECN-CE
marked. The bytes_newly_acked and bytes_newly_acked_ce are reset to
zero after a ref_wnd update.</t>
        </section>
      </section>
      <section anchor="network-cc-2">
        <name>Network Congestion Control</name>
        <t>This section explains the network congestion control, which calculates the
reference window. The reference window gives an upper limit to the number of bytes in flight.</t>
        <section anchor="reaction-delay-loss-ce">
          <name>Congestion Detection: Delay, Data Unit Loss and ECN-CE</name>
          <t>Congestion is detected based on three different indicators:</t>
          <ul spacing="normal">
            <li>
              <t>Lost data units detected.</t>
            </li>
            <li>
              <t>ECN-CE marked data units detected either for classic ECN or L4S.</t>
            </li>
            <li>
              <t>Estimated queue delay exceeds a threshold.</t>
            </li>
          </ul>
          <t>A congestion event occurs if any of the above indicators are true AND it is at
least min(VIRTUAL_RTT, s_rtt) since the last congestion event. This ensures that
the reference window is reduced at most once per smoothed RTT.</t>
          <section anchor="reaction-loss">
            <name>Detecting Lost Data Units</name>
            <t>The reference window backoff due to loss events is deliberately a bit less than
is the case with TCP Reno, for example. TCP is generally used to transmit whole
files; the file is then like a source with an infinite bitrate until the whole
file has been transmitted. SCReAMv2, on the other hand, has a source which rate
is limited to a value close to the available transmit rate and often below that
value; the effect is that SCReAMv2 has less opportunity to grab free capacity
than a TCP-based file transfer. To compensate for this, it is RECOMMENDED to let
SCReAMv2 reduce the reference window less than what is the case with TCP when
loss events occur.</t>
            <t>Lost data unit detection is based on the received sequence number list. A
reordering window SHOULD be applied to prevent data unit reordering from triggering
loss events. The reordering window is specified as a time unit, like the
ideas behind Recent ACKnowledgement (RACK) <xref target="RFC8985"/>. The computation of the
reordering window is made possible by means of a lost flag in the list of
transmitted data units. This flag is set if the received sequence number list
indicates that the given data unit is missing. If later feedback indicates that
a previously lost marked data unit was indeed received, then the reordering window
is updated to reflect the reordering delay. The reordering window is given by
the difference in time between the event that the data unit was marked as lost and
the event that it was indicated as successfully received. Loss is detected if a
given data unit is not acknowledged within a time window (indicated by the
reordering window) after a data unit with a higher sequence number was
acknowledged.</t>
          </section>
          <section anchor="reaction-ecn-ce">
            <name>Receiving ECN-CE with classic ECN</name>
            <t>In classic ECN mode the ref_wnd is scaled by a fixed value (BETA_ECN).</t>
            <t>The reference window backoff due to an ECN event MAY be smaller than if a loss
event occurs. This is in line with the idea outlined in <xref target="RFC8511"/> to enable
ECN marking thresholds lower than the corresponding data unit drop thresholds.</t>
          </section>
          <section anchor="reaction-l4s-ce">
            <name>Receiving ECN-CE for L4S</name>
            <t>The ref_wnd is scaled down in proportion to the fraction of marked
data units per RTT. The scale down proportion is given by l4s_alpha,
which is an Exponentially Weighted Moving Average (EWMA) filtered
version of the fraction of marked data units per RTT. This is inline
with how DCTCP works <xref target="RFC8257"/>. Additional methods are applied to
make the reference window reduction reasonably stable, especially when
the reference window is only a few MSS. In addition, because SCReAMv2
can quite often be source limited, additional steps are taken to
restore the reference window to a proper value after a long period
without congestion.</t>
            <t>l4s_alpha is calculated based in number of data units delivered (and marked)
the following way:</t>
            <artwork><![CDATA[
data_units_delivered_this_rtt += data_units_acked
data_units_marked_this_rtt += data_units_acked_ce
# l4s_alpha is updated at least every 10ms
if (now - last_update_l4s_alpha_time >= min(0.01, s_rtt))
  # l4s_alpha is calculated from data_units marked istf bytes marked
  fraction_marked_t = data_units_marked_this_rtt/
                      data_units_delivered_this_rtt

  # Apply EWMA filtering of fraction_marked_t
  l4s_alpha = L4S_AVG_G * fraction_marked_t +
       (1.0 - L4S_AVG_G) * l4S_alpha

  last_update_l4s_alpha_time = now
  data_units_delivered_this_rtt = 0
  data_units_marked_this_rtt = 0
  last_fraction_marked = fraction_marked_t
end
]]></artwork>
            <t>This makes calculation of L4S alpha more accurate at very low bitrates,
given that the tail data unit in e.g. a video frame is often smaller than MSS.</t>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>l4s_alpha (0.0): Average fraction of marked data units per RTT.</t>
              </li>
              <li>
                <t>last_update_l4s_alpha_time (0.0): Last time l4s_alpha was updated [s].</t>
              </li>
              <li>
                <t>data_units_delivered_this_rtt (0): Counter for delivered data units.</t>
              </li>
              <li>
                <t>data_units_marked_this_rtt (0): Counter delivered and ECN-CE marked data units.</t>
              </li>
              <li>
                <t>last_fraction_marked (0.0): fraction marked data units in last update</t>
              </li>
            </ul>
            <t>The following constants are used:</t>
            <ul spacing="normal">
              <li>
                <t>L4S_AVG_G (1.0/16): Exponentially Weighted Moving Average (EWMA) factor</t>
              </li>
            </ul>
          </section>
          <section anchor="reaction-delay">
            <name>Detecting Increased Queue Delay</name>
            <t>SCReAMv2 implements a delay-based congestion control approach where it mimics
L4S congestion marking when the averaged queue delay exceeds a target
threshold. This threshold is set to qdelay_target/2 and the congestion backoff
factor (l4s_alpha_v) increases linearly from 0 to 100% as qdelay_avg goes from
qdelay_target/2 to qdelay_target. The averaged qdelay (qdelay_avg) is used to
avoid that the SCReAMv2 congestion control over-reacts to scheduling jitter,
sudden delay spikes due to e.g. handover or link layer
retransmissions.</t>
            <t>qdelay_avg is updated with a slow attack, fast decay EWMA filter as described below.</t>
            <artwork><![CDATA[
# Update min and max average queue delay for every ACKed RTP packet

if (now - last_update_qdelay_avg_time >= min(virtual_rtt, s_rtt))
  # Calculate qdelay_avg
  if (qdelay < qdelay_avg)
    qdelay_avg = qdelay
  else
    qdelay_avg = QDELAY_AVG_G * qdelay +
      (1.0 - QDELAY_AVG_G) * qdelay_avg
  end

  # Optional code to calculate the variation on queue delay, which is an
  # Indication of congestion or near congestion.
  if (REDUCE_JITTER == true)
    calculate_latency_diff_avg()
  end
  last_update_qdelay_avg_time = now
end
]]></artwork>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>qdelay (0.0): When the sender receives feedback, the qdelay [s] is calculated as outlined in
<xref target="RFC6817"/>. A qdelay sample is obtained for each received acknowledgement.
It is typically sufficient with one update per received acknowledgement.</t>
              </li>
              <li>
                <t>qdelay_avg(0.0): The average qdelay [s].</t>
              </li>
              <li>
                <t>qdelay_avg_prev(0.0): The qdelay_avg from previous update [s].</t>
              </li>
              <li>
                <t>last_update_qdelay_avg_time (0.0): Last time qdelay_avg was updated [s]</t>
              </li>
              <li>
                <t>s_rtt (0.0): Smoothed RTT [s], computed with a similar method to that
described in <xref target="RFC6298"/></t>
              </li>
            </ul>
            <t>The following constants are used:</t>
            <ul spacing="normal">
              <li>
                <t>QDELAY_AVG_G (1.0/4): Exponentially Weighted Moving Average (EWMA) factor for qdelay_avg</t>
              </li>
              <li>
                <t>REDUCE_JITTER (false): (optional) config knob to enable jitter filtering</t>
              </li>
            </ul>
            <t>The SCReAM algorithm can be further improved for a greater rate stability by taking variations in qdelay into consideration. The goal is to react less to delay variations, caused by e.g. link layer related scheduling and retransmissions, but still be reactive to actual queue delay, caused by congestion. The code below provides a example implementation but more advanced statistical analysis can be considered.</t>
            <t>The variable latency_diff_avg tracks the difference between a short and long average of the qdelay. A positive delta indicates increased latency and increased latency_diff_avg and vice versa. The use of long and short average gives some robustness against e.g. scheduling jitter.</t>
            <artwork><![CDATA[
function calculate_latency_diff_avg()
  # Calculate a short and long average of qdelay
  qdelay_short_avg = qdelay_short_avg * (1.0 - QDELAY_SHORT_AVG_G) + qdelay * QDELAY_SHORT_AVG_G
  qdelay_long_avg = qdelay_long_avg * (1.0 - QDELAY_LONG_AVG_G) + qdelay * QDELAY_LONG_AVG_G

  # Calculate a bounded difference
  if (is_congestion_detected)
     diff_t = max(-LATENCY_DIFF_MARGIN_1, min(LATENCY_DIFF_MARGIN_1,
              qdelay_short_avg-qdelay_long_avg-LATENCY_DIFF_MARGIN_1))
     if (diff_t > 0.0)
        # Increase latency_diff_avg with additional restriction if qdelay is low
        tmp_t = min(1.0, qdelay_avg/LATENCY_DIFF_MARGIN_2)
        latency_diff_avg += LATENCY_DIFF_UP_GAIN*diff_t*tmp_t
     else
        # Decrease latency_diff_avg
        latency_diff_avg += LATENCY_DIFF_DOWN_GAIN*diff_t
     end
     latency_diff_avg = max(0.0, min(1.0, latency_diff_avg))
  else
     qdelay_long_avg = qdelay_short_avg
  end
end
]]></artwork>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>qdelay_short_avg (0.0): Short average queue delay [s], needed only if REDUCE_JITTER==true</t>
              </li>
              <li>
                <t>qdelay_long_avg (0.0): Long average queue delay [s], needed only if REDUCE_JITTER==true</t>
              </li>
              <li>
                <t>latency_diff_avg (0.0): indicates how much the queue delay varies[s]</t>
              </li>
            </ul>
            <t>The following constants are used:</t>
            <ul spacing="normal">
              <li>
                <t>QDELAY_SHORT_AVG_G (1.0/5): Exponentially Weighted Moving Average (EWMA) factor for qdelay_short_avg</t>
              </li>
              <li>
                <t>QDELAY_LONG_AVG_G (1.0/50): Exponentially Weighted Moving Average (EWMA) factor for qdelay_long_avg</t>
              </li>
              <li>
                <t>LATENCY_DIFF_MARGIN_1 (0.001): Latency margin for increasing latency_diff_avg [s]</t>
              </li>
              <li>
                <t>LATENCY_DIFF_MARGIN_2 (0.01): Additional margin to avoid over-sensitivity when qdelay is low [s]</t>
              </li>
              <li>
                <t>LATENCY_DIFF_UP_GAIN (20.0): Gain factor for increased latency</t>
              </li>
              <li>
                <t>LATENCY_DIFF_DOWN_GAIN (2.0): Gain factor for decreased latency</t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="ref-wnd-update">
          <name>Reference Window Update</name>
          <t>The reference window update contains two parts. One that reduces the reference
window when congestion events (listed above) occur, and one part that
continuously increases the reference window.</t>
          <t>The reference window is reduced whenever a congestion event is detected. A congestion event is either packet loss, ECN-CE marked packets or increased queue delay. The reference window reduction is applied at most once every (smoothed RTT) or, to improve fairness to other flows with a different RTT, at least very VIRTUAL_RTT second.</t>
          <t>The reference window is increased once per smother RTT (s_rtt). The reference window can also increase even when a congestion event occurs. Their provided the L4S scalable congestion control property where a one-MSS-increase of the reference window per RTT is offset by two marked packets per RTT.</t>
          <t>The following variables are defined:</t>
          <ul spacing="normal">
            <li>
              <t>ref_wnd (MIN_REF_WND): Reference window [byte].</t>
            </li>
            <li>
              <t>ref_wnd_i (1): Reference window inflection point [byte].</t>
            </li>
            <li>
              <t>qdelay_target (QDELAY_TARGET_LO): qdelay target [s], a variable qdelay target
is introduced to manage cases where a fixed qdelay target would otherwise
starve the data flow under such circumstances (e.g., FTP competes for the
bandwidth over the same bottleneck). The qdelay target is allowed to vary
between QDELAY_TARGET_LO and QDELAY_TARGET_HI.</t>
            </li>
            <li>
              <t>last_congestion_detected_time (0.0): Last time congestion detected [s].</t>
            </li>
            <li>
              <t>is_congestion_detected (false): True if congestion has been detected.</t>
            </li>
            <li>
              <t>last_reaction_to_congestion_time (0.0): Last time congestion avoidance occurred [s].</t>
            </li>
            <li>
              <t>ref_wnd_i_update_allowed (true): Allow update of ref_wnd_i.</t>
            </li>
            <li>
              <t>ref_wnd_i_update_time (0.0): Last time ref_wnd_i was updated [s].</t>
            </li>
            <li>
              <t>ref_wnd_lowest (0): Lowest reference window during a congestion epoch [byte].</t>
            </li>
          </ul>
          <t>Further the following constants are used (the RECOMMENDED values, within parentheses "()",
for the constants are deduced from experiments):</t>
          <ul spacing="normal">
            <li>
              <t>QDELAY_TARGET_LO (0.06): Target value for the minimum qdelay [s].</t>
            </li>
            <li>
              <t>QDELAY_TARGET_HI (0.4): Target value for the maximum qdelay [s]. This
parameter provides an upper limit to how much the target qdelay
(qdelay_target) can be increased in order to cope with competing loss-based
flows. However, the target qdelay does not have to be initialized to this high
value, as it would increase end-to-end delay and also make the rate control
and congestion control loops sluggish.</t>
            </li>
            <li>
              <t>MIN_REF_WND (3000): Minimum reference window [byte].</t>
            </li>
            <li>
              <t>BYTES_IN_FLIGHT_HEAD_ROOM (1.5): Extra headroom for bytes in flight.</t>
            </li>
            <li>
              <t>BETA_LOSS (0.7): ref_wnd scale factor due to loss event.</t>
            </li>
            <li>
              <t>BETA_ECN (0.8): ref_wnd scale factor due to ECN event.</t>
            </li>
            <li>
              <t>MSS (1000): Maximum segment size = Max data unit size [byte].</t>
            </li>
            <li>
              <t>POST_CONGESTION_DELAY_RTT (100): Determines how many RTTs after a congestion
event the reference window growth should be cautious.</t>
            </li>
            <li>
              <t>MUL_INCREASE_FACTOR (0.02): Determines how much (as a fraction of ref_wnd)
that the ref_wnd can increase per RTT.</t>
            </li>
            <li>
              <t>IS_L4S (false): Congestion control operates in L4S mode.</t>
            </li>
            <li>
              <t>VIRTUAL_RTT (0.025): Virtual RTT [s]. This mimics Prague's RTT fairness such that flows with RTT
below VIRTUAL_RTT should get a roughly equal share over an L4S path.</t>
            </li>
            <li>
              <t>REF_WND_I_UPDATE_MAX_HOLD_RTTS (50): Max number of RTTs that ref_wnd_i is held for update.</t>
            </li>
          </ul>
          <section anchor="ref-wnd-reduction">
            <name>Reference Window Reduction</name>
            <artwork><![CDATA[
latency_diff_ref_wnd_scale_t = 1.0 - latency_diff_avg

# Compute scaling factor for reference window adjustment
# when close to the last known max value before congestion
# ref_wnd_i is updated before this code.
# The boolean flags loss_detected and data_units_marked
# indicate that packets are marked or lost since
# last_reaction_to_congestion_time
scl_t = (ref_wnd - ref_wnd_i) / ref_wnd_i
scl_t *= 8
scl_t = scl_t * scl_t
scl_t = max(0.2, min(1.0, scl_t))

if (ref_wnd > ref_wnd_i && scl_t < 1.0)
   # Restrict ref_wnd increase when ref_wnd > ref_wnd_i and
   # queue delay varies
   scl_t = max(0.2, scl_t * latency_diff_ref_wnd_scale_t)
end

if (loss_detected || data_units_marked)
   last_congestion_detected_time = now
end

# The reference window is updated every s_rtt
if (now - last_reaction_to_congestion_time >= s_rtt
  if (loss_detected)
    is_loss_t = true
  else if (data_units_marked)
    is_ce_t = true
  else if (qdelay_avg > qdelay_target / 2 &&
    qdelay_avg >= qdelay_avg_prev &&
    !(is_ce_t || is_loss_t))
    # The calculation of l4s_alpha_v_t is based on qdelay_avg to reduce
    # sensitivity to sudden non-congestion related delay spikes that can
    # occur due to lower protocol retransmissions or cell change.
    # Congestion is not signalled if qdelay_avg shows a tendency to decrease.
    l4s_alpha_v_t = min(1.0, max(0.0,
            (qdelay_avg - qdelay_target / 2) /
            (qdelay_target / 2)))
    is_virtual_ce_t = true
    last_congestion_detected_time = now
  end
end
qdelay_avg_prev = qdelay_avg

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  is_congestion_detected = true
  # Update ref_wnd_i if possible
  if (ref_wnd > max(ref_wnd_lowest+MSS, ref_wnd_lowest*1.05) ||
    now - ref_wnd_i_update_time > REF_WND_I_UPDATE_MAX_HOLD_RTTS*s_rtt)
    # Allow update of ref_wnd_i only if ref_wnd has increased sufficiently (5%) above the
    # lowest ref_wnd or the hold time has expired.
    # This prevents that ref_wnd_i is wrongly stepped down during a period of congestion.
    ref_wnd_i_update_allowed = true
  end
  if (ref_wnd_i_update_allowed)
    # Update ref_wnd_i
    ref_wnd_i = ref_wnd
    ref_wnd_i_update_allowed = false
    ref_wnd_i_update_time = now
  end
end

# Either loss, ECN mark or increased qdelay is detected
if (is_loss_t)
  # Loss is detected
  ref_wnd = ref_wnd * BETA_LOSS
end
if (is_ce_t)
  # ECN-CE detected
  if (IS_L4S)
    # L4S mode
    backoff_t = l4s_alpha / 2

    # Jitter is considered large if the qdelay is larger than qdelay_target/4
    # when L4S is enabled
    if (qdelay_avg < qdelay_target * 0.25)
        # Scale down backoff if close to the last known max reference window
        # This is complemented with a scale down of the reference window increase
        backoff_t *= scl_t
    end

    if (now - last_reaction_to_congestion_time >
      100 * s_rtt)
      # A long time (>100 RTTs) since last congested because
      # link throughput exceeds max video bitrate.
      # There is a certain risk that ref_wnd has increased way above
      # bytes in flight, so we reduce it here to get it better on
      # track and thus the congestion episode is shortened
      ref_wnd = min(ref_wnd, max_bytes_in_flight_prev)
    end

    ref_wnd = (1.0 - backoff_t) * ref_wnd
  else
    # Classic ECN mode
    ref_wnd = ref_wnd * BETA_ECN
  end
end
if (is_virtual_ce_t)
  backoff_t = l4s_alpha_v_t / 2

  ref_wnd = (1.0 - backoff_t) * ref_wnd
end
ref_wnd = max(MIN_REF_WND, ref_wnd)
ref_wnd_lowest = ref_wnd

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  last_reaction_to_congestion_time = now
end
]]></artwork>
            <t>The reference window reduction, when congestion is detected due to L4S marking or increased delay, is constrained by a number of factors:</t>
            <ul spacing="normal">
              <li>
                <t>For cases that the target rate is lower than the acknowledged bitrate, it is likely that the target bitrate is already reduced because of an increased RTT. A further (large) decrease of the reference window would then only lead to an unnecessary undershoot.</t>
              </li>
              <li>
                <t>For large RTTs, a restriction attenuates variations in the reference window</t>
              </li>
              <li>
                <t>When the reference window is close to the last known max value, this reduces large variations</t>
              </li>
              <li>
                <t>When ref_wnd_delay_scale is small</t>
              </li>
            </ul>
            <t>Link layer losses, i.e. losses that are not congestion related can lead to unwarranted congestion back-off. One method is to apply congestion backoff only when an average loss rate exceeds a threshold. A suggested modification to the code above is found in <xref target="link-loss"/>.</t>
          </section>
          <section anchor="ref-wnd-increase">
            <name>Reference Window Increase</name>
            <artwork><![CDATA[
# Delay factor for multiplicative reference window increase
# after congestion

post_congestion_scale_t = max(0.0, min(1.0,
  (now - last_congestion_detected_time) /
    (POST_CONGESTION_DELAY_RTTS * max(VIRTUAL_RTT, s_rtt))))

post_congestion_scale_t *= latency_diff_ref_wnd_scale_t

# Scale factor for ref_wnd update
ref_wnd_scale_factor_t = 1.0 + (MUL_INCREASE_FACTOR * ref_wnd) / MSS

# Calculate bytes acked that are not CE marked
# For the case that only accumulated number of CE marked packets is
# reported by the feedback, it is necessary to make an approximation
# of bytes_newly_acked_ce based on average data unit size.
bytes_newly_acked_minus_ce_t = bytes_newly_acked -
                               bytes_newly_acked_ce

# Scale the increment between 0.5 and 2.0 (L4S) marked packets
# per RTT depending on how the queue delay varies.
increment_scale_t = 4.0 - 3.0 * latency_diff_ref_wnd_scale_t
increment_t = bytes_newly_acked_minus_ce_t * ref_wnd_ratio / increment_scale_t

# Reduce increment for small RTTs
tmp_t = min(1.0, s_rtt / VIRTUAL_RTT)
increment_t *= tmp_t

# Apply limit to reference window growth when close to last
# known max value before congestion
increment_t *= scl_t

# Scale up increment with multiplicative increase
# Limit multiplicative increase when congestion occurred
# recently and when reference window is close to the last
# known max value.
tmp_t = ref_wnd_scale_factor_t
if (tmp_t > 1.0)
  tmp_t = 1.0 + (tmp_t - 1.0) * post_congestion_scale_t
end
increment_t *= tmp_t

ref_wnd_prev_ = ref_wnd
# Increase ref_wnd only if bytes in flight is large enough
# Quite a lot of slack is allowed here to avoid that bitrate
# locks to low values.
# Increase is inhibited if max target bitrate is reached.
max_allowed_t = MSS + max(max_bytes_in_flight,
  max_bytes_in_flight_prev) * BYTES_IN_FLIGHT_HEAD_ROOM
int ref_wnd_t = ref_wnd + increment_t
if (ref_wnd_t <= max_allowed_t && target_bitrate < TARGET_BITRATE_MAX)
  ref_wnd = ref_wnd_t
end

]]></artwork>
            <t>The latency_diff_ref_wnd_scale_t scales the reference window increase. Firstly the increase is downscaled to target between 0.5 and 2.0 (L4S) marked packets per RTT. For L4S this reflects that larger queue delay spikes lead to that the L4S marking saturates at 100% with the consequence that the congestion is under estimated. Secondly an additional restriction is applied when L4S is not enabled to make non-L4S rate adaptation more stable.</t>
            <t>The multiplicative increase is restricted directly after a congestion event and
the restriction is gradually relaxed as the time since last congested
increased. The restriction makes the reference window growth to be no faster
than additive increase when congestion continuously occurs.  For L4S operation
this means that the SCReAMv2 algorithm will adhere to the 2 marked data units per
RTT equilibrium at steady state congestion, with the exception of the case
below.</t>
            <t>The reference window increase is restricted to values as small as 0.25MSS/RTT
when the reference window is close to the last known max value (ref_wnd_i). This
increases stability and reduces periodic overshoot.</t>
            <t>It is particularly important that the reference window reflects the transmitted
bitrate especially in L4S mode operation. An inflated ref_wnd takes extra RTTs
to bring down to a correct value upon congestion and thus causes unnecessary
queue buildup. At the same time the reference window must be allowed to be large
enough to avoid that the SCReAMv2 algorithm begins to limit itself, given that
the target bitrate is calculated based on the ref_wnd. Two mechanisms are used
to manage this:</t>
            <ul spacing="normal">
              <li>
                <t>Restore correct value of ref_wnd upon congestion. This is done if is a
prolonged time since the link was congested. A typical example is that
SCReAMv2 has been rate limited, i.e. the target bitrate has reached the
TARGET_BITRATE_MAX.</t>
              </li>
              <li>
                <t>Limit ref_wnd when the target_bitrate has reached TARGET_BITRATE_MAX. The
ref_wnd is restricted based on a history of the last max_bytes_in_flight
values. See <xref target="SCReAM-CPP-implementation"/> for details.</t>
              </li>
            </ul>
            <t>The two mechanisms complement one another.</t>
          </section>
        </section>
      </section>
      <section anchor="sender-transmission-control">
        <name>Sender Transmission Control</name>
        <t>The Sender Transmission control calculates of send window at the sender.
Data units are transmitted if allowed by the relation between the number of bytes
in flight and the reference window. This is controlled by the send window:</t>
        <ul spacing="normal">
          <li>
            <t>send_wnd (0): Upper limit to how many bytes can currently be
transmitted. Updated when ref_wnd is updated and when data unit is
transmitted [byte].</t>
          </li>
        </ul>
        <t>The sender transmission control is executed for each transmitted packet, the send interval is dictated by the pacing but is restricted by the send window. In practice it, however, can be more practical to transmit packets in small burst to save processing power, or alternatively, to offload the pacing to OS kernel function.</t>
        <section anchor="send-window">
          <name>Send Window Calculation</name>
          <t>The basic design principle behind data unit transmission in SCReAM was to allow
transmission only if the number of bytes in flight is less than the congestion
window. There are, however, two reasons why this strict rule will not work
optimally:</t>
          <ul spacing="normal">
            <li>
              <t>Bitrate variations: Media sources such as video encoders generally produce
frames whose size always vary to a larger or smaller extent. The data unit queue
absorbs the natural variations in frame sizes. However, the data unit queue should
be as short as possible to prevent the end-to-end delay from increasing. A
strict 'send only when bytes in flight is less than the reference window' rule
can cause the data unit queue to grow simply because the send window is limited. The
consequence is that the reference window will not increase, or will increase
very slowly, because the reference window is only allowed to increase when
there is a sufficient amount of data in flight. The final effect is that the
media bitrate increases very slowly or not at all.</t>
            </li>
            <li>
              <t>Reverse (feedback) path congestion: Especially in transport over
buffer-bloated networks, the one-way delay in the reverse direction can jump
due to congestion. The effect is that the acknowledgements are delayed, and
the self-clocking is temporarily halted, even though the forward path is not
congested. The ref_wnd_overhead allows for some degree of reverse path
congestion as the bytes in flight is allowed to exceed ref_wnd.</t>
            </li>
          </ul>
          <t>In SCReAMv2, the send window is given by the relation between the adjusted
reference window and the amount of bytes in flight according to the pseudocode
below. The multiplication of ref_wnd with ref_wnd_overhead has the effect that bytes in flight is 'around' the ref_wnd
rather than limited by the ref_wnd. The
implementation allows the data unit queue to be small even when the frame sizes vary
and thus, increased e2e delay can be avoided. A min window of 2*MSS is applied to avoid that the ACK clocking stalls in case MIN_REF_WND is set very low, for cases when SCReAM is used to congestion control at very low bitrates.</t>
          <artwork><![CDATA[
min_window_t = max(ref_wnd * ref_wnd_overhead, 2*MSS)
send_wnd = min_window_t - bytes_in_flight
]]></artwork>
          <t>The send window is updated whenever a data unit is transmitted or an feedback
messaged is received.</t>
          <t>The ref_wnd_overhead is adjusted dynamically. A large overhead is beneficial when the network link is uncongested as it allows to
transmit large media frames with little transmission delay. A large overhead is also beneficial for cases where network links use virtual queue marking or can temporarily absorb bursts from L4S capable flows.
If, on the other hand the network link is congested, then it is better to restrict how much bytes in flight exceeds the reference window because is not possible to push data faster than the reference window allows. This restriction reduces variations in RTT caused by self-congestion and improves performance for the cases where media encoders are slow to react to changes in target rate.</t>
          <t>The following constants are used (the RECOMMENDED values, within parentheses "()",
for the constants are deduced from experiments):</t>
          <ul spacing="normal">
            <li>
              <t>REF_WND_OVERHEAD_MIN (1.5): Indicates a lower limit how much bytes in flight is allowed to
exceed ref_wnd.</t>
            </li>
            <li>
              <t>REF_WND_OVERHEAD_MAX (3.0): Indicates an upper limit how much bytes in flight is allowed to exceed ref_wnd. This is roughly equal to MAX_RELAXED_PACING_FACTOR to allow that media frames can be transmitted quickly when the transmission channel is uncongested.</t>
            </li>
          </ul>
          <t>The ref_wnd_overhead is calculated as:</t>
          <artwork><![CDATA[
ref_wnd_overhead = REF_WND_OVERHEAD_MIN +
  (REF_WND_OVERHEAD_MAX - REF_WND_OVERHEAD_MIN) * latency_diff_ref_wnd_scale_t
]]></artwork>
        </section>
        <section anchor="packet-pacing">
          <name>Packet Pacing</name>
          <t>Packet pacing is used in order to mitigate coalescing, i.e., when packets are
transmitted in bursts, with the risks of increased jitter and potentially
increased packet loss. Packet pacing is also highly recommended to be used with L4S and
also mitigates possible issues with queue overflow due to key-frame generation
in video coders. However, when the link is uncongested, it is beneficial to relax
the packet pacing and allow frames to be transmitted faster, to reduce end to end delay on the application layer.</t>
          <ul spacing="normal">
            <li>
              <t>pace_bitrate (1e6): Data unit pacing rate [bps].</t>
            </li>
            <li>
              <t>t_pace (1e-6): Pacing interval between data units [s].</t>
            </li>
          </ul>
          <t>The following constants are used by the packet pacing:</t>
          <ul spacing="normal">
            <li>
              <t>RATE_PACE_MIN (50000): Minimum pacing rate in [bps].</t>
            </li>
            <li>
              <t>PACKET_PACING_HEADROOM (1.5): Headroom for packet pacing.</t>
            </li>
            <li>
              <t>MAX_RELAXED_PACING_FACTOR (4.0): Max extra packet pacing when the media coder reaches the max bitrate. This should be roughly equal to REF_WND_OVERHEAD_MAX.</t>
            </li>
            <li>
              <t>RELAXED_PACING_LIMIT_LOW (0.8): Nominal bitrate fraction of TARGET_BITRATE_MAX at which the pacing should be increasingly relaxed.</t>
            </li>
          </ul>
          <t>The time interval between consecutive data unit transmissions is
greater than or equal to t_pace, where t_pace is given by the equations below:</t>
          <artwork><![CDATA[
pace_bitrate = max(RATE_PACE_MIN, target_bitrate) *
               PACKET_PACING_HEADROOM

# Calculate and apply relaxed pacing
nominal_rate_t = target_bitrate/TARGET_BITRATE_MAX
pace_rate_scale_t = min(1.0,
  (nominal_rate_t - RELAXED_PACING_LIMIT_LOW) / (1.0 - RELAXED_PACING_LIMIT_LOW))
pace_rate_scale_t = min(1.0,
  max(1.0 / MAX_RELAXED_PACING_FACTOR, 1.0 - pace_rate_scale_t))
pace_bitrate /= pace_rate_scale_t

t_pace = data_unit_size * 8 / pace_bitrate
]]></artwork>
          <t>data_unit_size is the size of the last transmitted data unit. RATE_PACE_MIN is the
minimum pacing rate.</t>
        </section>
      </section>
      <section anchor="media-rate-control-2">
        <name>Media Rate Control</name>
        <t>The media rate control algorithm is executed whenever the reference window is
updated and calculates the target bitrate. It is, however, not necessary to execute this part more often than the frame period of the media encoder.</t>
        <ul spacing="normal">
          <li>
            <t>target_bitrate (0): Media target bitrate [bps].</t>
          </li>
          <li>
            <t>rate_adjust_factor (0.0): Adjustment factor to avoid unnecessary media queue buildup.</t>
          </li>
          <li>
            <t>frame_size_dev (0.0): Frame size deviation.</t>
          </li>
          <li>
            <t>frame_period (0.02): An estimated frame period.</t>
          </li>
        </ul>
        <t>The following constants are used by the media rate control:</t>
        <ul spacing="normal">
          <li>
            <t>PACKET_OVERHEAD (20): Estimated packetization overhead [byte].</t>
          </li>
          <li>
            <t>TARGET_BITRATE_MIN: Minimum target bitrate in [bps] (bits per second).</t>
          </li>
          <li>
            <t>TARGET_BITRATE_MAX: Maximum target bitrate in [bps].</t>
          </li>
          <li>
            <t>RATE_ADJUST_GAIN (1.0/16): Adjustment gain for rate adjustment to compensate for media queue buildup.</t>
          </li>
          <li>
            <t>FRAME_SIZE_DEV_ALPHA (1.0/64): Time constant to compensate for varying frame sizes.</t>
          </li>
        </ul>
        <t>The target bitrate is essentially based on the reference window ref_wnd and the (smoothed) RTT s_rtt according to</t>
        <artwork><![CDATA[
target_bitrate = 8.0 * ref_wnd / s_rtt
]]></artwork>
        <t>The role of the media rate control is to strike a reasonable balance between a
low amount of queuing in the data unit queue(s) and a sufficient amount of data to
send in order to keep the data path busy. Because the reference window is
updated based on loss, ECN-CE and delay, so does the target rate also update.</t>
        <t>The code above however needs some modifications to work fine in a number of
scenarios</t>
        <ul spacing="normal">
          <li>
            <t>ref_wnd is very small, just a few MSS or smaller</t>
          </li>
          <li>
            <t>The media queue grows large, which can result in large e2e delay</t>
          </li>
          <li>
            <t>The frame sizes vary much, which can result in larger e2e delay if not compensated for</t>
          </li>
        </ul>
        <t>The rate_adjust_factor helps to reduce the target rate when the delay in the data unit increases beyond frame_period/4, this allows for some modest queue buildup to ensure a good link utilization. The frame_size_dev calculates the positive deviation in frame sizes from the nominal, this helps compensate for larger variations in frame size, systematic errors in media encoder output bitrate and also to some extent sluggish media rate control loops where the media coder rate lags behind the target bitrate.
The complete pseudo code for adjustment of the target bitrate is shown below. The algorithm parts for rate_adjust_factor and frame_size_dev are suggested examples how to compensate for that frame sizes deviate from the nominal.</t>
        <artwork><![CDATA[
# Calculate the rate_adjust_factor and the frame_size_dev for each new media frame.
# The input variables are media_qdelay [s] and frame_size [byte].
# The media_qdelay is the elapsed time the oldest media packet has
# been in the media queue.

# The rate adjust factor is updated with an I (integration) controller.
# Cap values in range [0.0 0.5]
error = (media_qdelay - frame_period / 4) / frame_period
rate_adjust_factor += error * RATE_ADJUST_GAIN
rate_adjust_factor = min(0.5, max(0.0, rate_adjust_factor)

# The frame_size_dev estimates the deviation from the nominal frame size for
# the given bitrate and frame period.
# Cap values in range [0.0 0.2]
framesize_nom = target_bitrate * frame_period / 8
deviation = max(0.0, (frame_size - frame_size_nom) / frame_size_nom)
frame_size_dev = min(0.2, (1 - FRAME_SIZE_DEV_ALPHA) * frame_size_dev +
   FRAME_SIZE_DEV_ALPHA * deviation)

tmp_t = 1.0

# Scale down rate slightly when the reference window is very
# small compared to MSS
tmp_t *= 1.0 - min(0.2, max(0.0, ref_wnd_ratio - 0.1))

# Additional compensation for packetization overhead,
# important when MSS is small
tmp_t *= MSS / (MSS + PACKET_OVERHEAD)

# An additional downscaling is needed to avoid unnecessary
# sender queue build-up, better to set the target bitrate
# slightly lower than what ref_wnd and s_rtt indicates
tmp_t /= 1.2 + rate_adjust_factor + frame_size_dev

# Calculate target bitrate and limit to min and max allowed
# values
target_bitrate = tmp_t * 8 * ref_wnd / s_rtt
target_bitrate = min(TARGET_BITRATE_MAX,
  max(TARGET_BITRATE_MIN, target_bitrate))
]]></artwork>
      </section>
      <section anchor="additional-functions">
        <name>Additional functions</name>
        <t>This section covers additional functionality that is not critical for the function of the SCReAM congestion control algorithm, but can nevertheless, improve the performance.</t>
        <section anchor="clock-drift">
          <name>Clock drift issues and remedies</name>
          <t>SCReAM can suffer from the same issues with clock drift as is the case with LEDBAT <xref target="RFC6817"/>. However, Appendix A.2 in <xref target="RFC6817"/> describes ways to mitigate issues with clock drift. A clock drift compensation method is also implemented in <xref target="SCReAM-CPP-implementation"/>. The SCReAM implementation resets base delay history when it is determined that clock drift or skip becomes too large. This is achieved by reducing the target bitrate for a few RTTs.</t>
          <t>The variables and constants are:
* delay_min_avg (0): A long term averaged min queue delay [s].</t>
          <ul spacing="normal">
            <li>
              <t>qdelay_min (MAX_VALUE): The min queue delay measured during an RTT [s], initialized to a very high value.</t>
            </li>
            <li>
              <t>QDELAY_MIN_AVG_ALPHA (1.0/256): Slow EWMA time constant for delay_min_avg.</t>
            </li>
          </ul>
          <t>The steps for the clock drift compensation is as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Store the min qdelay (qdelay_min) during one RTT.</t>
            </li>
            <li>
              <t>When an RTT has elapsed:</t>
            </li>
          </ul>
          <artwork><![CDATA[
# Update delay_min_avg
qdelay_min_avg = (1.0 - QDELAY_MIN_AVG_ALPHA) * qdelay_min_avg +
  QDELAY_MIN_AVG_ALPHA * qdelay_min
qdelay_min = MAX_VALUE # set qdelay_min to a very high value
if qdelay_min_avg > qdelay_target / 4
  qdelay_min_avg = 0
  # Implement the following actions
  # 1. Reset queue delay history
  # 2. Scale down target bitrate by 50% for a period of max(5 * s_rtt, 0.2)
end
]]></artwork>
        </section>
        <section anchor="link-loss">
          <name>Link layer losses</name>
          <t>Link layer losses, i.e. losses that are not congestion related can lead to unwarranted congestion backoff. One method is to apply a conditional loss backoff only when an average loss rate exceeds a threshold. This increases robustness against non-congestion related losses. One problem is that such a method can also increase congestion related packet loss which can be detrimental for real time media such as video. This is resolved in that immediate loss backoff is triggered when the queue delay increases. While the conditional loss backoff increases robustness against link layer losses, it is inevitable that the algorithm can delay congestion backoff and thus cause increased packet loss rate. The constant LOSS_RATE_THRESHOLD should therefore be set low enough, with the objective to increase robustness to link layer losses only.</t>
          <t>A loss rate is calculated for each packet with an average value reflecting the number of packets send with in two  RTTs or 4/LOSS_RATE_THRESHOLD packets for small ref_win values. This avoids that multiple consecutive link layer losses cause the loss rate to increase too quickly. The averaging is selected to be slow enough to avoid that single packet drops cause backoff, provided that the queue delay is low, and fast enough to avoid excessive packet loss in the presence of very shallow queues.</t>
          <artwork><![CDATA[
# Apply an EWMA filter with a 2 RTT time constant
# or at least 4/LOSS_RATE_THRESHOLD packets.
alpha = min(LOSS_RATE_THRESHOLD / 4, mss / ref_wnd / 2)
if (packet_is_lost)
  loss_rate = (1.0 - alpha) * loss_rate + alpha
else
  loss_rate = (1.0 - alpha) * loss_rate
]]></artwork>
          <t>The following variables and constants are used:</t>
          <ul spacing="normal">
            <li>
              <t>loss_rate (0.0): Average loss rate.</t>
            </li>
            <li>
              <t>packet_is_lost: Set to true if a packet is determined to be lost.</t>
            </li>
            <li>
              <t>LOSS_RATE_THRESHOLD (0.01): Threshold for triggering loss based reference window backoff.</t>
            </li>
          </ul>
          <t>The code below modifies the 'if (loss_detected)' part in <xref target="ref-wnd-reduction"/></t>
          <artwork><![CDATA[
..
  if (loss_detected)
    # Conditional loss backoff
    if (loss_rate > LOSS_RATE_THRESHOLD || qdelay_avg > qdelay_target / 4)
      is_loss_t = true
    end
..
]]></artwork>
        </section>
        <section anchor="ref-wnd-undershoot">
          <name>Reference window undershoot at congestion</name>
          <t>The reference window can in certain cases undershoot when congestion occurs, one such case is when the RTT increases at the same time that the reference window is reduced. The RTT increase can push down the target rate faster then the reference window is reduced. An additional reduction of the reference window can be superfluous in some cases. One method to determine if additional reduction is unnecessary is to inspect how the acknowledged bitrate relates to the target bitrate. If the target rate is well below the ACKed bitrate, then additional reduction of the reference window is unnecessary. This is implemented as additional code that modifies the reference window backoff in <xref target="ref-wnd-reduction"/>.</t>
          <artwork><![CDATA[
# Reduce backoff when target bitrate is lower than the ACKnowledged rate
# this may be an indication that the target rate is already reduced
# due to an increased RTT.
if (target_bitrate < acked_bitrate * ACKED_BITRATE_MARGIN)
  # Reduce back off to zero if bytes in flight reduces, otherwise
  # scale down more carefully to avoid that the queue grows.
  # The latter case could be for instance if the media encoder
  # outputs a higher rate than target.
  if (bytes_in_flight < bytes_in_flight_prev)
    backoff_t = 0
  else
    backoff_t *= BACKOFF_SCALE_LOW_TARGET_RATE
  end
end
]]></artwork>
          <t>The variables and constants are:</t>
          <ul spacing="normal">
            <li>
              <t>ACKED_BITRATE_MARGIN (0.8): Safety margin for triggering of downscaling of backoff for cases where target bitrate is already low.</t>
            </li>
            <li>
              <t>BACKOFF_SCALE_LOW_TARGETRATE (0.25): Downscaling of backoff when target rate is already low compared to the ACKnowledged bitrate.</t>
            </li>
            <li>
              <t>acked_bitrate (0.0): A running average of the ACKnowledged bitrate [bps]. The averaging time should be around one RTT. For periodic media such as video it is beneficial to calculate the acked_bitrate over two frame periods for a reasonably accurate value.</t>
            </li>
          </ul>
        </section>
        <section anchor="competing-flows-compensation">
          <name>Competing Flows Compensation</name>
          <t>It is likely that a flow will have to share congested bottlenecks with other
flows that use a more aggressive congestion control algorithm (for example,
large FTP flows using loss-based congestion control). The worst condition occurs
when the bottleneck queues are of tail-drop type with a large buffer
size. SCReAMv2 takes care of such situations by adjusting the qdelay_target when
loss-based flows are detected, as shown in the optional pseudocode below.</t>
          <artwork><![CDATA[
adjust_qdelay_target(qdelay)
  qdelay_norm_t = qdelay / QDELAY_TARGET_LOW
  update_qdelay_norm_history(qdelay_norm_t)
  # Compute variance
  qdelay_norm_var_t = VARIANCE(qdelay_norm_history(200))
  # Compensation for competing traffic
  # Compute average
  qdelay_norm_avg_t = AVERAGE(qdelay_norm_history(50))
  # Compute upper limit to target delay
  new_target_t = qdelay_norm_avg_t + sqrt(qdelay_norm_var_t)
  new_target_t *= QDELAY_TARGET_LO
  if (loss_event_rate > 0.002)
    # Data unit losses detected
    qdelay_target = 1.5 * new_target_t
  else
    if (qdelay_norm_var_t < 0.2)
      # Reasonably safe to set target qdelay
      qdelay_target = new_target_t
    else
      # Check if target delay can be reduced; this helps prevent
      # the target delay from being locked to high values forever
      if (new_target_t < QDELAY_TARGET_LO)
        # Decrease target delay quickly, as measured queuing
        # delay is lower than target
        qdelay_target = max(qdelay_target * 0.5, new_target_t)
      else
        # Decrease target delay slowly
        qdelay_target *= 0.9
      end
    end
  end

  # Apply limits
  qdelay_target = min(QDELAY_TARGET_HI, qdelay_target)
  qdelay_target = max(QDELAY_TARGET_LO, qdelay_target)
]]></artwork>
          <t>The following variable is used:</t>
          <ul spacing="normal">
            <li>
              <t>loss_event_rate (0.0): The estimated fraction of RTTs with lost data units
detected.</t>
            </li>
          </ul>
          <t>Two temporary variables are calculated. qdelay_norm_avg_t is the long-term
average queue delay, qdelay_norm_var_t is the long-term variance of the queue
delay. A high qdelay_norm_var_t indicates that the queue delay changes; this can
be an indication that bottleneck bandwidth is reduced or that a competing flow
has just entered. Thus, it indicates that it is not safe to adjust the queue
delay target.</t>
          <t>A low qdelay_norm_var_t indicates that the queue delay is relatively stable. The
reason could be that the queue delay is low, but it could also be that a
competing flow is causing the bottleneck to reach the point that data unit losses
start to occur, in which case the queue delay will stay relatively high for a
longer time.</t>
          <t>The queue delay target is allowed to be increased if either the loss event rate
is above a given threshold or qdelay_norm_var_t is low. Both these conditions
indicate that a competing flow may be present. In all other cases, the queue
delay target is decreased.</t>
          <t>The function that adjusts the qdelay_target is simple and could produce false
positives and false negatives. The case that self-inflicted congestion by the
SCReAMv2 algorithm may be falsely interpreted as the presence of competing
loss-based FTP flows is a false positive. The opposite case -- where the
algorithm fails to detect the presence of a competing FTP flow -- is a false
negative.</t>
          <t>Extensive simulations have shown that the algorithm performs well in LTE and 5G
test cases and that it also performs well in simple bandwidth-limited bottleneck
test cases with competing FTP flows. However, the potential failure of the
algorithm cannot be completely ruled out. A false positive (i.e., when
self-inflicted congestion is mistakenly identified as competing flows) is
especially problematic when it leads to increasing the target queue delay, which
can cause the end-to-end delay to increase dramatically.</t>
          <t>If it is deemed unlikely that competing flows occur over the same bottleneck,
the algorithm described in this section MAY be turned off. One such case is
QoS-enabled bearers in 3GPP-based access such as LTE and 5G. However, when
sending over the Internet, often the network conditions are not known for sure,
so in general it is not possible to make safe assumptions on how a network is
used and whether or not competing flows share the same bottleneck. Therefore,
turning this algorithm off must be considered with caution, as it can lead to
basically zero throughput if competing with loss-based traffic.</t>
        </section>
      </section>
    </section>
    <section anchor="scream-receiver">
      <name>Receiver Requirements on Feedback Intensity</name>
      <t>The simple task of the receiver is to feedback acknowledgements with time
stamp and ECN bits indication for received data units to the sender. Upon reception
of each data unit, the receiver MUST maintain enough information to send the
aforementioned values to the sender via an RTCP transport- layer feedback
message. The frequency of the feedback message depends on the available RTCP
bandwidth. The requirements on the feedback elements and the feedback interval
are described below.</t>
      <t>SCReAMv2 benefits from relatively frequent feedback. It is RECOMMENDED that a
SCReAMv2 implementation follows the guidelines below. Feedback should forcibly be transmitted in any of these cases:</t>
      <ul spacing="normal">
        <li>
          <t>More than N data units received since last feedback has been transmitted. N=16 has been tested with good results.</t>
        </li>
        <li>
          <t>A data unit with marker bit set or other last data unit for media frame is received.</t>
        </li>
        <li>
          <t>A max defined interval between feedback reports. Values such as 40 ms has been tested with good results.</t>
        </li>
      </ul>
      <t>The feedback interval depends on the media bitrate. At low bitrates, it is
sufficient with feedback every frame; while at high bitrates, a shorter feedback interval is recommended to keep the self-clocking in SCReAMv2
working well. One indication that feedback is too sparse is that the SCReAMv2
implementation cannot reach high bitrates, even in uncongested links. More
frequent feedback can solve this issue.</t>
      <t>The transmission interval is not critical. So, in the case of multi-stream handling between two hosts, the feedback for two or more synchronization sources (SSRCs) can be bundled to save UDP/IP overhead.</t>
      <t>SCReAMv2 works with AVPF regular mode; immediate or early mode is not required
by SCReAMv2 but can nonetheless be useful for RTCP messages not directly related
to SCReAMv2, such as those specified in <xref target="RFC4585"/>. It is RECOMMENDED to use
reduced-size RTCP <xref target="RFC5506"/>, where regular full compound RTCP transmission is
controlled by trr-int as described in <xref target="RFC4585"/>.</t>
      <t>While the guidelines above are somewhat RTCP specific, similar principles apply
to for instance QUIC.</t>
    </section>
    <section anchor="discussion">
      <name>Discussion</name>
      <t>This section covers a few discussion points.</t>
      <ul spacing="normal">
        <li>
          <t>The target bitrate given by SCReAMv2 is the bitrate including the data unit and
Forward Error Correction (FEC) overhead. The media encoder SHOULD take this
overhead into account when the media bitrate is set. This means that the media
coder bitrate SHOULD be computed as: media_rate = target_bitrate -
data_unit_plus_fec_overhead_bitrate It is not necessary to make a 100% perfect
compensation for the overhead, as the SCReAM algorithm will inherently
compensate for moderate errors. Under-compensating for the overhead has the
effect of increasing jitter, while overcompensating will cause the bottleneck
link to become underutilized.</t>
        </li>
        <li>
          <t>The link utilization with SCReAMv2 can be lower than 100%. There are several
possible reasons to this:  </t>
          <ul spacing="normal">
            <li>
              <t>Large variations in frame sizes: Large variations in frame size makes
SCReAMv2 push down the target_bitrate to give sufficient headroom and avoid
queue buildup in the network. It is in general recommended to operate video
coders in low latency mode and enable GDR (Gradual Decoding Refresh) if
possible, to minimize frame size variations.</t>
            </li>
            <li>
              <t>Link layer properties: Media transport in 5G in uplink typically requires to
transmit a scheduling request (SR) to get permission to transmit
data. Because transmission of video is frame based, there is a high
likelihood that the channel becomes idle between frames (especially with
L4S), in which case a new SR/grant exchange is needed. This potentially
means that uplink transmission slots are unused with a lower link
utilization as a result.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Packet pacing is recommended. It is however possible to operate SCReAMv2 with
packet pacing disabled, this can however give a reduced link utilization over L4S enabled paths. Additional packet pacing headroom can be beneficial if unusually large media frames are generated; this can reduce unnecessary queue build-up in the data unit queue.</t>
        </li>
        <li>
          <t>Feedback issues: RTCP feedback packets <xref target="RFC8888"/> can be lost, this means that
the loss detection in SCReAMv2 may trigger even though packets arrive safely
on the receiver side. <xref target="SCReAM-CPP-implementation"/> solves this by using
overlapping RTCP feedback, i.e. RTCP feedback is transmitted no more seldom
than every 16th packet, and where each RTCP feedback spans the last 32
received packets. This however creates unnecessary overhead. <xref target="RFC3550"/> RR
(Receiver Reports) can possibly be another solution to achieve better
robustness with less overhead. QUIC <xref target="RFC9000"/> overcomes this issue because
of inherent design.</t>
        </li>
        <li>
          <t>SCReAM has been designed to target two marked packets per RTT in steady state when L4S is enabled.
 However, SCReAM can settle for a lower number of marked packets per RTT in steady state
 due to measures taken in the calculation of the ref_wnd and the target_bitrate
 that are necessary to get a stable bitrate and lower queue delay.
 In those cases, SCReAM may get a lower share of the link capacity
 when competing against e.g. a large file transfer with TCP Prague congestion control.</t>
        </li>
        <li>
          <t>SCReAM has over time been evaluated in a number of different experiments, a
few examples are found in <xref target="SCReAM-evaluation-L4S"/>.</t>
        </li>
        <li>
          <t>SCReAM (+L4S) is currently being integrated in chrome for performance evaluation and comparison against GCC, nightly Chrome Canary builds are available at <xref target="SCReAM-Chrome-Canary"/>.</t>
        </li>
        <li>
          <t>The addition of the optional latency_diff_avg related restriction on ref_wnd increase can cause the rate increase to go slower when the non-congestion related jitter is high. Non-congestion related jitter can occur for instance in 5G where the amount of scheduling delay jitter depends on factors like TDD (Time Division Duplex) patterns an overall load in a cell. The algorithm is somewhat robust to scheduling jitter as it calculates latency_diff_avg based on the difference between a short and long average of the queue delay. Still, there can be cases where large amounts of scheduling jitter can give a slow ramp up of the bitrate.</t>
        </li>
        <li>
          <t>Rate policers can cause loss bursts. These loss bursts are particularly harmful for real time media transmission and it is problematic to detect the existence of rate policers in the transmission path. The best cure is that the use of rate policers is avoided in access networks.</t>
        </li>
        <li>
          <t>The competing flows compensation described in <xref target="competing-flows-compensation"/> has an inherent risk of false positives, the outcome would be that an increased delay is met by an increased to delay, something that can self-amplify. The algorithm was devised already for <xref target="RFC8298"/> when access links could become bloated. Things have however changed since 2017 when RFC8298 was published. Firstly, bufferbloat and remedies to it is better understood. Secondly, more recent congestion control algorithms are designed to not bloat access links that lack active queue management. Thirdly, the algorithm in <xref target="clock-drift"/> that addresses clock-drift addresses this issue inherently as a competing flow still adds an offset in queue delay when SCReAM temporarily reduces its target rate temporarily. The need for competing flows compensation would therefore need to be investigated further.</t>
        </li>
        <li>
          <t>CPU limitation can lead to a case that SCReAM cannot push packets as fast as the congestion control would allow. This can lead to that ref_wnd increases due to lack of congestion signals. Even though ref_wnd increase is restricted by BYTES_IN_FLIGHT_HEAD_ROOM, the result can be that the target rate becomes overestimated, resulting in an RTP queue build-up. The not too controversial advice is therefore to limit the max target bitrate to levels that are supported by the device.</t>
        </li>
        <li>
          <t>The calculation of the target bitrate based on the reference window and the average RTT can lead to over-optimistic target rate values for instance when the source becomes idle or delivers a media bitrate that is lower than the target bitrate. To resolve this issue, it is recommended to update the average RTT with a longer time constant when bytes in flight is lower than the reference window by some margin.</t>
        </li>
        <li>
          <t>Video encoders can in some cases output a lower bitrate than the target bitrate, one example is for instance a video encoder pipeline that initiates with a low resolution or frame rate. Because ref_wnd is limited by the bytes in flight multiplied by BYTES_IN_FLIGHT_HEAD_ROOM the result can be that the bitrate is stuck at a low value. WebRTC exploits padding to overcome this issue. Unused target bitrate is filled up with duplicate transmitted packets and thus helps to increase the target bitrate enough to make the video encoder pipeline switch up the resolution and/or frame rate.</t>
        </li>
        <li>
          <t>Based on assessment by Kiro CLI, AI-tools can generate code based on the current draft version. What is mainly missing is the handling of the transport protocol specific parts such as RTP/RTCP or QUIC.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The feedback can be vulnerable to attacks similar to those that can affect
TCP. It is therefore RECOMMENDED that the RTCP feedback is at least integrity
protected. Furthermore, as SCReAM/SCReAMv2 is self-clocked, a malicious
middlebox can drop RTCP feedback packets and thus cause the self-clocking to
stall. However, this attack is mitigated by the minimum send rate maintained by
SCReAM/SCReAMv2 when no feedback is received.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC3550" target="https://www.rfc-editor.org/info/rfc3550" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3550.xml">
          <front>
            <title>RTP: A Transport Protocol for Real-Time Applications</title>
            <author fullname="H. Schulzrinne" initials="H." surname="Schulzrinne"/>
            <author fullname="S. Casner" initials="S." surname="Casner"/>
            <author fullname="R. Frederick" initials="R." surname="Frederick"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>This memorandum describes RTP, the real-time transport protocol. RTP provides end-to-end network transport functions suitable for applications transmitting real-time data, such as audio, video or simulation data, over multicast or unicast network services. RTP does not address resource reservation and does not guarantee quality-of- service for real-time services. The data transport is augmented by a control protocol (RTCP) to allow monitoring of the data delivery in a manner scalable to large multicast networks, and to provide minimal control and identification functionality. RTP and RTCP are designed to be independent of the underlying transport and network layers. The protocol supports the use of RTP-level translators and mixers. Most of the text in this memorandum is identical to RFC 1889 which it obsoletes. There are no changes in the packet formats on the wire, only changes to the rules and algorithms governing how the protocol is used. The biggest change is an enhancement to the scalable timer algorithm for calculating when to send RTCP packets in order to minimize transmission in excess of the intended rate when many participants join a session simultaneously. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="64"/>
          <seriesInfo name="RFC" value="3550"/>
          <seriesInfo name="DOI" value="10.17487/RFC3550"/>
        </reference>
        <reference anchor="RFC4585" target="https://www.rfc-editor.org/info/rfc4585" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4585.xml">
          <front>
            <title>Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF)</title>
            <author fullname="J. Ott" initials="J." surname="Ott"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <author fullname="N. Sato" initials="N." surname="Sato"/>
            <author fullname="C. Burmeister" initials="C." surname="Burmeister"/>
            <author fullname="J. Rey" initials="J." surname="Rey"/>
            <date month="July" year="2006"/>
            <abstract>
              <t>Real-time media streams that use RTP are, to some degree, resilient against packet losses. Receivers may use the base mechanisms of the Real-time Transport Control Protocol (RTCP) to report packet reception statistics and thus allow a sender to adapt its transmission behavior in the mid-term. This is the sole means for feedback and feedback-based error repair (besides a few codec-specific mechanisms). This document defines an extension to the Audio-visual Profile (AVP) that enables receivers to provide, statistically, more immediate feedback to the senders and thus allows for short-term adaptation and efficient feedback-based repair mechanisms to be implemented. This early feedback profile (AVPF) maintains the AVP bandwidth constraints for RTCP and preserves scalability to large groups. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4585"/>
          <seriesInfo name="DOI" value="10.17487/RFC4585"/>
        </reference>
        <reference anchor="RFC5506" target="https://www.rfc-editor.org/info/rfc5506" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5506.xml">
          <front>
            <title>Support for Reduced-Size Real-Time Transport Control Protocol (RTCP): Opportunities and Consequences</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="April" year="2009"/>
            <abstract>
              <t>This memo discusses benefits and issues that arise when allowing Real-time Transport Protocol (RTCP) packets to be transmitted with reduced size. The size can be reduced if the rules on how to create compound packets outlined in RFC 3550 are removed or changed. Based on that analysis, this memo defines certain changes to the rules to allow feedback messages to be sent as Reduced-Size RTCP packets under certain conditions when using the RTP/AVPF (Real-time Transport Protocol / Audio-Visual Profile with Feedback) profile (RFC 4585). This document updates RFC 3550, RFC 3711, and RFC 4585. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5506"/>
          <seriesInfo name="DOI" value="10.17487/RFC5506"/>
        </reference>
        <reference anchor="RFC6298" target="https://www.rfc-editor.org/info/rfc6298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC6817" target="https://www.rfc-editor.org/info/rfc6817" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6817.xml">
          <front>
            <title>Low Extra Delay Background Transport (LEDBAT)</title>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="G. Hazel" initials="G." surname="Hazel"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="December" year="2012"/>
            <abstract>
              <t>Low Extra Delay Background Transport (LEDBAT) is an experimental delay-based congestion control algorithm that seeks to utilize the available bandwidth on an end-to-end path while limiting the consequent increase in queueing delay on that path. LEDBAT uses changes in one-way delay measurements to limit congestion that the flow itself induces in the network. LEDBAT is designed for use by background bulk-transfer applications to be no more aggressive than standard TCP congestion control (as specified in RFC 5681) and to yield in the presence of competing flows, thus limiting interference with the network performance of competing flows. This document defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6817"/>
          <seriesInfo name="DOI" value="10.17487/RFC6817"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <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>
        <reference anchor="RFC9330" target="https://www.rfc-editor.org/info/rfc9330" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
              <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9330"/>
          <seriesInfo name="DOI" value="10.17487/RFC9330"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <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="RFC6365" target="https://www.rfc-editor.org/info/rfc6365" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6365.xml">
          <front>
            <title>Terminology Used in Internationalization in the IETF</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <date month="September" year="2011"/>
            <abstract>
              <t>This document provides a list of terms used in the IETF when discussing internationalization. The purpose is to help frame discussions of internationalization in the various areas of the IETF and to help introduce the main concepts to IETF participants. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="166"/>
          <seriesInfo name="RFC" value="6365"/>
          <seriesInfo name="DOI" value="10.17487/RFC6365"/>
        </reference>
        <reference anchor="RFC7478" target="https://www.rfc-editor.org/info/rfc7478" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7478.xml">
          <front>
            <title>Web Real-Time Communication Use Cases and Requirements</title>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="S. Hakansson" initials="S." surname="Hakansson"/>
            <author fullname="G. Eriksson" initials="G." surname="Eriksson"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>This document describes web-based real-time communication use cases. Requirements on the browser functionality are derived from the use cases.</t>
              <t>This document was developed in an initial phase of the work with rather minor updates at later stages. It has not really served as a tool in deciding features or scope for the WG's efforts so far. It is being published to record the early conclusions of the WG. It will not be used as a set of rigid guidelines that specifications and implementations will be held to in the future.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7478"/>
          <seriesInfo name="DOI" value="10.17487/RFC7478"/>
        </reference>
        <reference anchor="RFC8298" target="https://www.rfc-editor.org/info/rfc8298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8298.xml">
          <front>
            <title>Self-Clocked Rate Adaptation for Multimedia</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>This memo describes a rate adaptation algorithm for conversational media services such as interactive video. The solution conforms to the packet conservation principle and uses a hybrid loss-and-delay- based congestion control algorithm. The algorithm is evaluated over both simulated Internet bottleneck scenarios as well as in a Long Term Evolution (LTE) system simulator and is shown to achieve both low latency and high video throughput in these scenarios.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8298"/>
          <seriesInfo name="DOI" value="10.17487/RFC8298"/>
        </reference>
        <reference anchor="RFC8511" target="https://www.rfc-editor.org/info/rfc8511" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml">
          <front>
            <title>TCP Alternative Backoff with ECN (ABE)</title>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="G. Armitage" initials="G." surname="Armitage"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <date month="December" year="2018"/>
            <abstract>
              <t>Active Queue Management (AQM) mechanisms allow for burst tolerance while enforcing short queues to minimise the time that packets spend enqueued at a bottleneck. This can cause noticeable performance degradation for TCP connections traversing such a bottleneck, especially if there are only a few flows or their bandwidth-delay product (BDP) is large. The reception of a Congestion Experienced (CE) Explicit Congestion Notification (ECN) mark indicates that an AQM mechanism is used at the bottleneck, and the bottleneck network queue is therefore likely to be short. Feedback of this signal allows the TCP sender-side ECN reaction in congestion avoidance to reduce the Congestion Window (cwnd) by a smaller amount than the congestion control algorithm's reaction to inferred packet loss. Therefore, this specification defines an experimental change to the TCP reaction specified in RFC 3168, as permitted by RFC 8311.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8511"/>
          <seriesInfo name="DOI" value="10.17487/RFC8511"/>
        </reference>
        <reference anchor="RFC8699" target="https://www.rfc-editor.org/info/rfc8699" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8699.xml">
          <front>
            <title>Coupled Congestion Control for RTP Media</title>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>When multiple congestion-controlled Real-time Transport Protocol (RTP) sessions traverse the same network bottleneck, combining their controls can improve the total on-the-wire behavior in terms of delay, loss, and fairness. This document describes such a method for flows that have the same sender, in a way that is as flexible and simple as possible while minimizing the number of changes needed to existing RTP applications. This document also specifies how to apply the method for the Network-Assisted Dynamic Adaptation (NADA) congestion control algorithm and provides suggestions on how to apply it to other congestion control algorithms.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8699"/>
          <seriesInfo name="DOI" value="10.17487/RFC8699"/>
        </reference>
        <reference anchor="RFC8869" target="https://www.rfc-editor.org/info/rfc8869" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8869.xml">
          <front>
            <title>Evaluation Test Cases for Interactive Real-Time Media over Wireless Networks</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="X. Zhu" initials="X." surname="Zhu"/>
            <author fullname="J. Fu" initials="J." surname="Fu"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>The Real-time Transport Protocol (RTP) is a common transport choice for interactive multimedia communication applications. The performance of these applications typically depends on a well-functioning congestion control algorithm. To ensure a seamless and robust user experience, a well-designed RTP-based congestion control algorithm should work well across all access network types. This document describes test cases for evaluating performances of candidate congestion control algorithms over cellular and Wi-Fi networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8869"/>
          <seriesInfo name="DOI" value="10.17487/RFC8869"/>
        </reference>
        <reference anchor="RFC8985" target="https://www.rfc-editor.org/info/rfc8985" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8985.xml">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC8257" target="https://www.rfc-editor.org/info/rfc8257" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8257.xml">
          <front>
            <title>Data Center TCP (DCTCP): TCP Congestion Control for Data Centers</title>
            <author fullname="S. Bensley" initials="S." surname="Bensley"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="G. Judd" initials="G." surname="Judd"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This Informational RFC describes Data Center TCP (DCTCP): a TCP congestion control scheme for data-center traffic. DCTCP extends the Explicit Congestion Notification (ECN) processing to estimate the fraction of bytes that encounter congestion rather than simply detecting that some congestion has occurred. DCTCP then scales the TCP congestion window based on this estimate. This method achieves high-burst tolerance, low latency, and high throughput with shallow- buffered switches. This memo also discusses deployment issues related to the coexistence of DCTCP and conventional TCP, discusses the lack of a negotiating mechanism between sender and receiver, and presents some possible mitigations. This memo documents DCTCP as currently implemented by several major operating systems. DCTCP, as described in this specification, is applicable to deployments in controlled environments like data centers, but it must not be deployed over the public Internet without additional measures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8257"/>
          <seriesInfo name="DOI" value="10.17487/RFC8257"/>
        </reference>
        <reference anchor="RFC8888" target="https://www.rfc-editor.org/info/rfc8888" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8888.xml">
          <front>
            <title>RTP Control Protocol (RTCP) Feedback for Congestion Control</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <author fullname="M. Ramalho" initials="M." surname="Ramalho"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>An effective RTP congestion control algorithm requires more fine-grained feedback on packet loss, timing, and Explicit Congestion Notification (ECN) marks than is provided by the standard RTP Control Protocol (RTCP) Sender Report (SR) and Receiver Report (RR) packets. This document describes an RTCP feedback message intended to enable congestion control for interactive real-time traffic using RTP. The feedback message is designed for use with a sender-based congestion control algorithm, in which the receiver of an RTP flow sends back to the sender RTCP feedback packets containing the information the sender needs to perform congestion control.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8888"/>
          <seriesInfo name="DOI" value="10.17487/RFC8888"/>
        </reference>
        <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9332" target="https://www.rfc-editor.org/info/rfc9332" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9332.xml">
          <front>
            <title>Dual-Queue Coupled Active Queue Management (AQM) for Low Latency, Low Loss, and Scalable Throughput (L4S)</title>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This specification defines a framework for coupling the Active Queue Management (AQM) algorithms in two queues intended for flows with different responses to congestion. This provides a way for the Internet to transition from the scaling problems of standard TCP-Reno-friendly ('Classic') congestion controls to the family of 'Scalable' congestion controls. These are designed for consistently very low queuing latency, very low congestion loss, and scaling of per-flow throughput by using Explicit Congestion Notification (ECN) in a modified way. Until the Coupled Dual Queue (DualQ), these Scalable L4S congestion controls could only be deployed where a clean-slate environment could be arranged, such as in private data centres.</t>
              <t>This specification first explains how a Coupled DualQ works. It then gives the normative requirements that are necessary for it to work well. All this is independent of which two AQMs are used, but pseudocode examples of specific AQMs are given in appendices.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9332"/>
          <seriesInfo name="DOI" value="10.17487/RFC9332"/>
        </reference>
        <reference anchor="Packet-conservation">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/52325.52356"/>
          <refcontent>ACM SIGCOMM Computer Communication Review</refcontent>
        </reference>
        <reference anchor="LEDBAT-delay-impact" target="http://home.ifi.uio.no/michawe/research/publications/ledbat-impact-letters.pdf">
          <front>
            <title>Assessing LEDBAT's Delay Impact</title>
            <author initials="D." surname="Ros" fullname="David Ros">
              <organization/>
            </author>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2013" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/LCOMM.2013.040213.130137"/>
          <refcontent>IEEE Communications Letters, Vol. 17, No. 5,</refcontent>
        </reference>
        <reference anchor="QoS-3GPP" target="http://www.3gpp.org/ftp/specs/archive/23_series/23.203/">
          <front>
            <title>Policy and charging control architecture</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="July"/>
          </front>
          <refcontent>3GPP TS 23.203</refcontent>
        </reference>
        <reference anchor="SCReAM-CPP-implementation" target="https://github.com/EricssonResearch/scream">
          <front>
            <title>SCReAM - Mobile optimised congestion control algorithm</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-evaluation-L4S" target="https://github.com/EricssonResearch/scream/blob/master/L4S-Results.pdf?raw=true">
          <front>
            <title>SCReAM - evaluations with L4S</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-Chrome-Canary" target="https://www.google.com/chrome/canary/">
          <front>
            <title>SCReAM - Chrome Canary nightly builds</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TFWC" target="http://www-dept.cs.ucl.ac.uk/staff/M.Handley/papers/tfwc-conext.pdf">
          <front>
            <title>Fairer TCP-Friendly Congestion Control Protocol for Multimedia Streaming Applications</title>
            <author initials="S." surname="Choi" fullname="Soo-Hyun Choi">
              <organization/>
            </author>
            <author initials="M." surname="Handley" fullname="Mark Handley">
              <organization/>
            </author>
            <date year="2007" month="December"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/1364654.1364717"/>
        </reference>
      </references>
    </references>
    <?line 1508?>

<section anchor="acknowledgements">
      <name>Acknowledgments</name>
      <t>Zaheduzzaman Sarker is co-author of RFC 8298, the previous version
of SCReAM.</t>
      <t>We would like to thank the following people for their comments, questions, and support during the
work that led to this memo: Per Kjellander, Björn Terelius.</t>
    </section>
    <section anchor="changes-in-the-draft-versions">
      <name>Changes in the draft versions</name>
      <section anchor="working-group-draft-submissions">
        <name>Working group draft submissions</name>
        <section anchor="draft-version-00">
          <name>Draft version -00</name>
          <ul spacing="normal">
            <li>
              <t>Same contents as individual draft -07</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-01">
          <name>Changes in Draft version -01</name>
          <ul spacing="normal">
            <li>
              <t>New reference window scaling which acts on difference between max and min queue delay replaces earlier algorithm.</t>
            </li>
            <li>
              <t>Additional conditional loss threshold added as optional to increase robustness against non-congestion related (e.g link layer) losses.</t>
            </li>
            <li>
              <t>Added note about method to detect the extistence of rate policers and to reduce packet losses when rate policers are applied in network nodes.</t>
            </li>
            <li>
              <t>Added rate policer remediation algorithm.</t>
            </li>
            <li>
              <t>Added discussion on code generation with AI-tools based on the draft.</t>
            </li>
            <li>
              <t>Added method to reduce ref_wnd undershoot when L4S or delay based congestion occurs.</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-02">
          <name>Changes in Draft version -02</name>
          <ul spacing="normal">
            <li>
              <t>Removed rate policer remediation algorithm based on feedback at IETF-126.</t>
            </li>
            <li>
              <t>Reference window increase scaling algorithm modified for increased robustness against scheduling delay jitter.</t>
            </li>
            <li>
              <t>Delay based congestion backoff inhibited when qdelay_avg decreases.</t>
            </li>
            <li>
              <t>send_wnd calculation updated to avoid stalling when ref_wnd is very low.</t>
            </li>
            <li>
              <t>Updated calculation of ref_wnd_i.</t>
            </li>
            <li>
              <t>Restriction on ref_wnd increase when qdelay varies is applied only when ref_wnd &gt; ref_wnd_i</t>
            </li>
            <li>
              <t>ref_wnd reduction upon congestion is applied at most every s_rtt, the scaling based on virtual_rtt is thus removed</t>
            </li>
            <li>
              <t>Superfluous backoff downscaling when L4S congestion removed</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-03">
          <name>Changes in Draft version -03</name>
          <ul spacing="normal">
            <li>
              <t>Resubmit of -02 (which was not correctly updated)</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="individual-draft-submissions">
        <name>Individual draft submissions</name>
        <section anchor="changes-in-draft-version-02-1">
          <name>Changes in draft version -02</name>
          <t>Algorithm changes in draft version -02 were:</t>
          <ul spacing="normal">
            <li>
              <t>Slow down reference window growth when close to the last known maximum value is disabled
and when L4S is active. This makes SCReAM adhere more closely to two marked packets
per RTT at steady state.</t>
            </li>
            <li>
              <t>Reference window decrease and increase reduced by up to 50% when ref_wnd/mss
is small. This reduces rate oscillations.</t>
            </li>
            <li>
              <t>Target bitrate down adjustment when ref_wnd/mss is small is modified to
avoid that the data unit queue grows excessively in certain low
bitrate cases.</t>
            </li>
            <li>
              <t>Timing set to multiples of RTTs instead of seconds.</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-03-1">
          <name>Changes in Draft version -03</name>
          <t>Draft version -03 is a major editorial pass including removal of some
outdated or background information and reorganisation of several sections:</t>
          <ul spacing="normal">
            <li>
              <t>Much shorter abstract and introduction focusing on what's new in SCReAMv2.</t>
            </li>
            <li>
              <t>Removal of Section 1.1. on "Wireless (LTE and 5G) Access Properties" and
Section 1.2. on "Why is it a self-clocked algorithm?"</t>
            </li>
            <li>
              <t>New Section on "Updates compared to SCReAM (version 1)" in introduction
based on old Section on "Algorithm Changes".</t>
            </li>
            <li>
              <t>Section <xref target="ledbat-tfwc"/> updated and shortened.</t>
            </li>
            <li>
              <t>Overview Section <xref target="scream-overview"/> revised; now also including the overview
figure and the basic algorithms.</t>
            </li>
            <li>
              <t>Old section on "Constants and variables" removed; instead all variables are now listed
in the respective sections that explain the code.</t>
            </li>
            <li>
              <t>New Section on "Sender Side State" explaining some basic variables.</t>
            </li>
            <li>
              <t>Pseudo code and the corresponding explanations in Section <xref target="network-cc-2"/> on
"Network Congestion Control" moved into the respective subsections in
section <xref target="reaction-delay-loss-ce"/> on "Congestion Detection".</t>
            </li>
            <li>
              <t>Separate section on "Sender Transmission Control" introduced.</t>
            </li>
            <li>
              <t>Section "Lost Data Unit Detection" merged into Section <xref target="reaction-loss"/>.</t>
            </li>
            <li>
              <t>Section "Stream Prioritization" removed.</t>
            </li>
            <li>
              <t>Section on "Competing Flows Compensation" moved into Section <xref target="reaction-delay-loss-ce"/>
on "Congestion Detection".</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-04">
          <name>Changes in Draft version -04</name>
          <ul spacing="normal">
            <li>
              <t>Restructuring of code.</t>
            </li>
            <li>
              <t>Reduction of target rate when bytes_in_flight is higher than ref_wnd is done also when l4s_active, replaced with requirement that queue_delay is large.</t>
            </li>
            <li>
              <t>Additional constraint for increase of ref_wnd added.</t>
            </li>
            <li>
              <t>Discussion on when it is beneficial to reduce REF_WND_OVERHEAD added.</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-05">
          <name>Changes in Draft version -05</name>
          <t>Draft version -05 contains some clarifications based on a review by Per Kjellander
 and Björn Terelius plus some code modifications and text.</t>
          <ul spacing="normal">
            <li>
              <t>l4s_active state removed as delay based congestion control is always active.</t>
            </li>
            <li>
              <t>ref_wnd reduction when long time since congested limited to only limit ref_wnd to last max_bytes_in_flight_prev.</t>
            </li>
            <li>
              <t>Calculation of l4s_alpha is modified to use a fast attack slow decay EWMA filter.</t>
            </li>
            <li>
              <t>Congestion backoff downscaling also for virtual L4S marking when ref_wnd is very small.</t>
            </li>
            <li>
              <t>Congestion backoff is reduced if RTT is higher than VIRTUAL_RTT.</t>
            </li>
            <li>
              <t>ref_wnd increase is reduced if L4S is likely non-active and queue delay increases.</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-06">
          <name>Changes in Draft version -06</name>
          <ul spacing="normal">
            <li>
              <t>Correction of typos.</t>
            </li>
            <li>
              <t>Correction of send_wnd calculation.</t>
            </li>
            <li>
              <t>Additional variable qdelay_dev_norm that indicated how much the queue delay varies.</t>
            </li>
            <li>
              <t>Additional ref_wnd_overhead varable to limit how much bytes in flight can exceed the reference window in congested situations.</t>
            </li>
            <li>
              <t>REF_WND_OVERHEAD replaced by REF_WND_OVERHEAD_MIN and REF_WND_OVERHEAD_MAX.</t>
            </li>
            <li>
              <t>Reference window increase is restricted additionally when queue delay varies a lot.</t>
            </li>
            <li>
              <t>rel_framesize_high calculation is removed.</t>
            </li>
            <li>
              <t>Reduction of target bitrate when bytes in flight is high is removed because it is not helpful when media coders are sluggish.</t>
            </li>
            <li>
              <t>Calculation of l4s_alpha_v_t simplified, l4s_alpha_lim_t removed.</t>
            </li>
            <li>
              <t>Bug in condition for calculation of l4s_alpha_v_t fixed.</t>
            </li>
            <li>
              <t>bytes_in_flight_ratio removed.</t>
            </li>
            <li>
              <t>Moved Changes per draft version to this appendix.</t>
            </li>
          </ul>
        </section>
        <section anchor="changes-in-draft-version-07">
          <name>Changes in Draft version -07</name>
          <ul spacing="normal">
            <li>
              <t>Additional restriction of ref_wnd increase and ref_wnd_overhead when ref_wnd/MSS is very low.</t>
            </li>
            <li>
              <t>Additional compensation for increased media queue delay and frame size variation when calculating target bitrate.</t>
            </li>
            <li>
              <t>Changes in text on feedback.</t>
            </li>
            <li>
              <t>Section on handling of systematic error in media encoder output bitrate removed as this is adressed in section Media Rate Control.</t>
            </li>
            <li>
              <t>Added section Clock drift issues and remedies.</t>
            </li>
            <li>
              <t>Removed '*= max(0.5,1.0-ref_wnd_ratio)' as this function is replaced by qdelay_dev_norm related restriction on reference window growth.</t>
            </li>
            <li>
              <t>Removed extra selective restriction on ref_wnd growth when L4S is not enabled as this function is replaced by qdelay_dev_norm related restriction on reference window growth.</t>
            </li>
            <li>
              <t>Additional wording on the improvement of the optional qdelay_dev_norm related restriction based on extimation of the non-congestion related delay jitter.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8W92XrbSJYgfI+nwNhfd0o2SS22cnGVc0YpyU5VeStJTndN
fzX6QBKkkAYJFgBKVjndj/Vf/XfzYnPWiBMBUHJ2zeKLTIoEYjlx4uzLcDhM
ptVkmS3yZ+m0zmbtsMjb2XAyuZkP69nk+/0fvh8XzbCZ1Hm2uN4f7j5J2qIt
4enzvJwNj8pq8jGfpmdZm6eH02zVZm1RLdNZVaev12VbLPJpkSXZeFzn1/DO
0Vl++Pp6P6nGTVXmbd48S3GKZJK1z9L80yopVvWztK3XTbu/u/vD7n5yM3+W
Hh19eJlksIJn6YfTi6RZjxdF08A87e0KVnJ6cvEiSa7z5Tp/lqTpvK7WK3ip
Ws7zhlYDH9u6KtMPVf2xWM7Tl/hEuoWb3IYXFllRPkvxr/+Gmx9V9RyHKdqr
9RhGX87/VF2d1MWkaarlDgPp1+oqW+LfDCkGzxAglSTZur2qalzIMIH/4L9i
Cfs8HaV/0rfkewY7TJAvsrrzKyzjWarzync5r7XgV0bNyC3kv+Xy5GhSLWhy
M3f6epR+AGDkdbleToPZX2fz5brp/nrH7At6ZXTjXrl37j//z///qsxvinju
ov416/5419T4xujjOpc3wpmTYgmItwAUvCZMSM9eHO3v7f2gn7998u2Bfv7u
6Xff62dEQff5YG/Pff72B/fu9/CH+/zD9wf+3YPv/DPfu3F+2N3ddZ+fPNl/
RsjwLoPr0g4n1bLJ62u6K89kh3KtDNoeXlfFNFtO8jRbThWJ5WmPZfJv6D8K
4H8BhMsmeNOW9jcG/S/ZMv61zmewrjZfwlU8PHqdnp++PHr7+jVMvFit4aTx
w2K9LCZ8xc/y6yK/kXdhN0XeIPjNko7fnj5L93ZHe3tPD3YO9p/sH4zgvwff
yhNToBkw03oOlz3d++H77wlCr06Ofzq8GE7zMrsdFotVNmmfbdiz3TLt+HiU
nlWN+Zb3epxdF9Pgl86bdD/Kf5Sdd18Xk6ssL4NfLaBOT05OQsA06au8BXA1
g/SXqhyle98N0jfVKD0YfB2sdn/YeYVwH+3v7j0Z7T7d3Yf/7T2BP74LAPc6
u03xkRB9DpsmB9IIRI4B+U2THiMo01MCpT6c1fMcVn/VtqtnOztX1SIfFbNi
tC6q0bLaWeCmb/KdOm/yrJ5c7azW41K3t1Pm03HWytkMS97saDWd0fn9pTof
Pnn57l2E1g/eVTDCLWEyDF7PcYkTocs4R9Hmk3Zd5w96gIzjpRfn6f4TAMqT
/j3c3NyMnsxXK6TeO7N2tdOs8kmzQ0Nf5zv7Ty4Z7js8yE4Ayz+tSwLmd7QF
5lLDo3fvcJNlvoBF9F1Vfi4dpq+rcVHmabUCflc0wA4n/hK7PZbzqgaWsviq
C8xYqTQQ7hofRM/WG9g7syokgTv6ir6xw6zJ7iu/zso17Wf46un5pj35p5r0
BsZP4dn/J0vfGZfVeGeRIbPZgUUM4XeQLAjj/mud3TwHaSEPzu2qBnweHmXL
rL7dtD1+KOWH0mUxv2oBBcbropw2G5aKGDavqnmZ03InNMLOhEbYoQVcvPhw
FOP9i6yogXZeHL0bvgD8W05hmh7R5F1dtdUEPoSSU3reIgzwshyuVu4OPvgd
J3E+gs1WRfAD07bzqhr+fLteRr/3jAHk8We4uWV+2zPM66z+GP18PzvYe/Lt
028Pno7w/9/tfbfxTgMjWLWjSTNaT8pRNhmtP+40bTab7bweyZQ7q2wFBGin
nd1MkLHmn1oiRjwi3+/jfJIvxnAMIFTCHV/GQsKTvW8d435ycOAY99MDz+jh
62+dIGEEhm+/3/MCwN53Tw3Th3GS4XCYZuOmrZH6JhdXRZMu8kWVTnNA72Kc
N79HkE6vYaf49X6ypbL09gCIarpe4U7TtlIU7yFBOBYP0xBWNWmznlylWZOe
XbxLPn+WzX/5MnKCOhz/pFzDWuFIYe7M0LG0QeIIXEPZHpL2bArXp1mvVlXd
0nxwYUfpxVVu3+Ofm/QKDxBRu5qlC9wj0NpwgYMEJHyYoEzXTZ5OMuBtwCxy
+RlfxTlqgCfsXbY5SA/PaC1PjtNfztJ5NYcb24wY9MgU3JJTp4XgeZEiMuID
WxRTQK0keQjCOYw5XU/o+c8PC/Pnl/8zx4ng6qy0zldlNoHRWwDlCnSpogKh
HRQmuGjEnko3Fp0j7uXLFwBsIuhAJFznoBMBMCIoF9mSufIMCBXQpqaYL2ne
ZYuMGpEIsQrmTeD8gG3DVDKmP1JAIQXAFFAG1tDkk2fyOuBTkvxUuflpNodg
iKNwGWVrAJ+brJ6mf1/n6zwlIRDHw58aIDbpDfwNk72qbpKTT3CnRLj5CcRq
VPtg4Isa9CFCvy2WgLYZInhNcSU/VzeIyYP05gp5tiwJAD7OkHNXMhke4gQP
EZFsVcM1IOwETAVKPkj8/WjSZdWmcARA5hF87kUYDFZatECk53hETTQonQiI
UPA5oasDWLcsFmu4IMAl0hpgAnB7sa5hPbBcNyOcDNDJj3B602s4pGxOqzr5
hNyhaBPDW95UrcegrZOjNwIKpHaAHDgpADJ9BTMtQTSjz1XDF/kcLl02hjvQ
Aptbz69AAwCAPj2XIZC4wRBwNHwpbwifYIqU7zzCRe45wGF8S/izzNsb0MBp
fATyVdUAG0/diYSvI1jr/O9rgOuU7g2+AodUTJI+2rZe0qXMyqIllHG4Drf4
YfqeyGNDukyGA3pCuaUXZw/29tDiLd5vS7gIEd2FL2YzeBEX0BRTII1jOP2J
GT64qTqHv5BFcFOZRoKOu5SB4USY1gELeUQgUaoKJDaf8vP4tV/eFaAb3WYg
zEWZwZdFLrIbruX4CDAXYQ/86V2dzdd5H48YwznjQFk6y2+AwOAdW1RTQ+Zh
awtEP8BsPE0Y7SYvS0FnIEfw8CRtqnWNG1AGAwpYXo1wK7huVu74wvWsAUDM
R0BwdCI4rGnV5OtpNWRRNFut6iqbXA34VJQdCSW5ew63lBnIlcjkgJ8Ah4Gd
5jg9cpRrhTJoInweKVoc4JLACRQoPfj3CpQZhUZPGRRwSzOk+/icMDcCoX0N
dpcvr0jDh3UBjsxxGhgKiD/Mrms0GAgnXMFFQ+IgBKuF9wOqQ4YGfhHu8GRd
Zm0IAtkFjgX4Bli7bhjS7nHA2wqOUnjxuGhxPripP93iHQIcnZUoMPO2U7jH
dIFhnSV8oqHyT5M851seg0+YD9zofEAPgFzPSlEH0LBEWhvIoG2eTZHOdfYx
QPQK5mHJT4aYVjmTkiZv6UyQ5a9hiyVcklbJ/Tjc2IgNdwzEkGov8fwnrZxD
WSAdXqaAn3R2oEHAyeKdgEVFgxLhvgMusBY4C4Bdlk7yuoWjgWGm+bzOc8HD
jAkcYSg8N4apgUITrUGmh/spUYDm25bOauCYIpahJQmGA2RpcfJbYv3r5RLk
4qYBUgEzE8udgiDpeeAS6FqK1G1AdAHADhcdaRrdRhiPp1O6TiM4rA2Qx+EW
Hhwsfwprgz/gW6Sactlxpe4Ww+U7XcJkAOyCzrRoGWVBOkHDo14zgGNJ14pk
F6QV8g1MNIaF5fmyH9w429nFBa33kG40ApdIeL5s3EqJ3Dqi57gwya4qkiqV
I3DAUmlDJJ3iEcCy/oECKDGiM+ZoLBAIoF8TpHA9L3K0rUw+enXw88PavDEk
oAJjUqkOJlWpDPYPMhhIb7xcwA66OwQlkO/Tx/BfYADMqZn1wD9g4jBIQo9m
SPhg/ws8eOC5spgRvV4xu1svCzhmlFs+5kg4pypfKJ9JGlgvwXm5JpUL92Wn
k4FQBAZNbrFq8FrDvDmc4VQGblRGSOCRdk2PIKRQQgCMQmB6wU3JD95yutUM
AFw0ngkQDPx/g+q+hSVdgdm6nAFSM9V8JCcBokJGAgxgIu6Rv4Cdtw3fIIAh
XOXlJFs1Ql7hodN3bvEzeg1pCC5ar8fri/cjmuUEmJYfk+gCnhZBFk4R7tuy
5StAjx/72eVRf1Vh3kwPg2XmMVFWpQjkJeFhHG7hIHJwOQF+RQeIB0JyVh4s
rxmgTJaxVwXPAX/BrdGPdw2t0CCQZSweDo9O4CLVH/F6v2dU0jNNyNjg8Mmt
RFGNybhSrNtRerjUEScg+bdEqkjwgdPHwW5wXqQ1+axYql4ilnmUXfHezkCu
KQDcLCWydFg0is6sQBAuomkHR8Ar9PmhmEDR5CBS4gSBHutFpGTAFnAqop26
QCOfDkjcsiJbIsIjsDo8G0L+kAkJUySj0kyNSkzWOhJPolLV58+4B5H7ZxXy
alEnGcDWJ+E1HmY9/EjS/wjDWLU/kh0/AoeZAeWGMxznV4XI+yBVoJFX5GC5
FnBb6mph+frnzz1eElIie6Wxae6EMPiMwoSedkbqokEKOU+rD3rtA1eocoeX
6wjpVDVMWCH1KityxTVygHFFvKiEqel45X0E9SbhTzUWWDQwnCmqgcIP6CY2
Be4R/yxRRDXwEfa7xD2yNSInOQnxpFjOSgHxqiqQyrH2nHRlK12H5cwofUyu
CpgB4IwDT0UH/7VAK//Iq6PrJck+AlGH5lnaTDJY3xxuY49kvwCNz/CpBC85
4CHiEt4YEJ+8Ig8UDG/nwN2q6a/rpmWU/Tuvis2FeLLEtducr22FS4Rxm6Zz
G4aykhL5G94Ax0mAp6PxCnawBMWnA65rUCynAqR8ckWkqyt6xoIrXQbUWRvV
YBNZc49cNEpf0DMZ6r0ZEKEBzFqT+phNxMSGlB3kED4pEupUpOsuAuCIN7wC
0QXlk3F+W8lFjMVdI/8wucgKZZAZWp1RjECWVywVlPANcmbGcPqtJf31Exkw
oj2SQgV4RQwN7zBDfMebNHowJW+vqilfLgfwxlxmQb3EXGaS0gBy6zo3WAK7
a0hivmJxzZL2gUiVcMkTx1lwGLxOze0SbfxLkN4AhZD26m1S0Rg3L5IL0fSq
xm8FHVHJsKtwhEam9NM5oRxndaYumjGZ1SxO3RIbdodNP6bux9ThgCxGBAUg
B3mN9ggQiQu0UCRsipENAMZlRUngQsjhVbqiw3JSUlqC3iU6f+koltCUrzhG
r7pO1zQLkJ0KVjRplYoyNwjsQ8b4B1ICEzYrQcKtUtkUpDA87sZDhmCHFDQZ
CwVXbtlzaMj2Q5H8FUjua7SphYK3cHnka7BEgMiD1+/PLx4M+P/pm7f0+ezk
L+9Pz06O8fP5z4evXrkP+sT5z2/fv4LfE/nk30SX78mbY34Zvk2jr14f/vXB
gBb/4O27i9O3bw5fPVCLFIbwrNlEwmdJRw8EG3S1lslQYJ79CYSYvacMU4yP
AJgyfPe+e/rlS4L3macilZT/ZK1xtWL+hro+INmqaLOyITrYgBi+TFG5IKC+
BehifACenUOQQ4cNnx9KyEwlz30xdJhMak0rUj/ov2wYA9GsbZ45cbqLbQM5
4sQKv/5HYsYk4DPlFUsQrKoUDGxyngTwA7VeuVWJUYTFahzcNWR7TQPwJ7UD
hJxrenfycVndAJ+Zq7LntZzEKBTMx53Yi6ZcLyaDUDBI84L4GfISgPsETlqU
DibjIvwOEqAPK6JD0wJWsAZd1k0jdFc24ixqTQ882F5g1BO+jU4c54AuDLxC
gsR2voFolWZbOBocGkqrQKAq1Cd5LrVKIKLmi1VVk/UB9LzK2Xmt6pK+KOZI
oPYIwdS0B0OXDfOdDCWluXcc0YKSLVwbOYm2lQSM0nNkQWvyOOEmRego/uEg
75xQ6h8T1jBBLOWrQwRSr5sl6uZtEizYTwUPDSKFSgDKFDpBARePUp0PpKaq
xuLEoqpm28Yti7UkIA3raowsPGuuCFCHJWDBUkwhgyRzvFLtpIhBgCyrst/q
yoz0ybcHQA2EfQjzB+z5j//4jyxrrufJ4+F/8t/j5Le0/x8r3Ywldd8Dv/3e
Wf3jj9X9/D82TN6dSz98zdNONU9E5rlUmed/6zTw75ff8YKF1mOFHf/v8Z2L
ChZIf/HZ3DMr/kiQ8O+dCQzig3scv/eeqIW+p9EQnfl+i//4C12iDm7E++u8
5/cnH2LE6DnHxxaAd59Dz7e/qW378gaIzr1vGJSif2cXF79rot+ztOu7kcO+
ER0k3eY3wom7Y5unf6TfzpnzpHzQxkfJb/ZD5zd25iojJxRxGJL+tvn+/xjg
0gYkiZ0Zwcr1+d9NP37/zYY3DDycKW3jP4sg/Xv437e0CEF+z7/N9D59f/wO
+BwZnTas85/gMsCpks/P0oezYj5keWdIcijFYz1/IIj4wrmL01/g1wcgfr6O
xROVW9heRnEJ3rMbs/NiCZpoNKe6da20J0JBGuhhaZ/AWoIgS6axnulCeW7D
2+mWuOcD0UaEk+ClpGHJKK+3acwmnFMDQMzBjdIN8ydmfjLGN26fKHcRTW0q
b7UQJwGsMHaXgZxVgobMDs5+D045ztELDfIxijslXhu1i7BC6LwJHW8XaZcq
0uV8qZgX/YUBTPujIWm8xrwvbzebXvYGEZA1P5L8uXR2E4ZctNmBOjEGIHZN
UARkN2/ekC2G12lML0W79t543q94/mB38gu8YaNoEIuFqY2SQwk8SdU+YzzF
QRxMZMkR5cZFdHTVh5KUakfFsnG1DkwTqrWALEphAxizAOI84Rr6jcW0qgZw
NWKXAJwSxWDcEi5cNlWbNQmSbtYPaW0X9z3iYbHBuMe6A02K8T1JWwGIUENz
oRYxKsvK7rium4zbGiqjcCGXJR7YjA2xnd37E3GGf/TsG3sUqQMrRJP4eBk1
O8a7hGML2c5HnraNNk9+0NoTUaEGiooh4mxPLBsyj0m8vHGttld5qIjSFWha
8nG7G9UXx5DAmm7TZoE2CUARetYEEaHx9DpnD4+KLD0RuJ8fCloMJ+rU2Ywn
GE7QdGGwJYLMdsIWcQB6w9GZK6WHeLPgsnOkjmjwaqxLlBoUo3w0cF59upVw
jXAztxjG4E0Lm0JUACjWLdoNfECLDVE3ANIcwEMW5VzdYRiIIJMnqqXfMonR
qJBq/Gs+Qe9gEOIj/FNiGBd5tvSmucQbA1e0YI5iwJBrdGVmjpMG1xhQ4opQ
DvYQBCYkaI8Zha57d0wyJ1E2siHfoPsNZkXvSMqkCTMR8Mc0S8jZYUyR3aCV
DfeTrKXsKCmC4BRxRk3oOpzHLqjBxiuko4nRB+gsyCTFJzSN1JlaXxPl6uK6
Q1cHYv5RmQFVmZBL1ZmP4PtiFhERgrR6sygkBUUCwYMrYDtXVTkdeM+UQ1o8
axddleirxCn0tVHqDX68m01OkmWClKiq1fVEAaC6S5RZyFHsmDjsQm41WXS3
Gg1R7F7PbTiv0yUbXpBgqn5BWDD2zi1AEnRJpehp3XyAIUtk16mkrzDuNc+S
JNvGB/AknrnpHj1P01dvz88vfzq5OEyS8XY6MSd0dBI+Cd/5BysmYfwcnaH4
68QjF766N9pNh2n5tDksV1dZupPuj3YRAnyAKG8KXpsN8u4KdDPpUEVjplHU
46/IuuyMgBw3038jZIAmcnwCSclm6KTPjMxnljNDOy+M20g4X77Es6VAREr9
sBFyHCV1BbSSqCrIWBwwR7TQO1jZAY3mWWA64j9kXwi7YmkUF6K5yD6hl28t
nEIUhUAD9axCpPxWOcUdrF3F4EAEthiVuHilKr6ntDcbgRtJFttOQOghWKgJ
4aR0tM89vuinS7RqXmFc3ZAZ0WWxvORx6V05XwxEJ3AFG0CosqeYMWW1Km8p
VJopEouXz9IToCiJkB8Ka3aiO6khGtYbwA2gYHFErv8gUQO9F+mRtVkmWSyI
N7WAbH8QxqGOizpPgieX7CCBA1f+JxqZbABjtrrSVxIdyEgSOnk5gJuYIgGY
vsqEujgsrVmoZVUmcgILxqMURAHjKyAiRRzZV02A6BOfK5UTJ0GcH1mG0fEF
v4NwsST3nrrreQIgVnOSawHSa4kNTg6P/kzyYZ0z+Il1okjCzNETBI4BQKDs
oKvBsB6g5F72FL893yJWqska6C8PPTfEnas7Xm5RjzciEsbNEwFRviO6D1E5
Muo9T7/31wCoZXNZt2367+NV8zeP+WaqJXO5Cv5arFBW+fu6mHwEOOdLRAT8
BY8zoxyKtLlCZKhmBJPmFmjOAq+RRESTdBrfa0c0gyNDyiDcEOcWnmVeW2Dm
7JhUoMWq9TEBsJgWL6Pz/ZN6JVFjIl9FFoWtZjt0bqMWJ7eTpA1CC7UiJOog
YTsJUurpID6gbIGhdzSieXpawF8FiLN4QSaTqqbIF9qfkGX1y1DM5GmYYeDX
900j0ZW0fM+4YO5VMS1vvWAq28JhEqItZ9m0qNLDCWrz6QV6srbOME8EYzor
FwvkhBih7a8P/+o9Z0nmxU4JzvATwhYnWT2VzKZe9xdAVmJDPxarlUCAfdne
lR0dkcBPDAKCgoAw4Tg1Z0fqrnkWvjA54YR3uilKjdIPpK1IzIWEPyCFTzhS
J51cVYWkocPXoNKTL5QOY1KtcmZcxGidu5/8zRxZKFEyACd0SjZ0B+e3Il26
KNjM5zeOEgqFwbBvCo6fUQQiUzsgDHzVyY3n30l9JOWYUpK9acScR3AIOYu7
fIU1KBppDWZqE75R/E6YXobeMzvtGIj+DPk72eowmAnZHJ2miGoDPAvWB+km
cfyHX6Qsj2a2QdvMTvAiUUjSx/yWD5MU5oLcq6kGU/C+2INGgTnkhD8mRyks
+NichnXIi5DT45efyqtDc5Ca8NbkGrimOW/+Wg7ZcW5zZkiP5/FG6WnrImsT
G559v1e/V7gyXv0k8OpbGe4cl3SOUAmENUfVHTRVwvGhTfKpY8VKNACFYh/y
T6vSmelCHaFZjwVcDa3pIS0ExE3OSIKbBwA4l3nRkJgEuWVZGNZJRjwQ1YYV
Rn1GeR2ydVSqKHZ8YGhmbGYNZKHGxwmpwTkh+UfkUfuwNwqjtL3G2A/gZg0r
GNFziY9wgGGK2gqTwWFSLHi6dQOyDQe50jfbKcbWAJYA6q9Y+VCrVxg1J1+G
gCdLKGsQNYYW5VMK8n5EK7vElV3SHrd2t58BhsCnf0fQ/E03TVGXvTunjIFI
YH5GqsedxmyxwU2VHDbrhQY+pZwioFMbw3vtEgk6jgBSXBEfA3MNTIDUa4rB
OGRdYbMRp/EWwo+tAcmM6OyXJLM2mDPDofwwIG+tb+uXqEExGN9s3D+t36la
HODJ8IYhowFd9AFqbQ0SCIGYz4wLMjt0tQYENGTal4lgXwjA0PcGhQ5myyT/
lCHjf5aezoLQGAJYPMv5G4o2NJij8yJKJVFckAuXb+DF4YFuVZforObRLCSi
LDuQuxPNUr3TBr+CHSRuB8OnA/zvE/rvPv13j0nt+Rui4S6tCtQiZGPFbEAX
VFk2i6/3Qmr4hFJYSkTl4bB/kayl9L9LMfWtGHU0E9OTYYaF6tYxtAiZVRem
5CrA4hHi8Rn9oTj2+vxcggZZX5hgFByxeIwNSjWnC20wW4tiuQUfBvTSjr6y
vU1zLbJPl/GJ0b25MLGzd9AQ2dQaKPUSJ9Y46WLl71LvLOaKfu1UMHx0XcN5
DpuYDtC1bVYYFU46juFMoLuusR7OulEKpKnOcCp9UCGmvmEfidOTXQpeKUG0
aGn3nrbOAjUQLOljxFSqBC8bLlH9VywvuGBTR4U3xP5J4KLeN8+Mcom3e6bJ
cW6AiOdRRhRLdc2qYqlALKMuUwfz+DBDIOYWm+m3pd6O/TWXGaWLpoeOgTtq
4ynEN/EgTe8olxOsPeSSf0gen8WO7zD/B7aBkEALpyR5Cd0X0zd6TPzeUAMI
ox8p7hERKA0HtiKKZ1cgQZe3vNZ+XkUPpIdHf0ZNFgsfkT69G+Nyknb9Xfb2
dWYDyNw7Idf30g346WEyWcAd3raYj9qdqkF3wcKiZEySlTPpIFlg4N+AQpSs
5ExCSZSk4jMGiW+mlm+SbU0oykYmOL1z7jeOk8Ie7xjjzeMnzB97zj6ESEJG
boJHCpNlpXPVhlyz+Rq2+eYx8Mg3j/eZUcIiRjZ1z2XBEbNTV6jWVwGh7UZ0
cOcyM+rpIM1H89HA3AeYx7FOTCloaJ2JyzTTcZVrSH0YxT4LEzKbd5EHEbdA
q4ZPueg8g9K/Jt8pgxXEZnA7ksSVBJzHJA0zkfkCJ5oZeKE+9ODoVPnprDLj
UAm+Mv/I68p5GpRl8+5/lwt4uB+ru6LlNffqq6rrW8tlJwFrg+MWbdEdl7FG
Nmzi16JZmh0dq3PnGVdIGfggFV/jQ8gmZjqwDUuq7lHm1CSH/R/d6w9Dr43K
5e4OVnXD+bSvENfNvXEuUc6D3UC2/UTCClCytJ4zqSvEg4ROzTR2anq/JAgt
3TQ6Fk2QWaE/Xq486PuUqaeb4Wj1GkY/fHMs9pusTcociR6KfL+cnl28P3x1
eXZxMWBr8vZ9CXziIrf5K8l9TuHAXYno0SwqTHZTU/dDxAI5eqwAiM+a4CR7
0njGXza48JCEV7OZpuyQiZ/W3DAWlMWYDFN4y9GH4eO0kk6eFebLnuXLitUD
YQgj+hojD5zHRGtQOH/HDZxZnswKGPsPLE0VUvmADehYeEGi/V3BjWI5A7kS
TZ1i6AfKVJT0th+OWNiYlEevo41MPq7YIzmLEG3CA6mIorPR9aYQG4xR8xnn
yklAnOPiHoRL11lRcp0G3Vqt1qUKyBSKPGg1JASg93m7OdypScsbhnM3hQck
Lq6icjB4YShjbV5nY3aign6STeDbhNxNGWUJ842l7dMyZqjcXlS+2kEuvjik
+IzgJv+IsCBvk8iv3+958UF7moDdxQiUaRKLV3QNAYNDguF91J0CTZsUY5Jl
Qf4AekvZeFxpiRYmGVc+r4HTdZgO+DnNiyzv18V8Tn/bFSv5jifxlbs0/ZNk
dRx5wFiLzADUVEJCSo0+IxsOSoKBPLN1Bt9IuSUsOKvRpKFSK7ylZxmLbJp7
VyIIOixakAeEZJBZmc1VPBANINls6sOYM3qhoVIqxez+Y0i8bcP5NNjX6qFN
bkkqWDpCKRH5Ze0VrnCAxHvr0QeKe4h5B8lE8FaeuyS/qciCbd95JUaOJh8U
BwhFz0oq4sYTVwdyElmpCqmqYK1VjG49Pp4bKt9US90wlhKX0yR6x29RhN2M
yo+gK2u2Lsmnw7seMZ+3bBuZXNJzABwkZ2xheE+dO9nFtvk5JfqzA4ttJ3hF
Sqlzg8dogrVHgnA2YWJeFRchgYaxMoBlZvlkyfIKegttDFQ1dURKA1wwashE
t8BHJtpbGHpziUXSNkW2RGwxo/ITcjboHATCQjGIGq1WyE1rEitqyF0iPYTq
BXgZGakCOtfKoFwFFqTm3GZ2tCYmustLN4gxNzoz276semdIal2tzGsbAS7F
GwOZ4amIhRe9ICWbM+ZpfkVQl82AREEG5RcOKcexeCgzjrljGOV0mWGYk6pM
BcnLJ59gr1g4hcSJDznKxbCo1xVt6hCLV87hlE8+vD7cRkbYoqEw8XXZNiw0
7V+oniAeVUIHiNozl1jjqhZS3O2AikyYIEV2sobJ9aC2+BDYGO18bCJXBaBC
cxwWC2ohMRvaMvHUTRIkJfJyTbfX5+dUWkk92BRyTqEerjo/GmL+vi5IX2QJ
RWUfkXYGqfF/N22+CksToBO6reoNG5KwK6owxndPqQbV6uEacgRU9Lp5uRlQ
1Z19b8w64J5XkQJ1oiw4gXOLDYt4sNtJaKK7yW6fcbCIsW25Ny9RMqIokcfP
O8Yv+wYPfufjoLImD9NgK8qCMkq4b0j3r2/Tvd1Fg9FTW1h1bEh6xCU/eule
vyQa/eNz0kN2R7t7qoBgZ4NoGgMxEm38yhTbgWurdikXNXWXwu0tDfYU7VgL
a8f/7oRqQmvFCse3Kd5QuaASQdFZAFYec/t6jmTq8vCXl5cvQR3sLtalcG1x
lKR7ehseL+EPGiahamYb4fscC78l9+wCntoNn4mxgR+geaKFwk/dbebA/yUe
ycWH2XIt1UxKQCIcyBqOBlJWL9qUUAhVCy3gN0g0wleED3TJW1FgSWYmF2rB
4QZIPYgKBMwNqYhYx/tdrqTRkb3bH5W4V5QYfx21pSE2n4yM+YrctfiFnw4F
JWckbf4WG657DpAMtUdi0EIO6ElHZFW+45CDQfwAxuLSb6juRQvZngNVF04o
RuDmeafxmaBLos20mos7E39l8Fbs7H0Lc/w+DkrBtR2Tw6mLFuRMKC7PG1uY
bLEHU4wgu68wqMtk58AGdAEBP5o0Cd4C87xKRy5rJOPFb7QRUXhgYkLY6cK5
v1XpAc7F1Vwu+Y2dfWeRNrOLnJhI/PGWR9jrbRMezbWiANJEindx8L3d3X9B
gV4mya7n6RwdrfhEEs8cL0bKbLud8ia3/FiuEgJyaJMkFwS79UAdQ+KGdIAU
LdP4KgocETpImvV0ikoFzUguwEalZCIoGliHhjsKfcTcuxqkBBsFgpfAbNxw
RVEhGqRlWdtS1A3VbZ2C4BIwjLDSCRlWJAJUSwAjm1T3ogIrwAoyUxHpZNcM
lhGU8mcbWLFfdMCLr4sa492QJIQs+ciVWfVvYn3LmR5W+kfzyzaxLwOY5/IH
ep7LJu/+/Jfjk1eHf3UcUcZUNihc0D607Z6SpSDfoaW+XbnUmmkelohFrHHZ
hmiVMUA0de+yJQ10GlQ4sa5hjMPK6kDMY1icnRy/Pzq5/NPpxcXJWfr8ORlg
GRpuFZcl166+RKUbF7+1LctP7zwiZueGvX4FG9MLxQT5g5IWCSYTtdtXJuIg
UnkJuE8kf2WN1fSSoCTdob7WkLWUOPC45QAzl4LhLC+RH2yUcIidFM5HXcFV
OZTyaEvnDlr5lfcMlFi0kH0bGmM2Fz1LfnrzgkHPMBBIlqEj3HVkHT5vBo0Y
PQ6lrJheOjdmcnxg4KNklLaIk8uHwJLBKY3L2kvvhy9fvpLPBneRWO3T/xyn
pYM3lxTGDi/I1iwDagCDb1VyabcpVraYp3CsY28/0Dh+J2LbmmwmclO88Rpy
B3y6xprYEow7B4bQal4DaqMFFV5Hy1D20d0in4mspfw1SgIrpnP4Hk4+r7JS
qhoToxEjciU02Y814KwEst8Qa/HshAPI0RQZlvmJuIwtZUyZYNnEJQNxgHJA
yPx0hkKJHXaai+3eZQNn6uFIw8ZBNCcL6Fi0H305GPMA2hY1t8jgtG6bwkVA
+EgmkbGVJKUxvUNrPtal2xAel2HVpJrjabgQruCW2DtchTw0FHNNc/gGq986
w6vP/5C5pWJV9K1fEf58jdHiaFvJGFZSnZKXgGG1vCpZDPs8uUBvNV437RJP
P5ujs7XlY+4IHcLWXUm6e1iC5bp3AcWxVrlq9GTAds1XjyJmev7z27MLZamP
Fecf9fzsJ8AFhOO7b+LhX71983Lz6P7XpLPfMQZwodbgMER4LGgsHq0v1VDM
TJaeJmUfRKWt4avDi5M3R3+9PD598eLy9eHZy9M3l3sDknT6f4rsADH0htF2
+yfYlrXgYmU9P6ZI1N3oD53O0UVFJu7eUkX1FIqJhicpUSLbqRuwXax41xrK
56nuTt8a9/1aOgt4/DwNXnn/7vLl4embR7yVRzQVv+1EOd7Tcb5hT18/1/Hb
D2/sbDKPdlnsvM/nvIs7dluPH6Lj8EvdiMPulEUa+89IWuaiKRsPqIYV2omn
c4w3mzrhdAP2+Fy6hD3qrFnlCksI/pNDd0AqY3tiGoRY2VkQEnlDssvvkSsM
SWHp4uCfly782SU9xEWm2f3n59ETIHNE390n8O3ukdDHnGdBfQMl0JguCM7U
AbuIgL2XlQbFMa1Jnod1+UKk8IJcTxwRpRqyIwTUoncOud3p1j6f+8uM6vO5
jXeYZmcEd2dhjN4htNi1GYK9N8r5P7CNXZRdNLzMhjfL6ZDF400RHyKHS9FG
ECduKq6EOUrfLiUjrTeXP5EB4ohfcetvoRsYVQsMqNlmD5hWFuVamyxn48TF
cs2OXW8i6XMffEUlBlenJOvG+wR1GXrigTAkR+JPfYLrIDLcaQ5ycKZB1dre
JXpPDirG4vsJYnrY8LBlw3oAahjtX6kATjmmSxGPOUaFSzqJJuODsSgYyXkU
aGQTp4RhbdVyegc4/dZsvBHNiO9vsU1jw15RktUAR+ZkFM4oJTs3hGHRWIUt
anPFTY601EOfeYo9SXxLUcBG1Bq+Pj8fupk31PRQCzNbuGdo4EP15aaKj9lb
ou9iX1K085nJKki3XgPNOTt5cfnhzTHmFcQrMIHDmohQAIXtezSu7G7fDeyA
6ZYQ7QsgeScXQLthuLBgOvG0zGsVwa8oGja+tLwU6FkiLbeZuOo9D0e+qdbl
lNHypiAxAbhXfZ37WAdE1nTNBXWRE06KerJecNYIEAyOc31x8S6Vku6+cnqa
joFy3BRTtGFoGSIq9zyu2raEOz/5KOgYLooSU11rItg1CviqIsXAIuoUfvnz
qbdO9IjLG+wTnVIbxgvRL3d7Hf4CYw3DeiQuas3EUMqa1Lh+2VZ22HuXlbn+
0nT9arNAh41qjlEAbpEV7hkWTfZ8g1IH5IX+1/vX4nG+z1Wjv+LEjbhVXvHn
bhOINTkLQ8qyqgC/3DXpTxPsylewRXjCRr+RkxqYgITFYIe3ZYvFKJr0wdb2
g0GiZSzCwabCjsjk5Vs1NttWgvN4h9BBN8wFIy17xnVkzZeJTG4xnuIgTzeO
IWk/Zgzyc2CqjxbpMqaMTghyILzK1XL68lZAg7Z9TSvlIaY8fko54xzRQ5ec
pDjXrgFdztSaIezNEczoE9Cusmtf8rxAYZTq9ZMFD5sDgVQKAxIkBtKQkYmU
Z0wgHrXV0OVrcwVs5F29dcmwudey1z1VVtUKy2qt5/OiuaIDMvQ/3Xqyu4s4
/FrOsoPEhqL/9NeLk/NLePnFq9OXP8PRnhweX569ffsa5W8W8jGeHqu31BWg
F55xNygcxsGgJixBhJjx3bavGsRxNiJZdgJ9/bsYbASvfn/Pqy4SineN8+3J
bgXrmpy6YHJ+33P82nieG59/SwO8e3t+cXkESsfJOZa6v2Q0J6ljj0Y91kYv
jS+mhsWDXChJkLGj8XMbmmRgLscV4QTa3rJ1i7Zp3sj7V3AIR2cnh+cnly8O
jy7entE93e9ZAt6MLe6caPzariCcb75mEgmXHgutu/v0/BKlHscOjnqccisK
wabzxmcx1I3etSIeLRWx5Rf2Ran9W8uzkfNUmkF+09CvTrps+KZnrRUv4Qli
nUj7A1mSwcdFUKg8CRZHoYQaqYZC4jgvdZW1fDnkYlyeguZ0DGoQKGn/dvnz
21fHOCZs/0Dwx0T10BmLOqK8A295XrJh2iR69KlFZ7lv5auakZPKv7BJMVAn
dRbCeTILSamt2CyTcPcoLLCHz1L0sFfbelpIYjEqqiTyUJQnGzRODn30xix9
WSrt7GUw+2EIBWWg2gKMyt8RXjzklJqqAl1gSXG8FGHaeNEDSVonpgHec928
OvVURUimDj6YrIXpDhjXdI9EkjSTkgCptRIBmm4X2z5n9rKQJx89T793L8lX
/H/3LRuu9o3hin7Z3maXrU70owHXv/6rjPVHPFEy4SG+sH3QBzfq7dQkvM44
3E8V3u1ac/D7zgp1A3dh2TbZy2jp4SH99lv3jGjpd4um3tspiHBXNiGroByV
Ffm775Izf3wu77CtNlg3G0hB5qVvERxkMWNLIpt2e3dFYnLe+4Jx/v0YqT87
6T6cbuwW//G5+YvzoeWh/7Kl0wB43SLF8Pww6KMqNN0EdFy2QWaCmdBVbJJx
rD0Joyg4ZGLJLamUuqsLK4ik0IJcMhDJ6p5l37DQxt0iI18XXs4JVtnlDpsj
GSHM6qLmqMUcC4txjLjZBPfcyNKWqghObtklx3eCRwthYazmakwO3AD23Ibd
c4Pr3/u4eWLbYYbGV4QY8nV3wVulY6SwaMJX0OMt44dBFbuE7STdpNa5xbkg
FEO2Zy5HQ66OpzIIwlAJegyS1SBSjB4BuA+2YUW0e76u/frXj/dw3Eds0REs
2ajhOTO4rjTICTbhBvDU1sG/bEs6HavwFJPqlDh6XdQTCrSidV5xSZ2i5ixx
voWAqZKr0ycA3NQAd4qLzqk4AwWQO6WQQ4rDyJORbcvQ1XM9ySECbw6m86wC
LD7bcAJfgfG+iUnq63+oF4WBqJ+wydLZKok5R+ZJZ75WvAyxm72kcc5I4nsz
2AqSTq2gBagnMddRxFpqBsFHWKpVaKnQSn9KyBxdZB+/Cfc9kaf/xDELRWN8
41LyvLCubDLPc5liClMNg+aeymi2QrRUr0vUy2go1B8jCvUoBRZ+YF2P5z5b
QbND0GpzhygXs14zmGYVoE5cRin7Ji1ikzVTj9qN6IH6SASnRD2Abrdfy91l
UFC+UomtUTA8xPoRVOiPTDw/4iMopWsCrE1+JdmUIircy3ElRA3KJLGXopBd
0XoPJwr+bHyj7LQumo8BVYhoEvYBJSrkBukU4Ad1/0YLA6ORgEtncWHHotVy
bdXSjUCRFxL/uW7iINB8VTTSTJ4cavlScMxeKGSW8tdgY72T7fDU/NsSHeCO
edvXtLRe2odhWWi9chuvNTxliIvc7ZjT9V5YEgHk0n7dMnEGAw7gd8Zg4hjd
dhJyPENKfy+HvhfTeyIDN/txBh2/l023ExGNCJ0EJHfrOA+UpmmjB0pM8wov
K5FcOAZrIk7EMeYi+IkyaUneKAcsLHClxWY56c/WzTEjmZ6dWQkLnboqkS5N
CDNIl2YflBJ16ALFtoj+bvu+vJsIFpvhKDeTJApsNSmJdbbXBvkK4A5VbFtC
IDDh52LRWRDVgdWolmsyjIQBaH0rwOE++NTQrk50r04uhXXVNRr34HATKP6K
h52IOVIGzKhIklc+hg3xGE3N2ABA/vCVQ1BS71EW0IyksFsvb7IaVICoNCBe
viHcPnbnSpAjx9tR5eae8HXf+5EK74g3n0yEhCB9FRYAC5r1XCg9UJpipkG/
rqX11FVXQMfOeilxlcgGuCbBl43GGxfn4203ioRfNMib8w2M5SXqvryZaz4U
06ExryQgmQeqhLcCdUJl0ARumOkm/UM1nK2NFs7zlEp49ZWUQOVn45qAx99l
U0Ap8dwabsUsZcqjJOEr/JyzeT1Ot/qsoY6Wo+kGtBMyhLnQM+n1QuVbAjR2
vnR4vFtmmLMVTa0nTw+7TviiITsYpoq61GQThd3ptitmfURqTCf5JE1oYZC+
4jhYX8ap93oLQsP1qKd2DqDF2hkvuqVshhuS5Ny/vnX4I6RkYVeVXz2Zu6MD
Ekf2sRAdStoRpOB19Xh3Gjv0xyONEjeLwf2nxM+fjHbvMWOZl3uhYIEUF+Lb
STszc6teFs+CjgTc+AW5QdKJ3eMw8B1rrN4O1gXXhqPwEs0/dP6uTb6C0FxL
RR0ffoWxNpqVBXJ3pOuV2RUJ/Rv6xsMbr2iFm/rK9xbfq+mmuWqhrmv3V3G9
7vZGDtL9NIPEMn7kR7Wv6htCTPjPIf0Kx7+BrLEM2nteOjPKyJdGJDQBoc7C
IAaLvhZjxLK5jju8+hfKesZMZCqI51rkqHauWoFJnxKJCU3f1CKcrXLiNB7Z
5VBYxVUxLqQYA4LzjlbpqBDIvAQ49Ko9Jt7QoyogA9qoQaR3OBQTjCVRWJoT
hakM3K0dHY3mxAHN6v71X+PGmX9MxSv90+nFmZiatvvMCXLIXt6+0wFD/9/Y
UEYsk+mLom6oKu6VuRgomwMWS7UCxG+B/VfST5///0JqI4jwR4E5IqeJ8cHS
UjHjqojmJG6rGDRZu2Z/HvxIaYCuKgQqB1o1w/d/D1QODqdxXSpG6TnFdtFF
3xj/7EPQ4oZZYhJxrBKN1PgzJxZPs5UkNZgGXRIbtYkmEZh4bgpDx5rlpiFM
JxxMC59EC57XGfa1pionZfYpd0VuSXXrszckTk3RODU/IOdT3+UV5rCCZSUt
aKSgEsHzLoobRDNqZJtDGvbcIkdouz2yfCKmT8ShKrfZVEkPPrXfny+dIG/H
rvVlMa6L9QKRCRaOShwXMveLHNjSfFJY1DUJQjajyZP9/qL+g6XoqnLN7f2Y
LcMHNJoB7dpB5/HNP6VuGRvstsSu+GBRn4TEWT+skrHpt5iQB1q1SM6Qw/DT
AgVVTMItsCsCxu4EbvpY73c3PQ+rTQvNM9U4jFven/iIS6TOWKhVStgSHnKB
RJZiAO247pBU8c5cnX8Gw3pVBQjnjFDS7MyozwlTIuqytl7BAlofNke3pnen
2ljEhM2Nc6Ztie95simH2KPuOJ8X3KSSpSrA07ycDVJfhyDptz1s6kcpMIPD
xzDNHP1aRbPwwVuJD1bE20VmkzMpRhLC0Hs0YnD6+i5TjFIGzketMLAgcoWW
znxq6Q3hKirwN9Re3XX5PNQMTJ8S1mhSYVDMjYL6aN+uuApp/z2AwcdFPBB3
SpfHkpGEJUTdn7t0EYu2w/UMRGVBPcMOr7rXiVIAFsDXFU+ki9sjimgUVoPs
CZT4zwyF4dG7d8MwW+7LF4l1x/oUjdCgNjxwbySnUPJsSTGn97buklzHngd6
Gg6hAGh7VrUm4XeUmNquXB7SdFSYuZsj+qhr8RX0vAjreSZeMN3Y1cs4CVw3
EtNKWB4jtHetvyhw8n1PLF/YgVLqigPtGuOxB8UR35sOoBYhXN0axTJbVywc
xId3Xfis6d5+aeiU+ZRPKD3XpTvbkVgeG/hdaysvurOAn6ZImTa6xQTMCIM7
YKOySCsK3iIfgOnKK+GMJPHIE1IsWIs6OnOEFEqBGeuGYN1k1NSoQopMLdLQ
SEt9GTPMwF1KezwK8q9ms7LKpnbl8O3b8/QjPJiXqeY7ai8RXLyYx45MkAI3
qBvytiTpA24ssEFp6LMC/jKhftBShNAfXHAmsBtJDEbyhjQf8ToJnlHtqgel
72rnbFRjUxG3pnK+BvJ477nwFUae37LMrWE6a2wNi+IRiq1YdyvB5GcE/y3d
gZ+E0nmT7DNpSabtuMLupdyrqbaFSVccBp+k2prn5gqlFO4PV95gG+hrsStl
Kv2rUQKF8k+tFHvt9HPCQNJxU9VjqShMKkAZ2a2lSxTWoI7iYeMO5ByDR+F5
JH5xslwTdJPTapck9sVhrxSn7POqsIhmqpD+hq6JNwn/7mbd39BhJanpLNe3
CSpkCsjcIEe4dS6H6KKmvu6qcimrJRVGnu56HRRdVHKkm3gjNbPVg8pBUIDq
eC/tKjYXV/OiUqAYUOCnc1iaWgzZQgrYMxB83C7hyqxAhS0qAss8n3s9OWHJ
CcBmzVRWA6s6trguDrZEzIE1balpdJsCMc01fJaeBPIrXXKUikl2RsRaY2rR
cAwUioyyXAK7YXTErBt0s2qiv0CLJ2WNj/O0l+mv68UKSyvwecd59d09x5Up
NLyeOrgPJASPUaSccTMFJJw4gml2doXUFh6Pun4hi7nB9lsEDdaAGZ9sv3bV
O1zLTNPAkhLXp/kca++SVMl7xvH8QIXvg9ZzdwzySDcRFXSppqWvTdxzEYLu
lb1yhnY+7dQgd3KGx8V4ca5Fn+plqyZfTyskk6IiprHiHwQ+s5rZAd+VwEIO
mw1pXbh8k1HvkW+s7J/YjtBafdltX9UDLLIblmCQE9tAdbR4p0lTI+Tw5JcT
h1TVGhgHaL6vph7tXISKESsBWG5IgA1A2X+ERjxjeulqUdSOU1EYdNqyJJiQ
c8RmE0hJKi3yxvW1XYKWY9u+5FNvQa2eKnFSWQEWfskLdw4vHygQn+eAd7Zt
+80GA9zRYTZC506z+SwsVmsFQW4KogQtWaDKi+oZCXpSBjeoVuoREM9AGwJP
b5fZgovl4JGxSdg+yT3+kDJ6zNAGAKT7kQ3OB7lwmokiXOWqKsvQQRNCuh9l
gQlsoejlSnN010PJKWZRwdHX4dro/FOJgxB8N+EIiLGWSrJEwsKr9DSk4mrZ
ijIFOTEnOZ31lEnvBYsDilRhjpsfqkDucyhiMmCbjHcImLJmsVwGss66kcan
0kB6o2wiJyXKlTURqhUplMnQyubrwjDTCY0xkqtL5ic4nIXrYqnmNT0pRgUn
diJfozJnrhAO3lsK3uUoBh/u0clG/X+WyaZBpW9/OTkjt8JrzF/nNKVTV/og
k+AUVkE3nnbADJO0yw775jv8t3TrCeUWmvnC/LWvmzCezqnbYU4LPIiBs2cn
rw7/7eT48t3h0embl+oRVyWJSXpw14U9WBKmnYS9jSZQia+wkXMZ0Zc7aFpQ
YUzq2Xaee95/ZFghbqsXuMPeF7bv8/8SiUc1lZtk4/8QUT8/ZF15yAouqKfv
bNNwx7JsxqC2rgbERP8PPsdmMgnBMokpcZ9vJmXG3o3BgmTc6WttDSSk1ZoW
3nlgiwFoz2+zXKLHmGnI9derxSKnejssV9BmaHYq1goSDCcXum7cjmqZttxC
qfHMKGNahOWP+e2QZRLpDsueZdcbF6mI0RMdVvVwqYGjxY6PSBfmT4mYH8wu
OScSVyK4zHuzsGYyO/CZD51OuD2tfjnuie41Nk13tsmtvRyTYZ2RTddBP1Kn
bnqnvcS38OkhPi4Y5uxBKgUbNwmnzt5LOsNu8NLOnqgPmkfhxp8wmTvYDZM6
7TLhXPxK4ZU/n1worcA7ZNM5f7aJnMGknIe4kdpsPR1plhx7EMJjcwhgGwSz
zVcaqsOLGmHL1M6nQnaIXh9xEJIcrO3V6etTzGn+oKmjb6oF6bN6ujZDsmt5
RrGUC0gaM5hfljdReEegGonRLt85fbINTNZc3qzXzkVRRFrSjuQEtDu6hmCE
ZK6dLqNcrHnh0ywhkFoktDfAaZaiAwQaRDZ5oKlxaFA/4oRxVnQ7KXpFHaMM
tWTJgMeoGkmTCabb6QKfl0zPm3C3IMotGHK48fAxIkyCfzc+sn3fdAgxHGNn
8x0YSE5mZyQdXeG/87z7TJLIeZqa5twY+FH6PcxqB2CGFj1WSJtV0y/5jtbB
Efngl5NFl3iwJ4NtlWe4eN+jjK7yEB8aih4nvcr0lttsdduK29jVnXa1waaV
WMt+2MksckpJS29jsUVBPIi3k1nZdEtFf8iOzlXFnVTObM2n6niqJeIxE/zQ
hUW+DYZS5CvzlJeOm5W9S63JLIXIXRauRkU6fdxGIPMqQkcqDkwrJiy4nFJ/
VRr0hTMZANO7LqShvXtcNqhZ5IdLH7cRgOB3MKnuqT8zHEeJNZalwsIBbjbm
FMU/xGSj0qFJw4+pw+kbz+hin63wunRrrMXbucDQdu9Ih//mKwNsGGnkuO3h
8Z/en19IXSxXrtwc3jyTqmASoeJ+aDsdrjad5Yuzw9cnl+en//3k8vjkl8vD
V+9+PuTJvqWCGlI6peEQgc6waBvijlHeXC8sqePbBqxyVdNi53Yn4ICMKapc
u8JQ26SDcnCjtdAx04nuyPP0e4rV1NF2JFPXJzhUZR7euICCcJw4KsXUc811
IUGXUpkF5UYTKtHtjIkIZpbH+sxuW802M647rOKwJfHweV3gY56v/Hhkth2v
m9tR+tPddnpH0xzQg9pe2dKlZIB0TvVFDLVjzEK53ZUYuAgD2oX+Ua1AqWZq
Q+AJiGQawTJRKbVXct6ypJnkywyufWOrRxVq00fD5CBFrPY9XIyTSZsKW9xG
L4pEN/qGlGjQaNZlyz0DKPBRTZc6RmzwJKX5jhFqY/0sZpKioFeD/LeCY10i
fJWXq8ZoCzG0newauBRsuwr1fIzzW6A0AYHdeSq5GbGhHiNymjakAKykYCNG
rGxcAXkmfQkkxlLI48gDxxP8iC+aErpC9iMHnu8fLTKULJEBEVEUge4mbyAg
6S2oWxi7PknzusYulfBAwDCxwjjm1CkhcHVt8DojLNg56SrW9F1+rmkjkm+s
R1DQCtaSECdyj3QgtwRN8a06D/jWUB1pT6qF/nTJJeagS5NEaXHgJBoqUegI
f4RemcMId2BkXnMJKhKXw+VbuiSda5+Y0+NjzTun6DoMHAXF8Tcsqe3ikQty
WMLVNgYjrdtRLPEUw2pz9NilKS8fbtdx8YeeMlz6FFlSWMps1WgsE1lyS7oZ
vABRI68yTBugEKXCKpJ0fUaunoRnuypIddo3LNNTbCHX5nO2Wmz7EJZ6RMBb
afAgJnSiyTP9dxCSMCz3bwlhOCYTBjsZhjLVTvoUdQ77XdJzCo+f84VJu+JF
3+PaWenA1zToOdtthUV0tirciePJUYYYiQymEdF8SD+Khmnubygi3gm2/b8l
bKvBtcA0He0vfRTD7/vEr9AkOW0ZxBraHcKoHuLumySCgUJwH0bagwH6ZK3t
tCNPU8eKXrnskQckwN0kFvh8Cgqd5OL0ZOe1JtY+Hz4yWniZfYBICbKaDXiY
08QzPNLiP243Hh+C5JUhAB8rV2NKiQ++duSFjt+ZeWL5e4BFd1wwKq1ZfIac
LejWgt+Cgs1ZAZGsz3MHsd8a+i4mS6lo3KfvJA81PMswyeF6NTBuG+qG0yHX
+KZC26Si3tjEbCr/ToKrK4sse9pB+O7DZvrubIQcofkjYhpU2F0j3YJ+L2zo
h3f5ynQlZYEuqP5debnzMOJBV7FRq0VXeeoYe7bVRG7xREO8mqj9+IQimO2R
6pMZRT230m2XRDDgjxShpv4cVydf2Kx4h/tcwspduVECinxkKYC3MMJn4OrQ
ksjj3Vvagxxd1+m0LmatmrM5HBsJN/zx+SE5t4f0hOsDRdM0FF7iKWPD3ce8
SXxixs4a5WO+s/Crk+OfDi/SoJeKM4Ufrijl7VN6CDjmennQU67JR5NSPJf1
N2yYn2oHm+UEl9vn13IFXFPOgSa+I/CVJRz13YcBDNTinosNiUiskbc33rM6
1ap0ElJgF4ki8MdihU7Tik34FYuZ3s8FUkiRX7NpgcRybjLauWLcBARVEYxY
j7pUNFog0dsrnmHLNEp+xrAAro2OOryUjoAl+85VeGOjCuy2yi3+vIXGwF8O
X70/kQ4z8TsLUAzW1LZNasAsfe+XqExkxkoWum80uc1X1sSIC6x7buwB+wdo
fThHTZc6T7WBaUCaxvmNasArNcl07tVNqFNQ6gQbfTh6/dw10lz4PipbHhbb
ukUMg9YCgh8kbRv3TNV0WNZ7FvXCChaa/D08oOdR+4kAFKZllD6P7LoXavZJ
MwlmtOkpUn2s1p5w38EkvjiVTtot/oU1Xjo72aWyNKcuZLwNLGuZ0Ft8Zm+E
+QJ5G2CT3DN6YH9kJYzoWsCtOdj9F7kd3pSJ7OBAC6cMUDTb9iUmkGp2KgAA
nfQp8f+3KgTcVSCAkrQc56EyAP9MoQCmN06B72n7sqEyGu+Ylwl8CKjNwoUK
ciyvrr5bgbxnOOPXNTaOMR58y0EOwkRhhJKvOitAQdywiRPIm6q8ZkLPDHlB
z7d5CDMKZKK+8rnJz7A454AzgttcSNL3xjO4E5RlD/a0nI0KYjTl75lYy6AB
lIS1datDhClHaa+nPFWvoqGPWDTqkgSii5/PTs6x9pi69ihMlrKmMRiPxriR
zFzjva/Gv+auY5M7WrNrSjaKrxPiKFDGQ4OXYbSE08Fl/aq0Kj5z0pBkgClT
9NHuGn8gwWwYSbqk0HWuWAqDP93p27q+5/PYSepEj77kyhBmkYwuWC6hlnng
1uzu2JtC/ZYtxJD5S/CJ7Rwp6kGTl7mm9I0lJqk38YvcsM5Pjs3FdWrBlIGt
5i84FuB5w+GLpNxS6+NoGqQfTYObtKgl1ogVCkVUwXwmttIrjlKgKTSW0eX2
Y59w0y1SimvtE58M+DhWg6h984Q7D2+UaCNiaobU8yBwJVAWYdU7RqkAHoBJ
1TzIJdcw4hpFWMtIVAxhwTQBxdu43x7zl4nUefqql+7pwRMLbaaFrxs9auHr
r7lEcJi9gJDEPVNbqWbvrEqRnMrJhfAG5671AFCbtly4jqwkSTEF1erhYtfv
xggKazMWe65gzOZ5Mc180y1b+g07K0lm71YLlpozI+1X2VPylEpt9hJsV4DN
Q/bH3p3/9lt6Z63Tp1qHrae8KlfxggU6OeMsho0vroTIbui86RzjHtnUPYbr
WLtibBzfaEburUjRDEhi5R4QkkrsGCF15XAsLevmrG7K7nDFmCRu3w5E6+So
UBLdIneDixK9w0rkxj6M8uq1rPSmWlciVTRr1JhLTA2nRDE0wk8yJ9D47pPu
etC96ZupCNJ8RVYDdr/KJZi2veovACayT6MB/R13/qwDGjyanPolljIw98Z1
JcUIaL8LIOHyvQBlleUssHZwC1rigPbebrruG6+tM9dLMRl9npGv436ISqrB
xj1ExebFefzZLYX+L9WuRWWvNtRpi0qrwRgS39cprMaVVOLSGlw/x5tx0fp3
bIxQ2OuKS3GaTWJyIc7xj7yu+qqhSLDzIGjf8tCWnqSwjQlwhtkandfd5AXj
exwlWj25zMhqOGERXIK4uB8Wt33R5MHAeUWvswOroSTj+ZW6nPgwuOm1EN8o
uwBAtLmUoq1duGsrJQYFM38CmL598eLy/Ojw1QnGKmmXDQRx0tPW7k7rR9J/
Rhofd57N8jbob2Z4G/rCjfEWk3QEZeO4/801/LiWw6ONu8I14WKoW8Bx/2z2
gvSMH1jNO1fF+QNhESH2qkSR1kAQim6P0r5hJEIkkls5K9/FCXLukLOLUAEO
Vw6iR4vrjYcNG16HK+cmRCDkW6dMI9q/C5PgSmaShsrmJTKUus4nL8hBfWTN
QJ8fusYoQ0q5GFor0RetYGFrOEpnJUpk1J4o3HvBFF91fZLEokk3PZlJYhSM
goJ7Jp1q5/NaBO+7zMTpFqlO7EsdJBxWgP2beNR1EzZ36RlLejbdVDVXbmGK
L1KCrxjiFy/CPYmoiCRZUQ5R88CKC7kK9bwQTllMqEybL7vAFTcm8j4hQVO0
Ln7zVnyZquaFMhcldZoN8T45TYKFv4Hk3944p6m2ZDbZc0F3enF2BBOJjW/b
27OWVb0gqiVWwJ1OE6EP8HDYP5veEfvVVjCOtMWVphVEvbgxrH0KvqYZfzk8
Oz18c3Sy1Tfs/u7uth8t8HH5/j5wZTDIJ5hUbno0J7X8hjkPfzk5O3zZP+WB
nRGHinoVyVlpd6JlfiNQNfCzsz1Om7/X7VZn69vxy8AZYqBb+Z/Sq1Wex/aV
+6oJ+Eh2UdBNdew0QjF0hKG90M5sGZWpU21O6Y9sWNT6xGeeADXAXpzXLmrc
1Dd7NG/QnRZAfoV3EHm2AbJKuCLR/MFGtkjWua+c7AUik3k+zplScLHIyth9
iaTmnIPsClfbQ/lj50xskW7XSzeYU2wfdFedt0AC1szL1kjh5EDtk9cPPbT2
dguHHwwCsOoCN/X9DdbKSd0bJgSM3B39oMNJeXn+vxSNDiobNknPiovlVtxK
bBA+td33Gmw0BnzntTtMDprp400M5vqIWIBvBgGyTq0gwxpnT2L/GZ/iganl
vkceFgrSBMfbKIjG2/9GPTRB/IvooRqiNpb0tAce9FDL+D1HW13Xdar+4PI7
CdF7hnGpbL12M8kKlIuG7UH6tQ/DNn37RK/KphrplBlajSwtQb8RRfSgMlaz
Qr0W03G4tML5nZXQSCxQtFkns5Md9ub375mWXUq9FK08R7neLG159eJOUyPV
gmnlYcmlFSAkIRDYSMwyTCSDSIam5KhQR04aYhrR+QQbYBJPku63mBAungYx
0No1kvwGr9zanRKGkFiZUAGqmkRdMWjZt3sbXoZt+Gba39aZhrkkCOmy+CIF
s2auRJca3Hzj5hDVKSzvp4qt841xUWA9I9s7KkYw1ZjZhNtS8R00gHNCMak1
gw0YxAZELewn5EUjHHgyQsCmR3xD4zYZGURNQxyQGi/SeUPjOBuxSWPPoWU+
p8NoxJ3hShVT9i+WdOOiQtZTQsH5SU9VNNk4jUylNuB+ARRaX8/QmrUd1KzQ
6QVsKivCi9SF8xqrFf0tix0OfRBn4pcywwpbanCatJ3J7aHpnDiWnzVR0MA5
nGA8KWkMAGKpRdSwNsLicI+XSUJIxMKEZfMuOBb74GXSYjwiK7jsb2JiQ1e2
856cqiNyQ1cbwl1aO2DUftIBNKqy49JBCVTrWol4EvjJkPaNfZwr5mGtsTRX
taZIkfB40i2fuJpsxh+0KYG0C6oK1Vea4jJmBeNIeJOabYxuN8UHxTFKscEa
G4L+38Z4gKLAjoCnEX1Kwko9nXJB1pk0BQU4a6WEAminMxeNgnE/QA6tphot
XhpaberoO0hCfNFYHXGxmgCp14d/JUK+rtGr4JzZ1sKc/KU6H2p503EOMgCH
TT95+e6d3CxQ1l37Q4C0x8YorZbyEshCogs/xXu8xMJkmtnkyyF4quj89Fzb
khx/gFaDhDzVWnjK8FRb04DKsRKTzZpmvVjxiFLDO3OzYa5D48uyEUGVikAx
8NlE0AN3qcaFkjccAcCUEYZYi54FWoW0VKTpy8NXi/poLrXnqglBSKgSGSEq
mSJN95fCkDsn2ynNEw2Soo5Bu6H6HjV8AEm+lrpAAIkXUg2EjgNbrt1iNTTE
08VQioLU4sgQitFmzUdvp5Zh2Z6upUW6FYjYH039DNtssSJQY38Vyn4yMhjH
DnAtEpuGLDYyKSaYvl9RUIIUYk1gNSRbuBcG4epevz+/AGQAzoEOF/GYAhXB
WDztt0CuaKJUeIa4avgBFiEqVbCA9LrIOF7o6J2v+zQUj3JcYEWTIbjeliv8
6IAlj0mV+cZlfV8DBSW5H6dJHKHWCkvhOQYj5qUWftIIev1Fk30TNsAobVDj
iuO+bNXTkiZGtpJttG5ISWgM6maIcOhGiyLzJF6LQ7bXcAtKagsrOQsOI8U0
CccxKcZU3SysGokBNArNRhxDpBu95hAwOKA3FoccXpnKxw4wrrRoUMjxzfO9
b81PbBYkXKa0F07u4d63h0aU5YL0WHK4RgwnQwIgNotqNK9/1mfZsVk0LMaD
42Io7jSfkfO3k6ztNsAtHYAf/8IIqxT56W66aL5qDxd9iBJjZVBNjerj2mJI
EimTmAw1msljJkUd0E7/gHwT5cqWBXY/RiY9oOqe5TB4bMkIl98WlTPzdcAS
pPJEIkH2YS4Xq31+Io7zbFZZ3YSl8dxoETaLPMPaTbQTqo5VLINqR1RlaERI
mnRuE0f2YkwUMw+Kp9XUyLDSpAeIDWEepefVQO2oE+knRDEww6ZFqk61h8hX
4Wqe3WCBUyr6EdAK8qvAb4igVLr8djkB3rPUEHytCbl1fn521Lge5uM1jM9H
Q6U83x+/2zl95wL2LZWheniMIYe/vHsBMJxjfWlKOvuDiQWjYCMsO72QHmEM
cKKA0wQ0B0+3NAYbaLeEYEtNkdmaI9OIZgvJ5YFcfXWJcsOiyL6EnN6jlutY
otBIYqXGRD89+P4AA5F7qGCF8yZiORhSOgjNTu8dHOx+++WLVknQnaOnkHg6
+WI8f3HH3iRRKdu6HqIynTWhqGfXliQ+JM7QW1Fd8WSrRU5ZBzSh7HEyQI5f
4Kpc+VOuxHaLEAo8kn95f3pEgsZx0UzWvNTPD6fujy8bgvMpJNo/xoYBpqcX
3ShqV0DCMxYpEeiLO5brqYrqnsZyycMXUrnwhLKZjri8Nc669eLkaNsjqEkO
1czA85/fvn91TI4Qupcwmi8jtEQLzmRCibhRARGbl5e32kc8LGFPT1Llwymz
C3pDZhQtaS0ViiQzTbMvQj83dsnx1RZW5bq5nOUTV8fIPXfqZOWeNj/cTQG1
RQAOrSpyUZB/xtWxEwVcIvCjIvzFEnEbayTbgSSxHHdL8a6UjAkiHQpWxm+H
Inc0nZZBRFMtF0L0VYnweS5LNBC+gm8Fw9GavIZm9NxU+ipWEuvP0Ticzyps
mDzzUZYrUy6HjEL/jOUbYWnK9AIOoEm0xNroqqVorV6SL6kCe5oO01dRZ7Qo
M/bZPQ9wrwaybLvV9UXyOJTAOrJkh/B8+0pL7FAaLMYtsOclSAQuArVNiaDR
yyJezaX9c3Yg03hSyQ3zo0GOkPpYTOdxYlY+05fHZ+nWS25ngUb/ii75WT5D
cxuo8xwgpkAdSCITUK9/2BRtA6+RwNnHga5qXFxb5K7msS/oCqs7eEl8fMWI
wqXqiWUQE2q4+pqv4E09SK+A8hOnJS4PUt/W+dm2NslcYcASUz1TF5sGwUts
0vOD4tEzdb43sjFS9ohza9FclEFoHLIiFFco5flOKFIiTZNaimnpCxJIraot
YxtBFKfBsMNLbI3NKAX3/GxnjhHyGHpKVnafMCcUzxYJw7EMBVSI2k02ZaUR
lUtfDcxXxFt+pFHsTcTYJxFluXxUXHPMIKKiqVYgsBYDRVAvovD+wzJRwLHI
JjJw3gQ3GF2jzLkLOiSDzB9Y2EzNKliQAcifyWgL53L3UMUrH28B6j8CiFu8
9NTKRAhK3TPnYuSaBGS+tfFwYerihgoUXPnDS8qY6vWMZQYnNGqENskf38O/
L188YWxagZhHAClFTJZ1NqoGddSv98n8K+E9QTFiX8OuJtKVzXJCL1cdRJR/
NLOM7umfQBJ3w2sD+YI8GMLjS5B4iNjYbUo+Sbj1qNrqshKxOS+n1YL2mS1F
Adr7ttUNDNTsBI+SChEOCorIUhxkqDc+2acWE6LIakQ13zJFwQkV5grjHb1w
QwfzBKRP2PbZGdUw9LYhUiFZkpdbIVF6rLoCmNZqL5HUN0lyxVX5nAI2ReEn
Py+KiDz5D7u7OLnwZwU7oZPpd0ysneUHqcJP6CeShtNn+afcNqii1he9rajI
7m0b/PR0tqbGyc50afMtcyo6y+FKTIp8QsPXzYdDS+Si+NAbkimXXmHzTQl8
KGhQ1Cbk3DiiT2ey4hxCIhOnX5jqS0s3Bmza8elSNBzxJMnG8fLxSPwa2z+1
cBcSNyx1OylaIuwSuawWSU2oyUfzkQsxmhVauXemKQWI8O/qbL7uC52KT53t
xxi6Ruefo30uU3uQOREsscnYYyqwDqgxDSodrpoF7sd0VhUqIcMW3MqLdCi3
iq3H1O0MianpAaKFFOe1rgaV5QUjjK1r64cWlxqGARbojlV4vTw6GqRLSQw/
4lGOsiUeLFFoXrS3D8Lxe/JGjw/5cVk3hf1NNU5sFoZYBSVJMWhec71sYd/K
tDGx4eGmgFBmiusT/lUUh4Fn7GpA9+eo/eqa1aPkMkrf3PkYTssukDAmlkQ0
X3jFF0Yychh7YmQgY9iSrtEkMKUXx8fpFhWwOi6uCxJIjkFKyT9RBwD0WVC1
3IpEeUxTyAT3JmRdugjcL0XjlWsmkGQX8UvSUqpi9XcVcjrHEpS+UuS2xaS0
hQVd8W5cqL3w6TlIJKUKjcKebWQsX1WGYRMB0ZyDCDuU7lSjWR9EB5nOBrBS
Qb5VVRYTFPU93nCGB9WbJbiFXxGSB03HgPYs1IwTJxgGAiTVlOamZca1F7pt
809F06rftg5WWPSUFkYxjQ93TE7RdR1aB6XTdzRQo7XtCUPYVaZ9INzVjH1M
gcodGXXujHP9QgSSglqEcWLtXm6Lbj2q2oJi3ZKyexNEgQQh9S4QZIFmmNvw
R4KnFADDVAy2u2StcMtyNkQSW8xu40txk3F1IPK5SUQ0ninLjPs/oMzICbIM
Ma7LrsEqtGZpqkGSz3IuTnMnAJEWonb+/d2973g4GZ3mX63HZdFg41DtfjmQ
6FcaOqzC0FZhIXZO1mlBsfK9Iwcs7XHP2DtDgDX61Qsu5A/nae2OpUMm+dPI
E67l6LFh20L65BQ1TR56fRlXTOWILxrnMcUg5bxJzY/mWyOJeeMNK1dRNErT
cpvFKRPD2Qx9HFFVAdtYwRbN1zLx5NgzAfLmGUYZVCKjuNieK3ITpcPSWxrI
c42nMOdouDVW5eC6mEfv3nN8n7Phu4zvzISrePGPXMtoQnFqR8P5l2IB6znw
GwmYKl0jMjtNa6u8+OQtEQ9LTkCxwyK6wDUepSdGCepw5SJu2rWxk636SKk+
nZZa70vAUVMBcjwXWziQN8XVQs7Qd5EaKYdYteRSYbCg3Rd112x6XWjvIT04
1/eQzKLdbr/4O1zw0mTwN+tV2Mkc6cok97S1K1DHNQjuLCnpOr4IM+VeBv4U
cT9DaqIF3AR5jIGbD8b1YoqThdh5EpphuBZGIabx0IKs5Wqi/Ko4G+2i0px6
c5c1fz0yxnHke2d7ztjiIud8OvrGZlbhqrpJZrdSTZAyduh0fgk7iElSpE/x
02p8qnkYQPRtndMjTe/IAOxZ2LAsXRUrcoIIWKnCSatRTjQjg5G13aoWWxvD
WA1zpu5k1FcnhpC2+7nnRt51Ia0noV0jSxDQSJZM+iEfn10cobJTVlRSFiV+
7kOkmrZ1Kabv2bTWzYECBQ3tUiDKETSmay4+HzrfHRXUugauOqXXAbp3zeeq
L9iTkm86lwbmnlzhIgQmehYw4U54HpSn5dprIhtrqGgJQPrPRV2lR69OB+nh
6RBoUMl4pjYxSW62BEA0OozQmlGzn4aqWX6Q24cxJOiGLLg1obifnEdVKYwz
HIP42VYT4AXqU5MajOpUBJq5Q/Ye2JLzoZ0evjnETGiKDxLz/ueHBXB9daNN
q8ma9khlV40zlCIi6H0p0kIDgoiyrjGypzNoI78MJ8EvX6JgAEHG63WJgBNT
KehCGWZGqZOQeFqlnJPKiZCTJoH9qcnV0/pOuAgCrmNPcxUFWLNGMwOClIPV
0xfM0FHuIk8Uc+sd6x30MQGUZwQHCMhcVOsmWRRToLnj6hMX7sB8qH5LZlS6
oxtpgEV3sfFUEApJi29lG1oey5eglqrQFHREqKjRSfRMEu+E6O6yCmBjokSG
wyGlHVLlBhd6xSFAnx/GwVhwuv89Q3XuH//IQJZMzzlQBeWTapit4RDJgALS
corisgR21sBYMQ9b7gTGXPHy0L2sSgQp0CzcoFE/SGNY5dWqdG19ChLqxChD
3hFEPDaGClPXSk3o8aM4PZaHNWOStJJF9Sx9B4v/86+gfGcolg/Sn379n/9f
vUwvANXKYs1X4Mg0BbrKw+vdUEm5DxIjMq8roDr8QLMea8cDzkI8tu+lw91d
MgtlzCJbDrnieDaga+ir4nGGu99JFqNfRjzUHg71Jr/pMk/NLWXHSzbhgK8e
EwDV7Ft2K4LV+QrkSWyaDWp0gdYGVRQ4wsgmjUf1F3xAO7ATDqZ1lqMNBWXu
qUi0lY/mpv7KtpYokpWQ4bylItHrNsrwd5p7u1F1z7iFing4TAUU7fMWPV7n
rrdcsXQBoUssemxWZF8SrVCb5EWARJ3ZhzOQMjC1zWck2EW5UWjUQYwwA/nN
y3ZcA+6oVgQasLWOWtpJG+XE0NG9CLjPbS8X1fVX7div3Ud9tunpycWL4d7+
t9JDM65ioOiiKG2C/LlIwVTkNrUx9ODVBnsezXjcDwJf4+CqGBeuM7OpFKLp
EXzqri2fVR+0Pq9L4yei77rGxFXINYVce0FHmoiWQC1G2nP9LlurWS45sXO2
LQnm+opi+uKPfnxbId3XmYh6uNvRqGIEWu25QBDXYCOuJ4fmDl665HF10oaZ
ZM0IRHTRVO/QE7CZ+Q53Ayohr9+DrE8EakigycoL+JtuMYVE8w7HbtcS2CVH
t02E/jSmzh0qb+addi/Joc9kuOO5FHQWLGSQPuLah1xgN74QWPoB6AH7Tcqq
yTXOmJx9HPK+kL4PXFILpT/xPqPHxXUSFycWG4o00IjytjU2Z8od9KgmBU7F
FSm6zjIcVv1XmLFj/Fcj2k/nWuvlYburYwniAkd/KpWMx1J/Fkt3Fg1NVkit
XtdQkK1DXDOgmYA64mM2QKsPVQqCq6mLHk/gRic5TIkMR2tE1TjiNqfcE8DV
0+Iuv1q1B1P+sAaGLGMitAMXCPIwNmDiYk5afqxxOZhIxNB6gFZ1sh1+BW0G
dO98xcEei+xXjI4Erg1IScEDVO1L4+DoPsHXOBlogAkwVSZH8BLeyXktri8f
C8+Wz6qeZ8uicfRKQpc0gk8CrakUgMTqZmOgYdiDkbGgpSQxCRubcE5gxcWN
v2kobsQ4+UeO9/BazyUOYG+0N8K3HnwA5YYcyls+w2QbZF2ylr5zoTsPJNTP
v78v71+RGZsDc4xO4DnQf32gApi+jO8x9W6CYh3qBtSz2Nt+gHuxW8buz0ol
UXiyQ3r6IQf+gJ2L8sjnzyWy03bYzm4mX76ktrMQg3opIWlvYQHXhVnw58+S
uFHJL/B6zXb2PwBFvHH1HU2QpD6KbtFiTi0dxORFaSfGas1zwmYas5kjX7dl
OfXpwg+UkP/BoTtewTCdGFdUFg3n9LsO2FSRiQI6BNP4gqJdI1MvOchUo77T
OufsjHPQZNNzJFgP9D26kdVCd+UWwsFCps2C7p6YByjxnLREoyx9qJ2HuIiM
w8lkuI9BDXj0D96IHHnkGZv0o3qQsnxFQaPxhtdjt+cCx2ncLNTcFJ3RJAJQ
mdPhJKf56Ax0lmONoFGcAqRF8tR0gXRhvVtudYrEgmK6zwevUCKgmgzvkUD6
eUBKree6ofPugqki65dwsHMORH9XF4haEhnlUCZ4lve3ufRLAM+e6SN4cXjQ
RojdQ4WfOlENbvlaiw05bDwLqnjFnVnikkvi7lazqREfp2jJpKtKL5ZPm0tm
6wPV5FybcJcDxJeE+Nalz96mYtVdFQ/pdCHFlx27Nj3ISdVjeTrQZUzd7LgL
Jukncb9DN9A9cD3ocrcDUqhR4BeTMOzF9AZyxDUjApeThTm0AyR0lSNbQIpR
0TIi3vaw4xDdfdAuaese7BIrJOjJkfa9aobpAJWVVBpdxLF+GZxPt3KVmMhb
afNE2KaMBtyllqNww5CPCNuPZJ8u+2p3sZcr1DloS1R7M5SFpIwRu7PYaEUu
fZDrYJumAigP2tWrrFRPiEs9vqSHNkqm2kG7V1Ni4W/D0Kb0QjHjmKrw4vxy
enbx/vDVpdby7veIuRFETpYEW7RRyCHj4fcXFL4Xf7/ltbt8Arz+t6uqGXW/
79Ms4xvq6n2IfjrNr6mIgDoruErA1PdojsI7REOMh+30NYbH1JZ7T9NntJBK
q+de906xNHjrS0P1tp/2NAyubG9jZTyJza1TN9oUQs+nr4SounEXQuRAaQVr
ykvf/YWyuKzCXjQBd+qj9KoJbHKR0Zh+HN+K3WVjoAsFw1toBNM4Svucc9ep
Oy/25fVly3m6dLcH5hc44ss22MVP67mcnISGcX28O0aeFZ/k3ZjkcCcXO/pr
2qXeGlQoQx1ZbbiZNJq4/5p910FoYzSZdS8+KzIR0gf6oXSKCew1d7Wg8XYp
2zuOUcp3GwpTDUS5V7AitY9afuF5GvM0MCBrVYvFIetsinuapfe1NDM8rNUW
Fhz7QfZPVxqg00fVmCX1oXtal3iVDt755pG2RzoY7I12h0EDoO1v3HpcVRK6
KJ5OxJRwc4xin30lWAq3feaC3Uj3N4Q5WsuM8Ay8oxq1/39hwQYRb6RjpRiK
paWM7QPnjPJfM7GTntCSvgiCIzYY7UND6/8Cy+DiWAY3AQA=

-->

</rfc>
