<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lcurley-moq-use-cases-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.0 -->
  <front>
    <title abbrev="moqtf">Media over QUIC - Use Cases</title>
    <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-use-cases-01"/>
    <author fullname="Luke Curley">
      <organization>Discord</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="22"/>
    <area>wit</area>
    <workgroup>moq</workgroup>
    <abstract>
      <?line 22?>

<t>MoQ is designed to serve live tracks over a CDN to viewers with varying latency and quality targets: the entire spectrum between real-time and VOD.
However, it's difficult to understand how to use the transport given the layering and complexity of live media delivery.
This document outlines how an application could use MoQ to deliver video, audio, and metadata in a variety of scenarios.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Media Over QUIC Working Group mailing list (moq@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/kixelated/moq-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 28?>

<section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Media over QUIC is still in the concept phase; a loose collection of ideas and drafts on how to utilize QUIC for live media delivery.
It's difficult to grasp how to utilize the various layers:</t>
      <ul spacing="normal">
        <li>
          <t>QUIC: A transport layer that provides reliable, ordered, and secure streams.</t>
        </li>
        <li>
          <t>moq-lite: A pub/sub layer that provides caching and fanout.</t>
        </li>
        <li>
          <t>moq-karp: A proposed media layer on top of moq-lite that deals with encoding and containers.</t>
        </li>
        <li>
          <t>Application: Your application that utilizes any of the above layers.</t>
        </li>
      </ul>
      <t>This document briefly overviews how live media works and how you could use MoQ to deliver it.</t>
    </section>
    <section anchor="video">
      <name>Video</name>
      <t>Video encoding involves complex dependencies between frames/slices.
The terminology in this section stems from H.264 but is applicable to most modern codecs.</t>
      <t>Each frame of video is encoded as one or more slices but to simplify the discussion, we'll refer to a slice as a frame.
There are three types of frames:</t>
      <ul spacing="normal">
        <li>
          <t><strong>I-Frame</strong>: A frame that can be decoded independently.</t>
        </li>
        <li>
          <t><strong>P-Frame</strong>: A frame that depends on previous frames.</t>
        </li>
        <li>
          <t><strong>B-Frame</strong>: A frame that depends on previous or future frames.</t>
        </li>
      </ul>
      <section anchor="group-of-pictures">
        <name>Group of Pictures</name>
        <t>A simple application can ignore the complexity of P/B frames and focus on I-Frames.
This is the optimal approach for many encoding configurations.</t>
        <t>Each I-Frame begins a Group of Pictures (GoP).
A GoP is a set of frames that <bcp14>MAY</bcp14> depend on each other and <bcp14>MUST NOT</bcp14> depend on other GoPs.
Each frame has a decode order (DTS) and a frame <bcp14>MUST NOT</bcp14> depend on frames with a higher DTS.</t>
        <t>This perfectly maps to a QUIC stream, as they too are independent and ordered.
The easiest way to use moq-lite is to send each GoP as a GROUP with each frame as a FRAME, hence the names.</t>
        <t>Each SUBSCRIBE starts at a Group to ensure that it starts with an I-Frame.
Each Group is delivered in decode order ensuring that all frames are decodable (no artifacts).</t>
        <t>A subscriber can choose the Group Order based on the desired user experience:</t>
        <ul spacing="normal">
          <li>
            <t><tt>SUBSCRIBE order=DESC</tt>: Transmits new Groups first to allow skipping, intended for low-latency live streams.</t>
          </li>
          <li>
            <t><tt>SUBSCRIBE order=ASC</tt>: Transmits old Groups first to avoid skipping, intended for VOD and reliable live streams.</t>
          </li>
        </ul>
        <t>A publisher or subscriber can skip the remainder of a Group by resetting a Group Stream or by issuing a SUBSCRIBE_UPDATE.
A FETCH can be used to recover any partial groups.</t>
      </section>
      <section anchor="layers">
        <name>Layers</name>
        <t>An advanced application can subdivide a GoP into layers.</t>
        <t>The most comprehensive way to do this is with Scalable Video Coding (SVC).
There is a base layer and one or more enhancement layers that depend on lower layers.
For example, a 4K stream could be broken into 4K, 1080p, and 360p (base) layers.
However, SVC has limited support and is complex to encode.</t>
        <t>Another approach is to use temporal scalability via something like B-pyramids.
The frames within a GoP are sub-divided based on their dependencies, intentionally creating a hierarchy.
For example, even frames could be prevented from referencing odd frames, creating a base 30fps layer and an enhancement 60fps layer.
This is effectively a custom SVC scheme however it's limited to time and doesn't require special decoder support.</t>
        <t>The purpose of these layers is to support degrading the quality of the broadcast.
A subscriber could limit bandwidth usage by choose to only receive the base layer or a subset of the enhancements layers.
During congestion, the base layer can be prioritized while the enhancement layers can be deprioritized or dropped.
However, the cost is a small increase in bitrate (10%) as limiting potential references can only hurt the compression ratio.</t>
        <t>When using moq-lite, each layer is delivered as a separate Track.
This allows the subscriber to choose which layers to receive and how to prioritize them in SUBSCRIBE.
It also enables layers to be prioritized within the layer application, for example Alice's base layer is more important than Bob's enhancement layer.</t>
        <t>The application is responsible for determining the relationship between layers, since they're unrelated tracks as MoqTransport is concerned.
The application could use a catalog to advertise the layers and how to synchronize them, for example based on the Group Sequence.</t>
      </section>
      <section anchor="non-reference-frames">
        <name>Non-Reference Frames</name>
        <t>While not explicitly stated, I believe the complexity in MoqTransport stems almost entirely from a single use-case: the ability to drop individual non-reference frames in the middle of a group.</t>
        <t>In theory, transmitting enhancement layers as tracks like mentioned above could introduce head-of-line blocking depending on the encoding.
This would occur when enhancement layers are not self-referential, a rare configuration which also hurts the compression ratio.
And in practice, there's no discernible user impact given the disproportionate size difference between base and enhancement layers.</t>
        <t>The ability to drop individual non-reference frames in the middle of a group is an explicit non-goal for moq-lite.</t>
      </section>
    </section>
    <section anchor="audio">
      <name>Audio</name>
      <t>Unlike video, audio is simple and yet has perhaps more potential for optimization.</t>
      <section anchor="frames">
        <name>Frames</name>
        <t>Audio samples are very small and for the sake of compression, are grouped into a frame.
This depends on the codec and the sample rate but each frame is typically 10-50ms of audio.</t>
        <t>Audio frames are independent, which means they map nicely to moq-lite Groups.
Each audio frame can be transmitted as a GROUP with a single FRAME.</t>
      </section>
      <section anchor="groups">
        <name>Groups</name>
        <t>Audio FRAMEs can also be combined into periodic GROUPs to reduce overhead at the cost of some introducing head-of-line blocking.
This won't increase latency except under significant congestion as each FRAME is still streamed.</t>
        <t>For example, an application could then subscribe to video and audio starting at group X for both tracks, instead of trying to maintain a mapping between the two based on timestamp.
This is quite common in HLS/DASH as there's no reason to subdivide audio segments at frame boundaries.</t>
      </section>
      <section anchor="fec">
        <name>FEC</name>
        <t>Real-time audio applications often use Forward Error Correction (FEC) to conceal packet loss.
Audio frames are a good candidate for FEC given that they are small and independent.</t>
        <t>In an ideal world, FEC would be performed by QUIC based on the properties of the hop.
However this is not currently not supported and FEC is left to the application.</t>
        <t>In moq-lite, each FEC packet is transmitted as a separate GROUP with a single FRAME.
This means using QUIC streams instead of QUIC datagrams to automatically adjust to the viewer's RTT, automatically retransmitting in scenarios where RTT is small.
Lost packets will be retransmitted unless a real-time subscriber updates the subscription to skip them.
For example, if group 3 and group 5 are used to reconstruct group 4, then the subscriber can update the subscription to start at group 5, causing group 4 to be skipped.</t>
        <t>This round trip of feedback to avoid retransmissions is not ideal but keep in mind that Group Order = DESC will be respected, meaning group 4 won't be (re)transmitted if there's more important data to send.
This can result in wasted bandwidth versus something like a timeout on the sender, but it does not impact the user experience nor are these unnecessarily retransmittted audio FEC packets large enough to matter.</t>
      </section>
    </section>
    <section anchor="metadata">
      <name>Metadata</name>
      <t>There's a number of non-media use cases that can be served by moq-lite.</t>
      <section anchor="catalog">
        <name>Catalog</name>
        <t>Originally part of the transport itself, the catalog is a list of all tracks within a broadcast.
It's since been delegated to the application and is now just another track with a well-known name.</t>
        <t>The proposed MoQ catalog format supports live updates.
It does this by encoding a base JSON blob and then applying JSON patches over time.
If the number of deltas becomes too large, the producer can start over with a new base JSON blob.</t>
        <t>In moq-lite, the base and all deltas are a single GROUP.
The base is the first FRAME and all deltas are subsequent FRAMEs.
The producer can create a new GROUP to start over, repeating the process.</t>
      </section>
      <section anchor="timeline">
        <name>Timeline</name>
        <t>Another track that is commonly pitched is a timeline track.
This records the presentation timestamp of each Group, giving a VOD viewer to seek to a specific time.</t>
        <t>The <tt>timeline</tt> track is a single Group containing a Frame for each timestamp.
The live nature of the timeline track is great for DVR applications while being concise enough for VOD.
Timed metadata would use a similar approach or perhaps leverage this track.</t>
      </section>
      <section anchor="interaction">
        <name>Interaction</name>
        <t>Another common use-case is to transmit user interactions, such as controller inputs or chat messages.
It's up to the application to determine the format and encoding of these messages.</t>
        <t>Let's take controller input as an example.
The application needs to determine its loss vs latency tolerance, as reordering or dropping inputs will lead to a poor user experience.</t>
        <ul spacing="normal">
          <li>
            <t>If you don't want loss, then use a single GROUP with a FRAME per input.</t>
          </li>
          <li>
            <t>If you don't want latency, then use a GROUP per input with a single FRAME.</t>
          </li>
          <li>
            <t>If you want a hybrid, then use form of clustering inputs into GROUPs and FRAMEs based on time.</t>
          </li>
        </ul>
        <t>A publisher could monitor the session RTT or stream acknowledgements to get a sense of the latency and create Groups accordingly.
However, this only applies to the first hop and won't be applicable when relays are involved.</t>
      </section>
    </section>
    <section anchor="latency">
      <name>Latency</name>
      <t>One explicit goal of moq-lite is to support multiple latency targets.</t>
      <t>This is accomplished by using the same Tracks and Group for all viewers, but slightly changing the behavior based on the subscription.
This is driven by the subscriber, allowing them to choose the trade-off between latency and reliability.
This may be done on the fly via SUBSCRIBE_UPDATE, for example if a high-latency viewer wishes to join the stage and suddenly needs real-time latency.</t>
      <t>The below examples assume one audio and one video track.
See the next section for more complicated broadcasts.</t>
      <section anchor="real-time">
        <name>Real-Time</name>
        <t>Real-time latency is accomplished by prioritizing the most important media during congestion and skipping the rest.</t>
        <t>This is slightly different from other media protocols which instead opt to drop packets.
The end result is similar, but prioritization means utilizing all available bandwidth as determined by the congestion controller.
A subscriber or publisher can reset groups to avoid wasting bandwidth on old data.</t>
        <t>A real-time viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=1 order=DESC
SUBSCRIBE track=video priority=0 order=DESC
]]></artwork>
        <t>In this example, audio is higher priority than video, and newer groups are higher priority than older groups.
Suppose a viewer fell behind after a burst of congestion and has to decide which groups to deliver next.
This configuration would result in the transmission order:</t>
        <artwork><![CDATA[
GROUP track=audio sequence=102
GROUP track=audio sequence=101
GROUP track=audio sequence=100
GROUP track=video sequence=5
GROUP track=video sequence=4
]]></artwork>
        <t>The user experience depends on the amount of congestion:</t>
        <ul spacing="normal">
          <li>
            <t>If there's no congestion, all audio and video is delivered.</t>
          </li>
          <li>
            <t>If there's moderate congestion, the tail of the old video group is dropped.</t>
          </li>
          <li>
            <t>If there's severe congestion, all video will be late/dropped and some audio groups/frames will be dropped.</t>
          </li>
        </ul>
      </section>
      <section anchor="unreliable-live">
        <name>Unreliable Live</name>
        <t>Unreliable live is a term I made up.
Basically we want low latency, but we don't need it at all costs and we're willing to skip some video to achieve it.
This is useful for broadcasts where latency is important but so is picture quality.</t>
        <t>An unreliable live viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=1 order=ASC
SUBSCRIBE track=video priority=0 order=DESC
]]></artwork>
        <t>This example is different from the real-time one in that audio is reliable and delivered in order.
Of course this is optional and up to the application, as it will result in buffering during significant congestion.
If the viewer goes through a tunnel and then comes back online, they won't miss any audio.</t>
        <t>Video will be delivered out of order but the player can maintain a jitter buffer.
For example, it could hold onto up to 3s of video frames in memory so it can tolerate an equal amount of congestion.
If the buffer fills up, the player can STOP_SENDING any old groups and/or update the subscription to skip them.</t>
      </section>
      <section anchor="reliable-live">
        <name>Reliable Live</name>
        <t>Reliable live is another term I made up.
This is when we have a live stream but primarily care about picture quality.
A good example is a sports game where you want to see every frame.</t>
        <t>A reliable live viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=0 order=ASC
SUBSCRIBE track=video priority=0 order=ASC
]]></artwork>
        <t>This will deliver both audio and video in order, and with the same priority.
The viewer won't miss any content unless the publisher resets a group.
However, this can result in buffering during congestion and provides a similar user experience to HLS/DASH.</t>
      </section>
      <section anchor="vod-dvr">
        <name>VOD / DVR</name>
        <t>Video on Demand (VOD) and Digital Video Recorder (DVR) both involve seeking backwards in a live stream.
moq-lite can serve this use-case too, don't worry.</t>
        <t>A VOD viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=0 order=ASC start=345 end=396
SUBSCRIBE track=video priority=0 order=ASC start=123 end=134
]]></artwork>
        <t>The application is responsible for determining the group sequence numbers based on the desired timestamp.
This could be done via a <tt>timeline</tt> track or out-of-band.</t>
        <t>A subscriber will need a specific <tt>end</tt> or else it will download too much data at once, as old media is transmitted at network speed and not encode speed.
It will need to issue an updated SUBSCRIBE to expand the range as playback continues and the buffer depletes.
A subscriber could use SUBSCRIBE_UPDATE, however there are race conditions involved.</t>
        <t>A DVR player does the same thing but can automatically support joining the live stream.
It's perfectly valid to specify a <tt>end</tt> in the future and it will behave like reliable live viewer once it reaches the live playhead.</t>
        <t>Alternatively, a DVR player could prefetch the live playhead by issuing a parallel SUBSCRIBE at a lower priority.
This would allow playback to immediately continue after clicking the "Go Live" button, canceling or deprioritizing the VOD subscription.</t>
        <artwork><![CDATA[
SUBSCRIBE track=video priority=1 order=ASC start=123 end=134
SUBSCRIBE track=video priority=0 order=DESC
]]></artwork>
      </section>
      <section anchor="upstream">
        <name>Upstream</name>
        <t>All of these separate viewers could be watching the same broadcast.
How is a relay supposed to fetch the content from upstream?</t>
        <t>moq-lite addresses this by providing the publisher's Track Priority and Group Order in the INFO message.
This is the intended behavior for the first hop and dictates which viewers are preferred.</t>
        <t>For example, suppose the producer chooses:</t>
        <artwork><![CDATA[
INFO track=audio priority=1 order=DESC
INFO track=video priority=0 order=DESC
]]></artwork>
        <t>If Alice is watching a VOD and issues:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=0 order=ASC
SUBSCRIBE track=video priority=0 order=ASC
]]></artwork>
        <t>If Bob is watching real-time and issues:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=1 order=DESC
SUBSCRIBE track=video priority=0 order=DESC
]]></artwork>
        <t>For any congestion on the first mile, then the relay will improve Bob's experience by following the producer's preference.
However any congestion on the last mile will always use the viewer's preference.</t>
        <t>A relay should use the publisher's priority/order only when there's a conflict.
If viewers have the same priority/order, then the relay should use the viewer's preference and it can always issue a SUBSCRIBE_UPDATE when this changes.</t>
      </section>
    </section>
    <section anchor="broadcast">
      <name>Broadcast</name>
      <t>A broadcast is a collection of tracks from a single producer.
This usually includes an audio track and/or a video track, but there are reasons to have more than that.
This is transparent to moq-lite, as the a higher level application is responsible for any grouping between tracks.</t>
      <section anchor="abr">
        <name>ABR</name>
        <t>Virtually all mass fan-out use-cases rely on Adaptive Bitrate (ABR) streaming.
The idea is to encode the same content at multiple bitrates and resolutions, allowing the viewer to choose based on their unique situation.</t>
        <t>moq-lite unsurprisingly supports this via multiple Tracks, but relies on the application to determine the relationship between them.
This is often done via a <tt>catalog</tt> track that details each track's name, bitrate, resolution, and codec.
This includes how a group in one track corresponds to a group in another track.
A common approach is to use the same Group Sequence number for all tracks, or perhaps utilize a <tt>timeline</tt> track to map between Group Sequences and presentation timestamps.</t>
        <t>The viewer may limit the available tracks based on capabilities or preferences.
For example, the device may not support the 4K track since it uses AV1, or the screen size may be too small to justify the bandwidth.
This is easy enough to support; just ignore these tracks in the catalog.</t>
        <t>The primary reason to use ABR is to adapt to changing network conditions.
The viewer learns about the estimated bandwidth via the SESSION_UPDATE message, or by measuring network traffic and can then choose the appropriate track based on bitrate.</t>
        <t>Transitioning between tracks can be done seamlessly by utilizing prioritization.
For example, suppose a viewer is watching the 360p track and wants to switch to 1080p at group 69.</t>
        <t>A real-time or unreliable live viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE track=360p  priority=0 order=DESC end=69
SUBSCRIBE        track=1080p priority=1 order=DESC start=69
]]></artwork>
        <t>A reliable live or VOD viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE track=360p  priority=1 order=ASC end=69
SUBSCRIBE        track=1080p priority=0 order=ASC start=69
]]></artwork>
        <t>The difference between them is whether to prioritize the old track or the new track.
In both scenarios, the subscription will seamlessly switch at group 69 even if it's seconds in the future.
The same behavior can be used to switch down.</t>
      </section>
      <section anchor="svc">
        <name>SVC</name>
        <t>We touched on SVC before, but it's worth mentioning as an alternative to ABR.
I want to see it used more often but I doubt it will be.</t>
        <t>Instead of choosing the track based on the bitrate, the viewer subscribes to them all:</t>
        <artwork><![CDATA[
SUBSCRIBE track=360p  priority=2 order=DESC
SUBSCRIBE track=1080p priority=1 order=DESC
SUBSCRIBE track=4k    priority=0 order=DESC
]]></artwork>
        <t>During congestion, the 4k enhancement layer will be deprioritized followed by the 1080p enhancement layer.
This is a more efficient use of bandwidth than ABR, but it requires more complex encoding.</t>
      </section>
    </section>
    <section anchor="conferences">
      <name>Conferences</name>
      <t>Some applications involve multiple producers, such as a conference calls or a live events.
Even though these are separate broadcasts from potentially separate origins, moq-lite can still serve them over the same session.</t>
      <section anchor="discovery">
        <name>Discovery</name>
        <t>The first step to joining a conference is to discover the available tracks.</t>
        <t>That's where <tt>ANNOUNCE</tt> comes in.
The subscriber indicates interest in any tracks that start with a prefix, such as <tt>["meeting", "1234"]</tt>.
As new participants join, new tracks are announced, and the subscriber can choose to subscribe to them.</t>
      </section>
      <section anchor="participants">
        <name>Participants</name>
        <t>Extending the idea that audio is more important than video, we can prioritize tracks regardless of the source.
This works because <tt>SUBSCRIBE priority</tt> is scoped to the session and not the broadcast.</t>
        <artwork><![CDATA[
SUBSCRIBE track=[alice, audio] priority=3
SUBSCRIBE track=[frank, audio] priority=3
SUBSCRIBE track=[alice, video] priority=1
SUBSCRIBE track=[frank, video] priority=1
]]></artwork>
        <t>When Alice starts talking or is focused, we can actually issue a SUBSCRIBE_UPDATE to increase her priority:</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE track=[alice, audio] priority=2
SUBSCRIBE_UPDATE track=[frank, video] priority=0
]]></artwork>
        <t>Note that audio is still more important than video, but Alice is now more important than Frank. (poor Frank)</t>
        <t>This concept can further be extended to work with SVC or ABR:</t>
        <artwork><![CDATA[
SUBSCRIBE track=[alice, 360p] priority=4
SUBSCRIBE track=[frank, 360p] priority=3
SUBSCRIBE track=[alice, 720p] priority=2
SUBSCRIBE track=[frank, 720p] priority=1
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <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="RFC8174">
        <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>
    </references>
    <?line 451?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vc/3LbyJH+H0+B09bV2lukbNneTVaJk5Mlea3ElhxJdi6V
SsUgMCQRgRguBhDNpJJnuWe5J7v+unsGA5B2zre5VGp3RQLzo6f76+6vezid
TpO2bCtznB68MUWZpfbeNOnv3l2cptP0nTPpaeaMO0iy2awx9/TUyv7Yzg+S
PGvNwjbb47Ss5zZJCpvX2YqGKZps3k6rvGsqs53S09POmWmOUaaPjxLXzVal
c6Wt2+2aHr84v32Zpl+lWeUsjV7WhVkb+kfdHkzSA1pRa5syq/DHxckL+pdt
6L+ub18eJHW3mpnmOCloKccJre1pkjUmO043ZZtsbHO3aGy3Pk5pDUmSde3S
0sPpNEnpf/OuqmS9r7s72iSvlr+xzSKry79mLS3xOD0rXW6bgr8xq6ysjtO7
8qOpaMriPxb44DC3qySBEJoVvXRPS0mm02mazVzbZHmbJG/s79LSpYVx5aI2
Rdra1Jnm3qQVPZ3ioTsnYs/S07NLfH9fmo1pHHayTO+zZlvWixST1vk2zeoi
/bHLqrLdpm3WLEzrjtN2aVISWtmY1K1N3jbdKp2ZdmNMnZJQqmlbrgy/+v7q
7DB5ZTeGZpykZfs1La2cz8u8q1rM3ZH0G9fi0aXd8CekBhifllq7tW3adEEr
r/mzKtuaBqvD8ySKdWU+YmF2LttbsVIVBn8028PkdglR2Lxb0WpT27VVWRvH
M2V1mq3XVZmz7Gmwrip4bgiQlqGDkHAKYydp1hUl/kXzrkybkRZkpIskQ5JX
aWQJLjc1/WXdoRzKqiyKyiTJV+mpre8hL1s7HuLMzMu65L9pjSa9M9uUdKhw
ZBfvbm6hf/h3ennF/319TiZyfX6G/755dfL6dfiPRJ+4eXX17vVZ/1/9m6dX
b96cX57Jy/RpOvgoOXhz8ocD2dfB1dvbi6vLk9cH2Fk7EB2pOoQyM/RVa5p1
Y0gl08wlpGd5U87oD3rnxenb//6vo2fp3/72b9cvT58cHX3/97/rHz8/+tkz
+mOzNLXMZutqq3/SyW4TOgyTNSzTqkrzbF22ZKX0rEsdnVedLk1jSLDf/BGS
+dNx+stZvj569iv9ABsefOhlNviQZbb7yc7LIsQ9H+2ZJkhz8PlI0sP1nvxh
8LeXe/ThL38NTU2nRz//9a+SBCp0UbeNLbocSpOMwZOOyrUlya0UO8ltnZt1
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
qClhE+hSAAA=

-->

</rfc>
