<?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-rfc2629 version 1.6.2 (Ruby 3.0.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-taps-impl-12" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title abbrev="TAPS Implementation">Implementing Interfaces to Transport Services</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-taps-impl-12"/>
    <author initials="A." surname="Brunstrom" fullname="Anna Brunstrom" role="editor">
      <organization>Karlstad University</organization>
      <address>
        <postal>
          <street>Universitetsgatan 2</street>
          <city>651 88 Karlstad</city>
          <country>Sweden</country>
        </postal>
        <email>anna.brunstrom@kau.se</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="T." surname="Enghardt" fullname="Theresa Enghardt">
      <organization>Netflix</organization>
      <address>
        <postal>
          <street>121 Albright Way</street>
          <city>Los Gatos, CA 95032</city>
          <country>United States of America</country>
        </postal>
        <email>ietf@tenghardt.net</email>
      </address>
    </author>
    <author initials="P." surname="Tiesel" fullname="Philipp S. Tiesel">
      <organization>SAP SE</organization>
      <address>
        <postal>
          <street>Konrad-Zuse-Ring 10</street>
          <city>14469 Potsdam</city>
          <country>Germany</country>
        </postal>
        <email>philipp@tiesel.net</email>
      </address>
    </author>
    <author initials="M." surname="Welzl" fullname="Michael Welzl">
      <organization>University of Oslo</organization>
      <address>
        <postal>
          <street>PO Box 1080 Blindern</street>
          <city>0316  Oslo</city>
          <country>Norway</country>
        </postal>
        <email>michawe@ifi.uio.no</email>
      </address>
    </author>
    <date year="2022" month="March" day="07"/>
    <area>Transport</area>
    <workgroup>TAPS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Transport Services system enables applications to use transport protocols flexibly for network communication
and defines a protocol-independent Transport Services Application Programming Interface (API) that is based on an asynchronous, 
event-driven interaction pattern. This document serves as a guide to implementation on how to build such a system.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The Transport Services architecture <xref target="I-D.ietf-taps-arch"/> defines a system that allows applications to flexibly use transport networking protocols. The API that such a system exposes to applications is defined as the Transport Services API <xref target="I-D.ietf-taps-interface"/>. This API is designed to be generic across multiple transport protocols and sets of protocols features.</t>
      <t>This document serves as a guide to implementation on how to build a system that provides a Transport Services API. It is the job of an implementation of a Transport Services system to turn the requests of an application into decisions on how to establish connections, and how to transfer data over those connections once established. The terminology used in this document is based on the Architecture <xref target="I-D.ietf-taps-arch"/>.</t>
    </section>
    <section anchor="implementing-connection-objects">
      <name>Implementing Connection Objects</name>
      <t>The connection objects that are exposed to applications for Transport Services are:</t>
      <ul spacing="normal">
        <li>the Preconnection, the bundle of Properties that describes the application constraints on, and preferences for, the transport;</li>
        <li>the Connection, the basic object that represents a flow of data as Messages in either direction between the Local and Remote Endpoints;</li>
        <li>and the Listener, a passive waiting object that delivers new Connections.</li>
      </ul>
      <t>Preconnection objects should be implemented as bundles of properties that an application can both read and write. A Preconnection object influences a Connection only at one point in time: when the Connection is created. Connection objects represent the interface between the application and the implementation to manage transport state, and conduct data transfer. During the process of establishment (<xref target="conn-establish"/>), the Connection will not be bound to a specific transport protocol instance, since multiple candidate Protocol Stacks might be raced.</t>
      <t>Once a Preconnection has been used to create an outbound Connection or a Listener, the implementation should ensure that the copy of the properties held by the Connection or Listener cannot be mutated by the application making changes to the original Preconnection object. This may involve the implementation performing a deep-copy, copying the object with all the objects that it references.</t>
      <t>Once the Connection is established, Transport Services implementation maps actions and events to the details of the chosen Protocol Stack. For example, the same Connection object may ultimately represent a single instance of one transport protocol (e.g., a TCP connection, a TLS session over TCP, a UDP flow with fully-specified Local and Remote Endpoints, a DTLS session, a SCTP stream, a QUIC stream, or an HTTP/2 stream).
The properties held by a Connection or Listener is independent of other connections that are not part of the same Connection Group.</t>
      <t>Connection establishment is only a local operation for a Datagram transport (e.g., UDP(-Lite)), which serves to simplify the local send/receive functions and to filter the traffic for the specified addresses and ports <xref target="RFC8085"/>.</t>
      <t>Once Initiate has been called, the Selection Properties and Endpoint information are immutable (i.e, an application is not able to later modify Selection Properties on the original Preconnection object).
Listener objects are created with a Preconnection, at which point their configuration should be considered immutable by the implementation. The process of listening is described in <xref target="listen"/>.</t>
    </section>
    <section anchor="implementing-pre-establishment">
      <name>Implementing Pre-Establishment</name>
      <t>During pre-establishment the application specifies one or more Endpoints to be used for communication as well as protocol preferences and constraints via Selection Properties and, if desired, also Connection Properties. Generally, Connection Properties should be configured as early as possible, because they can serve as input to decisions that are made by the implementation (e.g., the Capacity Profile can guide usage of a protocol offering scavenger-type congestion control).</t>
      <t>The implementation stores these properties as a part of the Preconnection object for use during connection establishment. For Selection Properties that are not provided by the application, the implementation must use the default values specified in the Transport Services API (<xref target="I-D.ietf-taps-interface"/>).</t>
      <section anchor="configuration-time-errors">
        <name>Configuration-time errors</name>
        <t>The Transport Services system should have a list of supported protocols available, which each have transport features reflecting the capabilities of the protocol. Once an application specifies its Transport Properties, the transport system matches the required and prohibited properties against the transport features of the available protocols.</t>
        <t>In the following cases, failure should be detected during pre-establishment:</t>
        <ul spacing="normal">
          <li>A request by an application for Protocol Properties that cannot be satisfied by any of the available protocols. For example, if an application requires "Configure Reliability per Message", but no such feature is available in any protocol the host running the transport system on the host running the transport system this should result in an error, e.g., when SCTP is not supported by the operating system.</li>
          <li>A request by an application for Protocol Properties that are in conflict with each other, i.e., the required and prohibited properties cannot be satisfied by the same protocol. For example, if an application prohibits "Reliable Data Transfer" but then requires "Configure Reliability per Message", this mismatch should result in an error.</li>
        </ul>
        <t>To avoid allocating resources that are not finally needed, it is important that configuration-time errors fail as early as possible.</t>
      </section>
      <section anchor="role-of-system-policy">
        <name>Role of system policy</name>
        <t>The properties specified during pre-establishment have a close relationship to system policy. The implementation is responsible for combining and reconciling several different sources of preferences when establishing Connections. These include, but are not limited to:</t>
        <ol spacing="normal" type="1"><li>Application preferences, i.e., preferences specified during the pre-establishment via Selection Properties.</li>
          <li>Dynamic system policy, i.e., policy compiled from internally and externally acquired information about available network interfaces, supported transport protocols, and current/previous Connections. Examples of ways to externally retrieve policy-support information are through OS-specific statistics/measurement tools and tools that reside on middleboxes and routers.</li>
          <li>Default implementation policy, i.e., predefined policy by OS or application.</li>
        </ol>
        <t>In general, any protocol or path used for a connection must conform to all three sources of constraints. A violation that occurs at any of the policy layers should cause a protocol or path to be considered ineligible for use. For an example of application preferences leading to constraints, an application may prohibit the use of metered network interfaces for a given Connection to avoid user cost. Similarly, the system policy at a given time may prohibit the use of such a metered network interface from the application's process. Lastly, the implementation itself may default to disallowing certain network interfaces unless explicitly requested by the application and allowed by the system.</t>
        <t>It is expected that the database of system policies and the method of looking up these policies will vary across various platforms. An implementation should attempt to look up the relevant policies for the system in a dynamic way to make sure it is reflecting an accurate version of the system policy, since the system's policy regarding the application's traffic may change over time due to user or administrative changes.</t>
      </section>
    </section>
    <section anchor="conn-establish">
      <name>Implementing Connection Establishment</name>
      <t>The process of establishing a network connection begins when an application expresses intent to communicate with a Remote Endpoint by calling Initiate. (At this point, any constraints or requirements the application may have on the connection are available from pre-establishment.) The process can be considered complete once there is at least one Protocol Stack that has completed any required setup to the point that it can transmit and receive the application's data.</t>
      <t>Connection establishment is divided into two top-level steps: Candidate Gathering, to identify the paths, protocols, and endpoints to use, and Candidate Racing (see Section 4.2.2 of <xref target="I-D.ietf-taps-arch"/>), in which the necessary protocol handshakes are conducted so that the transport system can select which set to use.</t>
      <t>This document structures the candidates for racing as a tree as terminological convention. While a 
a tree structure is not the only way in which racing can be implemented, it does ease the illustration of how racing works.</t>
      <t>The most simple example of this process might involve identifying the single IP address to which the implementation wishes to connect, using the system's current default path (i.e., using the default interface), and starting a TCP handshake to establish a stream to the specified IP address. However, each step may also differ depending on the requirements of the connection: if the endpoint is defined as a hostname and port, then there may be multiple resolved addresses that are available; there may also be multiple paths available, (in this case using an interface other than the default system interface); and some protocols may not need any transport handshake to be considered "established" (such as UDP), while other connections may utilize layered protocol handshakes, such as TLS over TCP.</t>
      <t>Whenever an implementation has multiple options for connection establishment, it can view the set of all individual connection establishment options as a single, aggregate connection establishment. The aggregate set conceptually includes every valid combination of endpoints, paths, and protocols. As an example, consider an implementation that initiates a TCP connection to a hostname + port endpoint, and has two valid interfaces available (Wi-Fi and LTE). The hostname resolves to a single IPv4 address on the Wi-Fi network, and resolves to the same IPv4 address on the LTE network, as well as a single IPv6 address. The aggregate set of connection establishment options can be viewed as follows:</t>
      <artwork><![CDATA[
Aggregate [Endpoint: www.example.com:80] [Interface: Any]   [Protocol: TCP]
|-> [Endpoint: 192.0.2.1:80]       [Interface: Wi-Fi] [Protocol: TCP]
|-> [Endpoint: 192.0.2.1:80]       [Interface: LTE]   [Protocol: TCP]
|-> [Endpoint: 2001:DB8::1.80]     [Interface: LTE]   [Protocol: TCP]
]]></artwork>
      <t>Any one of these sub-entries on the aggregate connection attempt would satisfy the original application intent. The concern of this section is the algorithm defining which of these options to try, when, and in what order.</t>
      <t>During Candidate Gathering, an implementation first excludes all protocols and
paths that match a Prohibit or do not match all Require properties.
Then, the implementation will sort branches according to Preferred
properties, Avoided properties, and possibly other criteria.</t>
      <section anchor="structuring-candidates-as-a-tree">
        <name>Structuring Candidates as a Tree</name>
        <t>As noted above, the considereration of multiple candidates in a gathering and racing process can be conceptually structured as a tree; this terminological convention is used throughout this document.</t>
        <t>Each leaf node of the tree represents a single, coherent connection attempt, with an endpoint, a network path, and a set of protocols that can directly negotiate and send data on the network. Each node in the tree that is not a leaf represents a connection attempt that is either underspecified, or else includes multiple distinct options. For example, when connecting on an IP network, a connection attempt to a hostname and port is underspecified, because the connection attempt requires a resolved IP address as its Remote Endpoint. In this case, the node represented by the connection attempt to the hostname is a parent node, with child nodes for each IP address. Similarly, an implementation that is allowed to connect using multiple interfaces will have a parent node of the tree for the decision between the network paths, with a branch for each interface.</t>
        <t>The example aggregate connection attempt above can be drawn as a tree by grouping the addresses resolved on the same interface into branches:</t>
        <artwork><![CDATA[
                             ||
                +==========================+
                |  www.example.com:80/Any  |
                +==========================+
                  //                    \\
+==========================+       +==========================+
| www.example.com:80/Wi-Fi |       |  www.example.com:80/LTE  |
+==========================+       +==========================+
             ||                      //                    \\
  +====================+  +====================+  +======================+
  | 192.0.2.1:80/Wi-Fi |  |  192.0.2.1:80/LTE  |  |  2001:DB8::1.80/LTE  |
  +====================+  +====================+  +======================+
]]></artwork>
        <t>The rest of this section will use a notation scheme to represent this tree. The parent (or trunk) node of the tree will be represented by a single integer, such as "1". Each child of that node will have an integer that identifies it, from 1 to the number of children. That child node will be uniquely identified by concatenating its integer to it's parents identifier with a dot in between, such as "1.1" and "1.2". Each node will be summarized by a tuple of three elements: endpoint, path (labeled here by interface), and protocol. The above example can now be written more succinctly as:</t>
        <artwork><![CDATA[
1 [www.example.com:80, Any, TCP]
  1.1 [www.example.com:80, Wi-Fi, TCP]
    1.1.1 [192.0.2.1:80, Wi-Fi, TCP]
  1.2 [www.example.com:80, LTE, TCP]
    1.2.1 [192.0.2.1:80, LTE, TCP]
    1.2.2 [2001:DB8::1.80, LTE, TCP]
]]></artwork>
        <t>When an implementation views this aggregate set of connection attempts as a single connection establishment, it only will use one of the leaf nodes to transfer data. Thus, when a single leaf node becomes ready to use, then the entire connection attempt is ready to use by the application. Another way to represent this is that every leaf node updates the state of its parent node when it becomes ready, until the trunk node of the tree is ready, which then notifies the application that the connection as a whole is ready to use.</t>
        <t>A connection establishment tree may be degenerate, and only have a single leaf node, such as a connection attempt to an IP address over a single interface with a single protocol.</t>
        <artwork><![CDATA[
1 [192.0.2.1:80, Wi-Fi, TCP]
]]></artwork>
        <t>A parent node may also only have one child (or leaf) node, such as a when a hostname resolves to only a single IP address.</t>
        <artwork><![CDATA[
1 [www.example.com:80, Wi-Fi, TCP]
  1.1 [192.0.2.1:80, Wi-Fi, TCP]
]]></artwork>
        <section anchor="branch-types">
          <name>Branch Types</name>
          <t>There are three types of branching from a parent node into one or more child nodes. Any parent node of the tree must only use one type of branching.</t>
          <section anchor="derived-endpoints">
            <name>Derived Endpoints</name>
            <t>If a connection originally targets a single endpoint, there may be multiple endpoints of different types that can be derived from the original. This creates an ordered list of the derived endpoints according to application preference, system policy and expected performance.</t>
            <t>DNS hostname-to-address resolution is the most common method of endpoint derivation. When trying to connect to a hostname endpoint on a traditional IP network, the implementation should send DNS queries for both A (IPv4) and AAAA (IPv6) records if both are supported on the local interface. The algorithm for ordering and racing these addresses should follow the recommendations in Happy Eyeballs <xref target="RFC8305"/>.</t>
            <artwork><![CDATA[
1 [www.example.com:80, Wi-Fi, TCP]
  1.1 [2001:DB8::1.80, Wi-Fi, TCP]
  1.2 [192.0.2.1:80, Wi-Fi, TCP]
  1.3 [2001:DB8::2.80, Wi-Fi, TCP]
  1.4 [2001:DB8::3.80, Wi-Fi, TCP]
]]></artwork>
            <t>DNS-Based Service Discovery <xref target="RFC6763"/> can also provide an endpoint derivation step. When trying to connect to a named service, the client may discover one or more hostname and port pairs on the local network using multicast DNS <xref target="RFC6762"/>. These hostnames should each be treated as a branch that can be attempted independently from other hostnames. Each of these hostnames might resolve to one or more addresses, which would create multiple layers of branching.</t>
            <artwork><![CDATA[
1 [term-printer._ipp._tcp.meeting.ietf.org, Wi-Fi, TCP]
  1.1 [term-printer.meeting.ietf.org:631, Wi-Fi, TCP]
    1.1.1 [31.133.160.18.631, Wi-Fi, TCP]
]]></artwork>
            <t>Applications can influence which derived endpoints are allowed and preferred via Selection Properties set on the Preconnection. For example, setting a preference for <tt>useTemporaryLocalAddress</tt> would prefer the use of IPv6 over IPv4, and requiring <tt>useTemporaryLocalAddress</tt> would eliminate IPv4 options, since IPv4 does not support temporary addresses.</t>
          </section>
          <section anchor="alternate-paths">
            <name>Alternate Paths</name>
            <t>If a client has multiple network paths available to it, e.g., a mobile client with intefaces for both Wi-Fi and Cellular connectivity, it can attempt a connection over any of the paths. This represents a branch point in the connection establishment. Similar to a derived endpoint, the paths should be ranked based on preference, system policy, and performance. Attempts should be started on one path (e.g., a specific interface), and then successively on other paths (or interfaces) after delays based on expected path round-trip-time or other available metrics.</t>
            <artwork><![CDATA[
1 [192.0.2.1:80, Any, TCP]
  1.1 [192.0.2.1:80, Wi-Fi, TCP]
  1.2 [192.0.2.1:80, LTE, TCP]
]]></artwork>
            <t>This same approach applies to any situation in which the client is aware of multiple links or views of the network. A single interface may be shared by
multiple network paths, each with a coherent set of addresses, routes, DNS server, and more. A path may also represent a virtual interface service such as a Virtual Private Network (VPN).</t>
            <t>The list of available paths should be constrained by any requirements the application sets, as well as by the system policy.</t>
          </section>
          <section anchor="protocol-options">
            <name>Protocol Options</name>
            <t>Differences in possible protocol compositions and options can also provide a branching point in connection establishment. This allows clients to be resilient to situations in which a certain protocol is not functioning on a server or network.</t>
            <t>This approach is commonly used for connections with optional proxy server configurations. A single connection might have several options available: an HTTP-based proxy, a SOCKS-based proxy, or no proxy. These options should be ranked and attempted in succession.</t>
            <artwork><![CDATA[
1 [www.example.com:80, Any, HTTP/TCP]
  1.1 [192.0.2.8:80, Any, HTTP/HTTP Proxy/TCP]
  1.2 [192.0.2.7:10234, Any, HTTP/SOCKS/TCP]
  1.3 [www.example.com:80, Any, HTTP/TCP]
    1.3.1 [192.0.2.1:80, Any, HTTP/TCP]
]]></artwork>
            <t>This approach also allows a client to attempt different sets of application and transport protocols that, when available, could provide preferable features. For example, the protocol options could involve QUIC <xref target="I-D.ietf-quic-transport"/> over UDP on one branch, and HTTP/2 <xref target="RFC7540"/> over TLS over TCP on the other:</t>
            <artwork><![CDATA[
1 [www.example.com:443, Any, Any HTTP]
  1.1 [www.example.com:443, Any, QUIC/UDP]
    1.1.1 [192.0.2.1:443, Any, QUIC/UDP]
  1.2 [www.example.com:443, Any, HTTP2/TLS/TCP]
    1.2.1 [192.0.2.1:443, Any, HTTP2/TLS/TCP]
]]></artwork>
            <t>Another example is racing SCTP with TCP:</t>
            <artwork><![CDATA[
1 [www.example.com:80, Any, Any Stream]
  1.1 [www.example.com:80, Any, SCTP]
    1.1.1 [192.0.2.1:80, Any, SCTP]
  1.2 [www.example.com:80, Any, TCP]
    1.2.1 [192.0.2.1:80, Any, TCP]
]]></artwork>
            <t>Implementations that support racing protocols and protocol options should maintain a history of which protocols and protocol options successfully established, on a per-network and per-endpoint basis (see <xref target="performance-caches"/>). This information can influence future racing decisions to prioritize or prune branches.</t>
          </section>
        </section>
        <section anchor="branching-order-of-operations">
          <name>Branching Order-of-Operations</name>
          <t>Branch types must occur in a specific order relative to one another to avoid creating leaf nodes with invalid or incompatible settings. In the example above, it would be invalid to branch for derived endpoints (the DNS results for www.example.com) before branching between interface paths, since there are situations when the results will be different across networks due to private names or different supported IP versions. Implementations must be careful to branch in an order that results in usable leaf nodes whenever there are multiple branch types that could be used from a single node.</t>
          <t>The order of operations for branching should be:</t>
          <ol spacing="normal" type="1"><li>Alternate Paths</li>
            <li>Protocol Options</li>
            <li>Derived Endpoints</li>
          </ol>
          <t>where a lower number indicates higher precedence and therefore higher placement in the tree. Branching between paths is the first in the list because results across multiple interfaces are likely not related to one another: endpoint resolution may return different results, especially when using locally resolved host and service names, and which protocols are supported and preferred may differ across interfaces. Thus, if multiple paths are attempted, the overall connection can be seen as a race between the available paths or interfaces.</t>
          <t>Protocol options are next checked in order. Whether or not a set of protocol, or protocol-specific options, can successfully connect is generally not dependent on which specific IP address is used. Furthermore, the protocol stacks being attempted may influence or altogether change the endpoints being used. Adding a proxy to a connection's branch will change the endpoint to the proxy's IP address or hostname. Choosing an alternate protocol may also modify the ports that should be selected.</t>
          <t>Branching for derived endpoints is the final step, and may have multiple layers of derivation or resolution, such as DNS service resolution and DNS hostname resolution.</t>
          <t>For example, if the application has indicated both a preference for WiFi over LTE and for a feature only available in SCTP, branches will be first sorted accord to path selection, with WiFi at the top. Then, branches with SCTP will be sorted to the top within their subtree according to the properties influencing protocol selection. However, if the implementation has current cache information that SCTP is not available on the path over WiFi, there is no SCTP node in the WiFi subtree. Here, the path over WiFi will be tried first, and, if connection establishment succeeds, TCP will be used. So the Selection Property of preferring WiFi takes precedence over the Property that led to a preference for SCTP.</t>
          <artwork><![CDATA[
1. [www.example.com:80, Any, Any Stream]
1.1 [192.0.2.1:80, Wi-Fi, Any Stream]
1.1.1 [192.0.2.1:80, Wi-Fi, TCP]
1.2 [192.0.3.1:80, LTE, Any Stream]
1.2.1 [192.0.3.1:80, LTE, SCTP]
1.2.2 [192.0.3.1:80, LTE, TCP]
]]></artwork>
        </section>
        <section anchor="branch-sorting">
          <name>Sorting Branches</name>
          <t>Implementations should sort the branches of the tree of connection options in order of their preference rank, from most preferred to least preferred.
Leaf nodes on branches with higher rankings represent connection attempts that will be raced first.
Implementations should order the branches to reflect the preferences expressed by the application for its new connection, including Selection Properties, which are specified in <xref target="I-D.ietf-taps-interface"/>.</t>
          <t>In addition to the properties provided by the application, an implementation may include additional criteria such as cached performance estimates, see <xref target="performance-caches"/>, or system policy, see <xref target="role-of-system-policy"/>, in the ranking.
Two examples of how Selection and Connection Properties may be used to sort branches are provided below:</t>
          <ul spacing="normal">
            <li>"Interface Instance or Type":
If the application specifies an interface type to be preferred or avoided, implementations should accordingly rank the paths.
If the application specifies an interface type to be required or prohibited, an implementation is expeceted to not include the non-conforming paths.</li>
            <li>
              <t>"Capacity Profile":
An implementation can use the Capacity Profile to prefer paths that match an application's expected traffic pattern. This match will use cached performance estimates, see <xref target="performance-caches"/>:  </t>
              <ul spacing="normal">
                <li>Scavenger:
Prefer paths with the highest expected available capacity, but minimising impact on other traffic, based on the observed maximum throughput;</li>
                <li>Low Latency/Interactive:
Prefer paths with the lowest expected Round Trip Time, based on observed round trip time estimates;</li>
                <li>Low Latency/Non-Interactive:
Prefer paths with a low expected Round Trip Time, but can tolerate delay variation;</li>
                <li>Constant-Rate Streaming:
Prefer paths that are expected to satisy the requested Stream Send or Stream Receive Bitrate, based on the observed maximum throughput;</li>
                <li>Capacity-Seeking: 
Prefer adapting to paths to determine the highest available capacity, based on the observed maximum throughput.</li>
              </ul>
            </li>
          </ul>
          <t>Implementations process the Properties in the following order: Prohibit, Require, Prefer, Avoid.
If Selection Properties contain any prohibited properties, the implementation should first purge branches containing nodes with these properties. For required properties, it should only keep branches that satisfy these requirements. Finally, it should order the branches according to the preferred properties, and finally use any avoided properties as a tiebreaker.
When ordering branches, an implementation can give more weight to properties that the application has explicitly set, than to the properties that are default.</t>
          <t>The available protocols and paths on a specific system and in a specific context can change; therefore, the result of sorting and the outcome of racing may vary, even when using the same Selection and Connection Properties. However, an implementation ought to provide a consistent outcome to applications, e.g., by preferring protocols and paths that are already used by existing Connections that specified similar Properties.</t>
        </section>
      </section>
      <section anchor="gathering">
        <name>Candidate Gathering</name>
        <t>The step of gathering candidates involves identifying which paths, protocols, and endpoints may be used for a given Connection. This list is determined by the requirements, prohibitions, and preferences of the application as specified in the Selection Properties.</t>
        <section anchor="gathering-endpoint-candidates">
          <name>Gathering Endpoint Candidates</name>
          <t>Both Local and Remote Endpoint Candidates must be discovered during connection establishment.  To support Interactive Connectivity Establishment (ICE) <xref target="RFC8445"/>, or similar protocols that involve out-of-band indirect signalling to exchange candidates with the Remote Endpoint, it is important to query the set of candidate Local Endpoints, and provide the protocol stack with a set of candidate Remote Endpoints, before the Local Endpoint attempts to establish connections.</t>
          <section anchor="local-endpoint-candidates">
            <name>Local Endpoint candidates</name>
            <t>The set of possible Local Endpoints is gathered.  In the simple case, this merely enumerates the local interfaces and protocols, and allocates ephemeral source ports.  For example, a system that has WiFi and Ethernet and supports IPv4 and IPv6 might gather four candidate Local Endpoints (IPv4 on Ethernet, IPv6 on Ethernet, IPv4 on WiFi, and IPv6 on WiFi) that can form the source for a transient.</t>
            <t>If NAT traversal is required, the process of gathering Local Endpoints becomes broadly equivalent to the ICE candidate gathering phase (see Section 5.1.1. of <xref target="RFC8445"/>).  The endpoint determines its server reflexive Local Endpoints (i.e., the translated address of a Local Endpoint, on the other side of a NAT, e.g via a STUN sever <xref target="RFC5389"/>) and relayed Local Endpoints (e.g., via a TURN server <xref target="RFC5766"/> or other relay), for each interface and network protocol.  These are added to the set of candidate Local Endpoints for this connection.</t>
            <t>Gathering Local Endpoints is primarily a local operation, although it might involve exchanges with a STUN server to derive server reflexive Local Endpoints, or with a TURN server or other relay to derive relayed Local Endpoints.  However, it does not involve communication with the Remote Endpoint.</t>
          </section>
          <section anchor="remote-endpoint-candidates">
            <name>Remote Endpoint Candidates</name>
            <t>The Remote Endpoint is typically a name that needs to be resolved into a set of possible addresses that can be used for communication.  Resolving the Remote Endpoint is the process of recursively performing such name lookups, until fully resolved, to return the set of candidates for the Remote Endpoint of this connection.</t>
            <t>How this resolution is done will depend on the type of the Remote Endpoint, and can also be specific to each Local Endpoint.  A common case is when the Remote Endpoint is a DNS name, in which case it is resolved to give a set of IPv4 and IPv6 addresses representing that name.  Some types of Remote Endpoint might require more complex resolution.  Resolving the Remote Endpoint for a peer-to-peer connection might involve communication with a rendezvous server, which in turn contacts the peer to gain consent to communicate and retrieve its set of candidate Local Endpoints, which are returned and form the candidate remote addresses for contacting that peer.</t>
            <t>Resolving the Remote Endpoint is not a local operation.  It will involve a directory service, and can require communication with the Remote Endpoint to rendezvous and exchange peer addresses.  This can expose some or all of the candidate Local Endpoints to the Remote Endpoint.</t>
          </section>
        </section>
      </section>
      <section anchor="candidate-racing">
        <name>Candidate Racing</name>
        <t>The primary goal of the Candidate Racing process is to successfully negotiate a protocol stack to an endpoint over an interface to connect a single leaf node of the tree with as little delay and as few unnecessary connections attempts as possible. Optimizing these two factors improves the user experience, while minimizing network load.</t>
        <t>This section covers the dynamic aspect of connection establishment. The tree described above is a useful conceptual and architectural model. However, an implementation is unable to know the full tree before it is formed and many of the possible branches ultimately might not be used.</t>
        <t>There are three different approaches to racing the attempts for different nodes of the connection establishment tree:</t>
        <ol spacing="normal" type="1"><li>Simultaneous</li>
          <li>Staggered</li>
          <li>Failover</li>
        </ol>
        <t>Each approach is appropriate in different use-cases and branch types. However, to avoid consuming unnecessary network resources, implementations should not use simultaneous racing as a default approach.</t>
        <t>The timing algorithms for racing should remain independent across branches of the tree. Any timers or racing logic is isolated to a given parent node, and is not ordered precisely with regards to other children of other nodes.</t>
        <section anchor="simultaneous">
          <name>Simultaneous</name>
          <t>Simultaneous racing is when multiple alternate branches are started without waiting for any one branch to make progress before starting the next alternative. This means the attempts are effectively simultaneous. Simultaneous racing should be avoided by implementations, since it consumes extra network resources and establishes state that might not be used.</t>
        </section>
        <section anchor="staggered">
          <name>Staggered</name>
          <t>Staggered racing can be used whenever a single node of the tree has multiple child nodes. Based on the order determined when building the tree, the first child node will be initiated immediately, followed by the next child node after some delay. Once that second child node is initiated, the third child node (if present) will begin after another delay, and so on until all child nodes have been initiated, or one of the child nodes successfully completes its negotiation.</t>
          <t>Staggered racing attempts can proceed in parallel. Implementations should not terminate an earlier child connection attempt upon starting a secondary child.</t>
          <t>If a child node fails to establish connectivity (as in <xref target="determining-successful-establishment"/>) before the delay time has expired for the next child, the next child should be started immediately.</t>
          <t>Staggered racing between IP addresses for a generic Connection should follow the Happy Eyeballs algorithm described in <xref target="RFC8305"/>. <xref target="RFC8421"/> provides guidance for racing when performing Interactive Connectivity Establishment (ICE).</t>
          <t>Generally, the delay before starting a given child node ought to be based on the length of time the previously started child node is expected to take before it succeeds or makes progress in connection establishment. Algorithms like Happy Eyeballs choose a delay based on how long the transport connection handshake is expected to take. When performing staggered races in multiple branch types (such as racing between network interfaces, and then racing between IP addresses), a longer delay may be chosen for some branch types. For example, when racing between network interfaces, the delay should also take into account the amount of time it takes to prepare the network interface (such as radio association) and name resolution over that interface, in addition to the delay that would be added for a single transport connection handshake.</t>
          <t>Since the staggered delay can be chosen based on dynamic information, such as predicted round-trip time, implementations should define upper and lower bounds for delay times. These bounds are implementation-specific, and may differ based on which branch type is being used.</t>
        </section>
        <section anchor="failover">
          <name>Failover</name>
          <t>If an implementation or application has a strong preference for one branch over another, the branching node may choose to wait until one child has failed before starting the next. Failure of a leaf node is determined by its protocol negotiation failing or timing out; failure of a parent branching node is determined by all of its children failing.</t>
          <t>An example in which failover is recommended is a race between a protocol stack that uses a proxy and a protocol stack that bypasses the proxy. Failover is useful in case the proxy is down or misconfigured, but any more aggressive type of racing may end up unnecessarily avoiding a proxy that was preferred by policy.</t>
        </section>
      </section>
      <section anchor="completing-establishment">
        <name>Completing Establishment</name>
        <t>The process of connection establishment completes when one leaf node of the tree has successfully completed negotiation with the Remote Endpoint, or else all nodes of the tree have failed to connect. The first leaf node to complete its connection is then used by the application to send and receive data.</t>
        <t>Successes and failures of a given attempt should be reported up to parent nodes (towards the trunk of the tree). For example, in the following case, if 1.1.1 fails to connect, it reports the failure to 1.1. Since 1.1 has no other child nodes, it also has failed and reports that failure to 1. Because 1.2 has not yet failed, 1 is not considered to have failed. Since 1.2 has not yet started, it is started and the process continues. Similarly, if 1.1.1 successfully connects, then it marks 1.1 as connected, which propagates to the trunk node 1. At this point, the connection as a whole is considered to be successfully connected and ready to process application data.</t>
        <artwork><![CDATA[
1 [www.example.com:80, Any, TCP]
  1.1 [www.example.com:80, Wi-Fi, TCP]
    1.1.1 [192.0.2.1:80, Wi-Fi, TCP]
  1.2 [www.example.com:80, LTE, TCP]
...
]]></artwork>
        <t>If a leaf node has successfully completed its connection, all other attempts should be made ineligible for use by the application for the original request. New connection attempts that involve transmitting data on the network ought not to be started after another leaf node has already successfully completed, because the connection as a whole has now been established. An implementation may choose to let certain handshakes and negotiations complete in order to gather metrics to influence future connections. Keeping additional connections is generally not recommended since those attempts were slower to connect and may exhibit less desirable properties.</t>
        <section anchor="determining-successful-establishment">
          <name>Determining Successful Establishment</name>
          <t>Implementations may select the criteria by which a leaf node is considered to be successfully connected differently on a per-protocol basis. If the only protocol being used is a transport protocol with a clear handshake, like TCP, then the obvious choice is to declare that node "connected" when the last packet of the three-way handshake has been received. If the only protocol being used is an connectionless protocol, like UDP, the implementation may consider the node fully "connected" the moment it determines a route is present, before sending any packets on the network, see further <xref target="connectionless-racing"/>.</t>
          <t>For protocol stacks with multiple handshakes, the decision becomes more nuanced. If the protocol stack involves both TLS and TCP, an implementation could determine that a leaf node is connected after the TCP handshake is complete, or it can wait for the TLS handshake to complete as well. The benefit of declaring completion when the TCP handshake finishes, and thus stopping the race for other branches of the tree, is reduced burden on the network and Remote Endpoints from further connection attempts that are likely to be abandoned. On the other hand, by waiting until the TLS handshake is complete, an implementation avoids the scenario in which a TCP handshake completes quickly, but TLS negotiation is either very slow or fails altogether in particular network conditions or to a particular endpoint. To avoid the issue of TLS possibly failing, the implementation should not generate a Ready event for the Connection until TLS is established.</t>
          <t>If all of the leaf nodes fail to connect during racing, i.e. none of the configurations that satisfy all requirements given in the Transport Properties actually work over the available paths, then the transport system should notify the application with an InitiateError event. An InitiateError event should also be generated in case the transport system finds no usable candidates to race.</t>
        </section>
      </section>
      <section anchor="establish-mux">
        <name>Establishing multiplexed connections</name>
        <t>Multiplexing several Connections over a single underlying transport connection requires that the Connections to be multiplexed belong to the same Connection Group (as is indicated by the application using the Clone call). When the underlying transport connection supports multi-streaming, the Transport Services System can map each Connection in the Connection Group to a different stream.
Thus, when the Connections that are offered to an application by the Transport Services API are multiplexed,
the Transport Services implementation can establish a new Connection by simply beginning to use
a new stream of an already established transport Connection and there is no need for a connection establishment
procedure. This, then, also means that there may not
be any "establishment" message (like a TCP SYN), but the application can simply start sending
or receiving. Therefore, when the Initiate action of a Transport Services API is called without Messages being
handed over, it cannot be guaranteed that the Remote Endpoint will have any way to know about this, and hence
a passive endpoint's ConnectionReceived event might not be called until data is received.
Instead, calling the ConnectionReceived event could be delayed until the first Message arrives.</t>
      </section>
      <section anchor="connectionless-racing">
        <name>Handling connectionless protocols</name>
        <t>While protocols that use an explicit handshake to validate a Connection to a peer can be used for racing multiple establishment attempts in parallel, connectionless protocols such as raw UDP do not offer a way to validate the presence of a peer or the usability of a Connection without application feedback. An implementation should consider such a protocol stack to be established as soon as the Transport Services system has selected a path on which to send data.</t>
        <t>However, if a peer is not reachable over the network using the connectionless protocol, or data cannot be exchanged for any other reason, the application may want to attempt using another candidate Protocol Stack. The implementation should maintain the list of other candidate Protocol Stacks that were eligible to use.</t>
      </section>
      <section anchor="listen">
        <name>Implementing listeners</name>
        <t>When an implementation is asked to Listen, it registers with the system to wait for incoming traffic to the Local Endpoint. If no Local Endpoint is specified, the implementation should use an ephemeral port.</t>
        <t>If the Selection Properties do not require a single network interface or path, but allow the use of multiple paths, the Listener object should register for incoming traffic on all of the network interfaces or paths that conform to the Properties. The set of available paths can change over time, so the implementation should monitor network path changes, and change the registration of the Listener across all usable paths as appropriate. When using multiple paths, the Listener is generally expected to use the same port for listening on each.</t>
        <t>If the Selection Properties allow multiple protocols to be used for listening, and the implementation supports it, the Listener object should support receiving inbound connections for each eligible protocol on each eligible path.</t>
        <section anchor="implementing-listeners-for-connected-protocols">
          <name>Implementing listeners for Connected Protocols</name>
          <t>Connected protocols such as TCP and TLS-over-TCP have a strong mapping between the Local and Remote Endpoints (four-tuple) and their protocol connection state. These map into Connection objects. Whenever a new inbound handshake is being started, the Listener should generate a new Connection object and pass it to the application.</t>
        </section>
        <section anchor="implementing-listeners-for-connectionless-protocols">
          <name>Implementing listeners for Connectionless Protocols</name>
          <t>Connectionless protocols such as UDP and UDP-lite generally do not provide the same mechanisms that connected protocols do to offer Connection objects. Implementations should wait for incoming packets for connectionless protocols on a listening port and should perform four-tuple matching of packets to either existing Connection objects or the creation of new Connection objects. On platforms with facilities to create a "virtual connection" for connectionless protocols implementations should use these mechanisms to minimise the handling of datagrams intended for already created Connection objects.</t>
        </section>
        <section anchor="implementing-listeners-for-multiplexed-protocols">
          <name>Implementing listeners for Multiplexed Protocols</name>
          <t>Protocols that provide multiplexing of streams into a single four-tuple can listen both for entirely new connections (a new HTTP/2 stream on a new TCP connection, for example) and for new sub-connections (a new HTTP/2 stream on an existing connection). If the abstraction of Connection presented to the application is mapped to the multiplexed stream, then the Listener should deliver new Connection objects in the same way for either case. The implementation should allow the application to introspect the Connection Group marked on the Connections to determine the grouping of the multiplexing.</t>
        </section>
      </section>
    </section>
    <section anchor="implementing-sending-and-receiving-data">
      <name>Implementing Sending and Receiving Data</name>
      <t>The most basic mapping for sending a Message is an abstraction of datagrams, in which the transport protocol naturally deals in discrete packets. Each Message here corresponds to a single datagram. Generally, these will be short enough that sending and receiving will always use a complete Message.</t>
      <t>For protocols that expose byte-streams, the only delineation provided by the protocol is the end of the stream in a given direction. Each Message in this case corresponds to the entire stream of bytes in a direction. These Messages may be quite long, in which case they can be sent in multiple parts.</t>
      <t>Protocols that provide the framing (such as length-value protocols, or protocols that use delimiters) may support Message sizes that do not fit within a single datagram. Each Message for framing protocols corresponds to a single frame, which may be sent either as a complete Message in the underlying protocol, or in multiple parts.</t>
      <section anchor="sending-messages">
        <name>Sending Messages</name>
        <t>The effect of the application sending a Message is determined by the top-level protocol in the established Protocol Stack. That is, if the top-level protocol provides an abstraction of framed messages over a connection, the receiving application will be able to obtain multiple Messages on that connection, even if the framing protocol is built on a byte-stream protocol like TCP.</t>
        <section anchor="msg-properties">
          <name>Message Properties</name>
          <ul spacing="normal">
            <li>Lifetime: this should be implemented by removing the Message from the queue of pending Messages after the Lifetime has expired. A queue of pending Messages within the transport system implementation that have yet to be handed to the Protocol Stack can always support this property, but once a Message has been sent into the send buffer of a protocol, only certain protocols may support removing a message. For example, an implementation cannot remove bytes from a TCP send buffer, while it can remove data from a SCTP send buffer using the partial reliability extension <xref target="RFC8303"/>. When there is no standing queue of Messages within the system, and the Protocol Stack does not support the removal of a Message from the stack's send buffer, this property may be ignored.</li>
            <li>Priority: this represents the ability to prioritize a Message over other Messages. This can be implemented by the system re-ordering Messages that have yet to be handed to the Protocol Stack, or by giving relative priority hints to protocols that support priorities per Message. For example, an implementation of HTTP/2 could choose to send Messages of different Priority on streams of different priority.</li>
            <li>Ordered: when this is false, this disables the requirement of in-order-delivery for protocols that support configurable ordering. When the protocol stack does not support configurable ordering, this property may be ignored.</li>
            <li>Safely Replayable: when this is true, this means that the Message can be used by a transport mechanism that might transfer it multiple times -- e.g., as a result of racing multiple transports or as part of TCP Fast Open. Also, protocols that do not protect against duplicated messages, such as UDP (when used directly, without a protocol layered atop), can only be used with Messages that are Safely Replayable. When a transport system is permitted to replay messages, replay protection could be provided by the application.</li>
            <li>Final: when this is true, this means that the sender will not send any further messages. The Connection need not be closed (in case the Protocol Stack supports half-close operation, like TCP). Any messages sent after a Final message will result in a SendError.</li>
            <li>Corruption Protection Length: when this is set to any value other than <tt>Full Coverage</tt>, it sets the minimum protection in protocols that allow limiting the checksum length (e.g. UDP-Lite). If the protocol stack does not support checksum length limitation, this property may be ignored.</li>
            <li>Reliable Data Transfer (Message): When true, the property specifies that the Message must be reliably transmitted. When false, and if unreliable transmission is supported by the underlying protocol, then the Message should be unreliably transmitted. If the underlying
protocol does not support unreliable transmission, the Message should be reliably transmitted.</li>
            <li>Message Capacity Profile Override: When true, this expresses a wish to override the
Generic Connection Property <tt>Capacity Profile</tt> for this Message. Depending on the
value, this can, for example, be implemented by changing the DSCP value of the
associated packet (note that the guidelines in Section 6 of <xref target="RFC7657"/> apply; e.g.,
the DSCP value should not be changed for different packets within a reliable
transport protocol session or DCCP connection).</li>
            <li>No Fragmentation: When set, this property limits the message size to the Maximum Message Size Before Fragmentation or Segmentation (see Section 10.1.7 of <xref target="I-D.ietf-taps-interface"/>).  Messages larger than this size generate an error.  Setting this avoids transport-layer segmentation or network-layer fragmentation. When used with transports running over IP version 4 the Don't Fragment bit will be set to avoid on-path IP fragmentation (<xref target="RFC8304"/>).</li>
          </ul>
        </section>
        <section anchor="send-completion">
          <name>Send Completion</name>
          <t>The application should be notified whenever a Message or partial Message has been consumed by the Protocol Stack, or has failed to send. The time at which a Message is considered to have been consumed by the Protocol Stack may vary depending on the protocol. For example, for a basic datagram protocol like UDP, this may correspond to the time when the packet is sent into the interface driver. For a protocol that buffers data in queues, like TCP, this may correspond to when the data has entered the send buffer. The time at which a message failed to send is when Transport Services implementation (including the Protocol Stack) has not successfully sent the entire Message content or partial Message content on any open candidate connection; this can depend on protocol-specific timeouts.</t>
        </section>
        <section anchor="batching-sends">
          <name>Batching Sends</name>
          <t>Since sending a Message may involve a context switch between the application and the Transport Services system, sending patterns that involve multiple small Messages can incur high overhead if each needs to be enqueued separately. To avoid this, the application can indicate a batch of Send actions through the API. When this is used, the implementation can defer the processing of Messages until the batch is complete.</t>
        </section>
      </section>
      <section anchor="receiving-messages">
        <name>Receiving Messages</name>
        <t>Similar to sending, Receiving a Message is determined by the top-level protocol in the established Protocol Stack. The main difference with Receiving is that the size and boundaries of the Message are not known beforehand. The application can communicate in its Receive action the parameters for the Message, which can help the Transport Services implementation know how much data to deliver and when. For example, if the application only wants to receive a complete Message, the implementation should wait until an entire Message (datagram, stream, or frame) is read before delivering any Message content to the application. This requires the implementation to understand where messages end, either via a supplied deframer or because the top-level protocol in the established Protocol Stack preserves message boundaries. If the top-level protocol only supports a byte-stream and no framers were supported, the application can control the flow of received data by specifying the minimum number of bytes of Message content it wants to receive at one time.</t>
        <t>If a Connection finishes before a requested Receive action can be satisfied, the Transport Services API should deliver any partial Message content outstanding, or if none is available, an indication that there will be no more received Messages.</t>
      </section>
      <section anchor="fastopen">
        <name>Handling of data for fast-open protocols</name>
        <t>Several protocols allow sending higher-level protocol or application data during their protocol establishment, such as TCP Fast Open <xref target="RFC7413"/> and TLS 1.3 <xref target="RFC8446"/>. This approach is referred to as sending Zero-RTT (0-RTT) data. This is a desirable feature, but poses challenges to an implementation that uses racing during connection establishment.</t>
        <t>The amount of data that can be sent as 0-RTT data varies by protocol and can be queried by the application using the <tt>Maximum Message Size Concurrent with Connection Establishment</tt> Connection Property. An implementation can set this property according to the protocols that it will race based on the given Selection Properties when the application requests to establish a connection.</t>
        <t>If the application has 0-RTT data to send in any protocol handshakes, it needs to provide this data before the handshakes have begun. When racing, this means that the data should be provided before the process of connection establishment has begun. If the application wants to send 0-RTT data, it must indicate this to the implementation by setting the <tt>Safely Replayable</tt> send parameter to true when sending the data. In general, 0-RTT data may be replayed (for example, if a TCP SYN contains data, and the SYN is retransmitted, the data will be retransmitted as well but may be considered as a new connection instead of a retransmission). Also, when racing connections, different leaf nodes have the opportunity to send the same data independently. If data is truly safely replayable, this should be permissible.</t>
        <t>Once the application has provided its 0-RTT data, a Transport Services implementation should keep a copy of this data and provide it to each new leaf node that is started and for which a 0-RTT protocol is being used.</t>
        <t>It is also possible that protocol stacks within a particular leaf node use 0-RTT handshakes without any safely replayable application data. For example, TCP Fast Open could use a Client Hello from TLS as its 0-RTT data, shortening the cumulative handshake time.</t>
        <t>0-RTT handshakes often rely on previous state, such as TCP Fast Open cookies, previously established TLS tickets, or out-of-band distributed pre-shared keys (PSKs). Implementations should be aware of security concerns around using these tokens across multiple addresses or paths when racing. In the case of TLS, any given ticket or PSK should only be used on one leaf node, since servers will likely reject duplicate tickets in order to prevent replays (see section-8.1 <xref target="RFC8446"/>). If implementations have multiple tickets available from a previous connection, each leaf node attempt can use a different ticket. In effect, each leaf node will send the same early application data, yet encoded (encrypted) differently on the wire.</t>
      </section>
    </section>
    <section anchor="implementing-message-framers">
      <name>Implementing Message Framers</name>
      <t>Message Framers are functions that define 
simple transformations between application Message data and raw transport 
protocol data. A Framer can encapsulate or encode outbound Messages, and
decapsulate or decode inbound data into Messages.</t>
      <t>While many protocols can be represented as Message Framers, for the
purposes of the Transport Services API, these are ways for applications
or application frameworks to define their own Message parsing to be
included within a Connection's Protocol Stack. As an example, TLS 
is exposed as a protocol natively supported by the Transport Services
API, even though it could also serve the purpose of framing data over TCP.</t>
      <t>Most Message Framers fall into one of two categories:</t>
      <ul spacing="normal">
        <li>Header-prefixed record formats, such as a basic Type-Length-Value (TLV) structure</li>
        <li>Delimiter-separated formats, such as HTTP/1.1.</li>
      </ul>
      <t>Common Message Framers can be provided by a Transport Services implementation,
but an implementation ought to allow custom Message Framers to be defined by
the application or some other piece of software. This section describes one
possible API for defining Message Framers as an example.</t>
      <section anchor="defining-message-framers">
        <name>Defining Message Framers</name>
        <t>A Message Framer is primarily defined by the code that handles events
for a framer implementation, specifically how it handles inbound and outbound data
parsing. The function that implements custom framing logic will be referred to
as the "framer implementation", which may be provided by a Transport Services
implementation or the application itself. The Message Framer refers to the object
or function within the main Connection implementation that delivers events
to the custom framer implementation whenever data is ready to be parsed or framed.</t>
        <t>The Transport Services implementation needs to ensure that all of the
events and actions taken on a Message Framer are synchronized to ensure
consistent behavior. For example, some of the actions defined below (such as
PrependFramer and StartPassthrough) modify how data flows in a protocol
stack, and require synchronization with sending and parsing data in the
Message Framer.</t>
        <t>When a Connection establishment attempt begins, an event can be delivered to
notify the framer implementation that a new Connection is being created.
Similarly, a stop event can be delivered when a Connection is being torn down.
The framer implementation can use the Connection object to look up specific
properties of the Connection or the network being used that may influence how
to frame Messages.</t>
        <artwork><![CDATA[
MessageFramer -> Start(Connection)
MessageFramer -> Stop(Connection)
]]></artwork>
        <t>When a Message Framer generates a <tt>Start</tt> event, the framer implementation
has the opportunity to start writing some data prior to the Connection delivering
its <tt>Ready</tt> event. This allows the implementation to communicate control data to the
Remote Endpoint that can be used to parse Messages.</t>
        <artwork><![CDATA[
MessageFramer.MakeConnectionReady(Connection)
]]></artwork>
        <t>Similarly, when a Message Framer generates a <tt>Stop</tt> event, the framer implementation has the opportunity to write some final data or clear up its local state before the <tt>Closed</tt> event is delivered to the Application. The framer implementation can indicate that it has finished with this.</t>
        <artwork><![CDATA[
MessageFramer.MakeConnectionClosed(Connection)
]]></artwork>
        <t>At any time if the implementation encounters a fatal error, it can also cause the Connection
to fail and provide an error.</t>
        <artwork><![CDATA[
MessageFramer.FailConnection(Connection, Error)
]]></artwork>
        <t>Should the framer implementation deem the candidate selected during racing unsuitable, it can signal this to the Transport Services API by failing the Connection prior to marking it as ready.
If there are no other candidates available, the Connection will fail. Otherwise, the Connection will select a different candidate and the Message Framer will generate a new <tt>Start</tt> event.</t>
        <t>Before an implementation marks a Message Framer as ready, it can also dynamically
add a protocol or framer above it in the stack. This allows protocols that need to add TLS conditionally,
like STARTTLS <xref target="RFC3207"/>, to modify the Protocol Stack based on a handshake result.</t>
        <artwork><![CDATA[
otherFramer := NewMessageFramer()
MessageFramer.PrependFramer(Connection, otherFramer)
]]></artwork>
        <t>A Message Framer might also choose to go into a passthrough mode once an initial exchange or handshake has been completed, such as the STARTTLS case mentioned above.
This can also be useful for proxy protocols like SOCKS <xref target="RFC1928"/> or HTTP CONNECT <xref target="RFC7230"/>. In such cases, a Message Framer implementation can intercept
sending and receiving of messages at first, but then indicate that no more processing is needed.</t>
        <artwork><![CDATA[
MessageFramer.StartPassthrough()
]]></artwork>
      </section>
      <section anchor="send-framing">
        <name>Sender-side Message Framing</name>
        <t>Message Framers generate an event whenever a Connection sends a new Message.</t>
        <artwork><![CDATA[
MessageFramer -> NewSentMessage<Connection, MessageData, MessageContext, IsEndOfMessage>
]]></artwork>
        <t>Upon receiving this event, a framer implementation is responsible for
performing any necessary transformations and sending the resulting data back to the Message Framer, which will in turn send it to the next protocol. Implementations SHOULD ensure that there is a way to pass the original data
through without copying to improve performance.</t>
        <artwork><![CDATA[
MessageFramer.Send(Connection, Data)
]]></artwork>
        <t>To provide an example, a simple protocol that adds a length as a header would receive
the <tt>NewSentMessage</tt> event, create a data representation of the length of the Message
data, and then send a block of data that is the concatenation of the length header and the original
Message data.</t>
      </section>
      <section anchor="receive-framing">
        <name>Receiver-side Message Framing</name>
        <t>In order to parse a received flow of data into Messages, the Message Framer
notifies the framer implementation whenever new data is available to parse.</t>
        <artwork><![CDATA[
MessageFramer -> HandleReceivedData<Connection>
]]></artwork>
        <t>Upon receiving this event, the framer implementation can inspect the inbound data. The
data is parsed from a particular cursor representing the unprocessed data. The
application requests a specific amount of data it needs to have available in order to parse.
If the data is not available, the parse fails.</t>
        <artwork><![CDATA[
MessageFramer.Parse(Connection, MinimumIncompleteLength, MaximumLength) -> (Data, MessageContext, IsEndOfMessage)
]]></artwork>
        <t>The framer implementation can directly advance the receive cursor once it has
parsed data to effectively discard data (for example, discard a header
once the content has been parsed).</t>
        <t>To deliver a Message to the application, the framer implementation can either directly
deliver data that it has allocated, or deliver a range of data directly from the underlying
transport and simultaneously advance the receive cursor.</t>
        <artwork><![CDATA[
MessageFramer.AdvanceReceiveCursor(Connection, Length)
MessageFramer.DeliverAndAdvanceReceiveCursor(Connection, MessageContext, Length, IsEndOfMessage)
MessageFramer.Deliver(Connection, MessageContext, Data, IsEndOfMessage)
]]></artwork>
        <t>Note that <tt>MessageFramer.DeliverAndAdvanceReceiveCursor</tt> allows the framer implementation
to earmark bytes as part of a Message even before they are received by the transport. This allows the delivery
of very large Messages without requiring the implementation to directly inspect all of the bytes.</t>
        <t>To provide an example, a simple protocol that parses a length as a header value would
receive the <tt>HandleReceivedData</tt> event, and call <tt>Parse</tt> with a minimum and maximum
set to the length of the header field. Once the parse succeeded, it would call
<tt>AdvanceReceiveCursor</tt> with the length of the header field, and then call
<tt>DeliverAndAdvanceReceiveCursor</tt> with the length of the body that was parsed from
the header, marking the new Message as complete.</t>
      </section>
    </section>
    <section anchor="implementing-connection-management">
      <name>Implementing Connection Management</name>
      <t>Once a Connection is established, the Transport Services API allows applications to interact with the Connection by modifying or inspecting
Connection Properties. A Connection can also generate events in the form of Soft Errors.</t>
      <t>The set of Connection Properties that are supported for setting and getting on a Connection are described in <xref target="I-D.ietf-taps-interface"/>. For
any properties that are generic, and thus could apply to all protocols being used by a Connection, the Transport Services implementation should store the properties
in storage common to all protocols, and notify all protocol instances in the Protocol Stack whenever the properties have been modified by the application.
For protocol-specfic properties, such as the User Timeout that applies to TCP, the Transport Services implementation only needs to update the relevant protocol instance.</t>
      <t>If an error is encountered in setting a property (for example, if the application tries to set a TCP-specific property on a Connection that is
not using TCP), the action should fail gracefully. The application may be informed of the error, but the Connection itself should not be terminated.</t>
      <t>The Transport Services API should allow protocol instances in the Protocol Stack to pass up arbitrary generic or protocol-specific
errors that can be delivered to the application as Soft Errors. These allow the application to be informed of ICMP errors, and other similar events.</t>
      <section anchor="pooled-connections">
        <name>Pooled Connection</name>
        <t>For applications that do not need in-order delivery of Messages, the Transport Services implementation may distribute Messages of a single Connection across several underlying transport connections or multiple streams of multi-streaming connections between endpoints, as long as all of these satisfy the Selection Properties.
The Transport Services implementation will then hide this connection management and only expose a single Connection object, which we here call a "Pooled Connection". This is in contrast to Connection Groups, which explicitly expose combined treatment of Connections, giving the application control over multiplexing, for example.</t>
        <t>Pooled Connections can be useful when the application using the Transport Services system implements a protocol such as HTTP, which employs request/response pairs and does not require in-order delivery of responses.
This enables implementations of Transport Services systems to realize transparent connection coalescing, connection migration, and to perform per-message endpoint and path selection by choosing among multiple underlying connections.</t>
      </section>
      <section anchor="handling-path-changes">
        <name>Handling Path Changes</name>
        <t>When a path change occurs, e.g., when the IP address of an interface changes or a new interface becomes available, the Transport Services implementation is responsible for notifying the Protocol Instance of the change. The path change may interrupt connectivity on a path for an active connection or provide an opportunity for a transport that supports multipath or migration to adapt to the new paths. Note that, in the model of the Transport Services API, migration is considered a part of multipath connectivity; it is just a limiting policy on multipath usage. If the <tt>multipath</tt> Selection Property is set to <tt>Disabled</tt>, migration is disallowed.</t>
        <t>For protocols that do not support multipath or migration, the Protocol Instances should be informed of the path change, but should not be forcibly disconnected if the previously used path becomes unavailable. There are many common user scenarios that can lead to a path becoming temporarily unavailable, and then recovering before the transport protocol reaches a timeout error. These are particularly common using mobile devices. Examples include: an Ethernet cable becoming unplugged and then plugged back in; a device losing a Wi-Fi signal while a user is in an elevator, and reattaching when the user leaves the elevator; and a user losing the radio signal while riding a train through a tunnel. If the device is able to rejoin a network with the same IP address, a stateful transport connection can generally resume. Thus, while it is useful for a Protocol Instance to be aware of a temporary loss of connectivity, the Transport Services implementation should not aggressively close connections in these scenarios.</t>
        <t>If the Protocol Stack includes a transport protocol that supports multipath connectivity, the Transport Services implementation should also inform the Protocol Instance of potentially new paths that become permissible based on the <tt>multipath</tt> Selection Property and the <tt>multipath-policy</tt> Connection Property choices made by the application. A protocol can then establish new subflows over new paths while an active path is still available or, if migration is supported, also after a break has been detected, and should attempt to tear down subflows over paths that are no longer used. The Connection Property <tt>multipath-policy</tt> of the Transport Services API
allows an application to indicate when and how different paths should be used. However, detailed handling of these policies is still implementation-specific. For example, if the <tt>multipath</tt> Selection Property is set to <tt>active</tt>, the decision about when to create a new path or to announce a new path or set of paths to the Remote Endpoint, e.g., in the form of additional IP addresses, is implementation-specific. If the Protocol Stack includes a transport protocol that does not support multipath, but does support migrating between paths, the update to the set of available paths can trigger the connection to be migrated.</t>
        <t>In case of Pooled Connections <xref target="pooled-connections"/>, the Transport Services implementation may add connections over new paths to the pool if permissible based on the multipath policy and Selection Properties. In case a previously used path becomes unavailable, the transport system may disconnect all connections that require this path, but should not disconnect the pooled connection object exposed to the application. The strategy to do so is implementation-specific, but should be consistent with the behavior of multipath transports.</t>
      </section>
    </section>
    <section anchor="implementing-connection-termination">
      <name>Implementing Connection Termination</name>
      <t>With TCP, when an application closes a connection, this
means that it has no more data to send (but expects all data that has been
handed over to be reliably delivered). However, with TCP only, "close" does
not mean that the application will stop receiving data. This is related to TCP's ability to
support half-closed connections.</t>
      <t>SCTP is an example of a protocol that does not support such half-closed connections.
Hence, with SCTP, the meaning of "close" is stricter: an application has no more data
to send (but expects all data that has been handed over to be reliably delivered), and will
also not receive any more data.</t>
      <t>Implementing a protocol independent transport system means that the exposed
semantics must be the strictest subset of the semantics of all supported protocols.
Hence, as is common with all reliable transport protocols, after a Close action, the
application can expect to have its reliability requirements honored regarding the data
provided to the Transport Services API, but it cannot expect to be able to read any
more data after calling Close.</t>
      <t>Abort differs from Close only in that no guarantees are given regarding any data
that the application sent to the Transport Services API before calling Abort.</t>
      <t>As explained in <xref target="establish-mux"/>, when a new stream is multiplexed on an already
existing connection of a Transport Protocol Instance, there is no need for a connection
establishment procedure. Because the Connections that are offered by a Transport Services implementation
can be implemented as streams that are multiplexed on a transport protocol's connection,
it can therefore not be guaranteed an Initiate action from one endpoint
provokes a ConnectionReceived event at its peer.</t>
      <t>For Close (provoking a Finished event) and Abort (provoking a ConnectionError event), the
same logic applies: while it is desirable to be informed when a peer closes or aborts a
Connection, whether this is possible depends on the underlying protocol, and no guarantees
can be given. With SCTP, the transport system can use the stream reset procedure to cause
a Finish event upon a Close action from the peer <xref target="NEAT-flow-mapping"/>.</t>
    </section>
    <section anchor="cached-state">
      <name>Cached State</name>
      <t>Beyond a single Connection's lifetime, it is useful for an implementation to keep state and history. This cached
state can help improve future Connection establishment due to re-using results and credentials, and favoring paths and protocols that performed well in the past.</t>
      <t>Cached state may be associated with different endpoints for the same Connection, depending on the protocol generating the cached content.
For example, session tickets for TLS are associated with specific endpoints, and thus should be cached based on a Connection's
hostname endpoint (if applicable). However, performance characteristics of a path are more likely tied to the IP address
and subnet being used.</t>
      <section anchor="protocol-state-caches">
        <name>Protocol state caches</name>
        <t>Some protocols will have long-term state to be cached in association with endpoints. This state often has some time after which
it is expired, so the implementation should allow each protocol to specify an expiration for cached content.</t>
        <t>Examples of cached protocol state include:</t>
        <ul spacing="normal">
          <li>The DNS protocol can cache resolution answers (A and AAAA queries, for example), associated with a Time To Live (TTL) to
be used for future hostname resolutions without requiring asking the DNS resolver again.</li>
          <li>TLS caches session state and tickets based on a hostname, which can be used for resuming sessions with a server.</li>
          <li>TCP can cache cookies for use in TCP Fast Open.</li>
        </ul>
        <t>Cached protocol state is primarily used during Connection establishment for a single Protocol Stack, but may be used to influence an
implementation's preference between several candidate Protocol Stacks. For example, if two IP address endpoints are otherwise
equally preferred, an implementation may choose to attempt a connection to an address for which it has a TCP Fast Open cookie.</t>
        <t>Applications can use the Transport Services API to request that a Connection Group maintain a separate cache for
protocol state. Connections in the group will not use cached state
from connections outside the group, and connections outside the group will not
use state cached from connections inside the group. This may be necessary, for
example, if application-layer identifiers rotate and clients wish to avoid
linkability via trackable TLS tickets or TFO cookies.</t>
      </section>
      <section anchor="performance-caches">
        <name>Performance caches</name>
        <t>In addition to protocol state, Protocol Instances should provide data into a performance-oriented cache to help guide future protocol and path selection. Some performance information can be gathered generically across several protocols to allow predictive comparisons between protocols on given paths:</t>
        <ul spacing="normal">
          <li>Observed Round Trip Time</li>
          <li>Connection Establishment latency</li>
          <li>Connection Establishment success rate</li>
        </ul>
        <t>These items can be cached on a per-address and per-subnet granularity, and averaged between different values. The information should be cached on a per-network basis, since it is expected that different network attachments will have different performance characteristics. Besides Protocol Instances, other system entities may also provide data into performance-oriented caches. This could for instance be signal strength information reported by radio modems like Wi-Fi and mobile broadband or information about the battery-level of the device. Furthermore, the system may cache the observed maximum throughput on a path as an estimate of the available bandwidth.</t>
        <t>An implementation should use this information, when possible, to influence preference between candidate paths, endpoints, and protocol options. Eligible options that historically had significantly better performance than others should be selected first when gathering candidates (see <xref target="gathering"/>) to ensure better performance for the application.</t>
        <t>The reasonable lifetime for cached performance values will vary depending on the nature of the value. Certain information, like the connection establishment success rate to a Remote Endpoint using a given protocol stack, can be stored for a long period of time (hours or longer), since it is expected that the capabilities of the Remote Endpoint are not changing very quickly. On the other hand, the Round Trip Time observed by TCP over a particular network path may vary over a relatively short time interval. For such values, the implementation should remove them from the cache more quickly, or treat older values with less confidence/weight.</t>
        <t><xref target="I-D.ietf-tcpm-2140bis"/> provides guidance about sharing of TCP Control Block information between connections on initialization.</t>
      </section>
    </section>
    <section anchor="specific-transport-protocol-considerations">
      <name>Specific Transport Protocol Considerations</name>
      <t>Each protocol that is supported by a Transport Services implementation should have a well-defined API mapping.
API mappings for a protocol are important for Connections in which a given protocol is the "top" of the Protocol Stack.
For example, the mapping of the <tt>Send</tt> function for TCP applies to Connections in which the application directly sends over TCP.</t>
      <t>Each protocol has a notion of Connectedness. Possible values for Connectedness are:</t>
      <ul spacing="normal">
        <li>Connectionless. Connectionless protocols do not establish explicit state between endpoints, and do not perform a handshake during Connection establishment.</li>
        <li>Connected. Connected protocols establish state between endpoints, and perform a handshake during Connection establishment. The handshake may be 0-RTT to send data or resume a session, but bidirectional traffic is required to confirm connectedness.</li>
        <li>Multiplexing Connected. Multiplexing Connected protocols share properties with Connected protocols, but also explictly support opening multiple application-level flows. This means that they can support cloning new Connection objects without a new explicit handshake.</li>
      </ul>
      <t>Protocols also define a notion of Data Unit. Possible values for Data Unit are:</t>
      <ul spacing="normal">
        <li>Byte-stream. Byte-stream protocols do not define any Message boundaries of their own apart from the end of a stream in each direction.</li>
        <li>Datagram. Datagram protocols define Message boundaries at the same level of transmission, such that only complete (not partial) Messages are supported.</li>
        <li>Message. Message protocols support Message boundaries that can be sent and received either as complete or partial Messages. Maximum Message lengths can be defined, and Messages can be partially reliable.</li>
      </ul>
      <t>Below, terms in capitals with a dot (e.g., "CONNECT.SCTP") refer to the primitives with the same name in section 4 of <xref target="RFC8303"/>. For further implementation details, the description of these primitives in <xref target="RFC8303"/> points to section 3 of <xref target="RFC8303"/> and section 3 of <xref target="RFC8304"/>, which refers back to the relevant specifications for each protocol. This back-tracking method applies to all elements of <xref target="RFC8923"/> (see appendix D of <xref target="I-D.ietf-taps-interface"/>): they are listed in appendix A of <xref target="RFC8923"/> with an implementation hint in the same style, pointing back to section 4 of <xref target="RFC8303"/>.</t>
      <t>This document defines the API mappings for protocols defined in <xref target="RFC8923"/>. Other protocol mappings can be provided as separate documents, following the mapping template <xref target="appendix-mapping-template"/>.</t>
      <section anchor="tcp">
        <name>TCP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Byte-stream</t>
        <t>API mappings for TCP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>TCP connections between two hosts map directly to Connection objects.</t>
          </dd>
          <dt>Initiate:</dt>
          <dd>
            <t>CONNECT.TCP. Calling <tt>Initiate</tt> on a TCP Connection causes it to reserve a local port, and send a SYN to the Remote Endpoint.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>CONNECT.TCP with parameter <tt>user message</tt>. Early safely replayable data is sent on a TCP Connection in the SYN, as TCP Fast Open data.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t>A TCP Connection is ready once the three-way handshake is complete.</t>
          </dd>
          <dt>InitiateError:</dt>
          <dd>
            <t>Failure of CONNECT.TCP. TCP can throw various errors during connection setup. Specifically, it is important to handle a RST being sent by the peer during the handshake.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>Once established, TCP throws errors whenever the connection is disconnected, such as due to receiving a RST from the peer.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.TCP. Calling <tt>Listen</tt> for TCP binds a local port and prepares it to receive inbound SYN packets from peers.</t>
          </dd>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>TCP Listeners will deliver new connections once they have replied to an inbound SYN with a SYN-ACK.</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on a TCP Connection creates a new Connection with equivalent parameters. These Connections, and Connections generated via later calls to <tt>Clone</tt> on an Establied Connection, form a Connection Group. To realize entanglement for these Connections, with the exception of <tt>Connection Priority</tt>, changing a Connection Property on one of them must affect the Connection Properties of the others too. No guarantees of honoring the Connection Property <tt>Connection Priority</tt> are given, and thus it is safe for an implementation of a transport system to ignore this property. When it is reasonable to assume that Connections traverse the same path (e.g., when they share the same encapsulation), support for it can also experimentally be implemented using a congestion control coupling mechanism (see for example <xref target="TCP-COUPLING"/> or <xref target="RFC3124"/>).</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.TCP. TCP does not on its own preserve Message boundaries. Calling <tt>Send</tt> on a TCP connection lays out the bytes on the TCP send stream without any other delineation. Any Message marked as Final will cause TCP to send a FIN once the Message has been completely written, by calling CLOSE.TCP immediately upon successful termination of SEND.TCP. Note that transmitting a Message marked as Final should not cause the <tt>Closed</tt> event to be delivered to the application, as it will still be possible to receive data until the peer closes or aborts the TCP connection.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>With RECEIVE.TCP, TCP delivers a stream of bytes without any Message delineation. All data delivered in the <tt>Received</tt> or <tt>ReceivedPartial</tt> event will be part of a single stream-wide Message that is marked Final (unless a Message Framer is used). EndOfMessage will be delivered when the TCP Connection has received a FIN (CLOSE-EVENT.TCP) from the peer. Note that reception of a FIN should not cause the <tt>Closed</tt> event to be delivered to the application, as it will still be possible for the application to send data.</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a TCP Connection indicates that the Connection should be gracefully closed (CLOSE.TCP) by sending a FIN to the peer. It will then still be possible to receive data until the peer closes or aborts the TCP connection. The <tt>Closed</tt> event will be issued upon reception of a FIN.</t>
          </dd>
          <dt>Abort:</dt>
          <dd>
            <t>Calling <tt>Abort</tt> on a TCP Connection indicates that the Connection should be immediately closed by sending a RST to the peer (ABORT.TCP).</t>
          </dd>
        </dl>
      </section>
      <section anchor="mptcp">
        <name>MPTCP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Byte-stream</t>
        <t>the Transport Services API mappings for MPTCP are identical to TCP. MPTCP adds support for multipath properties,
such as "Multipath Transport" and "Policy for using Multipath Transports".</t>
      </section>
      <section anchor="udp">
        <name>UDP</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</t>
        <t>API mappings for UDP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>UDP connections represent a pair of specific IP addresses and ports on two hosts.</t>
          </dd>
          <dt>Initiate:</dt>
          <dd>
            <t>CONNECT.UDP. Calling <tt>Initiate</tt> on a UDP Connection causes it to reserve a local port, but does not generate any traffic.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>Early data on a UDP Connection does not have any special meaning. The data is sent whenever the Connection is Ready.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t>A UDP Connection is ready once the system has reserved a local port and has a path to send to the Remote Endpoint.</t>
          </dd>
          <dt>InitiateError:</dt>
          <dd>
            <t>UDP Connections can only generate errors on initiation due to port conflicts on the local system.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>Once in use, UDP throws "soft errors" (ERROR.UDP(-Lite)) upon receiving ICMP notifications indicating failures in the network.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.UDP. Calling <tt>Listen</tt> for UDP binds a local port and prepares it to receive inbound UDP datagrams from peers.</t>
          </dd>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>UDP Listeners will deliver new connections once they have received traffic from a new Remote Endpoint.</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on a UDP Connection creates a new Connection with equivalent parameters. The two Connections are otherwise independent.</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.UDP(-Lite). Calling <tt>Send</tt> on a UDP connection sends the data as the payload of a complete UDP datagram. Marking Messages as Final does not change anything in the datagram's contents. Upon sending a UDP datagram, some relevant fields and flags in the IP header can be controlled: DSCP (SET_DSCP.UDP(-Lite)), DF in IPv4 (SET_DF.UDP(-Lite)) and ECN flag (SET_ECN.UDP(-Lite)).</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.UDP(-Lite). UDP only delivers complete Messages to <tt>Received</tt>, each of which represents a single datagram received in a UDP packet. Upon receiving a UDP datagram, the ECN flag from the IP header can be obtained (GET_ECN.UDP(-Lite)).</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a UDP Connection (ABORT.UDP(-Lite)) releases the local port reservation.</t>
          </dd>
          <dt>Abort:</dt>
          <dd>
            <t>Calling <tt>Abort</tt> on a UDP Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt>.</t>
          </dd>
        </dl>
      </section>
      <section anchor="udp-lite">
        <name>UDP-Lite</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</t>
        <t>The Transport Services API mappings for UDP-Lite are identical to UDP. Properties that require checksum coverage are not supported
by UDP-Lite, such as "Corruption Protection Length", "Full Checksum Coverage on Sending", 
"Required Minimum Corruption Protection Coverage for Receiving", and "Full Checksum Coverage on Receiving".</t>
      </section>
      <section anchor="udp-multicast-receive">
        <name>UDP Multicast Receive</name>
        <t>Connectedness: Connectionless</t>
        <t>Data Unit: Datagram</t>
        <t>API mappings for Receiving Multicast UDP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>Established UDP Multicast Receive connections represent a pair of specific IP addresses and ports.  The "unidirectional receive" transport property is required, and the Local Endpoint must be configured with a group IP address and a port.</t>
          </dd>
          <dt>Initiate:</dt>
          <dd>
            <t>Calling <tt>Initiate</tt> on a UDP Multicast Receive Connection causes an immediate InitiateError.  This is an unsupported operation.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>Calling <tt>InitiateWithSend</tt> on a UDP Multicast Receive Connection causes an immediate InitiateError.  This is an unsupported operation.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t>A UDP Multicast Receive Connection is ready once the system has received traffic for the appropriate group and port.</t>
          </dd>
          <dt>InitiateError:</dt>
          <dd>
            <t>UDP Multicast Receive Connections generate an InitiateError if Initiate is called.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>Once in use, UDP throws "soft errors" (ERROR.UDP(-Lite)) upon receiving ICMP notifications indicating failures in the network.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.UDP. Calling <tt>Listen</tt> for UDP Multicast Receive binds a local port, prepares it to receive inbound UDP datagrams from peers, and issues a multicast host join.  If a Remote Endpoint with an address is supplied, the join is Source-specific Multicast, and the path selection is based on the route to the Remote Endpoint.  If a Remote Endpoint is not supplied, the join is Any-source Multicast, and the path selection is based on the outbound route to the group supplied in the Local Endpoint.</t>
          </dd>
        </dl>
        <t>There are cases where it is required to open multiple connections for the same address(es). 
For example, one Connection might be opened for a multicast group to for a multicast control bus, 
and another application later opens a separate Connection to the same group to send signals to and/or receive signals from the common bus. 
In such cases, the Transport Services system needs to explicitly enable re-use of the same set of addresses (equivalent to setting SO_REUSEADDR 
in the socket API).</t>
        <dl>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>UDP Multicast Receive Listeners will deliver new connections once they have received traffic from a new Remote Endpoint.</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on a UDP Multicast Receive Connection creates a new Connection with equivalent parameters. The two Connections are otherwise independent.</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.UDP(-Lite). Calling <tt>Send</tt> on a UDP Multicast Receive connection causes an immediate SendError.  This is an unsupported operation.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.UDP(-Lite). The Receive operation in a UDP Multicast Receive connection only delivers complete Messages to <tt>Received</tt>, each of which represents a single datagram received in a UDP packet. Upon receiving a UDP datagram, the ECN flag from the IP header can be obtained (GET_ECN.UDP(-Lite)).</t>
          </dd>
          <dt>Close:</dt>
          <dd>
            <t>Calling <tt>Close</tt> on a UDP Multicast Receive Connection (ABORT.UDP(-Lite)) releases the local port reservation and leaves the group.</t>
          </dd>
          <dt>Abort:</dt>
          <dd>
            <t>Calling <tt>Abort</tt> on a UDP Multicast Receive Connection (ABORT.UDP(-Lite)) is identical to calling <tt>Close</tt>.</t>
          </dd>
        </dl>
      </section>
      <section anchor="sctp">
        <name>SCTP</name>
        <t>Connectedness: Connected</t>
        <t>Data Unit: Message</t>
        <t>API mappings for SCTP are as follows:</t>
        <dl>
          <dt>Connection Object:</dt>
          <dd>
            <t>Connection objects can be mapped to an SCTP association or a stream in an SCTP association. Mapping Connection objects to SCTP streams is called "stream mapping" and has additional requirements as follows. The following explanation assumes a client-server communication model.</t>
          </dd>
        </dl>
        <t>Stream mapping requires an association to already be in place between the client and the server, and it requires the server to understand that a new incoming stream should be represented as a new Connection Object by the Transport Services system. A new SCTP stream is created by sending an SCTP message with a new stream id. Thus, to implement stream mapping, the Transport Services API MUST provide a newly created Connection Object to the application upon the reception of such a message. The necessary semantics to implement a Transport Services system Close and Abort primitives are provided by the stream reconfiguration (reset) procedure described in <xref target="RFC6525"/>. This also allows to re-use a stream id after resetting ("closing") the stream. To implement this functionality, SCTP stream reconfiguration <xref target="RFC6525"/> MUST be supported by both the client and the server side.</t>
        <t>To avoid head-of-line blocking, stream mapping SHOULD only be implemented when both sides support message interleaving <xref target="RFC8260"/>. This allows a sender to schedule transmissions between multiple streams without risking that transmission of a large message on one stream might block transmissions on other streams for a long time.</t>
        <t>To avoid conflicts between stream ids, the following procedure is recommended: the first Connection, for which the SCTP association has been created, MUST always use stream id zero. All additional Connections are assigned to unused stream ids in growing order. To avoid a conflict when both endpoints map new Connections simultaneously, the peer which initiated association MUST use even stream ids whereas the remote side MUST map its Connections to odd stream ids. Both sides maintain a status map of the assigned stream ids. Generally, new streams SHOULD consume the lowest available (even or odd, depending on the side) stream id; this rule is relevant when lower ids become available because Connection objects associated with the streams are closed.</t>
        <t>SCTP stream mapping as described here has been implemented in a research prototype; a desription of this implementation is given in <xref target="NEAT-flow-mapping"/>.</t>
        <dl>
          <dt>Initiate:</dt>
          <dd>
            <t>If this is the only Connection object that is assigned to the SCTP Association or stream mapping is
not used, CONNECT.SCTP is called. Else, unless the Selection Property <tt>activeReadBeforeSend</tt>
is Preferred or Required, a new stream is used: if there are enough streams
available, <tt>Initiate</tt> is a local operation that assigns a new stream id to the Connection object.
The number of streams is negotiated as a parameter of the prior CONNECT.SCTP call, and it represents a
trade-off between local resource usage and the number of Connection objects that can be mapped
without requiring a reconfiguration signal. When running out of streams, ADD_STREAM.SCTP must be called.</t>
          </dd>
          <dt>InitiateWithSend:</dt>
          <dd>
            <t>If this is the only Connection object that is assigned to the SCTP association or stream mapping is not used, CONNECT.SCTP is called with the "user message" parameter. Else, a new stream
is used (see <tt>Initiate</tt> for how to handle running out of streams), and this just sends the first message
on a new stream.</t>
          </dd>
          <dt>Ready:</dt>
          <dd>
            <t><tt>Initiate</tt> or <tt>InitiateWithSend</tt> returns without an error, i.e. SCTP's four-way handshake has completed. If an association with the peer already exists, stream mapping is used and enough streams are available, a Connection Object instantly becomes Ready after calling <tt>Initiate</tt> or <tt>InitiateWithSend</tt>.</t>
          </dd>
          <dt>InitiateError:</dt>
          <dd>
            <t>Failure of CONNECT.SCTP.</t>
          </dd>
          <dt>ConnectionError:</dt>
          <dd>
            <t>TIMEOUT.SCTP or ABORT-EVENT.SCTP.</t>
          </dd>
          <dt>Listen:</dt>
          <dd>
            <t>LISTEN.SCTP. If an association with the peer already exists and stream mapping is used, <tt>Listen</tt> just expects to receive a new message with a new stream id (chosen in accordance with the stream id assignment procedure described above).</t>
          </dd>
          <dt>ConnectionReceived:</dt>
          <dd>
            <t>LISTEN.SCTP returns without an error (a result of successful CONNECT.SCTP from the peer), or, in case of stream mapping, the first message has arrived on a new stream (in this case, <tt>Receive</tt> is also invoked).</t>
          </dd>
          <dt>Clone:</dt>
          <dd>
            <t>Calling <tt>Clone</tt> on an SCTP association creates a new Connection object and assigns it a new stream id in accordance with the stream id assignment procedure described above. If there are not enough streams available, ADD_STREAM.SCTP must be called.</t>
          </dd>
          <dt>Priority (Connection):</dt>
          <dd>
            <t>When this value is changed, or a Message with Message Property <tt>Priority</tt> is sent, and there are multiple
Connection objects assigned to the same SCTP association,
CONFIGURE_STREAM_SCHEDULER.SCTP is called to adjust the priorities of streams in the SCTP association.</t>
          </dd>
          <dt>Send:</dt>
          <dd>
            <t>SEND.SCTP. Message Properties such as <tt>Lifetime</tt> and <tt>Ordered</tt> map to parameters of this primitive.</t>
          </dd>
          <dt>Receive:</dt>
          <dd>
            <t>RECEIVE.SCTP. The "partial flag" of RECEIVE.SCTP invokes a <tt>ReceivedPartial</tt> event.</t>
          </dd>
        </dl>
        <t>Close:
If this is the only Connection object that is assigned to the SCTP association, CLOSE.SCTP is called, and the <tt>Closed</tt> event will be delivered to the application upon the ensuing CLOSE-EVENT.SCTP. Else, the Connection object is one out of several Connection objects that are assigned to the same SCTP assocation, and RESET_STREAM.SCTP must be called, which informs the peer that the stream will no longer be used for mapping and can be used by future <tt>Initiate</tt>, <tt>InitiateWithSend</tt> or <tt>Listen</tt> calls. At the peer, the event RESET_STREAM-EVENT.SCTP will fire, which the peer must answer by issuing RESET_STREAM.SCTP too. The resulting local RESET_STREAM-EVENT.SCTP informs the Transport Services system that the stream id can now be re-used by the next <tt>Initiate</tt>, <tt>InitiateWithSend</tt> or <tt>Listen</tt> calls, and invokes a <tt>Closed</tt> event towards the application.</t>
        <t>Abort:
If this is the only Connection object that is assigned to the SCTP association, ABORT.SCTP is called. Else, the Connection object is one out of several Connection objects that are assigned to the same SCTP assocation, and shutdown proceeds as described under <tt>Close</tt>.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>RFC-EDITOR: Please remove this section before publication.</t>
      <t>This document has no actions for IANA.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t><xref target="I-D.ietf-taps-arch"/> outlines general security consideration and requirements for any system that implements the Transport Services archtecture. <xref target="I-D.ietf-taps-interface"/> provides further discussion on security and privacy implications of the Transport Services API. This document provides additional guidance on implementation specifics for the Transport Services API and as such the security considerations in both of these documents apply. The next two subsections discuss further considerations that are specific to mechanisms specified in this document.</t>
      <section anchor="considerations-for-candidate-gathering">
        <name>Considerations for Candidate Gathering</name>
        <t>Implementations should avoid downgrade attacks that allow network interference to cause the implementation to select less secure, or entirely insecure, combinations of paths and protocols.</t>
      </section>
      <section anchor="considerations-for-candidate-racing">
        <name>Considerations for Candidate Racing</name>
        <t>See <xref target="fastopen"/> for security considerations around racing with 0-RTT data.</t>
        <t>An attacker that knows a particular device is racing several options during connection establishment may be able to block packets for the first connection attempt, thus inducing the device to fall back to a secondary attempt. This is a problem if the secondary attempts have worse security properties that enable further attacks. Implementations should ensure that all options have equivalent security properties to avoid incentivizing attacks.</t>
        <t>Since results from the network can determine how a connection attempt tree is built, such as when DNS returns a list of resolved endpoints, it is possible for the network to cause an implementation to consume significant on-device resources. Implementations should limit the maximum amount of state allowed for any given node, including the number of child nodes, especially when the state is based on results from the network.</t>
      </section>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This work has received funding from the European Union's Horizon 2020 research and
innovation programme under grant agreement No. 644334 (NEAT) and No. 815178 (5GENESIS).</t>
      <t>This work has been supported by Leibniz Prize project funds of DFG - German
Research Foundation: Gottfried Wilhelm Leibniz-Preis 2011 (FKZ FE 570/4-1).</t>
      <t>This work has been supported by the UK Engineering and Physical Sciences
Research Council under grant EP/R04144X/1.</t>
      <t>This work has been supported by the Research Council of Norway under its "Toppforsk"
programme through the "OCARINA" project.</t>
      <t>Thanks to Colin Perkins, Tom Jones, Karl-Johan Grinnemo, Gorry Fairhurst, for their contributions to the design of this specification. Thanks also to Stuart Cheshire, Josh Graessley, David Schinazi, and Eric Kinnear for their implementation and design efforts, including Happy Eyeballs, that heavily influenced this work.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="I-D.ietf-taps-arch">
          <front>
            <title>An Architecture for Transport Services</title>
            <author fullname="Tommy Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Brian Trammell">
              <organization>Google Switzerland GmbH</organization>
            </author>
            <author fullname="Anna Brunstrom">
              <organization>Karlstad University</organization>
            </author>
            <author fullname="Godred Fairhurst">
              <organization>University of Aberdeen</organization>
            </author>
            <author fullname="Colin Perkins">
              <organization>University of Glasgow</organization>
            </author>
            <date day="3" month="January" year="2022"/>
            <abstract>
              <t>   This document describes an architecture for exposing transport
   protocol features to applications for network communication, a
   Transport Services system.  The Transport Services Application
   Programming Interface (API) is based on an asynchronous, event-driven
   interaction pattern.  This API uses messages for representing data
   transfer to applications, and describes how implementations can use
   multiple IP addresses, multiple protocols, and multiple paths, and
   provide multiple application streams.  This document further defines
   common terminology and concepts to be used in definitions of a
   Transport Service API and a Transport Services implementation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-taps-arch-12"/>
        </reference>
        <reference anchor="I-D.ietf-taps-interface">
          <front>
            <title>An Abstract Application Layer Interface to Transport Services</title>
            <author fullname="Brian Trammell">
              <organization>Google Switzerland GmbH</organization>
            </author>
            <author fullname="Michael Welzl">
              <organization>University of Oslo</organization>
            </author>
            <author fullname="Theresa Enghardt">
              <organization>Netflix</organization>
            </author>
            <author fullname="Godred Fairhurst">
              <organization>University of Aberdeen</organization>
            </author>
            <author fullname="Mirja Kuehlewind">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Colin Perkins">
              <organization>University of Glasgow</organization>
            </author>
            <author fullname="Philipp S. Tiesel">
              <organization>SAP SE</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Tommy Pauly">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Kyle Rose">
              <organization>Akamai Technologies, Inc.</organization>
            </author>
            <date day="3" month="January" year="2022"/>
            <abstract>
              <t>   This document describes an abstract application programming
   interface, API, to the transport layer that enables the selection of
   transport protocols and network paths dynamically at runtime.  This
   API enables faster deployment of new protocols and protocol features
   without requiring changes to the applications.  The specified API
   follows the Transport Services architecture by providing
   asynchronous, atomic transmission of messages.  It is intended to
   replace the BSD sockets API as the common interface to the transport
   layer, in an environment where endpoints could select from multiple
   interfaces and potential transport protocols.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-taps-interface-14"/>
        </reference>
        <reference anchor="RFC8305">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi">
              <organization/>
            </author>
            <author fullname="T. Pauly" initials="T." surname="Pauly">
              <organization/>
            </author>
            <date month="December" year="2017"/>
            <abstract>
              <t>Many communication protocols operating over the modern Internet use hostnames.  These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics.  Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly.  This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs".  This document obsoletes the original algorithm description in RFC 6555.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8305"/>
          <seriesInfo name="DOI" value="10.17487/RFC8305"/>
        </reference>
        <reference anchor="RFC7540">
          <front>
            <title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
            <author fullname="M. Belshe" initials="M." surname="Belshe">
              <organization/>
            </author>
            <author fullname="R. Peon" initials="R." surname="Peon">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t>
              <t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7540"/>
          <seriesInfo name="DOI" value="10.17487/RFC7540"/>
        </reference>
        <reference anchor="RFC8421">
          <front>
            <title>Guidelines for Multihomed and IPv4/IPv6 Dual-Stack Interactive Connectivity Establishment (ICE)</title>
            <author fullname="P. Martinsen" initials="P." surname="Martinsen">
              <organization/>
            </author>
            <author fullname="T. Reddy" initials="T." surname="Reddy">
              <organization/>
            </author>
            <author fullname="P. Patil" initials="P." surname="Patil">
              <organization/>
            </author>
            <date month="July" year="2018"/>
            <abstract>
              <t>This document provides guidelines on how to make Interactive Connectivity Establishment (ICE) conclude faster in multihomed and IPv4/IPv6 dual-stack scenarios where broken paths exist.  The provided guidelines are backward compatible with the original ICE specification (see RFC 5245).</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="217"/>
          <seriesInfo name="RFC" value="8421"/>
          <seriesInfo name="DOI" value="10.17487/RFC8421"/>
        </reference>
        <reference anchor="RFC8303">
          <front>
            <title>On the Usage of Transport Features Provided by IETF Transport Protocols</title>
            <author fullname="M. Welzl" initials="M." surname="Welzl">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="N. Khademi" initials="N." surname="Khademi">
              <organization/>
            </author>
            <date month="February" year="2018"/>
            <abstract>
              <t>This document describes how the transport protocols Transmission Control Protocol (TCP), MultiPath TCP (MPTCP), Stream Control Transmission Protocol (SCTP), User Datagram Protocol (UDP), and Lightweight User Datagram Protocol (UDP-Lite) expose services to applications and how an application can configure and use the features that make up these services.  It also discusses the service provided by the Low Extra Delay Background Transport (LEDBAT) congestion control mechanism.  The description results in a set of transport abstractions that can be exported in a transport services (TAPS) API.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8303"/>
          <seriesInfo name="DOI" value="10.17487/RFC8303"/>
        </reference>
        <reference anchor="RFC8304">
          <front>
            <title>Transport Features of the User Datagram Protocol (UDP) and Lightweight UDP (UDP-Lite)</title>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst">
              <organization/>
            </author>
            <author fullname="T. Jones" initials="T." surname="Jones">
              <organization/>
            </author>
            <date month="February" year="2018"/>
            <abstract>
              <t>This is an informational document that describes the transport protocol interface primitives provided by the User Datagram Protocol (UDP) and the Lightweight User Datagram Protocol (UDP-Lite) transport protocols.  It identifies the datagram services exposed to applications and how an application can configure and use the features offered by the Internet datagram transport service.  RFC 8303 documents the usage of transport features provided by IETF transport protocols, describing the way UDP, UDP-Lite, and other transport protocols expose their services to applications and how an application can configure and use the features that make up these services.  This document provides input to and context for that document, as well as offers a road map to documentation that may help users of the UDP and UDP-Lite protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8304"/>
          <seriesInfo name="DOI" value="10.17487/RFC8304"/>
        </reference>
        <reference anchor="RFC7413">
          <front>
            <title>TCP Fast Open</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng">
              <organization/>
            </author>
            <author fullname="J. Chu" initials="J." surname="Chu">
              <organization/>
            </author>
            <author fullname="S. Radhakrishnan" initials="S." surname="Radhakrishnan">
              <organization/>
            </author>
            <author fullname="A. Jain" initials="A." surname="Jain">
              <organization/>
            </author>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document describes an experimental TCP mechanism called TCP Fast Open (TFO).  TFO allows data to be carried in the SYN and SYN-ACK packets and consumed by the receiving end during the initial connection handshake, and saves up to one full round-trip time (RTT) compared to the standard TCP, which requires a three-way handshake (3WHS) to complete before data can be exchanged.  However, TFO deviates from the standard TCP semantics, since the data in the SYN could be replayed to an application in some rare circumstances.  Applications should not use TFO unless they can tolerate this issue, as detailed in the Applicability section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7413"/>
          <seriesInfo name="DOI" value="10.17487/RFC7413"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8923">
          <front>
            <title>A Minimal Set of Transport Services for End Systems</title>
            <author fullname="M. Welzl" initials="M." surname="Welzl">
              <organization/>
            </author>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing">
              <organization/>
            </author>
            <date month="October" year="2020"/>
            <abstract>
              <t>This document recommends a minimal set of Transport Services offered by end systems and gives guidance on choosing among the available mechanisms and protocols. It is based on the set of transport features in RFC 8303.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8923"/>
          <seriesInfo name="DOI" value="10.17487/RFC8923"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.ietf-quic-transport">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="Jana Iyengar">
              <organization>Fastly</organization>
            </author>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <date day="14" month="January" 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="Internet-Draft" value="draft-ietf-quic-transport-34"/>
        </reference>
        <reference anchor="I-D.ietf-tcpm-2140bis">
          <front>
            <title>TCP Control Block Interdependence</title>
            <author fullname="Joe Touch">
              <organization>Independent</organization>
            </author>
            <author fullname="Michael Welzl">
              <organization>University of Oslo</organization>
            </author>
            <author fullname="Safiqul Islam">
              <organization>University of Oslo</organization>
            </author>
            <date day="12" month="April" year="2021"/>
            <abstract>
              <t>This memo provides guidance to TCP implementers that is intended to help improve connection convergence to steady-state operation without affecting interoperability.  It updates and replaces RFC 2140's description of sharing TCP state, as typically represented in TCP Control Blocks, among similar concurrent or consecutive connections.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tcpm-2140bis-11"/>
        </reference>
        <reference anchor="NEAT-flow-mapping">
          <front>
            <title>Transparent Flow Mapping for NEAT</title>
            <author>
              <organization/>
            </author>
            <date year="2017"/>
          </front>
          <seriesInfo name="IFIP NETWORKING 2017 Workshop on Future of Internet Transport (FIT 2017)" value=""/>
        </reference>
        <reference anchor="TCP-COUPLING">
          <front>
            <title>ctrlTCP: Reducing Latency through Coupled, Heterogeneous Multi-Flow TCP Congestion Control</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
          <seriesInfo name="IEEE INFOCOM Global Internet Symposium (GI) workshop (GI 2018)" value=""/>
        </reference>
        <reference anchor="RFC8085">
          <front>
            <title>UDP Usage Guidelines</title>
            <author fullname="L. Eggert" initials="L." surname="Eggert">
              <organization/>
            </author>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst">
              <organization/>
            </author>
            <author fullname="G. Shepherd" initials="G." surname="Shepherd">
              <organization/>
            </author>
            <date month="March" year="2017"/>
            <abstract>
              <t>The User Datagram Protocol (UDP) provides a minimal message-passing transport that has no inherent congestion control mechanisms.  This document provides guidelines on the use of UDP for the designers of applications, tunnels, and other protocols that use UDP.  Congestion control guidelines are a primary focus, but the document also provides guidance on other topics, including message sizes, reliability, checksums, middlebox traversal, the use of Explicit Congestion Notification (ECN), Differentiated Services Code Points (DSCPs), and ports.</t>
              <t>Because congestion control is critical to the stable operation of the Internet, applications and other protocols that choose to use UDP as an Internet transport must employ mechanisms to prevent congestion collapse and to establish some degree of fairness with concurrent traffic.  They may also need to implement additional mechanisms, depending on how they use UDP.</t>
              <t>Some guidance is also applicable to the design of other protocols (e.g., protocols layered directly on IP or via IP-based tunnels), especially when these protocols do not themselves provide congestion control.</t>
              <t>This document obsoletes RFC 5405 and adds guidelines for multicast UDP usage.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="145"/>
          <seriesInfo name="RFC" value="8085"/>
          <seriesInfo name="DOI" value="10.17487/RFC8085"/>
        </reference>
        <reference anchor="RFC6763">
          <front>
            <title>DNS-Based Service Discovery</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire">
              <organization/>
            </author>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal">
              <organization/>
            </author>
            <date month="February" year="2013"/>
            <abstract>
              <t>This document specifies how DNS resource records are named and structured to facilitate service discovery.  Given a type of service that a client is looking for, and a domain in which the client is looking for that service, this mechanism allows clients to discover a list of named instances of that desired service, using standard DNS queries. This mechanism is referred to as DNS-based Service Discovery, or DNS-SD.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6763"/>
          <seriesInfo name="DOI" value="10.17487/RFC6763"/>
        </reference>
        <reference anchor="RFC6762">
          <front>
            <title>Multicast DNS</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire">
              <organization/>
            </author>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal">
              <organization/>
            </author>
            <date month="February" year="2013"/>
            <abstract>
              <t>As networked devices become smaller, more portable, and more ubiquitous, the ability to operate with less configured infrastructure is increasingly important.  In particular, the ability to look up DNS resource record data types (including, but not limited to, host names) in the absence of a conventional managed DNS server is useful.</t>
              <t>Multicast DNS (mDNS) provides the ability to perform DNS-like operations on the local link in the absence of any conventional Unicast DNS server.  In addition, Multicast DNS designates a portion of the DNS namespace to be free for local use, without the need to pay any annual fee, and without the need to set up delegations or otherwise configure a conventional DNS server to answer for those names.</t>
              <t>The primary benefits of Multicast DNS names are that (i) they require little or no administration or configuration to set them up, (ii) they work when no infrastructure is present, and (iii) they work during infrastructure failures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6762"/>
          <seriesInfo name="DOI" value="10.17487/RFC6762"/>
        </reference>
        <reference anchor="RFC8445">
          <front>
            <title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal</title>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg">
              <organization/>
            </author>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg">
              <organization/>
            </author>
            <date month="July" year="2018"/>
            <abstract>
              <t>This document describes a protocol for Network Address Translator (NAT) traversal for UDP-based communication.  This protocol is called Interactive Connectivity Establishment (ICE).  ICE makes use of the Session Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN).</t>
              <t>This document obsoletes RFC 5245.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8445"/>
          <seriesInfo name="DOI" value="10.17487/RFC8445"/>
        </reference>
        <reference anchor="RFC5389">
          <front>
            <title>Session Traversal Utilities for NAT (STUN)</title>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg">
              <organization/>
            </author>
            <author fullname="R. Mahy" initials="R." surname="Mahy">
              <organization/>
            </author>
            <author fullname="P. Matthews" initials="P." surname="Matthews">
              <organization/>
            </author>
            <author fullname="D. Wing" initials="D." surname="Wing">
              <organization/>
            </author>
            <date month="October" year="2008"/>
            <abstract>
              <t>Session Traversal Utilities for NAT (STUN) is a protocol that serves as a tool for other protocols in dealing with Network Address Translator (NAT) traversal.  It can be used by an endpoint to determine the IP address and port allocated to it by a NAT.  It can also be used to check connectivity between two endpoints, and as a keep-alive protocol to maintain NAT bindings.  STUN works with many existing NATs, and does not require any special behavior from them.</t>
              <t>STUN is not a NAT traversal solution by itself.  Rather, it is a tool to be used in the context of a NAT traversal solution.  This is an important change from the previous version of this specification (RFC 3489), which presented STUN as a complete solution.</t>
              <t>This document obsoletes RFC 3489.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5389"/>
          <seriesInfo name="DOI" value="10.17487/RFC5389"/>
        </reference>
        <reference anchor="RFC5766">
          <front>
            <title>Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)</title>
            <author fullname="R. Mahy" initials="R." surname="Mahy">
              <organization/>
            </author>
            <author fullname="P. Matthews" initials="P." surname="Matthews">
              <organization/>
            </author>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg">
              <organization/>
            </author>
            <date month="April" year="2010"/>
            <abstract>
              <t>If a host is located behind a NAT, then in certain situations it can be impossible for that host to communicate directly with other hosts (peers).  In these situations, it is necessary for the host to use the services of an intermediate node that acts as a communication relay.  This specification defines a protocol, called TURN (Traversal Using Relays around NAT), that allows the host to control the operation of the relay and to exchange packets with its peers using the relay.  TURN differs from some other relay control protocols in that it allows a client to communicate with multiple peers using a single relay address.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5766"/>
          <seriesInfo name="DOI" value="10.17487/RFC5766"/>
        </reference>
        <reference anchor="RFC7657">
          <front>
            <title>Differentiated Services (Diffserv) and Real-Time Communication</title>
            <author fullname="D. Black" initials="D." role="editor" surname="Black">
              <organization/>
            </author>
            <author fullname="P. Jones" initials="P." surname="Jones">
              <organization/>
            </author>
            <date month="November" year="2015"/>
            <abstract>
              <t>This memo describes the interaction between Differentiated Services (Diffserv) network quality-of-service (QoS) functionality and real- time network communication, including communication based on the Real-time Transport Protocol (RTP).  Diffserv is based on network nodes applying different forwarding treatments to packets whose IP headers are marked with different Diffserv Codepoints (DSCPs). WebRTC applications, as well as some conferencing applications, have begun using the Session Description Protocol (SDP) bundle negotiation mechanism to send multiple traffic streams with different QoS requirements using the same network 5-tuple.  The results of using multiple DSCPs to obtain different QoS treatments within a single network 5-tuple have transport protocol interactions, particularly with congestion control functionality (e.g., reordering).  In addition, DSCP markings may be changed or removed between the traffic source and destination.  This memo covers the implications of these Diffserv aspects for real-time network communication, including WebRTC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7657"/>
          <seriesInfo name="DOI" value="10.17487/RFC7657"/>
        </reference>
        <reference anchor="RFC3207">
          <front>
            <title>SMTP Service Extension for Secure SMTP over Transport Layer Security</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="February" year="2002"/>
            <abstract>
              <t>This document describes an extension to the SMTP (Simple Mail Transfer Protocol) service that allows an SMTP server and client to use TLS (Transport Layer Security) to provide private, authenticated communication over the Internet.  This gives SMTP agents the ability to protect some or all of their communications from eavesdroppers and attackers.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3207"/>
          <seriesInfo name="DOI" value="10.17487/RFC3207"/>
        </reference>
        <reference anchor="RFC1928">
          <front>
            <title>SOCKS Protocol Version 5</title>
            <author fullname="M. Leech" initials="M." surname="Leech">
              <organization/>
            </author>
            <author fullname="M. Ganis" initials="M." surname="Ganis">
              <organization/>
            </author>
            <author fullname="Y. Lee" initials="Y." surname="Lee">
              <organization/>
            </author>
            <author fullname="R. Kuris" initials="R." surname="Kuris">
              <organization/>
            </author>
            <author fullname="D. Koblas" initials="D." surname="Koblas">
              <organization/>
            </author>
            <author fullname="L. Jones" initials="L." surname="Jones">
              <organization/>
            </author>
            <date month="March" year="1996"/>
            <abstract>
              <t>This memo describes a protocol that is an evolution of the previous version of the protocol, version 4 [1]. This new protocol stems from active discussions and prototype implementations.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1928"/>
          <seriesInfo name="DOI" value="10.17487/RFC1928"/>
        </reference>
        <reference anchor="RFC7230">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke">
              <organization/>
            </author>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7230"/>
          <seriesInfo name="DOI" value="10.17487/RFC7230"/>
        </reference>
        <reference anchor="RFC3124">
          <front>
            <title>The Congestion Manager</title>
            <author fullname="H. Balakrishnan" initials="H." surname="Balakrishnan">
              <organization/>
            </author>
            <author fullname="S. Seshan" initials="S." surname="Seshan">
              <organization/>
            </author>
            <date month="June" year="2001"/>
            <abstract>
              <t>This document describes the Congestion Manager (CM), an end-system module that enables an ensemble of multiple concurrent streams from a sender destined to the same receiver and sharing the same congestion properties to perform proper congestion avoidance and control, and allows applications to easily adapt to network congestion.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3124"/>
          <seriesInfo name="DOI" value="10.17487/RFC3124"/>
        </reference>
        <reference anchor="RFC6525">
          <front>
            <title>Stream Control Transmission Protocol (SCTP) Stream Reconfiguration</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="P. Lei" initials="P." surname="Lei">
              <organization/>
            </author>
            <date month="February" year="2012"/>
            <abstract>
              <t>Many applications that use the Stream Control Transmission Protocol (SCTP) want the ability to "reset" a stream.  The intention of resetting a stream is to set the numbering sequence of the stream back to 'zero' with a corresponding notification to the application layer that the reset has been performed.  Applications requiring this feature want it so that they can "reuse" streams for different purposes but still utilize the stream sequence number so that the application can track the message flows.  Thus, without this feature, a new use of an old stream would result in message numbers greater than expected, unless there is a protocol mechanism to "reset the streams back to zero".  This document also includes methods for resetting the transmission sequence numbers, adding additional streams, and resetting all stream sequence numbers.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6525"/>
          <seriesInfo name="DOI" value="10.17487/RFC6525"/>
        </reference>
        <reference anchor="RFC8260">
          <front>
            <title>Stream Schedulers and User Message Interleaving for the Stream Control Transmission Protocol</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="S. Loreto" initials="S." surname="Loreto">
              <organization/>
            </author>
            <author fullname="R. Seggelmann" initials="R." surname="Seggelmann">
              <organization/>
            </author>
            <date month="November" year="2017"/>
            <abstract>
              <t>The Stream Control Transmission Protocol (SCTP) is a message-oriented transport protocol supporting arbitrarily large user messages.  This document adds a new chunk to SCTP for carrying payload data.  This allows a sender to interleave different user messages that would otherwise result in head-of-line blocking at the sender.  The interleaving of user messages is required for WebRTC data channels.</t>
              <t>Whenever an SCTP sender is allowed to send user data, it may choose from multiple outgoing SCTP streams.  Multiple ways for performing this selection, called stream schedulers, are defined in this document.  A stream scheduler can choose to either implement, or not implement, user message interleaving.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8260"/>
          <seriesInfo name="DOI" value="10.17487/RFC8260"/>
        </reference>
      </references>
    </references>
    <section anchor="appendix-mapping-template">
      <name>API Mapping Template</name>
      <t>Any protocol mapping for the Transport Services API should follow a common template.</t>
      <t>Connectedness: (Connectionless/Connected/Multiplexing Connected)</t>
      <t>Data Unit: (Byte-stream/Datagram/Message)</t>
      <t>Connection Object:</t>
      <t>Initiate:</t>
      <t>InitiateWithSend:</t>
      <t>Ready:</t>
      <t>InitiateError:</t>
      <t>ConnectionError:</t>
      <t>Listen:</t>
      <t>ConnectionReceived:</t>
      <t>Clone:</t>
      <t>Send:</t>
      <t>Receive:</t>
      <t>Close:</t>
      <t>Abort:</t>
    </section>
    <section anchor="appendix-non-consensus">
      <name>Additional Properties</name>
      <t>This appendix discusses implementation considerations for additional parameters and properties that could be used to enhance transport protocol and/or path selection, or the transmission of messages given a Protocol Stack that implements them.
These are not part of the interface, and may be removed from the final document, but are presented here to support discussion within the TAPS working group as to whether they should be added to a future revision of the base specification.</t>
      <section anchor="branch-sorting-non-consensus">
        <name>Properties Affecting Sorting of Branches</name>
        <t>In addition to the Protocol and Path Selection Properties discussed in <xref target="branch-sorting"/>, the following properties under discussion can influence branch sorting:</t>
        <ul spacing="normal">
          <li>Bounds on Send or Receive Rate:
If the application indicates a bound on the expected Send or Receive bitrate, an implementation may prefer a path that can likely provide the desired bandwidth, based on cached maximum throughput, see <xref target="performance-caches"/>. The application may know the Send or Receive Bitrate from metadata in adaptive HTTP streaming, such as MPEG-DASH.</li>
          <li>Cost Preferences:
If the application indicates a preference to avoid expensive paths, and some paths are associated with a monetary cost, an implementation should decrease the ranking of such paths. If the application indicates that it prohibits using expensive paths, paths that are associated with a cost should be purged from the decision tree.</li>
        </ul>
      </section>
    </section>
    <section anchor="appendix-reasons-errors">
      <name>Reasons for errors</name>
      <t>The Transport Services API <xref target="I-D.ietf-taps-interface"/> allows for the several generic error types to specify a more detailed reason as to why an error occurred. This appendix lists some of the possible reasons.</t>
      <ul spacing="normal">
        <li>InvalidConfiguration:
The transport properties and endpoints provided by the application are either contradictory or incomplete. Examples include the lack of a Remote Endpoint on an active open or using a multicast group address while not requesting a unidirectional receive.</li>
        <li>NoCandidates:
The configuration is valid, but none of the available transport protocols can satisfy the transport properties provided by the application.</li>
        <li>ResolutionFailed:
The remote or local specifier provided by the application can not be resolved.</li>
        <li>EstablishmentFailed:
The Transport Services system was unable to establish a transport-layer connection to the Remote Endpoint specified by the application.</li>
        <li>PolicyProhibited:
The system policy prevents the transport system from performing the action requested by the application.</li>
        <li>NotCloneable:
The protocol stack is not capable of being cloned.</li>
        <li>MessageTooLarge:
The message size is too big for the transport system to handle.</li>
        <li>ProtocolFailed:
The underlying protocol stack failed.</li>
        <li>InvalidMessageProperties:
The message properties are either contradictory to the transport properties or they can not be satisfied by the transport system.</li>
        <li>DeframingFailed:
The data that was received by the underlying protocol stack could not be deframed.</li>
        <li>ConnectionAborted:
The connection was aborted by the peer.</li>
        <li>Timeout:
Delivery of a message was not possible after a timeout.</li>
      </ul>
    </section>
    <section anchor="appendix-implementations">
      <name>Existing Implementations</name>
      <t>This appendix gives an overview of existing implementations, at the time of writing, of transport systems that are (to some degree) in line with this document.</t>
      <ul spacing="normal">
        <li>
          <t>Apple's Network.framework:
          </t>
          <ul spacing="normal">
            <li>Network.framework is a transport-level API built for C, Objective-C, and Swift. It a connect-by-name API that supports transport security protocols. It provides userspace implementations of TCP, UDP, TLS, DTLS, proxy protocols, and allows extension via custom framers.</li>
            <li>Documentation: <eref target="https://developer.apple.com/documentation/network">https://developer.apple.com/documentation/network</eref></li>
          </ul>
        </li>
        <li>
          <t>NEAT and NEATPy:
          </t>
          <ul spacing="normal">
            <li>NEAT is the output of the European H2020 research project "NEAT"; it is a user-space library for protocol-independent communication on top of TCP, UDP and SCTP, with many more features such as a policy manager.</li>
            <li>Code: <eref target="https://github.com/NEAT-project/neat">https://github.com/NEAT-project/neat</eref></li>
            <li>NEAT project: <eref target="https://www.neat-project.org">https://www.neat-project.org</eref></li>
            <li>NEATPy is a Python shim over NEAT which updates the NEAT API to be in line with version 6 of the Transport Services API draft.</li>
            <li>Code: <eref target="https://github.com/theagilepadawan/NEATPy">https://github.com/theagilepadawan/NEATPy</eref></li>
          </ul>
        </li>
        <li>
          <t>PyTAPS:
          </t>
          <ul spacing="normal">
            <li>A TAPS implementation based on Python asyncio, offering protocol-independent communication to applications on top of TCP, UDP and TLS, with support for multicast.</li>
            <li>Code: <eref target="https://github.com/fg-inet/python-asyncio-taps">https://github.com/fg-inet/python-asyncio-taps</eref></li>
          </ul>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAgoJmIAA+S9bXcbV5Im+B2/Iof+UGQ3AEuy7HLROz1NU5SstixxRbq8
2z19SgkgSWYJyERnJkTRKs1v34gnIu6Nm5mgZFfP7JzdOt1VIpDI+xY33uOJ
2Ww26cpuXRxnzzfbdbEpqq6srrPnVVc0V/myaLOuzi6bvGq3ddNlF0XzrqRP
J/li0RTvjrPLk/OL+NO8K+tqsqqXVb6hV66a/KqblUV3NevybTsr6bnZw0eT
Vd4Vx5Ml/fd13dwdZ2V1VU8m5bY5zrpm13aPHjz404NHk7wp8uM4+OS2bt5e
N/Vuq8P+Qn/zZJ/xZ5O3xR09sDqWuVdFN3vCw08mbZdXq7/k67qiKd3R3Lfl
cfZvXb2cZi29timuWvrX3Yb/8e+TSb7rburmeJJlM/r/jCbXHmcn8+z7Zle1
XVNv8Kks8KSq8t4XTc2bWazKrm7wQd1cH2c/5s2a5rHKfq7Kd0XTlt0dvqTf
FUV3HD8uuvY6pwlnj/D9kh48zr75+mH27bfhJfJNvas63ryL22JVVPis2OTl
+jjLaVbzhc3qn9/mu3lbpOu5nGfn+W5959ZyWW82d+7T8YWcbOmoaYuX82T+
r6pCvzrPm7fZL/mdm/7pbls0RFb1NDvN1+VV3VRlnv3p6wcPH6dLoV3oilV2
QXREhFdfZSeboimXuV9ct+UZ/nPOg82X2PR0XWfV9U3erDq/tJuiKdo8/QrL
eUm0uS7fJ2t5+OhhdrJeNOX1TddbyYu6zZ7lXU0Ec3rCK/jq0W9fAd+Hf+4K
ncucKDVdw/k8uyyLtli7FZzflOtyu80uku+whIuT8+ziLFnBj3XV5KvZv+7a
Yvaab8jDB24RDx8//uZP2Xndtat8k07/WdFs8urOz3YrI/9zh2GHs/1pnv1S
rH/1k/2pXN7kxdp9jolG0ueNedWu62TS56+y7+v3NNVvH2Tfr8tqRZfYzfrB
Vw+/yeKvwpRf1s1tnsx4w8PfFv9cXpXzXVnPK+ItVU0L62j8Yzz5fPZkHtlS
3ixvxj4vjQkeE3MiFjX+iv/YlctZZ0yq/57ldjN79PDxg0XZylcvz04uZ1fr
+na2IRqmw5GPs0zZsLA7Yn1Vlz2lx7Kf5LGMxseP9fGW6KpoeVrE8Z4+P6fv
Ln959frH5y+fZY8ePPwjuGN7U2+zusqe7rpdU/C2G3N0PP3w6fNL/ORIXy0c
sLWJ2XHLf3DoT/nQSyKy6u3+h4gyLnfFe+VNWQauj4HwweXp+ez01c/nL2jG
vT04WHbNmr4/zl4Xq92SV/+Cflwt77Luhpj99U12Six/Xaym2Q8FLai+Lqqi
3rXZT7t1V86wb/R7eqq6LloWSvxP4obrg+H2uXk/Pzs7y56/fPrq9NVP2bN1
vcjXcccu7jbbui13m+zw2fOj7Nb2l/7iVX27Z/vivmBX6AY/b9d68eKduciv
yv/YrZPver9Mbtp9t23wyx/n2Q8lHfVN76c/NiVtDgmb5Nvej5/Qj3MWm+lv
n+TvylXyTe93z+bZSbMpu/y66P30GRH3u3JNwqL3wHCrnv21aOmUrvu71RH1
pV8G6vp29uDx7OHXk8lkNptl+YL4S74kNYCEwIgiQ4K/7YpNVlT5Yk1/slwh
fs0kA9WHWGgWLne2bWrSG+p1m12ti/flYn2Ha0nUwdRATGmz2VX68wlpHdmq
uCorfm346Yw527ag/6q6sfmcxAlk50TYTb7ZJBpZdnhyTuTX3eRdVrbZIm9J
4NDDdIx5e1ct6YJUdBWm2aR4R2PMVg3xrCoDM6ON4Pdu845pmu7nDb2B1LUd
K298J97xXHm617tyVfAGlIluxwPd0OWiLxa7cr3K2t3yhh6XXZzLnm/K1Wpd
TCZf8KSbmm4w9mPfCTD7Jam5BIv68GHImz9+dPuo54Xl52u66MMzC2eTHp6e
Em9mOEfeAiLD8+fywmQ1WfGe7rtowMkQvGeYz4r3qhtfFb+zv5ggUD5+1L3n
p/C6trzm9/G+FhlzM9IasnzZ1G2bbZipsW41RohMZS1pjczcHXkWOW9nO+dd
/3vPON10GoRuPs5ifNnE4ECZvDF/rRc8MaLN/hhX47+3keqM5l/hHU3xHzti
4q2+yB0FE3VNm7csWxxMnDg9T/e5bG/oTlZVAQKkK8GbpU9gL6+KhhlHntWk
mdBgdNz+B/RCum/hXcVKyIUOka5kva6vQWIrmgb91u+yv5e8hJNPk/gc98Xb
YKdhItmrxV/pX61coTjBrJbP9TbQu4VkVwOSZS41evVYt5lhjudNEd88xUeL
XUUXmfedOBF0+ELHovNfNuWikFP2R0LvYI5LJ8PbJ1u+JdOKNPCKh6SZyMsD
MX+nEzjtj563dAdkiTJqU9Cb2oJfnWesQ/HUcH5Ezz+RMCBR0vJpFCW9gI62
bHSjFnT3i0IO40W9JLHO83pdbOquILNgta15wjwT/hxPkWjkazhl3p2TnHlX
ZLd5iZPxc1oVa6i1xF5u3RL45iU7Gs6KdIYdXSq65uFKCCOR3baLnGx3j+yX
9Pei7m5oQ8ik5BnfNkReJHCzsTHZvl7vZPtzT1Z1RUySXk+WcYYdACWXLGFv
b3S33ONE1UsaseN7cDpcWDgd/C7wumTv/Spsp3ucgUiXbBA6ScfuWranhJZo
dSxQ5NjtEs+zJ7uGT4bfR5tHK8U+hquLW3n44QPvzSx8+vHj0bS/yFtSTLKq
7viAFmRkyF3K2i1xmSuixyEPZmWFLPYlTZC0EVpw4Nd0TquSFRO+P/IsWYbL
t8TSYVzSECSSeTsnk1f8y7x3fjdMFrx3O73Usv9MD/Wuk+n5k2joDZFwRzZX
ia+oWuZEoK0OLGULo0y3z2jvpmBCvetvEQ1jg/ASdbM2Oz6k8Lw/6U0OqUt6
Kqvj4L70RE0WdlnRVRyjWZWPm/yOtvddvX5XjC2HJspmGb88p5tYbGe8kinW
Y+Sgd+CWWAIrDO4zvVwlMxbjT3M9iSHpOzEwHeOlvamRdUe3TeUIEy60sbD4
VdGRsdrapi9Z9FQ9MplnT2mri/c5v1mOsyX1d3j3sE1MdGSgFnSl403MmSSv
10WgUR6Qr/sIGR8W8+s5szu2nLwooE9eXJDm0LYYkkUlPcKf//zkXPgwdvdq
t17fzfSmECXsZ7T82yfupfz3xenlOZwB+Yb//D9/fn4a/mTCJivl8vL8y0f6
4dEcwnCEWvN9tFqybIjKN+8ExISX+EGSMlWTGd7ZCfV3Hk5Hvrjus5TdlK0y
2GyNjeCJCm1c4aI+IQ7G6r07Cz0C2tbD2Qvi6EfEn25vyMAzvY2op2VCK6/k
lsmb6ahXX9IlKlhIXe0qR3WsDpfrDtoNTv2KmRhPAIsKZ5WvVkQyrO1CYNNk
WlJU/tvrp6ffPvj2a6gnuBfPKxKBzIICa6IJwBDn910Ua90KpzDwC+3ks+BH
YQHQ8IVmvkGmV3ZYzsHiUwWvxUHgAVrKOueVbOoVr390MFW47uUtRDqBJowT
8FxUuCmr6CtERBdyFLIQGqUE6VyV17sm4a4L6GgtKckNK4dhhcoZU0YhKqWT
WWtMjbmXGAbQs6Bjfvgg340pizTZ2Zknv8lERSKxgllKmH32bFTQgjPUvMGN
u6xqlEAEMeEkVi4rLrcFsVX638BJvL6nMjvohO/KfC+ZTLPyCrZQwwSVr9va
37j47Dx7xodHhEe8fvSJ9ChwRKJkFXnDV5ImS5YVGYlEcotimcNSvCnuoFrh
rvEzZbXddVliYgT+sMlXe07UbjFESL7N2X/JU6N7CJVA7a4da6tiB4WNq69o
3/jQ2mVO4uK6aGbd3RZrMD/WUvxYR3MxBvryvaOjg1LeJrwR9p5nZ6N6Ip8u
78RKKGe5h7OJXBo9xJR9iqU4phKMKiebXdtlehJsYeck0rJ3OamureNUZXWf
yX14j83Ne/bFF0ww8c7OWN3Niqapm/ZTPiKlqZucqQP3lHez3W356WLljfJ3
JNxzUJfwjCKn/8IPI7M3G521D2ylKixLoplFuS6FnwWlDK+eZ6InVnsucEk3
LC4gHkzP5LIVESNe3qgRx2Z2iVsCi62+KRelripQ0XXOekTvXWEdOteweOdm
mUyey7Fd1eyzAXWRgUzzuqKHWReNF5ZUI9oNGnm1h4HBZD0xvwBEfrofTMdB
lepTZ9RYW3q6BU3hFXf3LSBVxcqBJ0J3r80OjLwK0nrWpZzkHWuqZqEeEMsh
tlLV4m7S7WNuHwcuK0woMAaeFqmIpKnuqsoIZXCcKvw+/SC8FbrjNGm+ZxhR
LsI0EwYGGxBqmYrhSOp6o1WlYYalDsC/42CgDoDBXdEPVGPHxYGaRrs+L5St
fgat7jnmoMrFG/WJk7XX09HKgdLxsOom94z49QGOs+PN+m1UgFPYlC1u4f7j
YE5PJui7ulzB47mUHacH612z7DPdK1Z7SMRVRbFiKVpCESVOSweXV+q0WO5j
gbiOo3JSeOfrWvxBSkfbmrbpbtLXxCOz3neFjYku1+xya4q1+Kluyi1UXP92
UZB6oqJkrkkkXWFuppYsSpA8EwXE25J2nWmTTC9SFjLSGqGWECHrzsHVEnUV
EHyYZ+qDE1dxyyS6XO9WhVxi2/V1uQEBdjUxp4fzxIvvRjAa9oMONkv4fX/D
9ulN88mjefbkrso3pNcnGxcGw1+8P1vSQEiHa+qNuGeEUmCcvo9/LvVuJar6
oubVBv5kEY8gXTmFInCHET+1Om92De//l7S8dyXH65L9PZNLiGO5ze+geLqJ
NUXXlHSUuqCZjjcwKSxE+OpiFrw27EDiWNey/XJT5Oz8EE24Nhe6/Eu9jKy6
MzOVQMaifq96LL2XZkNb/hVtueonfY9EuvW0jxop0FMgFvTqAvZspBCRjtei
0k5Txk9PbnPig0H7zr1aBo2JLzNtAPxU8G80ReEp3Gnf7CGkjV+rp41XWy/p
UNoMTsboA5LJrvM79mwqZxItOR/OTewDb/JUxPOuw82knwmXZY4mZwy9d/yO
ZOsiX+Ee1H7qA9OQfR7GmzFpnh29dsMBYZrEkER1/64RD3NmQ2fcld7AfKQl
DfeCLvSaeaD6XfzFwmbpa8A7901Fw0l7ZyRXsaca/6E1a3CevcjbzqbQ54Bd
W6yvMLSpymyolG0eFCxiELR1Yxuxq9ZsbRbvedSyw+WCzB733zHt47VOhlrA
T2I99CbR2YJLkf2zHAPpSwvzCPAztDE39QpGb13DRbjbmu1iz8If+y5v7iwa
Rv8G69gSFTPdM1EPwktKshzn3GyxMzyCvp7lTfGOhWEYJThEZKYsfbOVMlVi
ReKUfkvfQ1PrRP4ErZ0pk68R+0WQ4iIBrgHhmIM4fsGHLTTVFNd5szL+n9KD
uW34sMWJqgErJr7VrtBAdQO+stqQFORbw7kq5nO9N7qU+A2yD1/0nORBvA+8
6uJ3jdHv8MZFcU2GgsjT3rUlSlFHE9MjeLDzKBTmfOl5DJns2NEkkXBxQc2z
w5NOlCg8I5wziT81ppFtxPc68EvfiSKiirNbAQuSKO5wTwcyeX6U+G4QlUn4
IIvcNV1+iSOyEitqfsc8rpW4S+rylfvDvjX77QqrCgpvW3S7rTmRzRMlTmwe
H5KXVBHTgeARHBIUX875/a7LVSm2O0KsdMA05nZG16ZYkzAttu1xdhqiG89y
XhudzRTRZPaumoOSBUQ77esBhfctEeXKp/GFr3Mk/Ry2BfsUZYaP54/mj5j8
xuOnR1O+tWJt88C0MFa0GydL6Sqs2hu6xuruk0gSb2od+dbAVhKP0BoxBHXF
djrtYXS9a3ZLMYbFktcFCYNpZFXwxXDSG7IHQiy5ZE8uzYnDBPAL/nLDDqM8
m+jT4eVmjsECYw/zLaIkOj0dRanRxRhhC6zqgpV7dbIQb90JqxCOxbFx/T3S
m9i/zSS+YYsSjufCS3C5e0r+EtKyYI0RgTE0DUM8PzdPM29hPK0e+77lMEur
GgCT6JS2O7zKOKdqk0H+QRk5FM0rPm7fBvF3JNRGBN8I90bAIxBHmj6Qa7jB
rlzU1uNS5tkPJBrfsYkKc5XvB3gLPJhidWQSd0D0OKY1BM5kYaBwIY/ZEuWP
iuA5T7JOclj5nA0VHPZTsUGFzfDwCxeKZGuRzsU7+oPZGPjcd+7HmLt/A26y
92wdWtoDe3J0w/PKaTcSXaFhquQggoy18/hOzqN2VrlE/pjI2Y4FC4wXMzmq
lOMeuCjdAfEPKGAtB1QkkrIuRmI+iJ51ZCv+WojK63x5jmlMM3sdR64sDEY8
4Bfadj7+kTQX5uRhB+ttTMbY51udGid/Vxa3QnEF3Iys2pcVuPJOGMU467ZB
QCNy64jer69Zv+iKe3y6fM/jczwqW9DFttvB+lKzt+U4JjHVd/m6XKnNHdhH
EeN7yvfVP2NOtJPW2QDTcHAjGydCTSV9OwhKSlA+XIF/xAUI42uiD7NXElwy
Vaf9Rrl++Es5e1ri6ReXZ0eyCeGtemdazQAwDvbuceBhepXlLaoHTVX2xt8G
n9PYb2lc98sYTPEDfhM5zfCUxMK7nxhUGDBNCfsQN2x7PJn8j/CfyUl477+Z
3nWc3d7ezvXAON3++NsH/579W0hG5BKIu3/PsuzfTI855pP698nfZv/k3/Lw
T4/mD0iAP8Tv5T/+LdjBf/9730J7+RlzefTgwcPjJ99/e3z8cG7v+Yy3uI2a
nLCpXKkMZHOl3S1mtOGNC0GO3jkzSG5hnohn8i6NWPby28LdxG1sqiB325ia
gOHW1/SK7mYjUgIiHOI1zNGIAclvd+LeFWKF7sC+gIYu4zxEDkcVvOFVvSob
0g6K98ofmFEl6YkTkRy40eLq5NiqWsvEClc1GL1+Rb9+LZLReRQR6x8PGsE+
5DqebEECAtEMssXqxlwI5/AsEEufbF005ITt/cRhrLxKvJ13JiU4raopc3F+
XqgCluyNctpL0tCILqCY8RVbkHyYmkwX6RTVrGGCUCsm57Xts/AQ0cSG9kXk
ykEnXEW18juhj72aJVOM5BOJo6zeqRVlaiyt9oz1GDJSrmg9K6NzUUOTJDwT
MMv6RjyrQ1qfqklXefYcjEamDdn63LhZJB6L12giH7za17XkH0jeK6dYI3+z
UqUfb51nmD+mruFCTN1yppFSIMtLVjNyUe0nmlG447KUoAMiMaVYR6ewE/Yr
djdWy8CDe3EGmMY2niiFtE7SKaMsGJ1OPab54UR7M3NR7bEXhUhFHlVDp5zn
EkrsWeHz7LlT+YS8sclhF6ODaHzynZevpQalmW74NUopyxtOOuYPRFWCTu21
beeb26c4tMFfFW0IVVHDCTmNAExEQxJuQgndm4vIcgGSvEZPzq1RvHKkuIgw
ogbvzZS6V1SAldjlXzX5beUsSNpsVEQGv1HQ7sOp6tWAAhJ1c5j1xjFTNSC7
7z9/+9vg+3/8r3v/84+Dh/+WjWgUX7I8zf7ON2fZl1+Ozfi///fJfe/5nKH+
NjZnUfr+du+6WLmjdf294/dOYPxk9q5+z8v/8Td+LhP5W6KExU2g/0u+kJXj
/1J9y/bkP3FWXjO7hGXddgM1CVdcAhjE/tVLTMS/gRXpc5dZdtLd0sQs4QaH
fPmbXfX2aMgY8ObFgAm61MuuuGbngJmPBw8PVEIJq8PLcmU5jhVV9lNlauJS
kTSPqfgkHxpTrXabBTuAr+SdNGmeP4vPwE3DRHdV+R87zhMNb8SEWbHgKjsJ
LzP7D8PX9Ce7qrEZbfxdY5xuVSNkrSzRL3X+8AByiv716MALZptNu9ts8oZs
b921bhe8S7y7hTD39tipD+LoIROu4HgmXBaLu4GDJ0b4YTSBjRrHZXZa1bc8
PqfO06ol6Y3mvWSpjdh3yhYfZv82vOFTtn+mYiDQDZjveQjXJDyGB/lRf2P6
D9F2jb+L7k/ypkfDNw0foXel19A/5O/PL+qy70lVthxbuRv3WZ8qsxLvw/2u
DvFf2t2MNlVUPttBtQ4fKBe4SXjBhonaKqk+9QYiMF/dBQ+zOccypt1mVNSW
6W9GQmEcaxLTQKNCPcZRqtIqTpI4pd1WtHxIYs6T52XyFfPaBtZTdun8p3Rd
u3Kt7IY40JABleHR4FBl6lZe0Q96uKT/uAF8XLc3nNzR2wPSVE72+xcwvLoa
V4VEsK1QAyerOlX/iCKD2KvlVl4dhbMtYaiixSj30c/Dhe/f2/33LDHqk8MI
PtC4DqZOYacsDngxR4PVKE2O+pA0G3zgCh/M99Ms5BPswy/rC7JcvxdF9PJu
W0iWI3t9JVWCzSL+mClK9EEUm7NwSXVhaIw+Qdjp6Xwt7vZqzshSwOLtjiOp
1Q8IA5sm+qTgatWYL06zfX6VEok5Suh1Xd5cF84OdSJi3Ase405cOBbSgWQD
grUJYpZ5hAC9jap1KZIqDm8mnCb0qOWDio0gP4/jJT6J8cyHaT/LAHk5GlfX
Shcu4WAHzcuLQGKzrp7ZPQG17bxbCJEbjq9yuDOE20NQARPNLd7EDLK5i7kX
sJpSkzP8kq8rs+VVyb/mOnlnu474aTQiD5Odp08aSGORd9SynWSH7B89wrpP
6D/4+5sjpHI1q5YDIngwh5y2XCM1b6QQIhpYIvODT4xHwUH1fCviGYtWk85S
3KMapuHdo1lb8W+V/UDnd5ed3RULokIuk/gvXCbx1QMpk/hdV7kvnEd0gfuV
ha/8Ox6NvuOxf+SrwSOeZ9ABzb5HAavmQGdPynZZQ6hJVcg3f/zmq48fcV3A
JTXX27t5HHEhJHY/hTF1rZB6Xy7Nc7Yu+XYixUWHTxjQ0A+yzcumTUnCLHNn
/C859s40GJbySAqymRbspYEWYLkvwMryzvxsatl7lqHCCyHzUGTEAAHMQkRn
CO9WPTi4ZuOgEkVVqZH1OG6gU5P04kbWosDA5TRtq8dfU7pk7+Bs2+DCzP9S
brfzv3TL7XxTFKz9I7o+r5vrUWJNftv/xfE3Xz3cq/B+Rf/91Vfzh988mD/8
dj54MpHGvnx5CVtIi1h17SM8lrdI3T6x7Jh5896iE6iwQi5JRUTPW0ePaag4
smvwlDck0S4LTq7NmzvUu53IGb3Rs5HnfVIY4jmgZWZ3Fi1ibxyP8MkXFpxq
WvF5I5qk3kXLLMJniPG7fO2ssxdGCjKBe7JGfiWXqLLrysSt3Lwkepm4uFwM
DcahpYznRKgL1LnIG6CgMaHEBDzw8Bh3Oy3W6906jxHRd2V3F6KgwQmWaAAS
a43ZijwjFcyJP1dvaSxtvrkvAKpuRWFHfeqaxpFcqQID4LDdarX+e4W5WqRO
iGcnZivF1yElQd6EkmyYubaxIZe1b+dC3WfDtUCVOgcvKmU4Ml/WVqOzkwTs
VYeEhDXn2Ia5R1WDh224tnjWNeVW0sNZfuKV8eA3nI+7HGqvqaAa2MefNHr3
2bKpm4ddO+D9WxI9zEyhVGmwlmijLbudBdFcoonSJduxt7lAIkW+WVZvkTQm
1q5SV4gpnAztD9Uv25u8gftiMn5bNC9ErZUQK7HIfuTqSDCm/2XhhCq0Ro6Y
uT9PAEcTLBNf5vuubDgk5OamotTZJn/WZ84hlgsGP8McD/98/tLqyUyLdTUw
PZoPCXaxbubeJDsGJ0ki20kGqSX5KzsK2XCvhK+RKqJa+lJiZFaOEBM0OFGu
bstY8uqD3qlu4gycwBPuS4iwMEKrZGOlkJwhLnSEelwltDZSWh6SbyNIgLBk
q861mI8ecxZRhCypLBB22aoCv77zRZgxfwV0JavOEXt9f2evTQo9WkfDPokc
KgcsXKuUCEkkRgXHVn89E36BQVC1/er0x4v0Q15KLX+YUmXvG3BOBP6c4hT4
GLLiP9P7hrrwMRbzbe8Z/i8msfd3X44xnD8eP3zw6KvH/hdY3pdey/6sWeDZ
IbPrPTdgaJGXMdkaupHxLGZsKg5dJYtC/wyANUagglhbNa9ZTONaqp4id0Qk
mCS9GobQEIYglgDYXcNLLPkPtfsuTTOFyCOzARKcwQNU0sm9FF6nVf5iVf3x
68cP7HmfdRXqvFkmfdJP+/jxV7r57KbgAfZ6a+OjvIgvaY57PLbjD456beOj
PPSjL2khX+534O59OtGO1Qtp/mzWfMSiRb0eOAID6H32HeKNuUCm472ObDzL
Q9zjx06e2evG9nrBHjd2fMQvPQWbVbeNaboxZcLBYw2oVdnQhrPEcyRe0O3r
6gYapRb5f+INwqaAeJEig4Cpk6I3Mw1AFb9ZMIsZ16iV3OYPH5xKOFvmHIzl
OmWRPb6wKbWArgTPUVfrqtOZ75bs8+BcRq7PaXbhepnSr95A/uUrdonM6qvZ
K8OmIImrzkJxionvjosbJEMlaKHwpmjlXrRUc6XLUFID25SHcv58NQokLw+6
Kctweoy5jppareYauCC5pNSUljzFyc36jhDKhmgcGoaH/B7WqaS4UuyQHlEe
0Quv2MiOOoIF+KNOpdpcqOJQN6pTAQJukg1lYa7IsrWORemjtQKOrWpl4gfg
dUQmH7xdz8+twIQ3qHcTcFasodGciDLdtkg1qRyZ1bhhdiVDC4Hb+/OxfNa4
wqDXLjxxaC2pnoboJuI4Vi2D36eKpQzOmCuB1MQcDNsdlAMtoexZpo/mQ+0Q
dXgDj/GtTDtjT0BjkVHOnV3CZ3tD+g7bRlwesSqknH4lawUB2PdrOnGphogp
RHN3eYw8REFWf6skw+kvoExbIo5teR/UzyemNvybt2zCsa6IyyUpLO5uxUCo
d/eyUdAUwMyLdKNDkvmBawufOQhUnGFwkKH2S1NFUDguiVViO4AWRSwP2GLi
hU3dLeKxQ9q7rjYu0oJ35dUgtbxxTjTRM2qoo0m2s3rbWt55WDXNAGOsZ7ok
1i9g2XrMHEW8xXuOlRfLt6KHSiokeyzBz6DTdsMctakwWYX2jMzRvDIoHvGy
wnyeRC7XhmGCVztcIrMiwutcJExz90gn2zU8M7YMezpZKxBjiwIeq6BcC5SW
SRCuFFt39bUsT4vKfL2BvUBGO1mtzP/F1gVcJPFQ/tAaXwC3G3lbqFjin9Pj
PrYX/aLz7PSmrq2QIA8MICwtmL4KASRFUI0heTlPCpx9NHMTZ4agPBQO4eKy
8cR+ajW5rTZsxK3qHNsoMbNbGAOBZsDzJXK3NNfgRxoe3GkRcB+IoG9J3wCS
RtjYSmMhfYfkL+XTUrRkzrPh8aTo1VAmJAbpcSZYU5vG5FmTV8LIWr3eiF5B
SrEHojVXqma6YVCrn6q3sPqq5J30kCqmmvShheK1/QbPCNssG06nlgIpHzXr
UpABo2Wv78WZuZoc3cmRygwrIILilahbICcPfRG3TC0PbAQ2mldvAUc8LT/0
2afYIF0UzawIdzZ5SdgdziNfyQlMAy7S3iA8+EuxaqErxyQf3NsL2baB7/su
Qh/A7YzhO5TGObmoqKhF/BX2Za0Ao33a42X3rPb5Z5oc+z2Dvafu9yA6c/4r
7z9MX+JMjeQpsVk0XWbk+9HQ+kUtVWTfG7F/+ELoftbKNx+HJovFQuGbv4n6
eRI1TzNrTFaZaNJHy8YfAjtVNDEMcd8okbkAGiWn4aP55EXU+DibNbmsqgPx
C1kZd67GsWwfUEVIg2NESyHe+b6Vmybqlo5cGlRU60WPgABWMjxam86Ex4k0
DL/q4dokIxsW8UjgxwJo0GI8tNR9kM2AaSCxVVoFUo8j3Yt3NcypEoGMvPHw
Vk7U15qDIEvAnZLgATMAYD2yLbLXjIRu0q8/x9Pc2oOtPvlyJl/yD5Rd6bHP
J5e3tUmk1upD43bmKfqoC6upX9xQS3vlGVLaoVtVkJZOCv8/ZAcR4fx5AKts
kLNycMxhqYFjOaBeJVWHyC0RP22kf5aBUvIx7R1DoMkga1gjpg1woaXfN3qo
2RYVUTGKxijBABQKlYkVsimFMiTHvpopygeknUyK96yPL0c7NQRDYCXUSgEG
gHSwPBGjHJbpVL2y8YjyoIAEKZC8/Cok8/1eukXjhH/ILgwCTxspnPtZgkmh
mIAZFcqPdGpRUC91qYLUw6gImxK6JW1PvuxilExXM00xu+sFfOisCb4vN7uN
lctsd913MsMXdBu0L8WXzw1e3/qD7Jkv26R+uq+B4XvZlNvsstwUbg5h/EZQ
iPkRQWqyTRyZxkuilM+ZCozj+2axUzwB4hSAtUC0ENgbIAYd+rTGTe1mr/kZ
kbCxpcn5gK4UolyJqJYCuDv1lxgAibyG+EyFq6N/vlYwg+/LTnIMf+NhGeHP
LoqCmdtxlkwyX+XbThVNnXANJDq+ckVCaqMU9pmTmQ+VASvvcnqWqLdilgS8
PMjM41A5N7UyuakuQYvawKxGcx0YOTKPwHJDzLT78rbEHNjummsns/WNPDvn
2et64JMSPwjc0I9XBpsNdsnbotg6jQAmXSyRbNOaeXqtpAEmrxkqFiM2hEmF
fvWfYaehTKC6M5ExANKkfy2IKN9ysSRymkJqmY06xuUB/ckkjFye2wJhN7Df
FAdvzOxzSD1tgWSEfEwDCZdMa+3V9zYCaCgeG/GPJH5dVRi0LNR9wYcNJwmN
LBb+d9FpZrB8wK5jxB/Vig3pp951nNPMX6nTeiPshE6PgbG9WypUK32GpuHM
vJEeE7u4wxoARjFmC9wZm1KvVYJlsizuvH00tm8RP2EtGdM7VVGL96j9S9Dj
lJqDqtlqsokHchN00mHRLZkUoTBU0XgAMUGbGQtGk1LSd5Jz7EE41H/3CTgW
r7iNo2WprIdrE5AUyiKD1uvv6DQwmjL03/CafT3Uq/IRrNdx3DuYX3GTAlRQ
LM2dTL5nJ8leHHJfxWvOc8s0jHh8+zMEsss6RJ6c1A27xalMPXSlw+enZ0eG
rP348dempis59GpfLaBKtMr6+kJupVTDZtwyRiGRAJSnbjdHCEHr6K17BBWy
RkKuZmZoXUegRNlAj95exYjx0PcY0vL77xnCwGvMhd+RDuKMyz3dXCxlpPe7
pTv9y7iYkDfSWwscsaAhdpdYzEmhbqzKlXVbeoBDfdVuA4WoHcs6ToOFuk8K
2cl27JbLzTi/QtD5xHVJoyaOv7TbDjN/ca8xijrPk1uRwUcvhNcqqkS1ksxC
yeaQJdEV3jX7z1ESrpn/24unmp3Y+wTPiJsrjKOfHMUcWAEhvDHsQeUfCPuX
UlVOmsnLk0v+iINY+VqKTUQvCE5sQxmLrK0/bauPWTR1vuJDoTe8y9dFdDPT
JXPLjm/a3jBUTQIr9TX7lOaCKxXu5BHfbe++DmxO6qI1uwYOi/d84wc7G7Fq
sQESyAkub86xTH8yTTIaMkGg5MdowyCSkMOaZxeXP7+UNB1lIl9/9e2faMKa
Rso+6tVwNiLS5A2XP79+aQvQV/zxm284ycJS/PCao+lI3TJGCaltob5Os3xy
SVGOft1PMRKtqUaCU5Avk8mzvScPuKmSywXH+iowZHx3A+zPsuvhURl7DPaP
biS2Aao+xwU+ebBg1voGv5Hp3rkX7jkS2rPon+5ixq5NN8XY38fHjQXuF2vC
A/vfc8jjbltK9E9S7+UaM9iSS3KTqCAKf/IBI+0BSWlcbrxLAC33NV5n+t3Y
jNLrTyJu12g+q2vzAqcYJsyAjrtta/VxEl6zSU/Fnxh6iPUpMSI+9mdidcMJ
Rf6AYpCyX2Cz4rAs/B0SvbM7bOVNo6IXOLiWmrgoXGehWm5bSiq0dSdWwAOg
rdIlGYxsY44AE++QA8STH2qBox4rDQdrJJxsKkc8koD6fuXwmEwQq8suoD5b
8Vh/LlbJIFguUjEGTMP3Pur1KcIQIbItuBNCPeP/HaYu3nNpGN2iWhW/vmPE
UMuolT1h3ZLJA0bsUhNXMQDvTC6poe0IQqVwWsUiFmnwKX0pOpuFJjViHiRm
/Gkj64+7r8mePMWw/zxLospPXinFOUm5JGs56q23jcsVYIUzoEIFjtGpneDn
sSS5d2HLpYZNNVNsbqxAyLSUDohg3LZOIOAQmV4HRLy9skNlzBhLHCBJGoQp
i4677LrOw/sHmJPGgkpptuNj9w58pq/xSsVqLI4zNLjoF47lTiMVyymcQAe3
/7rsurU53qBIclvHW2J3EdrSZwH72usA2o5MmU35a6x1Y0Q0mlHHYO+k5ZIS
r7osAGTZOUeEjQIGgcsTvyleYIJ/TWqXZSkbvAJsJnmR4ebmzNnuxSfTdoq8
6tjoRgr1wcloSpzHFBGPZB9iM0X6ZEP7t77XDQBwHCtVeVtpXR8fqWKoiA0i
7JGvpN7OTQKIrVIvuJVcuy3hQtptAHHXYY2tS//SJF+NeYU6xHiAV0nyl0bo
+gCRI5XYkjd1UXLGQo5+yJw0ddHl19ds3nC21NO8XPNJKcKTzzHHv7cN6Lv0
WUTcRRzNOrArPgHMbXtM+CNa3EFUe0I10glNC/aGYXgb2f/WumUkyKkGI2lz
Vx8Xkzk/YiWfCeRq6K3AKZ9JEzDNTxqLwEpRM7vcG4ESlncBUAvWc1uH/Czz
kyRoRrDWhQtbkTAH18u2AOYB+jcy6LMUh2sijoB3xOZkUl+tsWZ/tJOLkR0y
5SAkrcQkmiT+ZpVGPAvG/7LOlhC3Cm5nJ63Q11tuRsycUe9LwE9FhIo9gzYW
7YRFhIq8alPiRgiASAueEnZnulWkxNs7PC6xVH8sg32k1GM5mWWnBIiwMZle
Q8oTmRRSdlvFY5C418hNxsaHOzQJ/+wB7ULxDZmTSQZkwt6TmrqkhP77JIYA
R7bzruFY0Y/X9pxfN9XcJXbOjyC9GIAmupAVqxL8aqpBheiy0+S38HMpEIM0
hvjRrkPiwuQqyZV/GpnKOo6avDdlkzxyWCLbhLWpI5vcNbuXMZAlDWMsBefl
lEfV7JEA6DDBkJW1kMTcMGzdePAQ/3gv/U5QtVvNGRCBLkr+4GQDzfIRQy8Q
lyRdcu55tx5m4DoeJgenzTq5m0pp13sM8WK3RZF0QCSWXYaI55/MrS4zbukV
2keOOsfgdjxEshhZ+EZD9OJZ3IsUyZwdCM4VJzoHgo0afEDkxkymSC7TPvkM
axkd4Y3tsSVuxoTA2KdBu2A7x/+wPL9Xi+9RMJPOea5E3/56/Ojhx4/mxmzR
lS23VCYDweZL56zP3+LkZUdG7FIXt7XPPk10uLMNgYtFkUYW10V13UndeLkx
16u0UgEYpGx5ejd9vJUzvJy+Y5ljKDDX5C9l8vdWxp1EIcvpyv1DWHISJ6wK
WbCtgLNH1vWgJ5UbJyI7j0xc8QO8M8BTk8RMxxPVAxB0j+rG2tiEktp7KJQr
b7EU41oWONE+rkxCYJ+ptjREgPyM+UTKsUQVdhzgJMUzs1zWO+vquME/jT64
GwmOVZI8trne72EjErdBq5Le2bb1UhijeBZ7yaqWGZg7WHW4G/rZUcpJkB8W
pDhchHLHVUreTwzMN2LfjHDm8m5DRZWND7RmRohL6ozZudyWpwRpxTJn7Nhe
rVSQ14lNbyGvVlpbgA7MqrAHnhk6Rem30ubUvzYkisdUY02XD/MXj4EjH/SU
dxnZWSaqSdTon1+NxUCbQSwZkPa1dOXy6ZtO51P7VfuuxXC6Rfq1EwmuOeP4
k/aowjpiJPFQLKSQ5DWuMYo9smvU1R3t4UFgEVBZZnI7sY0RJDvCLABSZ78L
XQWlvaYo5b0lDMZQrwMPFdRwfT2jYMXeRcGtdqV7L341xYkpVmK8JnUJQ4cB
X4kdjCrNqRcM3LHHFnfcgL4ILlKuq33qhlYzuVQHYXhKXJS3IIINhzWtEar2
LiM9X2BFrsHzUcalnksXpGe/5m7rrDn43lkTTyoCcMXlbml2BUfQY3E3yUuo
XgjVpo1qL1PP714bNypv4J1MauMuFCa9UbVvldDO/vCowfrm6AW/Su1CUUCV
tKNfR5wZoorHaYnvULrAgLKSnuLdjfV2H8lsZfcTb75v5aKNWy5kcWrMKLFr
XEm0CVMsXcV1obU60j/GWapcIFffiiF6YyhzbsFH/R6JY608kaMuCdpBNQ3N
O9Bi3Qo1inA76REE34S780/55KrEGJYZ4hUQfI6tyMa4+o/kvdn3WnjFSeHy
3i67Kzr99TR7aMa56x/R1f5048zSN6iiZWF007ss2SUAdtfsM98VKWRx2Kax
uqBWcQo5fpVzcSA/mAey4TFDIdY2v5ZAdO2ODUTH1XNpZ6Se7yjF+0vXvyhG
Zxb2W7EBbZGeYpU6P7Pk+P8d0Mz5fJ6WE6eS5x7WkV7fqcgLEGo+hHJBe+hh
H7x9Gexi8msHAE2FnGcvk5z2Xr69Oe+t5RM46wgYuloTsElrb5mlxne6BZbS
NL4V+9HFI13JfbkVQ91VSI91a0u1iTW3HlH4DN+yqUq4d+v4aihtrS3xQbFp
AE7Ur5r2OSTZj0UB8GyfgO+c6oMyPS/mrQwYxo6dzS37fVtRD73TX/W84r30
PUD/PbQ6t7y8kNEmet2TaLZnF+EU+qJzUALMZkIRqihCLcHiLiCTJFrW5179
4A0WdCGpcA+6Cira55lmySOVM34XdFZRi4bAFAEXh2bWxBOfim1Jl9Zht9YL
6RtK1MKldaWm6S7XYtoYiPJBmPlBDJauUf9CWlURcBrhm5/dotTPLE8mXBCt
ytzV5y3M28s43FgiinX8/OR8vOl5fhf74ODawruD/ffL4K82tdQjJ/kouaAG
SW4EXGwhrarVjlPI+MXC2x5zkDz8K6klzT58SNcwEzUQpS9PXaGrlZji4ILF
7Tslie0XgPIlXwfKZrVjJ0vc1J7CG3IXUd7IkB98c0AEIxm1apvFLO28G6Fw
E1/gdzxm2u+rjKwEmp9Cj8GoMd7ME0naTgXmo8BGov0tiFdclZ3UiDJRSv6g
KL51FWkxnQH3a2lvovOBY9VdvQ2o/jAlrkKOyViwYio2yGrHxVeLHbHDqi8H
RhIgWykWs/PfK2tcYbqwiZxTEUkBX7Fr2OUt3aBakbmNBhQieHG6hcmmD08W
9oXCJS+Lilt+enSldPuiXcBAM2/XWvHBA3p1P3bxAI4l82g+btFWXTG0eHi7
cglYOtfdcqUgU7VixLmnipCtcWmBMNz1tt3BNOG5hN4yalTel27PosbglDPu
hsnCmBOlI0k6t6hsMo/Ba3SyVtSbGE13IA9o9O0ElCa7yo2X/sVcd1S4yKND
ksqS5HweIcEAExtE7YTLwPFdMUK+1A42oqJYoWmvdt9x/kFfxrhTVgnulSrr
OWPNQs+4vbnsIDSQkc8T/xrRuO3/KrGsB/Ogy7uC0aJAGi7HSOK72jo9SO6A
Q8q5MMUq0Tc+fBGOb7bZvf84mfxkT8LhqfhcPrE8xcZGG5i1IKyOOdVC35dQ
apAkqSct/95rfV4snUBaviO8Z9x7REINSWn68Dxiav/pGj4iOvwjQ4S9+fS8
Q7YrJjdrrdRo2iMxxatts4vYvXOTbyWzys1caXOwFgF/jMgrGIfbTwXA+cGe
GYOs8aOV5oL4xet+jMzy5Px5gq9CWz6d7Hl2pJzE96nkAli3nMWdZDHfSait
0jRx0lcm8qz2tayvBGtB9H3HPNw5uNcGqBQtdUd7xkFf8sRvM4GpSPxFo8Jy
qacK5KARYiFGheymOz1ZSAnOQfKqA3q+bfPrIjuEUiWS4OL/fnkkLL9PdYDf
kF2A1WMa0QQFSazesXMvu4xlLOGIjUEwp4Ij9QpdvkZPEFlM67WLp/8k01SX
7YRlFft1Ld+T5qVB5utdTu/seBfDjeynVPmWIHfWeACJLPnCmndpy0O2cyYs
mcSdZ2LpD607Q62kWynXS2LeugwRKDAmxbUpivCEC3OJTqahF3N6GXpvDshA
K02CjcqAuMl0l+gGcK6sZDlkP9BC1mndRaJPt9qheqimcveKMilyMi9rJjlm
KKFK9TgASImQdVQu4h3Jhr20VnOMBkT5xEMZtCYXJZ7uX0gMutwCDU874dWC
nGMnHaao4b5WsBmubIq1wQvnC9IrBNohWY0RZeJ0IIpbkMJ9T/P0YJVoG/th
ytuiSBgGu05q8QLsYWEqMuFkUYQW6FEc0wworXXs6yaptwHGQxesbruGebpA
cpj6kIJ9p86JnlFWSy8RdxUtT3EVs2A6SenO21qbD/a7h9/mKTCjdcFVB2ZI
Lky7fIuxML7rAZQO+pqisd7/OgNgYPYZHE6hfccXvcbva9S/cU7Thy/k3x/3
tn1hw7Z9KzLtBZ5VX+41/9G4CiOrWamj3QRYNxXoV5rgzI/285ufs0raL+Mp
XRnYfYqyXe5QWsMEJ3ov/2i0EFavmSW2xlydQVi0brRBIeIlIelAkbxT/CqZ
5Qvd3axe/BVFWpZ5Jjs2vjF8Z6KSPgwC2zwC4lolmcOyn74akunKYIV7MFix
blPvC+KdbX3P5m5qEoIRmVYuqtZRaIJwhHqSJcYml8luaJpdDmgAN6k8yTtU
fbDXp29sdxO/nE8UMKckNFUwH95xofNSMHcLSRq8j0LkqOMMokCpE2kQ3hvS
BgY7aXpr2d1LIAHA0rQSOn7EjxPzIFTkhGsekSmr/je0bZq+tuf+89tOg3vE
eEo7mcQPh7KKFS64ZF5czJiOZmKLSyGBxJVJ3976rIZ46UddEIdcpTZD268j
28bSOZu8FdCBSiS8zmo9MiCcqJNNbYWQNBOPlV3bzMQBIR68EMxJTkePxdng
Pf1aj0/KgTlhJhSf+XZRn7v/Jp+Gh7Bfa2CNgYen/52R3C/cjVAO50s0cSE2
BV/Yst1ETjI4aPotp6NCBxnb2T05b0O2bx7HFK66txg4k+P1xB1AAqC8VZN9
skgigjKCq3wVhuA0OHHtjNRe29RNURJIUmFSo4fawqm1Xecdj61Cjhgxa1eK
MK8tN/LswIDX4woP7l/xngwTZVxteki14ZYoBIXpxuxgJO3lusk3Aq5YhZwa
teSW2q5kZHWfJMqfnAPAUeR5qlcbdW28h4Jr/2FYtqFuTISrO0GWRDKgeHnB
1dCUDUUWtwnLO5Sbp6jQZrRWeiHTrvBasiixv6OAfgdrd7eYfdZrq0hC8fmj
4K7OFyzjgknodjc2fxzygQzoONtt/NL7WGR05+vqcyGyn0rmZePUar4M3HC2
GbAJpaqMbXGfthl1ml7mAR0eSeytBZIGfhKOTse8xJ4PKcVNCQ1qVSnw9MK0
mFLiRYhZrBTzhf96QsQuiSIANuOA0zLIGWTb2c+CUSlBmd55hUvjiuNSr17M
MspRYMLctMjXrdREtHStGJBS+I628bER4b9Y1g0RwrauJK0/0L+NPM/SrNDW
dcK84QkUFSpYNdk6bkbUDPB8vr7l9h3S0TREI3QqvXiNNSWUKqvFXVeoA03V
KgS2mMiqwpqSpUhmvosB/41aRzlNvTrSvhxuX6klQ6VZsj2l6x3d3yZ5Kfoy
Rr8UT1Qbo7t3ivAPDhZNvCRVviuQktkve6RXhyzBVuF8nW7ZdB4Ttsfa4Kpo
4GiMKZKShDsjs3znVMMECdZ5HlZo2MPG0pFEZ1XRs11py1/NG6tSmwNIioY5
Qj3JljLl2/zi2PtIkJ8sLIHEWpfwjiiz0HaMKSkZd3EO2sSIHttNrphQyrVz
0obXKPwYg/0Yvb9DcJGu3s7WpNetHUkqTLhzRAytbfQED1CgI28JaeBDnoFt
W5nnMTjcvdgR+8fuZxqHkLtt9Wf1AsZ92LJAx3WVqGR4LZBxdM79Y4YCuyvX
2onPXer4iAXQVeLbzjpD58MXm/Z6FrMPPk4mMxI/VwVbh8dyX2NSS5AhciBc
qxrKTwNJWsfE/9gVEvva9kjBBWJtJF9mwE1K9v82wsQOIzFjneBhmXDOllhu
6oiNlrOjE63KBlsNnbOQQ6Xop+IGqIEYHpm+pQsobwnQB1wrt4MWLa66eGmY
2/b7w7QJcwg7mxvZ9VLwRtGlxKmx4fJJYZ0Kxs5KkpuPVXZqnFt/AWeY/gD4
tX4F0Z+GmCdylNal+RuL96StINKvuDZfPfiK6ywsuBOCBYwVh+MM5zt2rnKa
0aLundKwu9mNlE2/k6refEiKcFj+oU03ITlaY4fldVUDHJWuwbl0UrjTa+A6
i4kiKItPWy7EwaVbIfiqLXIeC56Hl8k50ZpiFgDFwgb9VmoGc6b3XgtPCo0a
dLJ32Y1VUfeElm2rrYqrQuIiPkmHdAKqVIv7P+Z1Yfcjv/MNWG2rM9j4Yj4k
D9iscTCvpJjy2II10nf5ipQ0Q+shRY0Zbqu0ESLTyO+uZHdnqlWLvrxnE0LU
G25mPRQXtuz5xAe0Ofr7z6C9i/yKjaHXBVmhd9KAKVls1+wiMpGPoAX684EL
6ase2GUwMDNX9Bg6bHPqqUknlDNks5l190O2UQB568dCwggwtXM0t8aDzICe
cvbVqy33pT9Zt/W0v+PRZdHBr8IIDC2nJYgsdQJ4mnhADm9DDrUoiaxXh4iH
k4WM3s7hBhL+RwLMD0YcSjfZyE9vGwdmBwehh5+PiB9cFM7ElDvZ4Ddu2vqB
LjEmMC2KgcKd+pBmAnX42TTAN41blJdIX+8sjfwuJPpsHEdKjDuEcy0WuK55
Yw599kOPFwfv5k2+vprhBx6Ox/SPIymlDhqU9KyT9FNZWojrYs5KYlCAWZFE
kgb24ZRU293W3LW2jS+gkfe2py20kTjjDLKqrmCvjJz45ilX/5+ivcR18UYQ
JAvl7PC47Db+nBJBLbQBwxmqfQg1cfeIln6oVXpAXYJ37gXp/0f7Mt6GPKP3
HgySm6L5CcbxGnKZLiNbzBKC40t9qJR9dGxNeHexbYS8LAIaD3iJYeOJ0Ock
MMs5ZnUNL1Tui5L3KzIWGpuHPoqWbjiW0DNESX3UsAiukGAmBSU0vLs3Dd3d
+LpJ2OjBFu+Z33TPkKMD8m7bowNU5VfvGDhyVfS2u4xg5siU5swNNgr0aR5e
ikbTstdzO6M3/YHeRAitIKCfFKY1i3dmAvKfmvGdesmmI6oIgjpG1U8uiHnr
BcIOT6w4kL3Gkk17WNVWQQ+Hz64UZwKMdwNa+0Yw1lhB/OM3X//x40cwubvv
RLZMemO5PDhU98XArFMK1PsbjGU71MmIO6eVroIsmZ6cJl7DIxzlyzp7Sswg
KDJ6coq26m8d7qOyCmfEmxr2k4L+Gm1c8HffS0JuMgLAjQv3d4JL9/DB/OH8
j7JneyHpGacuyKx13lwbgxPDjUeOEYwqK8BHMxqjU67FTjJNtbQtm0FS0sLT
mWoMUL+98gsJYTsTo04RaHaSeqQNj617VfZYiKuu/tCFXckWZWwjYOwbuZR1
NUPskV6QjJwdhsrux7IbitdQADDW8m4VBde7G8LdRv5gmWI3BB2+CfbOwNxT
mInAxka0b1eqpOqvAt6wxcsBe81mdR6PkVKkzxgtgOkqDlm8+w6kL9HbJWNL
3KjmW+r5DTRhvWw1Rd18SqHeiFcR0qWUE5Rtzw6OsfQV5/g0Mg+nl0mFI2yy
VjOOKrEP27QCYHQiYXz8El4EHrBY9Y3w8Z23+5ueUkBR+XQS3mFsMzE8lqNQ
NJZUVQimWHR4Bo2dAZbZRhlSXfhK0LuJEVUuGySysu8Ck3eIdLbVsT0VbwOp
x6EfoEXU+Nq0Vmw99MhJwwqDDDM86JauPJcq+w5c/Wak92UDTcNI2k2gV98U
zIt2w+kDgd1JR0RuTMjA7GAwN0UO9QOBcI9lWFSgKG5sxmlZAKPwmdqalDjI
HbSUVtwVXmV9JbwlD8mfjXrrC84EDJZhGTp1jSavyAFZY3gtpdMQSVhgzJaT
sV3KvPhYY3gkelldE3Pd1ql77n+Sd7VA1lKQzEsFMYvjlt44gZ+ELyZH5POm
jIUMMR8QfBk5jpUWs7CvQ8bqH5LH5mN0J5I61ixAnbjquMo3RWchTjfcNEQL
quymWG/3kWvvDJGAeYM0Efox+A9CXxKqk5Z5bO1+qqsXrFDOI9MeODrzgSP+
viwoV4APGLqErxwag5+GSKOGDYojSe/MQ4m+Tt+Khvr8ZyTDQXxaLq18MEfO
ymGlHN6/TJozBlOw4HoRK8sAPi3r6OsS+A6YIxIcfb3h76FSic42XFhkPD+S
X7AdRt6M0wlmbupnR0ViLTvZWOWfmTfjDIU3sqk1BxYFKFchvVZoaGGW2J0J
FbNHtZFlCIxFXhHOh/WnASV1qJRnnm8wQs60sNIjI4DcNeLo3SKLoaHoI6Tl
7UmJ7kWupQJtj1AjSaSOYYkoXUnhSdn6NtWRGwffvriWTWGsaikwC9sZ3K5p
WrFGgSV2lrfdDNLUZxfzp/zhR2KnWnARvxbD30SW9MkaEE0zKIu2+ppeblOS
PjxNkqyCw8xaYT9++BUbTZJ7hWbkBmT0+Bt2tw+6xvvuX3kb5vyvRVPPXl9e
ZocP+H+OJNNWWw4Lwp6VpWrXQAl8cPCYKy85qxlIylLoMBZ1AbCFdSf+BIq+
KucBuUY4qYMUFm9Rm2G28vU7ERsLV45pcKWIBRdooHdvGcqbUTuNboY1BYQI
czclqbx9M2aej+VSowKh6AWSRvsaJrj/agcJhohHgJIQ+2jSYtCF/YL1NveQ
wnz0MqZC9oFi3IYHzTi0j5Fd9zWfpcOPjgH0UrV6By/mirrVwrnemRFp9Wdj
bk28J1pu0WcaX/05MCJiwmHIkYUH/on1xi2YimMczX1VKcQcu9EE2sWdNbIW
Yhu4kd/I+4NWgvc0O7Wo7KraqtEMW9P7pv5c1AMonmV21l71tI1QIWPNelpd
jenl/BV4hfNtTeN2h65+/nsrepXGWop8FS1XhAnSPK6slMoRCdCFl8Elc2QR
AY+I5XK1ps7l4woYQTrIXoHEJQ1QonHY187yodSiDICfrPg/vwqlLbTlLN/l
dJpwOkp/jtZYU1ZM3cnklYFR9W9MIElWQj3tjJYOjetyaILEF3R7F8DIMV3f
dEOyTdXOufV4M5LqkGCSoNu5WrwyqSSJIIJKEScQDHGuzAqQt5YRMyj9hs/N
FcHGWbCqJiO5ux6CMtXIjg9xRFLFOZWIy5j7n52uubtE9gPRYy0hX1SNt4Mz
QHqVpJnCXb8jy1Jioq4iSLSkwdzrqw6IAAJ/YJh7ko+8T2wv6/otWks5iD6v
ofI0aevYhSn4la7Jy4pT6Uu6XoIZO6Np8M16W9y12eH5xY/t0d5EXE42uZV6
RIaR3CGuCgjlBr2ukQcd5CBCs2+LatiXPMIxhuoDd0Hn1ioFoSGpcJ7iaEVC
ycL4pzTbpMmXBdzqHoKTQbgKSrs2Itai86b4q9QoazDQ9i2B/uBtLtD1nImq
FXeq4lPPvp0/jF13voGvkNhAPxc3bfhsg8RKCs2PCOefJOvwZYxXwCqCrPmi
ryqVF2MLJSNq8GssPuVkjCF6N7gmU6QDkM1dM9s5pH80d9zu+6gP2cHvuSUT
bZhxaQrQU7FjJpPeBzDHr3aVr3dVPLyJNsqR4LEB7bUR9szN1t4aeBlXvUVH
vYvW4Paf6PBS51ot823L1xVOWVkuXxjJ6jdNH1JtsiqSh+lP6cQsz6pAIHpx
9oHUDW68ahPyNELeh0i23uZMzZsw2e4a0ZDVmTFuGFnOJ+8pMo2uUmOhnfSM
B1iX7HnXzNorTaslK4KdIzYdYsOt6pOLYqLNQ1eRTUd19Q/twINz0kres/Fa
YkwTCVUhApy33mErAM/RKo6K9nDFE6wYaWyxMcsyVtnjroviJrtn+XYRy4it
R0lh+6l2JaNGm1c5+hhwEE2xCm7rjFkEI5QW7TGHdn4gxQNwNbR5nG/NGD6N
dF/IO5dOYA5xbjk7k5jy7M+IRh1evvjzEXtPdow6X/BLn1he58x8iiNvRCYM
41ZxOQdaePTnr0Tm4/+foStMJwLgt7fjnVipS1JX681gTPGJCinxiJOBS0rR
SyVivi0LqTdtSQqyZFFb0aD/DWmXcxjpGpjawF4AAca8EhSjAVvxVCdG+pM9
z04mJ72P0lZAcS0ik4ImhIIJdjOxZGgnEvZQt1JvS0MjFuR8s2OvjL837sF8
K7AdJtCJXjxF/1MuqWqYDdDaSRhpC4Z81K2DnT7R2tmD0Tke9JJ3P0U1kyEY
aP+oSUkq1lcy+94OY1rBwJFiA+ZOYZEuZw/+Xw+vMOIUUF9QOAx9sduawYJj
UC7Woiv+3EJ4XrEKzkxtu/AZmnYwU0nv2RlwVKzAnMgEBZHTpB6pgZWk2va2
CXD6d9Xypqmr8lfxtsh7J8vYbXJRkG5R1k1PrW21KSaORYcKxMytsUPa+eS8
gQ1jo1bcKJd07/O8bTUKccTNMBgMhYlXfFz0Bs2gN/49aSU+KSUFUgEbp+/A
U3ztgUkXi8/xJqXbMLcaYk8Fo8XxgkchHVIVJ0B4oNKH3AMH6zJOGYr11CuJ
CfaMlj/NJw55MQeq0r5BbwfTDy/r6qYCkuocBDY+oaTL9qBOkHHtyB5g8E3j
M5OYdh260bjfpRXtDm1MO3TfOWQ7OnC+TpiY12sY4VD/VLqZ/ZOQzWEc6mjs
kXqbPAGoRD3gHv1bggHLzzd49xvZ4un+05vcKJ/r2+4A6bhtJKlKGhAwySH9
0ziR26QYrpiwtfcGOElvDOZHHKJr3IHxuIQPHZlr3vxdTOOD5kb9TmcCpNre
v+nzn4h5eJQMmuRwdx2h3n7ORtfbT+9ztmefeYe13RJ6Hquu1SgGHxEpb6c0
jpL2GM7H9uYUiYE6ukQS482VUGgaILrvyjhvmjg+kTUhUQlLJ6Fz/Ix9lWkN
N/ZEXA6CiH41RglsT+wqxAaJZ9JWrCVVxrBaRFmNEag4BG5dXq4T50zItBmb
MwM3x9+72U4zpDkaNYjFvP9kV0XR7x0WIDUSLK9sR8Ko7MStpeuR1rGJA3NP
HGcR4Mr6dy/cSS4FRJAXXnoI6Lm6lBuL5fYRLJLQTu/FUIt40Hn2in91W7Z7
HlKkS29ax90wB2fvFuGHvbLuhG3RqWm21lC/FkzeoQqgy07pRSHoWZ2c5KsE
3NtUlsa6XXWhiNNi6pF19WIDSNFlFX8lLqQATIeSwglSZi4uT15f8pfi8vjq
0YM/cqNhPizREEZyiEKYIXf+MMnEVULGGeqSj/8ro9MmpH3YEyTzRGNJKN29
yS5pf08lK10uXighuK6tqngb1R60ANOyHOsJs45d52qHKerTtwKWrRlr8Ibb
xsGtBQ9JjW59fEzzSajfMIw4hV7XCoL33n0gB/Hq9Ec7hYd/evSttFllszA7
ffXy5dnppaVEPvrqAQfxnlcyHzTcmg5JbZSDEufiBmmT8XJRRioJpVedQC8F
uKw+A7YoqstJ4dodojno10N+1ldCD/VANQuP7WPmiX4Z/NIPX/BkZ2oQfRw6
nZK8RQgal6DnGAG/xuINsfp1VPEhgqUpdfr5/+EJUj97Ao+a/nEqCU7T7HlL
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

-->

</rfc>
