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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc tocindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc tocdepth="2"?>

<rfc ipr="trust200902" docName="draft-ietf-httpbis-header-structure-11" category="std">

  <front>
    <title>Structured Headers for HTTP</title>

    <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
      <organization>Fastly</organization>
      <address>
        <email>mnot@mnot.net</email>
        <uri>https://www.mnot.net/</uri>
      </address>
    </author>
    <author initials="P-H." surname="Kamp" fullname="Poul-Henning Kamp">
      <organization>The Varnish Cache Project</organization>
      <address>
        <email>phk@varnish-cache.org</email>
      </address>
    </author>

    <date />

    <area>Applications and Real-Time</area>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header fields. It is intended for use by specifications of new HTTP header fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>



    </abstract>


    <note title="Note to Readers">


<t><spanx style="emph">RFC EDITOR: please remove this section before publication</spanx></t>

<t>Discussion of this draft takes place on the HTTP working group mailing list (ietf-http-wg@w3.org), which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/">https://lists.w3.org/Archives/Public/ietf-http-wg/</eref>.</t>

<t>Working Group information can be found at <eref target="https://httpwg.github.io/">https://httpwg.github.io/</eref>; source code and issues list for this draft can be found at <eref target="https://github.com/httpwg/http-extensions/labels/header-structure">https://github.com/httpwg/http-extensions/labels/header-structure</eref>.</t>

<t>Tests for implementations are collected at <eref target="https://github.com/httpwg/structured-header-tests">https://github.com/httpwg/structured-header-tests</eref>.</t>

<t>Implementations are tracked at <eref target="https://github.com/httpwg/wiki/wiki/Structured-Headers">https://github.com/httpwg/wiki/wiki/Structured-Headers</eref>.</t>


    </note>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>Specifying the syntax of new HTTP header fields is an onerous task; even with the guidance in <xref target="RFC7231"/>, Section 8.3.1, there are many decisions – and pitfalls – for a prospective HTTP header field author.</t>

<t>Once a header field is defined, bespoke parsers and serializers often need to be written, because each header has slightly different handling of what looks like common syntax.</t>

<t>This document introduces a set of common data structures for use in definitions of new HTTP header field values to address these problems. In particular, it defines a generic, abstract model for header field values, along with a concrete serialisation for expressing that model in textual HTTP <xref target="RFC7230"/> header fields.</t>

<t>HTTP headers that are defined as “Structured Headers” use the types defined in this specification to define their syntax and basic handling rules, thereby simplifying both their definition by specification writers and handling by implementations.</t>

<t>Additionally, future versions of HTTP can define alternative serialisations of the abstract model of these structures, allowing headers that use it to be transmitted more efficiently without being redefined.</t>

<t>Note that it is not a goal of this document to redefine the syntax of existing HTTP headers; the mechanisms described herein are only intended to be used with headers that explicitly opt into them.</t>

<t><xref target="specify"/> describes how to specify a Structured Header.</t>

<t><xref target="types"/> defines a number of abstract data types that can be used in Structured Headers. Those abstract types can be serialized into and parsed from textual HTTP headers using the algorithms described in <xref target="text"/>.</t>

<section anchor="strict" title="Intentionally Strict Processing">

<t>This specification intentionally defines strict parsing and serialisation behaviours using step-by-step algorithms; the only error handling defined is to fail the operation altogether.</t>

<t>It is designed to encourage faithful implementation and therefore good interoperability. Therefore, an implementation that tried to be “helpful” by being more tolerant of input would make interoperability worse, since that would create pressure on other implementations to implement similar (but likely subtly different) workarounds.</t>

<t>In other words, strict processing is an intentional feature of this specification; it allows non-conformant input to be discovered and corrected by the producer early, and avoids both interoperability and security issues that might otherwise result.</t>

<t>Note that as a result of this strictness, if a header field is appended to by multiple parties (e.g., intermediaries, or different components in the sender), an error in one party’s value is likely to cause the entire header field to fail parsing.</t>

</section>
<section anchor="notational-conventions" title="Notational Conventions">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
“RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as
shown here.</t>

<t>This document uses algorithms to specify parsing and serialisation behaviours, and the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/> to illustrate expected syntax in textual HTTP header fields. In doing so, uses the VCHAR, SP, DIGIT, ALPHA and DQUOTE rules from <xref target="RFC5234"/>. It also includes the OWS rule from <xref target="RFC7230"/>.</t>

<t>When parsing from textual HTTP header fields, implementations MUST follow the algorithms, but MAY vary in implementation so as the behaviours are indistinguishable from specified behaviour. If there is disagreement between the parsing algorithms and ABNF, the specified algorithms take precedence. In some places, the algorithms are “greedy” with whitespace, but this should not affect conformance.</t>

<t>For serialisation to textual header fields, the ABNF illustrates the range of acceptable wire representations with as much fidelity as possible, and the algorithms define the recommended way to produce them. Implementations MAY vary from the specified behaviour so long as the output still matches the ABNF.</t>

</section>
</section>
<section anchor="specify" title="Defining New Structured Headers">

<t>To define a HTTP header as a structured header, its specification needs to:</t>

<t><list style="symbols">
  <t>Reference this specification. Recipients and generators of the header need to know that the requirements of this document are in effect.</t>
  <t>Specify the header field’s allowed syntax for values, in terms of the types described in <xref target="types"/>, along with their associated semantics. Syntax definitions are encouraged to use the ABNF rules beginning with “sh-“ defined in this specification.</t>
  <t>Specify any additional constraints upon the syntax of the structured used, as well as the consequences when those constraints are violated. When Structured Headers parsing fails, the header is discarded (see <xref target="text-parse"/>); in most situations, header-specific constraints should do likewise.</t>
</list></t>

<t>Note that a header field definition cannot relax the requirements of this specification because doing so would preclude handling by generic software; they can only add additional constraints (for example, on the numeric range of integers and floats, the format of strings and tokens, or the number of items in a list). Likewise, header field definitions should use Structured Headers for the entire header field value, not a portion thereof.</t>

<t>This specification defines minimums for the length or number of various structures supported by Structured Headers implementations. It does not specify maximum sizes in most cases, but header authors should be aware that HTTP implementations do impose various limits on the size of individual header fields, the total number of fields, and/or the size of the entire header block.</t>

<t>For example,</t>

<figure><artwork type="example"><![CDATA[
42. Foo-Example Header

The Foo-Example HTTP header field conveys information about how
much Foo the message has.

Foo-Example is a Structured Header [RFCxxxx]. Its value MUST be a
dictionary ([RFCxxxx], Section Y.Y). Its ABNF is:

  Foo-Example = sh-dictionary

The dictionary MUST contain:

* Exactly one member whose name is "foo", and whose value is an
  integer ([RFCxxxx], Section Y.Y), indicating the number of foos
  in the message.
* Exactly one member whose name is "barUrl", and whose value is a
  string ([RFCxxxx], Section Y.Y), conveying the Bar URL for the
  message. See below for processing requirements.

If the parsed header field does not contain both, it MUST be
ignored.

"foo" MUST be between 0 and 10, inclusive; other values MUST cause
the header to be ignored.

"barUrl" contains a URI-reference ([RFC3986], Section 4.1).

If barURL is not a valid URI-reference, it MUST be ignored.
If barURL is a relative reference ([RFC3986], Section 4.2),
it MUST be resolved ([RFC3986], Section 5) before being used.
]]></artwork></figure>

</section>
<section anchor="types" title="Structured Header Data Types">

<t>This section defines the abstract value types that can be composed into Structured Headers. The ABNF provided represents the on-wire format in HTTP.</t>

<section anchor="list" title="Lists">

<t>Lists are arrays of zero or more members, each of which can be an item (<xref target="item"/>) or an inner list (an array of zero or more items).</t>

<t>Each member of the top-level list can also have associated parameters – an ordered map of key-value pairs where the keys are short, textual strings and the values are items (<xref target="item"/>). There can be zero or more parameters on a member, and their keys are required to be unique within that scope.</t>

<t>The ABNF for lists is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-list       = list-member *( OWS "," OWS list-member )
list-member   = ( sh-item / inner-list ) *parameter
inner-list    = "(" OWS [ sh-item *( SP sh-item ) OWS ] ")"
parameter     = OWS ";" OWS param-name [ "=" param-value ]
param-name    = key
key           = lcalpha *( lcalpha / DIGIT / "_" / "-" )
lcalpha       = %x61-7A ; a-z
param-value   = sh-item
]]></artwork></figure>

<t>In textual HTTP headers, each member is separated by a comma and optional whitespace. For example, a header field whose value is defined as a list of strings could look like:</t>

<figure><artwork type="example"><![CDATA[
Example-StrListHeader: "foo", "bar", "It was the best of times."
]]></artwork></figure>

<t>In textual HTTP headers, inner lists are denoted by surrounding parenthesis, and have their values delimited by a single space. A header field whose value is defined as a list of lists of strings could look like:</t>

<figure><artwork type="example"><![CDATA[
Example-StrListListHeader: ("foo" "bar"), ("baz"), ("bat" "one"), ()
]]></artwork></figure>

<t>Note that the last member in this example is an empty inner list.</t>

<t>In textual HTTP headers, members’ parameters are separated from the member and each other by semicolons. For example:</t>

<figure><artwork type="example"><![CDATA[
Example-ParamListHeader: abc_123;a=1;b=2; cdef_456, (ghi jkl);q="9";r="w"
]]></artwork></figure>

<t>Parsers MUST support lists containing at least 1024 members, support members with at least 256 parameters, support inner-lists containing at least 256 members, and support parameter keys with at least 64 characters.</t>

<t>Header specifications can constrain the types of individual list values (including that of individual inner-list members and parameters) if necessary.</t>

</section>
<section anchor="dictionary" title="Dictionaries">

<t>Dictionaries are ordered maps of name-value pairs, where the names are short, textual strings and the values are items (<xref target="item"/>) or arrays of items. There can be zero or more members, and their names are required to be unique within the scope of the dictionary they occur within.</t>

<t>Implementations MUST provide access to dictionaries both by index and by name. Specifications MAY use either means of accessing the members.</t>

<t>The ABNF for dictionaries in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-dictionary  = dict-member *( OWS "," OWS dict-member )
dict-member    = member-name "=" member-value
member-name    = key
member-value   = sh-item / inner-list
]]></artwork></figure>

<t>In textual HTTP headers, members are separated by a comma with optional whitespace, while names and values are separated by “=” (without whitespace). For example:</t>

<figure><artwork type="example"><![CDATA[
Example-DictHeader: en="Applepie", da=*w4ZibGV0w6ZydGU=*
]]></artwork></figure>

<t>A dictionary with a member whose value is an inner-list of tokens:</t>

<figure><artwork type="example"><![CDATA[
Example-DictListHeader: rating=1.5, feelings=(joy sadness)
]]></artwork></figure>

<t>Typically, a header field specification will define the semantics of individual member names, as well as whether their presence is required or optional. Recipients MUST ignore names that are undefined or unknown, unless the header field’s specification specifically disallows them.</t>

<t>Parsers MUST support dictionaries containing at least 1024 name/value pairs, and names with at least 64 characters.</t>

</section>
<section anchor="item" title="Items">

<t>An item is can be a integer (<xref target="integer"/>), float (<xref target="float"/>), string (<xref target="string"/>), token (<xref target="token"/>), byte sequence (<xref target="binary"/>), or Boolean (<xref target="boolean"/>).</t>

<t>The ABNF for items in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-item = sh-integer / sh-float / sh-string / sh-token / sh-binary
          / sh-boolean
]]></artwork></figure>

</section>
<section anchor="integer" title="Integers">

<t>Integers have a range of −999,999,999,999,999 to 999,999,999,999,999 inclusive (i.e., up to fifteen digits, signed), for IEEE 754 compatibility (<xref target="IEEE754"/>).</t>

<t>The ABNF for integers in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-integer = ["-"] 1*15DIGIT
]]></artwork></figure>

<t>For example:</t>

<figure><artwork type="example"><![CDATA[
Example-IntegerHeader: 42
]]></artwork></figure>

<t>Note that commas in integers are used in this section’s prose only for readability; they are not valid in the wire format.</t>

</section>
<section anchor="float" title="Floats">

<t>Floats are integers with a fractional part, that can be stored as IEEE 754 double precision numbers (binary64) (<xref target="IEEE754"/>).</t>

<t>The ABNF for floats in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-float    = ["-"] (
             DIGIT "." 1*14DIGIT /
            2DIGIT "." 1*13DIGIT /
            3DIGIT "." 1*12DIGIT /
            4DIGIT "." 1*11DIGIT /
            5DIGIT "." 1*10DIGIT /
            6DIGIT "." 1*9DIGIT /
            7DIGIT "." 1*8DIGIT /
            8DIGIT "." 1*7DIGIT /
            9DIGIT "." 1*6DIGIT /
           10DIGIT "." 1*5DIGIT /
           11DIGIT "." 1*4DIGIT /
           12DIGIT "." 1*3DIGIT /
           13DIGIT "." 1*2DIGIT /
           14DIGIT "." 1DIGIT )
]]></artwork></figure>

<t>For example, a header whose value is defined as a float could look like:</t>

<figure><artwork type="example"><![CDATA[
Example-FloatHeader: 4.5
]]></artwork></figure>

</section>
<section anchor="string" title="Strings">

<t>Strings are zero or more printable ASCII <xref target="RFC0020"/> characters (i.e., the range 0x20 to 0x7E). Note that this excludes tabs, newlines, carriage returns, etc.</t>

<t>The ABNF for strings in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-string = DQUOTE *(chr) DQUOTE
chr       = unescaped / escaped
unescaped = %x20-21 / %x23-5B / %x5D-7E
escaped   = "\" ( DQUOTE / "\" )
]]></artwork></figure>

<t>In textual HTTP headers, strings are delimited with double quotes, using a backslash (“\”) to escape double quotes and backslashes. For example:</t>

<figure><artwork type="example"><![CDATA[
Example-StringHeader: "hello world"
]]></artwork></figure>

<t>Note that strings only use DQUOTE as a delimiter; single quotes do not delimit strings. Furthermore, only DQUOTE and “\” can be escaped; other sequences MUST cause parsing to fail.</t>

<t>Unicode is not directly supported in this document, because it causes a number of interoperability issues, and – with few exceptions – header values do not require it.</t>

<t>When it is necessary for a field value to convey non-ASCII string content, a byte sequence (<xref target="binary"/>) SHOULD be specified, along with a character encoding (preferably UTF-8).</t>

<t>Parsers MUST support strings with at least 1024 characters.</t>

</section>
<section anchor="token" title="Tokens">

<t>Tokens are short textual words; their abstract model is identical to their expression in the textual HTTP serialisation.</t>

<t>The ABNF for tokens in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-token = ALPHA
           *( ALPHA / DIGIT / "_" / "-" / "." / ":" / "%"
              / "*" / "/" )
]]></artwork></figure>

<t>Parsers MUST support tokens with at least 512 characters.</t>

<t>Note that a Structured Header token is not the same as the “token” ABNF rule defined in
<xref target="RFC7230"/>.</t>

</section>
<section anchor="binary" title="Byte Sequences">

<t>Byte sequences can be conveyed in Structured Headers.</t>

<t>The ABNF for a byte sequence in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-binary = "*" *(base64) "*"
base64    = ALPHA / DIGIT / "+" / "/" / "="
]]></artwork></figure>

<t>In textual HTTP headers, a byte sequence is delimited with asterisks and encoded using base64 (<xref target="RFC4648"/>, Section 4). For example:</t>

<figure><artwork type="example"><![CDATA[
Example-BinaryHdr: *cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==*
]]></artwork></figure>

<t>Parsers MUST support byte sequences with at least 16384 octets after decoding.</t>

</section>
<section anchor="boolean" title="Booleans">

<t>Boolean values can be conveyed in Structured Headers.</t>

<t>The ABNF for a Boolean in textual HTTP headers is:</t>

<figure><artwork type="abnf"><![CDATA[
sh-boolean = "?" boolean
boolean    = "0" / "1"
]]></artwork></figure>

<t>In textual HTTP headers, a boolean is indicated with a leading “?” character. For example:</t>

<figure><artwork type="example"><![CDATA[
Example-BoolHdr: ?1
]]></artwork></figure>

</section>
</section>
<section anchor="text" title="Working With Structured Headers in Textual HTTP Headers">

<t>This section defines how to serialize and parse Structured Headers in textual header fields, and protocols compatible with them (e.g., in HTTP/2 <xref target="RFC7540"/> before HPACK <xref target="RFC7541"/> is applied).</t>

<section anchor="text-serialize" title="Serializing Structured Headers">

<t>Given a structure defined in this specification:</t>

<t><list style="numbers">
  <t>If the structure is a dictionary or list and its value is empty (i.e., it has no members), do not send the serialize field at all (i.e., omit both the field-name and field-value).</t>
  <t>If the structure is a dictionary, let output_string be the result of Serializing a Dictionary (<xref target="ser-dictionary"/>).</t>
  <t>Else if the structure is a list, let output_string be the result of Serializing a List <xref target="ser-list"/>.</t>
  <t>Else if the structure is an item, let output_string be the result of Serializing an Item (<xref target="ser-item"/>).</t>
  <t>Else, fail serialisation.</t>
  <t>Return output_string converted into an array of bytes, using ASCII encoding <xref target="RFC0020"/>.</t>
</list></t>

<section anchor="ser-list" title="Serializing a List">

<t>Given a list of (member, parameters) as input_list:</t>

<t><list style="numbers">
  <t>Let output be an empty string.</t>
  <t>For each (member, parameters) of input_list:
  <list style="numbers">
      <t>If member is an array, let mem_value be the result of applying Serialising an Inner List (<xref target="ser-innerlist"/>) to member.</t>
      <t>Otherwise, let mem_value be the result of applying Serializing an Item (<xref target="ser-item"/>) to member.</t>
      <t>Append mem_value to output.</t>
      <t>For each parameter in parameters:
      <list style="numbers">
          <t>Append “;” to output.</t>
          <t>Let name be the result of applying Serializing a Key (<xref target="ser-key"/>) to parameter’s param-name.</t>
          <t>Append name to output.</t>
          <t>If parameter has a param-value:
          <list style="numbers">
              <t>Let value be the result of applying Serializing an Item (<xref target="ser-item"/>) to parameter’s param-value.</t>
              <t>Append “=” to output.</t>
              <t>Append value to output.</t>
            </list></t>
        </list></t>
      <t>If more members remain in input_plist:
      <list style="numbers">
          <t>Append a COMMA to output.</t>
          <t>Append a single WS to output.</t>
        </list></t>
    </list></t>
  <t>Return output.</t>
</list></t>

<section anchor="ser-innerlist" title="Serialising an Inner List">

<t>Given an array inner_list:</t>

<t><list style="numbers">
  <t>Let output be the string “(“.</t>
  <t>For each member mem of inner_list:
  <list style="numbers">
      <t>Let value be the result of applying Serializing an Item (<xref target="ser-item"/>) to mem.</t>
      <t>Append value to output.</t>
      <t>If inner_list is not empty, append a single WS to output.</t>
    </list></t>
  <t>Append “)” to output.</t>
  <t>Return output.</t>
</list></t>

</section>
<section anchor="ser-key" title="Serializing a Key">

<t>Given a key as input_key:</t>

<t><list style="numbers">
  <t>If input_key is not a sequence of characters, or contains characters not allowed in the ABNF for key, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>Append input_key to output.</t>
  <t>Return output.</t>
</list></t>

</section>
</section>
<section anchor="ser-dictionary" title="Serializing a Dictionary">

<t>Given a dictionary as input_dictionary:</t>

<t><list style="numbers">
  <t>Let output be an empty string.</t>
  <t>For each member mem of input_dictionary:
  <list style="numbers">
      <t>Let name be the result of applying Serializing a Key (<xref target="ser-key"/>) to mem’s member-name.</t>
      <t>Append name to output.</t>
      <t>Append “=” to output.</t>
      <t>If mem is an array, let value be the result of applying Serialising an Inner List (<xref target="ser-innerlist"/>) to mem.</t>
      <t>Otherwise, let value be the result of applying Serializing an Item (<xref target="ser-item"/>) to mem.</t>
      <t>Append value to output.</t>
      <t>If more members remain in input_dictionary:
      <list style="numbers">
          <t>Append a COMMA to output.</t>
          <t>Append a single WS to output.</t>
        </list></t>
    </list></t>
  <t>Return output.</t>
</list></t>

</section>
<section anchor="ser-item" title="Serializing an Item">

<t>Given an item as input_item:</t>

<t><list style="numbers">
  <t>If input_item is an integer, return the result of applying Serializing an Integer (<xref target="ser-integer"/>) to input_item.</t>
  <t>If input_item is a float, return the result of applying Serializing a Float (<xref target="ser-float"/>) to input_item.</t>
  <t>If input_item is a string, return the result of applying Serializing a String (<xref target="ser-string"/>) to input_item.</t>
  <t>If input_item is a token, return the result of Serializing a Token (<xref target="ser-token"/>) to input_item.</t>
  <t>If input_item is a Boolean, return the result of applying Serializing a Boolean (<xref target="ser-boolean"/>) to input_item.</t>
  <t>If input_item is a byte sequence, return the result of applying Serializing a Byte Sequence (<xref target="ser-binary"/>) to input_item.</t>
  <t>Otherwise, fail serialisation.</t>
</list></t>

</section>
<section anchor="ser-integer" title="Serializing an Integer">

<t>Given an integer as input_integer:</t>

<t><list style="numbers">
  <t>If input_integer is not an integer in the range of −999,999,999,999,999 to 999,999,999,999,999 inclusive, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>If input_integer is less than (but not equal to) 0, append “-“ to output.</t>
  <t>Append input_integer’s numeric value represented in base 10 using only decimal digits to output.</t>
  <t>Return output.</t>
</list></t>

</section>
<section anchor="ser-float" title="Serializing a Float">

<t>Given a float as input_float:</t>

<t><list style="numbers">
  <t>If input_float is not a IEEE 754 double precision number, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>If input_float is less than (but not equal to) 0, append “-“ to output.</t>
  <t>Append input_float’s integer component represented in base 10 using only decimal digits to output; if it is zero, append “0”.</t>
  <t>Append “.” to output.</t>
  <t>Append input_float’s decimal component represented in base 10 using only decimal digits to output; if it is zero, append “0”.</t>
  <t>Return output.</t>
</list></t>

</section>
<section anchor="ser-string" title="Serializing a String">

<t>Given a string as input_string:</t>

<t><list style="numbers">
  <t>If input_string is not a sequence of characters, or contains characters outside the range allowed by VCHAR or SP, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>Append DQUOTE to output.</t>
  <t>For each character char in input_string:
  <list style="numbers">
      <t>If char is “\” or DQUOTE:
      <list style="numbers">
          <t>Append “\” to output.</t>
        </list></t>
      <t>Append char to output.</t>
    </list></t>
  <t>Append DQUOTE to output.</t>
  <t>Return output.</t>
</list></t>

</section>
<section anchor="ser-token" title="Serializing a Token">

<t>Given a token as input_token:</t>

<t><list style="numbers">
  <t>If input_token is not a sequence of characters, or contains characters not allowed in <xref target="token"/>}, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>Append input_token to output.</t>
  <t>Return output.</t>
</list></t>

</section>
<section anchor="ser-binary" title="Serializing a Byte Sequence">

<t>Given a byte sequence as input_bytes:</t>

<t><list style="numbers">
  <t>If input_bytes is not a sequence of bytes, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>Append “*” to output.</t>
  <t>Append the result of base64-encoding input_bytes as per <xref target="RFC4648"/>, Section 4, taking account of the requirements below.</t>
  <t>Append “*” to output.</t>
  <t>Return output.</t>
</list></t>

<t>The encoded data is required to be padded with “=”, as per <xref target="RFC4648"/>, Section 3.2.</t>

<t>Likewise, encoded data SHOULD have pad bits set to zero, as per <xref target="RFC4648"/>, Section 3.5, unless it is not possible to do so due to implementation constraints.</t>

</section>
<section anchor="ser-boolean" title="Serializing a Boolean">

<t>Given a Boolean as input_boolean:</t>

<t><list style="numbers">
  <t>If input_boolean is not a boolean, fail serialisation.</t>
  <t>Let output be an empty string.</t>
  <t>Append “?” to output.</t>
  <t>If input_boolean is true, append “1” to output.</t>
  <t>If input_boolean is false, append “0” to output.</t>
  <t>Return output.</t>
</list></t>

</section>
</section>
<section anchor="text-parse" title="Parsing Header Fields into Structured Headers">

<t>When a receiving implementation parses textual HTTP header fields that are known to be Structured Headers, it is important that care be taken, as there are a number of edge cases that can cause interoperability or even security problems. This section specifies the algorithm for doing so.</t>

<t>Given an array of bytes input_bytes that represents the chosen header’s field-value (which is an empty string if that header is not present), and header_type (one of “dictionary”, “list”, or “item”), return the parsed header value.</t>

<t><list style="numbers">
  <t>Convert input_bytes into an ASCII string input_string; if conversion fails, fail parsing.</t>
  <t>Discard any leading OWS from input_string.</t>
  <t>If header_type is “list”, let output be the result of Parsing a List from Text (<xref target="parse-list"/>).</t>
  <t>If header_type is “dictionary”, let output be the result of Parsing a Dictionary from Text (<xref target="parse-dictionary"/>).</t>
  <t>If header_type is “item”, let output be the result of Parsing an Item from Text (<xref target="parse-item"/>).</t>
  <t>Discard any leading OWS from input_string.</t>
  <t>If input_string is not empty, fail parsing.</t>
  <t>Otherwise, return output.</t>
</list></t>

<t>When generating input_bytes, parsers MUST combine all instances of the target header field into one comma-separated field-value, as per <xref target="RFC7230"/>, Section 3.2.2; this assures that the header is processed correctly.</t>

<t>For Lists and Dictionaries, this has the effect of correctly concatenating all instances of the header field, as long as individual individual members of the top-level data structure are not split across multiple header instances.</t>

<t>Strings split across multiple header instances will have unpredictable results, because comma(s) and whitespace inserted upon combination will become part of the string output by the parser. Since concatenation might be done by an upstream intermediary, the results are not under the control of the serializer or the parser.</t>

<t>Tokens, Integers, Floats and Byte Sequences cannot be split across multiple headers because the inserted commas will cause parsing to fail.</t>

<t>If parsing fails – including when calling another algorithm – the entire header field’s value MUST be discarded. This is intentionally strict, to improve interoperability and safety, and specifications referencing this document are not allowed to loosen this requirement.</t>

<section anchor="parse-list" title="Parsing a List from Text">

<t>Given an ASCII string input_string, return an array of (member, parameters). input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>Let members be an empty array.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Let member be the result of running Parsing a Parameterized Member from Text (<xref target="parse-param"/>) with input_string.</t>
      <t>Append member to members.</t>
      <t>Discard any leading OWS from input_string.</t>
      <t>If input_string is empty, return members.</t>
      <t>Consume the first character of input_string; if it is not COMMA, fail parsing.</t>
      <t>Discard any leading OWS from input_string.</t>
      <t>If input_string is empty, there is a trailing comma; fail parsing.</t>
    </list></t>
  <t>No structured data has been found; return members (which is empty).</t>
</list></t>

<section anchor="parse-param" title="Parsing a Parameterized Member from Text">

<t>Given an ASCII string input_string, return an token with an ordered map of parameters. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>If the first character of input_string is “(“, let member be the result of running Parsing an Inner List (<xref target="parse-innerlist"/>) with input_string.</t>
  <t>Else, let member be the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</t>
  <t>Let parameters be an empty, ordered map.</t>
  <t>In a loop:
  <list style="numbers">
      <t>Discard any leading OWS from input_string.</t>
      <t>If the first character of input_string is not “;”, exit the loop.</t>
      <t>Consume a “;” character from the beginning of input_string.</t>
      <t>Discard any leading OWS from input_string.</t>
      <t>let param_name be the result of Parsing a key from Text (<xref target="parse-key"/>) from input_string.</t>
      <t>If param_name is already present in parameters, there is a duplicate; fail parsing.</t>
      <t>Let param_value be a null value.</t>
      <t>If the first character of input_string is “=”:
      <list style="numbers">
          <t>Consume the “=” character at the beginning of input_string.</t>
          <t>Let param_value be the result of Parsing an Item from Text (<xref target="parse-item"/>) from input_string.</t>
        </list></t>
      <t>Append key param_name with value param_value to parameters.</t>
    </list></t>
  <t>Return the tuple (member, parameters).</t>
</list></t>

</section>
<section anchor="parse-innerlist" title="Parsing an Inner List">

<t>Given an ASCII string input_string, return an array of items. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>Consume the first character of input_string; if it is not “(“, fail parsing.</t>
  <t>Let inner_list be an empty array.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Discard any leading OWS from input_string.</t>
      <t>If the first character of input_string is “)”:
      <list style="numbers">
          <t>Consume the first character of input_string.</t>
          <t>Return inner_list.</t>
        </list></t>
      <t>Let item be the result of running Parsing an Item from Text (<xref target="parse-item"/>) with input_string.</t>
      <t>Append item to inner_list.</t>
      <t>If the first character of input_string is not SP or “)”, fail parsing.</t>
    </list></t>
  <t>The end of the inner list was not found; fail parsing.</t>
</list></t>

</section>
</section>
<section anchor="parse-dictionary" title="Parsing a Dictionary from Text">

<t>Given an ASCII string input_string, return an ordered map of (key, item). input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>Let dictionary be an empty, ordered map.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Let this_key be the result of running Parsing a Key from Text (<xref target="parse-key"/>) with input_string.</t>
      <t>If dictionary already contains the name this_key, there is a duplicate; fail parsing.</t>
      <t>Consume the first character of input_string; if it is not “=”, fail parsing.</t>
      <t>If the first character of input_string is “(“, let this_value be the result of running Parsing an Inner List (<xref target="parse-innerlist"/>) with input_string.</t>
      <t>Else, let this_value be the result of running Parsing an Item (<xref target="parse-item"/>) with input_string.</t>
      <t>Add name this_key with value this_value to dictionary.</t>
      <t>Discard any leading OWS from input_string.</t>
      <t>If input_string is empty, return dictionary.</t>
      <t>Consume the first character of input_string; if it is not COMMA, fail parsing.</t>
      <t>Discard any leading OWS from input_string.</t>
      <t>If input_string is empty, there is a trailing comma; fail parsing.</t>
    </list></t>
  <t>No structured data has been found; return dictionary (which is empty).</t>
</list></t>

</section>
<section anchor="parse-key" title="Parsing a Key from Text">

<t>Given an ASCII string input_string, return a key. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>If the first character of input_string is not lcalpha, fail parsing.</t>
  <t>Let output_string be an empty string.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Let char be the result of removing the first character of input_string.</t>
      <t>If char is not one of lcalpha, DIGIT, “_”, or “-“:
      <list style="numbers">
          <t>Prepend char to input_string.</t>
          <t>Return output_string.</t>
        </list></t>
      <t>Append char to output_string.</t>
    </list></t>
  <t>Return output_string.</t>
</list></t>

</section>
<section anchor="parse-item" title="Parsing an Item from Text">

<t>Given an ASCII string input_string, return an item. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>If the first character of input_string is a “-“ or a DIGIT, process input_string as a number (<xref target="parse-number"/>) and return the result.</t>
  <t>If the first character of input_string is a DQUOTE, process input_string as a string (<xref target="parse-string"/>) and return the result.</t>
  <t>If the first character of input_string is “*”, process input_string as a byte sequence (<xref target="parse-binary"/>) and return the result.</t>
  <t>If the first character of input_string is “?”, process input_string as a Boolean (<xref target="parse-boolean"/>) and return the result.</t>
  <t>If the first character of input_string is an ALPHA, process input_string as a token (<xref target="parse-token"/>) and return the result.</t>
  <t>Otherwise, the item type is unrecognized; fail parsing.</t>
</list></t>

</section>
<section anchor="parse-number" title="Parsing a Number from Text">

<t>Given an ASCII string input_string, return a number. input_string is modified to remove the parsed value.</t>

<t>NOTE: This algorithm parses both Integers <xref target="integer"/> and Floats <xref target="float"/>, and returns the corresponding structure.</t>

<t><list style="numbers">
  <t>Let type be “integer”.</t>
  <t>Let sign be 1.</t>
  <t>Let input_number be an empty string.</t>
  <t>If the first character of input_string is “-“, consume it and set sign to -1.</t>
  <t>If input_string is empty, there is an empty integer; fail parsing.</t>
  <t>If the first character of input_string is not a DIGIT, fail parsing.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Let char be the result of consuming the first character of input_string.</t>
      <t>If char is a DIGIT, append it to input_number.</t>
      <t>Else, if type is “integer” and char is “.”, append char to input_number and set type to “float”.</t>
      <t>Otherwise, prepend char to input_string, and exit the loop.</t>
      <t>If type is “integer” and input_number contains more than 15 characters, fail parsing.</t>
      <t>If type is “float” and input_number contains more than 16 characters, fail parsing.</t>
    </list></t>
  <t>If type is “integer”:
  <list style="numbers">
      <t>Parse input_number as an integer and let output_number be the product of the result and sign.</t>
      <t>If output_number is outside the range defined in <xref target="integer"/>, fail parsing.</t>
    </list></t>
  <t>Otherwise:
  <list style="numbers">
      <t>If the final character of input_number is “.”, fail parsing.</t>
      <t>Parse input_number as a float and let output_number be the product of the result and sign.</t>
    </list></t>
  <t>Return output_number.</t>
</list></t>

</section>
<section anchor="parse-string" title="Parsing a String from Text">

<t>Given an ASCII string input_string, return an unquoted string. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>Let output_string be an empty string.</t>
  <t>If the first character of input_string is not DQUOTE, fail parsing.</t>
  <t>Discard the first character of input_string.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Let char be the result of consuming the first character of input_string.</t>
      <t>If char is a backslash (“\”):
      <list style="numbers">
          <t>If input_string is now empty, fail parsing.</t>
          <t>Else:
          <list style="numbers">
              <t>Let next_char be the result of consuming the first character of input_string.</t>
              <t>If next_char is not DQUOTE or “\”, fail parsing.</t>
              <t>Append next_char to output_string.</t>
            </list></t>
        </list></t>
      <t>Else, if char is DQUOTE, return output_string.</t>
      <t>Else, if char is in the range %x00-1f or %x7f (i.e., is not in VCHAR or SP), fail parsing.</t>
      <t>Else, append char to output_string.</t>
    </list></t>
  <t>Reached the end of input_string without finding a closing DQUOTE; fail parsing.</t>
</list></t>

</section>
<section anchor="parse-token" title="Parsing a Token from Text">

<t>Given an ASCII string input_string, return a token. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>If the first character of input_string is not ALPHA, fail parsing.</t>
  <t>Let output_string be an empty string.</t>
  <t>While input_string is not empty:
  <list style="numbers">
      <t>Let char be the result of consuming the first character of input_string.</t>
      <t>If char is not one of ALPHA, DIGIT, “_”, “-“, “.”, “:”, “%”, “*” or “/”:
      <list style="numbers">
          <t>Prepend char to input_string.</t>
          <t>Return output_string.</t>
        </list></t>
      <t>Append char to output_string.</t>
    </list></t>
  <t>Return output_string.</t>
</list></t>

</section>
<section anchor="parse-binary" title="Parsing a Byte Sequence from Text">

<t>Given an ASCII string input_string, return a byte sequence. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>If the first character of input_string is not “*”, fail parsing.</t>
  <t>Discard the first character of input_string.</t>
  <t>If there is not a “*” character before the end of input_string, fail parsing.</t>
  <t>Let b64_content be the result of consuming content of input_string up to but not including the first instance of the character “*”.</t>
  <t>Consume the “*” character at the beginning of input_string.</t>
  <t>If b64_content contains a character not included in ALPHA, DIGIT, “+”, “/” and “=”, fail parsing.</t>
  <t>Let binary_content be the result of Base 64 Decoding <xref target="RFC4648"/> b64_content, synthesizing padding if necessary (note the requirements about recipient behaviour below).</t>
  <t>Return binary_content.</t>
</list></t>

<t>Because some implementations of base64 do not allow reject of encoded data that is not properly “=” padded (see <xref target="RFC4648"/>, Section 3.2), parsers SHOULD NOT fail when it is not present, unless they cannot be configured to do so.</t>

<t>Because some implementations of base64 do not allow rejection of encoded data that has non-zero pad bits (see <xref target="RFC4648"/>, Section 3.5), parsers SHOULD NOT fail when it is present, unless they cannot be configured to do so.</t>

<t>This specification does not relax the requirements in <xref target="RFC4648"/>, Section 3.1 and 3.3; therefore, parsers MUST fail on characters outside the base64 alphabet, and on line feeds in encoded data.</t>

</section>
<section anchor="parse-boolean" title="Parsing a Boolean from Text">

<t>Given an ASCII string input_string, return a Boolean. input_string is modified to remove the parsed value.</t>

<t><list style="numbers">
  <t>If the first character of input_string is not “?”, fail parsing.</t>
  <t>Discard the first character of input_string.</t>
  <t>If the first character of input_string matches “1”, discard the first character, and return true.</t>
  <t>If the first character of input_string matches “0”, discard the first character, and return false.</t>
  <t>No value has matched; fail parsing.</t>
</list></t>

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

<t>This draft has no actions for IANA.</t>

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

<t>The size of most types defined by Structured Headers is not limited; as a result, extremely large header fields could be an attack vector (e.g., for resource consumption). Most HTTP implementations limit the sizes of individual header fields as well as the overall header block size to mitigate such attacks.</t>

<t>It is possible for parties with the ability to inject new HTTP header fields to change the meaning
of a Structured Header. In some circumstances, this will cause parsing to fail, but it is not possible to reliably fail in all such circumstances.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC7230" target='https://www.rfc-editor.org/info/rfc7230'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<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 &quot;http&quot; and &quot;https&quot; 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="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></author>
<date year='2017' month='May' />
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>



<reference  anchor="RFC5234" target='https://www.rfc-editor.org/info/rfc5234'>
<front>
<title>Augmented BNF for Syntax Specifications: ABNF</title>
<author initials='D.' surname='Crocker' fullname='D. Crocker' role='editor'><organization /></author>
<author initials='P.' surname='Overell' fullname='P. Overell'><organization /></author>
<date year='2008' month='January' />
<abstract><t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='68'/>
<seriesInfo name='RFC' value='5234'/>
<seriesInfo name='DOI' value='10.17487/RFC5234'/>
</reference>



<reference  anchor="RFC0020" target='https://www.rfc-editor.org/info/rfc20'>
<front>
<title>ASCII format for network interchange</title>
<author initials='V.G.' surname='Cerf' fullname='V.G. Cerf'><organization /></author>
<date year='1969' month='October' />
</front>
<seriesInfo name='STD' value='80'/>
<seriesInfo name='RFC' value='20'/>
<seriesInfo name='DOI' value='10.17487/RFC0020'/>
</reference>



<reference  anchor="RFC4648" target='https://www.rfc-editor.org/info/rfc4648'>
<front>
<title>The Base16, Base32, and Base64 Data Encodings</title>
<author initials='S.' surname='Josefsson' fullname='S. Josefsson'><organization /></author>
<date year='2006' month='October' />
<abstract><t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4648'/>
<seriesInfo name='DOI' value='10.17487/RFC4648'/>
</reference>




    </references>

    <references title='Informative References'>

<reference anchor="IEEE754" target="http://ieeexplore.ieee.org/document/4610935/">
  <front>
    <title>IEEE Standard for Floating-Point Arithmetic</title>
    <author >
      <organization>IEEE</organization>
    </author>
    <date year="2008" month="August"/>
  </front>
  <seriesInfo name="IEEE" value="754-2008"/>
  <seriesInfo name="DOI" value="10.1109/IEEESTD.2008.4610935"/>
  <seriesInfo name="ISBN" value="978-0-7381-5752-8"/>
<annotation>See also <eref target="http://grouper.ieee.org/groups/754/">http://grouper.ieee.org/groups/754/</eref>.</annotation></reference>




<reference  anchor="RFC7231" target='https://www.rfc-editor.org/info/rfc7231'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t></abstract>
</front>
<seriesInfo name='RFC' value='7231'/>
<seriesInfo name='DOI' value='10.17487/RFC7231'/>
</reference>



<reference  anchor="RFC7540" target='https://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<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="RFC7541" target='https://www.rfc-editor.org/info/rfc7541'>
<front>
<title>HPACK: Header Compression for HTTP/2</title>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='H.' surname='Ruellan' fullname='H. Ruellan'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t></abstract>
</front>
<seriesInfo name='RFC' value='7541'/>
<seriesInfo name='DOI' value='10.17487/RFC7541'/>
</reference>



<reference  anchor="RFC8259" target='https://www.rfc-editor.org/info/rfc8259'>
<front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2017' month='December' />
<abstract><t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t><t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t></abstract>
</front>
<seriesInfo name='STD' value='90'/>
<seriesInfo name='RFC' value='8259'/>
<seriesInfo name='DOI' value='10.17487/RFC8259'/>
</reference>



<reference  anchor="RFC7493" target='https://www.rfc-editor.org/info/rfc7493'>
<front>
<title>The I-JSON Message Format</title>
<author initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2015' month='March' />
<abstract><t>I-JSON (short for &quot;Internet JSON&quot;) is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t></abstract>
</front>
<seriesInfo name='RFC' value='7493'/>
<seriesInfo name='DOI' value='10.17487/RFC7493'/>
</reference>




    </references>


<section anchor="acknowledgements" title="Acknowledgements">

<t>Many thanks to Matthew Kerwin for his detailed feedback and careful consideration during the development of this specification.</t>

</section>
<section anchor="faq" title="Frequently Asked Questions">

<section anchor="why-not-json" title="Why not JSON?">

<t>Earlier proposals for structured headers were based upon JSON <xref target="RFC8259"/>. However, constraining its use to make it suitable for HTTP header fields required senders and recipients to implement specific additional handling.</t>

<t>For example, JSON has specification issues around large numbers and objects with duplicate members. Although advice for avoiding these issues is available (e.g., <xref target="RFC7493"/>), it cannot be relied upon.</t>

<t>Likewise, JSON strings are by default Unicode strings, which have a number of potential interoperability issues (e.g., in comparison). Although implementers can be advised to avoid non-ASCII content where unnecessary, this is difficult to enforce.</t>

<t>Another example is JSON’s ability to nest content to arbitrary depths. Since the resulting memory commitment might be unsuitable (e.g., in embedded and other limited server deployments), it’s necessary to limit it in some fashion; however, existing JSON implementations have no such limits, and even if a limit is specified, it’s likely that some header field definition will find a need to violate it.</t>

<t>Because of JSON’s broad adoption and implementation, it is difficult to impose such additional constraints across all implementations; some deployments would fail to enforce them, thereby harming interoperability. In short, if it looks like JSON, people will be tempted to use a JSON parser / serialiser on header fields.</t>

<t>Since a major goal for Structured Headers is to improve interoperability and simplify implementation, these concerns led to a format that requires a dedicated parser and serializer.</t>

<t>Additionally, there were widely shared feelings that JSON doesn’t “look right” in HTTP headers.</t>

</section>
<section anchor="structured-headers-dont-fit-my-data" title="Structured Headers don’t “fit” my data.">

<t>Structured headers intentionally limits the complexity of data structures, to assure that it can be processed in a performant manner with little overhead. This means that work is necessary to fit some data types into them.</t>

<t>Sometimes, this can be achieved by creating limited substructures in values, and/or using more than one header. For example, consider:</t>

<figure><artwork><![CDATA[
Example-Thing: name="Widget", cost=89.2, descriptions=(foo bar)
Example-Description: foo; url="https://example.net"; context=123,
                     bar; url="https://example.org"; context=456
]]></artwork></figure>

<t>Since the description contains an array of key/value pairs, we use a List to represent them, with the token for each item in the array used to identify it in the “descriptions” member of the Example-Thing header.</t>

<t>When specifying more than one header, it’s important to remember to describe what a processor’s behaviour should be when one of the headers is missing.</t>

<t>If you need to fit arbitrarily complex data into a header, Structured Headers is probably a poor fit for your use case.</t>

</section>
</section>
<section anchor="implementation-notes" title="Implementation Notes">

<t>A generic implementation of this specification should expose the top-level parse (<xref target="text-parse"/>) and serialize (<xref target="text-serialize"/>) functions. They need not be functions; for example, it could be implemented as an object, with methods for each of the different top-level types.</t>

<t>For interoperability, it’s important that generic implementations be complete and follow the algorithms closely; see <xref target="strict"/>. To aid this, a common test suite is being maintained by the community; see <eref target="https://github.com/httpwg/structured-header-tests">https://github.com/httpwg/structured-header-tests</eref>.</t>

<t>Implementers should note that dictionaries and parameters are order-preserving maps. Some headers may not convey meaning in the ordering of these data types, but it should still be exposed so that applications which need to use it will have it available.</t>

<t>Likewise, implementations should note that it’s important to preserve the distinction between tokens and strings. While most programming languages have native types that map to the other types well, it may be necessary to create a wrapper “token” object or use a parameter on functions to assure that these types remain separate.</t>

</section>
<section anchor="changes" title="Changes">

<t><spanx style="emph">RFC Editor: Please remove this section before publication.</spanx></t>

<section anchor="since-draft-ietf-httpbis-header-structure-10" title="Since draft-ietf-httpbis-header-structure-10">

<t><list style="symbols">
  <t>Update abstract (#799).</t>
  <t>Input and output are now arrays of bytes (#662).</t>
  <t>Implementations need to preserve difference between token and string (#790).</t>
  <t>Allow empty dictionaries and lists (#781).</t>
  <t>Change parameterized lists to have primary items (#797).</t>
  <t>Allow inner lists in both dictionaries and lists; removes lists of lists (#816).</t>
  <t>Subsume Parameterised Lists into Lists (#839).</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-09" title="Since draft-ietf-httpbis-header-structure-09">

<t><list style="symbols">
  <t>Changed Boolean from T/F to 1/0 (#784).</t>
  <t>Parameters are now ordered maps (#765).</t>
  <t>Clamp integers to 15 digits (#737).</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-08" title="Since draft-ietf-httpbis-header-structure-08">

<t><list style="symbols">
  <t>Disallow whitespace before items properly (#703).</t>
  <t>Created “key” for use in dictionaries and parameters, rather than relying on identifier (#702). Identifiers have a separate minimum supported size.</t>
  <t>Expanded the range of special characters allowed in identifier to include all of ALPHA, “.”, “:”, and “%” (#702).</t>
  <t>Use “?” instead of “!” to indicate a Boolean (#719).</t>
  <t>Added “Intentionally Strict Processing” (#684).</t>
  <t>Gave better names for referring specs to use in Parameterised Lists (#720).</t>
  <t>Added Lists of Lists (#721).</t>
  <t>Rename Identifier to Token (#725).</t>
  <t>Add implementation guidance (#727).</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-07" title="Since draft-ietf-httpbis-header-structure-07">

<t><list style="symbols">
  <t>Make Dictionaries ordered mappings (#659).</t>
  <t>Changed “binary content” to “byte sequence” to align with Infra specification (#671).</t>
  <t>Changed “mapping” to “map” for #671.</t>
  <t>Don’t fail if byte sequences aren’t “=” padded (#658).</t>
  <t>Add Booleans (#683).</t>
  <t>Allow identifiers in items again (#629).</t>
  <t>Disallowed whitespace before items (#703).</t>
  <t>Explain the consequences of splitting a string across multiple headers (#686).</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-06" title="Since draft-ietf-httpbis-header-structure-06">

<t><list style="symbols">
  <t>Add a FAQ.</t>
  <t>Allow non-zero pad bits.</t>
  <t>Explicitly check for integers that violate constraints.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-05" title="Since draft-ietf-httpbis-header-structure-05">

<t><list style="symbols">
  <t>Reorganise specification to separate parsing out.</t>
  <t>Allow referencing specs to use ABNF.</t>
  <t>Define serialisation algorithms.</t>
  <t>Refine relationship between ABNF, parsing and serialisation algorithms.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-04" title="Since draft-ietf-httpbis-header-structure-04">

<t><list style="symbols">
  <t>Remove identifiers from item.</t>
  <t>Remove most limits on sizes.</t>
  <t>Refine number parsing.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-03" title="Since draft-ietf-httpbis-header-structure-03">

<t><list style="symbols">
  <t>Strengthen language around failure handling.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-02" title="Since draft-ietf-httpbis-header-structure-02">

<t><list style="symbols">
  <t>Split Numbers into Integers and Floats.</t>
  <t>Define number parsing.</t>
  <t>Tighten up binary parsing and give it an explicit end delimiter.</t>
  <t>Clarify that mappings are unordered.</t>
  <t>Allow zero-length strings.</t>
  <t>Improve string parsing algorithm.</t>
  <t>Improve limits in algorithms.</t>
  <t>Require parsers to combine header fields before processing.</t>
  <t>Throw an error on trailing garbage.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-01" title="Since draft-ietf-httpbis-header-structure-01">

<t><list style="symbols">
  <t>Replaced with draft-nottingham-structured-headers.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-header-structure-00" title="Since draft-ietf-httpbis-header-structure-00">

<t><list style="symbols">
  <t>Added signed 64bit integer type.</t>
  <t>Drop UTF8, and settle on BCP137 ::EmbeddedUnicodeChar for h1-unicode-string.</t>
  <t>Change h1_blob delimiter to “:” since “’” is valid t_char</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAL/TI10AA8192XLbSJboO78CQ0dFiR6SErUvo6mWt7K6vagtuSu6uzoc
IJAkUQIBNgCaZjncz/N8P/F+yT1bbiAoUXZ13amIskgikcvZz8mTJ3u9XqtK
qlSdBtdVMY+qeaHi4KUKY1WUwSgvgpc3N1etOI+ycAqN4iIcVb1EVaPepKpm
w6TsTahxr9Sv9waDVhxW0Pjzs4ub519aEXwZ58XyNCiruJXMitMA2pbV7s7O
yc5uKyxUeBpczGZpAi2TPCuDMIuDdypMezfJVLUWeXE7LvL57JQnc6uW8FN8
GlxmlSoyVfWe4axarbKCFz+EaZ7B4EtVtmbJaSsIqjzir/QxyWKVVfqHMi+q
Qo1K83059b5WRRKZxlE+nYXe1yl0ZRonWZrokWmoWM2qyWmw22q1wnk1yQuY
TQ8eYVN463U/eJNXVZKNJ+GUfmYYvw6L2/qTvBiHWfIrwec0eBGWVbqkB2oa
JulpMM3y6g/4Tx/gQQ/mRXIaII7K0+3txWLR10+3vUlc9V72gz+F05kzgat8
nvZeqiyDCdhn/hRuJir4S1hkSTkJnoYRfLsq8l9UVLmzmk1u//CRG/UibNSH
TlqtLC+m0M1HddpqJdnIfguCy+fPnx8d7J9SL1VYjFXFq4BFJEqpT7M0L1Qf
P2Jf20CYc0TC9v7hYOdk72CbX2SKxs6ArIEowiImYn6R5iGCtXeVJ1kVXBRJ
NZmqKonoNYMk+I9BVF819kgPmMCBgo97O8f0S6mKRJW4nFN5FRufBrCaHraT
H5+9vTwNgsFOfwDz3cYm1zfP+tigL0vQb18/eXManBzBAL2jveNB7+DoYLfH
3YQZ4FKmdK1UEKZlHvyXgIlYRRUWRvRDuQ0T2f7vPtBir9cLwiGQNtByq3Uz
ScpAgzGIVRkVyVABD8KKqiAf4VLDoFrOFPNlWJbARLB8+JgCWyMEy6CahFUA
nAxEVSngsBjoP5iGt/BDFaiwTFRBb5fhCD7Bs1iNgFnotwn8kyri7YCFSTBK
VBqX/eCyCmB2pk9E4bxUwXAZlDMVJSMjMWCemVo09MEzWyCZwqj4ckiMm2fA
61kVfuIGMMoUCCsoFLM8kCM+yEBShXGCY4Qp907dBh/DdK5KDU3AhvrwBv+p
8g/vWHi2Wo/fvXgaPH92efP2HbBCClDA/qc5dQ0DlsAt0HEwVCMcejYfagn4
uNV6lpTRvCzxOayN2pPsBaa4BUzM0jBSATysJgI5lJLIr4TtAPkPv6VJWQVb
Rl73FuM/LPaQKjrdYDFJogmuPCyiCSwYEFoxFaHIwDfLPjfevuAW5fYVTXLb
7ZCI6icZ/Uca3TA1TDAKcYWAunnmD4B/F+P+GAhoPuwn+fZ/n4E4nhewriiP
mTSSsgQw8yoQ+Q4c1vYrHQKSZQj601OfgIgQnuV2Gg5VWm7XFReu4wbwz3ov
mQLKkCe0TipwXmkKSFP3DWi6jLV2rLBfHOCyoVvkxNt7O10ktwn/YzV1TzQ1
9oyEOE1iYKVW6xHqxiKP50RhrdY1ccsSMYQEI5S/nmmQKIDwMgXoBBYKy9uz
QH1UGTBSNaEuxvMkDrMIGT74/PkHIPWj3b3Bly9dEEhM1sf9vf6gi41hibjM
aZgtge+jhLAQoBQC1M2SahSmKX1HuIfBrMiRu4kHV+YmQhrW+xZHD/2HSB0k
WOIuEEc5y0EAzcKiRGOGxA8I6TBNfsXv+QgIAgDAsgpIaQGyDH7CN6MQJYUC
laX7n4TAsGkynoDiDeJkBGIM5SXJLgQrwHKBgiTN81sk2Fvli5l+XdImgiBX
1MobJHENDZVG7AGoaXXJ3TJPhBOuKoxj6ACFoIL3AbBDID6UqxmCBfTePA2L
LspoBhvOZawA7UnUNToCJGOsUppFwzDQDgyuMVMGytYsKlSlNKhLlgL4Mihv
nAwTYai7hUVVwJtzLV8NMe18+VJTB62Ws1ZH5wjKQTUF7VUrtk2wQ5plJaZb
48Akhl1N4qgmeCMpNKsg8QxBjUUW48U8xdUTfaNCQoEhPDbMmUvgfYuwFa1F
BKcp03QLrWqiB9Z9EWsllC67wWiOCww+wruaEAgwKBK1Xk3RNCazysdEyepE
1bHLvwKgLN0hZtN8gZPyQE6kWAnTQB9ZOUXGiVmDqhGsL4HJA58gTeTzCtoR
wJSAHhaEylI0Lylf0KBIenmYWnWnOQUG0q/WpJf6BIoBu3bp4owaTVUEIE3K
aWlsGgAyoArQjjSTZzA/11iBtcDCYqZjb71odMKScEH5jBg3xyGmsIzPnxmj
S6BVazpN8gX2KI9gXStESa8SOdKLmvWy+XQI5A4rM9hxrC+ajKg9miosZZXc
+2Ca56WDX35Z3jMCMOZ1kARGAQnGVZFPfVbUUJiXWnE4Fp+FKmkAfPHLFzSI
HpHyAcQJveIcwaJC/yAS9v/8iK2sLyIUfbZIvLc1dPgNmix24UhzETFDNQk/
JmBA6AmXlZr1hsse/nVmzvRB+FdFgUJNs56RDCQ7R2BCcVOwpnkI4KocPJIJ
IZBtUwBDMs6YhFQWwfDhWOG71WQ0T2usTLMmgUEW3zjPCQ2gZXGIIZhs1RLx
Jw26qIRrPRARACgM0bYnKp3BUG2UHMxoxIdVnkKfGemVJJsBFy7ArYvFKK8N
itZjCeMB3CLhS24NshxM/YAE95zYJshxASvmEUzG/ISyMAHFEmwNYVjUhQDr
cj70VGeHLNawQPsNRdyl7hl9e5A9Gt+WatgocagjGMHkaFajBlF+hqKFJBiK
l6wHmomsUtK9CA+GXwyGNpjkyEGInSgvCjbxAJyI/RlraVBfYYHCl3ygj3kC
VhKJ+RVQMmVG4H/DFzFgWd+h9cCLBH+EfI15WnnCMEQpwL/bRREggAUAKMmo
weIJZzMrxZbBFF5OABOs4WHwLdUf97s80amKkxAd1S54to4dg6ENMPeyqmS9
iJIC+iw6RIPMJwlZhNTt8vuS1T+OLwiG0dlswrcRRYAYb6qap4SFRVa8EU8W
0Pk0zz4ybksUDCq4VUsmh6D9+v31TbvLf4M3b+nzu+d/fn/57vkz/Hz98uLV
K/NBt7h++fb9q2f2E//egjefvn39+vmbZ/wy/BrUfnp98dc2I7v99urm8u2b
i1dtYzIY1UTWO5ERQXeGlg/aIS1POj55ehUM9kFI/gdYNruDwQkIff5yPDja
hy+LCZqdOBiJJf4KYFwSbkMCPVAywBesZXD2uzhECWomI5W2YlsCFkrPO7fK
aBP52dVyKriYj7FDWMYTcFHmZe9NOC+CF8BGwdbFkzcvOoEORCC58poOdvdw
TSgQ0nSOSgioG3Qoc5Uo77rVV/f7wZDJSYbnXV4NzuYvT19evAMH46obPLv8
8fKmG1y8unp5QbN99uf3b2+es1HGqsydDUUSKEoCAi6dx9Lh25+u6Q33BbY8
0aUFLBhwrVOOMuPuijwkOh3lKH5qmhP8CxA+QF/AQQXaIHURD7MMeX6OSuPY
Ssz2zjwpJ+FQz1ukHoos3R7WOxLPC+kCUDwuFMvmoaoWSjGPG2KwpIKwRMx2
WQiYrl1qQg0CpB6BUQbqgrBV5lPFQQk2ib0uYRZtHD9ettm8WkzA8C1n0JqB
wXJuQhqHLEEQSxEKJZHYEZI4UF2NYtEOE5TUsEG0C6twSJAhChpxTPoijCI1
qwiIi4QCP6jjLP7YnSlBmoIPOErARCbZXgazHLQRvGaZxDOKjJUK8KH4MArm
RUjiUVQJG49BPRJgKIJpzYO+QSwSB7lbQiFgXaMqA6oA8TANq2giC8XVk4QN
npEHAq+8AWexIcgPxpjYsCBGbGDOo3LSSzaqIT+j41g33tCfRoFz2mo9Dt4p
Ui+RalDPfXgaJbOEdA6CkvzOsMoL46LI4NpFv82Il9D+Ifj+cw6Iowj8qs/A
7ILOCBBSH+ciIRC3Y6KW70s2EqxsQl9V+7Ykp4qpmZJ2IX3blw15zxNm788J
lpYKTY8kAul2zeO4vjzO15iPsQ5VGjJmsTZU44SD8jREu5z02ne7s97KMfwS
GkcSuQs5I0H4zWcSSrS+FX2zGEeHA9VOsFBAaUJ92AWgATFcktaCX9H3cLvG
lQHppgiEfkBCtYEIjZwFA0H4V5DE8isKC2SkrVIpcTZ65LZ8+dI5w6VP8xLN
TpAFBM9uoIN7Ag1vSiJp4pxMF7TFfCPMN1scDz6iwDuQXkpx4zVE6DOEDiZp
fSaGNcpPVESe4y+hF2g1qhYAuDM2AiKKxaWEvXUY3OIIS4hCpasDw+BPUn9G
6qGVMtYhhxFuhgiwOV6LTdDczMbcospvVcamonQn7imI7ylZiiHFZjv94JVA
srsOeAbsCIw1e43rLEfixq4ECWZ5IZ4QyJZ81G/0IbXXOIXRp/Op7T5V2Rh4
B77Z1YDUTTDO6YTcyvkMx2E3oGG29RAN2hdxrjiQoW2tafgJBwe6/FWVhkqj
sFRiBGjpSiFNAyCwJsMFWZZIjSSG69ZFTN4WspqeewouF9KgsDGMyPiOk49J
vEZDVmC7pQ4c9DNA/baAS3e0iplhmke3opY13bVa//rXv/S31v5uH0zFvPec
vwvs2LL3fl8JYEboCCxLbx8hHGIkCWzeFqlk6EDiPGWJHvckLGkytlv0jFZR
F/wdbLxP8N8/EGfaiyFrDeHeihOKXqMe3jJNbVD7r/2/dvhFNi9K0HOBt5pz
QGPP9sLLdXqloWCBFfAtKUl4MaLYUoarIVwsSIriZiyuoj3Kc/FF+IHxvMKM
tp2Jp9dOt0tUENG+Z42NoWPeuHZB2d9oTsOweF+ka6YlO+cw3vpJMY71nJ6A
k/P+3SvNptCBng1tcA4V2tH40IkHuMIXAwgjY9MaC0VLIc2ZAnfy3CnsLYhv
JeMsLygySdA2BKGt5R1a52Cnyw5EmXwE4czxCom2M15R1Lcc7SXOoe1d4KZn
gjT6/t1lrzCWEkFs7+T40IHYfn/Q4RXi6wAmEzGFwZPY78Fdlx3ZezckFUbB
4fsG3u10W05/IBvzFLcKm1ofdPReJseh0Gboo0ggO3SVFZ9hbPOGLKrPj9iI
0sJcetRi3AtYM52txkQphlHqyGZzZFTsKaAiEIvwyJj9Yk5nPfIGRB0CpaBw
kkjFK9wRhZmixoOJ8teQNreKcEn6/1dV5KhbKALHjAPylPaRaIMIN1xlthjK
Ai0abH3+jH/BkMEXKcAFRoBs3IYZd77SNylgpInn2LewqLZR81kvVR9Vyp3g
eOT6gguhXIsUOAW4mXYgaC8OOo8pDjYNZ9jXrVr2GNazMCnIwCvYJr1F4Ywr
B41VVF3jhXm2w0Rp1gj1hJ3FSphTQ8NbnDMxFPyyPONwgV1tJiAywETwswTM
UTKPE4mVllE+4wiJ4B6lCG1us/RGjRUOs1ELxDbBi/87pzY9gezjLYoVtLtt
+us+6rTcb/jiFmoAwu02I5P77QSPzcJazu/0TnuLe/67eReGvL4y3zr09B9B
u9NumV5kojSzM36fnvVISv89aJ+35QdG4z9azmN6FeCI6VSB/Q/WHYXpbBLi
BPTHbY63wN/2hzb+C34HrFue6he/+3Q46B1dBGdB2Pu15Q4csFbElbA4uGwM
/2hWEViSHMBuxAzjxI2Q42QzsYFtKAGNDccErlnxNRXlbBmyCeuavhGZYbiT
Sw7CqW/WiKLvgYBBEcDC5VRraRTw+AfswYWJ4nD3VQI6rd++BwKW/UvZ3MTs
EgJAOS8oXI6yFeACUgu8/UTCdcTdzB3CdhizAKNQAw91ZopBBYLVxcPBw3P6
Wji5sNpiJUuwAlNgCz78qj9U8DuYHfS1w7CyrhlZ8CFMR5OIOL3KsfnA65/O
MPRuANm/A9wipL93hQ5JNkN5JhwjYyKwWaKT+ke8qGkS5Sn5AQ4NroHHFQ7k
QiMcRh8Gu3tn4fngbHi+exZEAP4P+weHAIHxJAl+uU07Z/88b5+0z4rz9kII
6ErSGkgzi7siKBLbgiJ78JtCgA12dvetRtLt5QeJdum2uweHDjhsayu0msfA
98wQFGCWF63EIsHtj3a4H0STEDU76uhWS4yDWoIX6gnj7zqhGN/JIVIV8t/i
UK9JN/BbOgJYA0H2QmXZHdxsyRQam2C2iwnwTNvxCdks1qz/ghlbzjPaYrbq
lJM1oGdXoXYdjYrPvlWlkv1gTBF6epeW9TDFgsPO4h69qlitaovDcW8oYJFH
0byQ1g05T0SyYoJRILakLYrYBSDtrWEuRBYrSb9Y0vz6Es8ylIFxU8rWSYgf
pyrkJAfuWDsYstq6IeCN2bwp0WAnOOsFzYbf1hgK7qNOy/1GOpE/sz5GZS3f
Ccct96FR1m4LV616psY9GsbQuyfmHAVL/NmgYSllMDXEmsUuNXo94WK2dPaH
7aCziXxEPtKiUWXnbcwMV7NEgVaNw/PHi/2/JcMf/7KzOPzbMv7x/fljXu2F
S4SSi+R5ro7T7DI/UjBFue6YjSusC/Kjzwf9g24wUgojd+X51i85aIEwxk1a
0Vng1gCFUrpOzRKp5QBh4N5NbtFh4pq8krUQ6L04LMgQonvmYPZmIlqo4WEA
ucamF3UnPmQPUXBqUqrAyhATAHPPMgy9Z134kEo2WT2E7i/KfKMEjqSUXXhJ
mmnUXB4jrlVgOMttT4QiFfLc79YqlJZCAvPzI5KXQDLigSUmOya0wRSQqvwR
BGuXQ6X4I32gn3SA4/Nn/kQ/Einhb/SBfhouKRmOo+T4aJiQwsBnANsneQ4T
pneG/BGdo5qUMuHWzcQTrYpFgyxnG7/wIuijTJ4+85zpI0+tZb0B/pXnpR15
Tu8Z89aRBhKKG/mR3Uwbc/6///N/Tk5OurX/UeA3/WzCK6C/+6oPNDejxIFk
VGEcJk7GCcasOekGMQPgoTz/o4N9PqBRJZKIASCV4wRNINXT3RyqAsvz4O/g
//wjGDweHJBbxIC5X7AJhLQk2d+tW7ckfWlGNk5f2FwvN2kcWA7TZCWPCRdU
QLeSgiLbBvguRok4RiR62wlvCFfQmQjEJdM2rIR/0Nn8Y2sggi0cRqIWMA2k
68Vfyiov2GcwCInzOe6w4mYHZf1K7BGsFia1w/3O3WjiPYrNkcQ0TpqRsbTl
UDMevyA/tt1vI/r2xav1mux6Tfaamux5TXabmux7TQZNTQ68JjtNTQ7dJidN
LY7cFsdNLY7dFkdNLU7cFocNLfTkuMVBU4uB26IJrgMPrk1gHXhgbYLqwIUq
f+ysMJ+jb+9yaplQNvNgiSEM2/YPrCS8FuucExpBCbRa+idkHz+qBb9zwsHF
9dPLS0k32dnZxURnq6u03LPZCjufdndQBu58OnreoTNjxhsm11cntIRDEIyZ
WuApNPgUgS+Q4NZIoap5gdt4qorq/KXdi40ZTDTHuU64ebwVTYqOfGvBZ8HV
ORgLqozCGQB8O5BPLfsbhot2d3q7A3gKn/Z6B0/o08Gz3tHzlm5FobGfwZbU
w23T1849Fm7p4MBGQUiGiUT65xygWHYlUzQMhmF0W6ZhOQm22j//3O5QOidN
wn9DEsGlsdrI4WeKMHGiCRhuuAtcpHG7rgH0xEmqo1MjyyaS1SspznQsR+YU
5yTn5bnuBKY2L9A0nFIqKXWpu8O0NlimltwCbr2jYff07aaG2aGXLD4gpPdZ
Qgd1ZDMiTjBxkjI99d5pPV/OHq1IKu7Wz3peyaXk9Em28no9xuBILZDo1azS
x0iE3XXYi6Eh1i+MpHO5JNNcu/Ry2sTZYaYURtqWooRRZlMheDRJaQXhHRZd
IFmGQyd3p34+QjM6pXtQdGJrRpswIBqWwfubF73jzjojWZOHb+qSZbxi7N6Q
V4MbK2SKYm4P/WBiDIZ3KMPyTGes+McC8PQdnpdFWz7gvPfEnuSgZG0Oxrh8
6GVp1SUOe1ubCxw2T8851c/VBuBqc/pfU3R6m5QE/HtK/37X9s0A/O0xPdk2
0qQR4jJbH+AHg10f3m7uyOo2F69AuIR8PHTpJTjcpqdtm+bjJPS03LMwgtYn
SHzXhkE/PxLia7WeuGRZ2k0xpOe1hwVqyKkT98ZY4lmgtAawPt4ahqVC2w6+
tfgz64QVhP2nRsI2xgzuEesrsyvr0h2wA7RX3rKcJg6j3CXKr+F5bLHe3T/c
P3ZPq+1vFJt4Qst8GYMcfxy9/GMa//iX+d+ePtkJf0x/vaT//zgbTl8s1fWT
X4a7Bzt/++lg59X4XAcpGkls6OOtxtuHe8f7QQ6Ehhb5COVGrFhuaIJg74xI
QRxIoAXxKkUkfiUt6F42pwJ5Acjgh3ag/Ub9K2vzHcL1YANc69FLncBgsIzA
IdGJwxhO3AiB0Cmh74eB2ZjWZ1d/wr6bcn2y4Mado02cpEMva7as9SEgfeDG
HrVZM8aaVFZ6rcirPMrT0ni4qTJphlOb4E/z297VZ+gO9tG0lC35l1cXT/9k
nwzgCZ8dSEFJocZBc1Ymi9BozBSlxDuzJFj6jwmeCnVyQ+/ORwSsDHRusvMO
pSQ48TvZoeUjwJVz1IB3dsRCTio6lZnlOqLZ6Wrlj4cXJJymwS+nR+lIiO4h
R3NJH9bjFhxvpfQ4+kpDA3h27592F8iykozcD2I2DHUysD7S4YI4tPsJFK2A
yTqhZfKG9/rB8xTtpcaxEUhfMSrGMwMejnIZQLfs3zUOx8kePlBGETe9Mr3x
3zrgsbp8GqRmLBxihBL9ldpIJLvEqKRzazYxAgWoMeXZaDO2letkocAEKn/U
CI1HBhqWqHWAeEsnILi7QxSowQliK6brVwY+kuDB5MorIBIiAYV7h41d6pNa
0iV6vER1dj9cL5txAb9/YNZYwQPyNSVXyVpLjRDaFKUla7TgL0wG5PXwYH0c
HSb8Vp9WevCId5BAbRig8Qs6wuR0Dy0YktRi34Gc3UtMMgd6uujGwHSGKRF+
N7wkxBIx+YZLCP6kDHfeqqXM34z8fekkXehh7JJopJVp7BNe7VIm5OA5KROn
1l4VwvptwL46beq3b4fbtQA8bwCgt7gmXB0wyTo7jFj0IqSgppD3zNC3h7Aw
wBNYF41IM03E8/3p2m22VxMapM0sozcQP/O7pX3D9Fqu0KO1vC0ykkyQrbbP
2sKt8IcZ2vbzWyNzitspHnyaELJHCLHz0J4ICaeunB68A7KaGjoeNezfDXKH
dRjUyDlWsmLOkRGg8AVgvCPTlF9siqMx97FAgvG6aPPEJFE64TN6SQ50iHNq
TFrot1nrbCS8BRB2indTYIOqcdQ9Q8VLINDAcQwhAyP724NVTZ0e691Zqvx2
qQiDgGBxdq5r9NkgDffukDf7Wv2t6r5/h97T8qum9H5bZj28k1mP7peeNdz9
+0ToKgHL4kR48i6qkZu062gIFr8Za9/+5BziHqP5w7HpTSFrN2cZg3qDlg6b
mjG0sV4blUP+DxqS98b0eHrvtz7aXuNozIoPG+7a7ilzYSLeV64PuN84IAWS
1oznD3Ojd6lxFL1TXR/koHEQCQk8bFnOHjeOaPe562MeNo7pBUgeOLIbLTPj
m3Btbfgjj/Wb9EQzTwhZaptC74hbzpAGljn4h5rW08205rMvih771i31b9B9
TZOUXBBELB5mIpvin3OKE3eCHWNZYDi20aLwOgS1oU+rsVw0mfmsxzF6Fwx2
xMujzQwsJTWF4Tgn4B7jpEEbM3Mz1vTet9bBvD1oEEZfa+jiJsZMuW/P+7cA
vhnytwE9dfd9acjMFIH4BuCfYQiBd1pw99NOZadNeNG6vu/N7GDNzPQo//aZ
1cMOzRQj8plJxuz4OjGwhE9m8yL4e41qpNHXWrcwuxKzJq040LbucMn1EfBN
rJDwrWaubBX65GOMSruNhZ+scaLXbGIX/Ljk7UZ4m7tt8NbxuW+22LlQJz5/
r53lwUaYZBXIiNQbZBqPvF9j0Ehfa1j0tnS+1UUx2WJffivnhKf3YPfE15YM
HLO9pKHjb8EYKFEQrgYl+q0ZShKz+9bltn9+vEbC+eYB7/30TFjQnR/WdEDt
3bwt1MVyFwSeKMrnWaVTnr2T33Q80RNvtXk1EOXNRJkNKiry5WZsctb1LIxj
vecBzlH37qnu9Xf7eCpNn8P2OpeNacrNg26DIVVuUFQESaTh3X0fmOxPW7BN
l8Kg5O0cz7bH7NDUCpo459TXEJ4YiEJyZhtL05x+bqmNf6jTm90xYoobamv1
m+nshzqZNQ1aFXhKXauVQT1e0vTKKKRIuFVF94uy4EoyMWR7+YWU7Gw+9Kg3
bbhagmRC4PnPSCUfiRV8XFG78o5SNzZHmJKChVRXB+4KoeA59aLCqluSK1iw
Lx2St8K74FIg1E0FUfFY8VF5m2MoqSP1JBHUSUgnpuiWrXPp7czplIzSr9rC
5wCkOkN/JRCohZUnM2hKtbOjEWabZQIssF2c/aNgy9ba9YmMN1xCUwpAcxZ3
3JGjXfTsAx54CbbwSDbMqW3DAHjcDAMZbVI4bfRl8PSU4yf5Z6Il4ous85R3
VXx5LfsrXvqLq93JkOL9GLJvpWaHX9sLuOsZl+2guiN6wxYPRdCBKrdDbeS6
60STQRaVroRerWDXvCDbONQ1btair0erlh2ujmba+hgeGDcbyYniNYxX28Db
bxyVcLTheBJ0aRjK3VF7ALAP15qjEhL2Mel7xUVNIJE8kdI9Nc3aNaV3pebB
dMilSfH0Fdbqj5Stq0Ol3mul7ZAQkdwpL7rnnMiznOXoLZsq4+vE3TPeiA6p
gmFpDxJalpOiAsqU/0uXUtlCDnmjpekcUOhyjxPJ4eEqQ1zAV16nOrgw2Yyh
0rhmd7G0Dl3YyTumVjsBYiFmTnn75YJN2nc5S7EAYlSAlrZFAfWi9WT6NmN1
sxf4xAoZEvMM5BTSO2W1MumWNseP0LaFW6VUIkIfAsKueCeXqg4xWTiHYYZY
OIvLDDp1iMi9E1ZZWqFW9INrqlnpwBs64lKLWN0R6QePNmUwGnSjwmngFEJc
dh2uKw3o8PRLoSscVUWemomY+tG6Jo7MQqfXdc3hiK5OrMfV17K2pI4QpQmu
h3lpIIkDGajJKQGC1brUTN5ctBWVMEvSHoekSk14OIflCyd9Wn0IbdcU4vm+
Xi/FVGYSVauL9ZvqrVy8sitGYYG175sLZoYjVUl1zdrJT12hgk/y1Yt8ub5U
hbXRSAlTO8dEN1v/a/XF50eOunCMgLVa0IhC11Jo2tbvr4jaKTghI6ngai4E
MFpaq2exTzXbuwYqjUda8yc6kLdWlru7O7IPtKJoijnXFLOgudKTpzrBr/m9
Bv1Di8Q4KnkovpLx/HcZ2mz7l3rn5wFay2wH1RcrSkuw4Q5wQAZOOZ8qye8p
sByGiVzko1Wzxjo3tJFS14W8f/OwWR/dNetK12gMsZI239lADH5WG3kPE//d
gmwk9VEDDfFcFF2DcFYDgmN20nAd8b4ebY5rzRaM6ofyBcchOGdvpbyIZZFv
4BDJyboHtWRzbbVNDstmfFDfNRSjy903bCD8XZ3d9NCxZNvQM+2aBthjdnbq
FTiioetCma1PymTK85mWBQ+j3t2HwBj5pn0GcFafEinWAANrZte8GFJqju3I
FFiw9Q1rfWvuf9jUgf1TDagPzXvblg9wP79BxMnWdvMAhzaL54MujBWmeBBv
qT04P0nJ4/d4zjdeqTqrs8wwOLYJV+gfg9K3GTvHD2KA87YTdnUFI26821fF
Or4bGTaVqjbHr3Vi1oD4xOgQRJADamIMfRLYzsBNcSrdCAqZzHM0rhp1dF0u
1pKF6qz/1QaCVGX4ann39fqM5J9PaIJBJzWowcjY29jI+DcKlnZnHe3e87JD
rEIIdrVaLhEMkDo3FtN3kHGzKWQjwzQQ7Tt70zh4qJi9vqJgT2cFqftc5gzH
EqfFKSi2CPltMRdWy7E/ui/OoXmhKXNpQ2ao2QFblJWFcPlWU9lJnFqvEh9m
NKMjQbleG5jNf7pThay1kQHvbsaX6A+zb6Srw5ipbKxE9r5JXJyvUJaxwB9q
cdHM12iI38jqYhayhtdDh9zU+JIErjj2ceKqI2dot6jNUiv2h4nJ4w18ntoY
J/8Ot2fnoRMf/P5uj1u7tdnzWcutWqx5aaobyTM0TH4XBwaxIyX31ijylbMZ
Kztamytz7I+23VfZB5fDwZjN1O+ulwiAI8kehlmN3ObQ/vmD7GH0XHV/VSgv
C+Bu/e4BoZZh6ucRmDb1dCHzoEYzK9rfGIa1VMiN1CDlnP0ehBNSHhCd6BNA
S7zbbxk6Z7GNKOTvKAwxMreSeueei9poJpyvcdcMSpMDyTOwWZBrZrD3IJ30
8+P2XaOvnO3mSdiUwTWTeJhi/OHOOTjpkjK6TZhcM/yDzEckUDyHe9ccTCEj
noFJEl0z/qG3R0RGJ9m5st81z/A2jHGGMab7rM438zUhKCHFB0pnfutr+ewN
5ipxaNvGx2WLnM4N2lJItl4UAUlX1dEVo7oO6PTlCUWBV1RyPU+j4qw5S9DD
G76k57YR9Fj9CJ8MTDSIlyfc2yT5H0agvTYV6CYbIqnksiAZFwDWG/j5wXfo
d1uNk9ZQx/7hQzWgkWErm5TfrNh4wV+v2czUQu3qWW0lZCjqiO1U3Po3G8KC
YgK1yZnrt01nvvITRGu8UDfwsE3E1tamusOSszt0KJPmashOhErjFL1pGF+F
L57DtNTBgZcI1xRFd/vmeW/W8+EdPR83T1njns7f10DonkegCTinXC0/kWzg
C3VtBhgRDuEA+MIhCP/tpClr0zkl7UiO+nJOHBw6OZVMnnQDyCp52lGJfFYg
v7sWDDrp+VtgsFM3pTTh18W8pNKuivl6Wu2G1tQ8o2I4sRZ43xZJuN+SfnBc
XFs+K/6Ndqs2Ejr7/yvkXL1akmOsN2aWLJozS4zpjvJw9cRrBmTx4bdaghnr
cuR07OGGPA9YTvM0PUfC9rDqTdREvB5H479Y56bsN7zkHfz47tPOTm8wwml+
9+loZMog8BqgqZP/3WlYhAmQhHd6QxQzD6OJiiUNIF4haV3ZdZSw8RIGUZoT
Y/Mq77PxOPt6lfdrmdibWXj00u/mgYvl/P/R//5W9nUccFmM536T7Ueqo32K
/3yH/2A6M3LH9v9Kv7yWuL5KV/Uk9s0Iy/MFfzcCYw91hb4epCWMS1woazcT
Eu1LUhZmDYs37CogRQ4P9z9IJbS7CFM3qS+Ra7nqE0tufXa9KJ1mpg0MO1+c
Pgknb+fSX9P9W5dsd7rLcC7isR3Z6bGNVmOU/0Se2GZ7tSFQLru3THXr4fUE
zy4d7gfPlFeshHPv3Tl26Vo+vOuB8uXxWAARjFOfPtjKuAZZ7WQC35pV6JrP
zkWSdGahQyazMJk/X6DdJ5J+Rpd71q8gM6cqdM0dysKCoX6RXEjv/AFf9a6T
mzH7K13K/SSxc7HfmnMNHZtKau/xZaAvnMp+NnHaLVW9dNLt8EbRZDyXIxZ0
ZuGb1ikX364ulQsTZT2qAGoOXNy5yoPNVvlVK2y6IU/fibXmNkPyTJpnOiDC
3+vvnbGM4bvKvWRfmjVmdzYfXROIUvh3qCp993GApUuxrDqdZ/DA2iD0JUzW
IO7rB0g2k/fS4e8n6X/47QT9vWPqu2HbA6yjv36MrhfiK3Blm4eOzCA7DxiE
jsCQZH+TyxYacg/31RQuDC4v3lyQGgByKkJzXzimhhbhyFQF41LVfPUjvtKn
W8j0IZHV9+1th3RPo77qlR31NddAyrYM1yA8c+9vxySoCpkJBF2K2e21YzSR
uesRaK+qwKMKPgKHwVylnBsX9S5BVnN6Myg9Knna6QevcX6NF0NyBdhK1lK/
RMCfQe0yVyDrAvPU3fsdGSKYt5lUyRgv8i7x8kWeL126xzJJHwSjG/rk2nld
ny7Qeb5kIpJ2yNSi8WRRjiSCrg6+hhd5AMpbeLp/Ffb21ukoKaL5VLLTJTN/
fXI0X7zZfIYNJGFCVViJ5OTOdVqwNwYsu9frkROMFHUR4UGoFA8skeRstV7j
DikGq25pTa8BXBNY8Z8wkJMRjIhWFdgdKR5nAHmHnXHsLwR5Oue7XQ15BvG8
0HZSjDn/+Wyq9FnEumRnHnlRkOGKRxEuylsY5c9zVTKNfH40Cv/5hY6S/TRZ
EhT+eP32zQ94mVyRJoouWQS4AF/qGtH+vc9INwULcUnix/flCMbx7sEJXrj+
Ml/ATIuuPf1Hog8vGy6ZpPAacSxXPE/4AAGO1UAV5lAkFvXT9/QU9hYL97yh
gYR7Ta6+Ybd2WSlPGmWFrxi55nAQ0lVbwrq6bD2pqSHSsNC3yb8wicfBRYrO
8Ri4JP6YRLys8GOeaEsXQ288BMZSPgIN0OqF6+Ucy/7JHt0QQXWStW5H+hSI
eyc9aSEsgvkMwxBPwY9CtDN1kWZ53JVLCOWSBnvebpZT2j4dOWkswuxUmaQi
lEVSkiwyyzVIQEDpCzUABCUrTgKBU1dZm8V8B9I8M6assDBySDICrOAqsBo3
3gVLF8FfyIkF59IvhABe5G0lTYaXrukxcPgCLLACLeVYzapJqc+NWJOcFBho
92JJqQhJRQRlTpLMM0OoFhKIc7JfiTBoVroeLdhCH6la6yzNlyQYCJ3fuxWo
8cACCeyE4jckzkZhOQEyPMMCosxA6lNS0uwIz3WJT5gEbUdyim8BloA+mj7J
iOoYTlngOUWpaSZY8z5dssVKg6+7+JrkKUZ7kGbkOna51JsLbGsTGihJcDEs
8hBvq+abZzi0701dHxD1sCy3GrOWab7pWg7L0JEqHxZnvAgH5HLZNslzS0OI
9KlsUgGrgFUyZbPQJ3xWMXwdF+fI4EUBDDVaJdi8Kp9RKVY6txRUGMKx17eH
jDE2jPEuFTmAjByX+VIOj2ERPYYgF38BiTHOYdkoOpqtjnvP0yBo8A7qOsxZ
AOFpKYUbkakwp77xVA62ksTlmvO68q6sgrec9Cko5EaDpdRs/JF6WID6whNA
AF5WcnRXEo9AcEEPJPse7GC6f6FARmsHUsRWa5q+vmahDoM4p1dHCbwzXWoX
4XpVVfnnkeSabN5/RdB8ohPEo9ohupJOLPGJQfFdzTUn9rAg3X8OgCfYoawI
KXONFANgokrZqMKZyPkovpyMOlzkxS0ZIa40GCXCiOxJkgVKxyArvjrpGp7R
NZIiJLWYjSaJ+shWalQoPnNoBNF8aNeFc+ai0Oaaby6dYjfYMDY4ERvL05fa
JOHSyqakMiwsG59SPtx5+6cEzKCKdo/L6vz4pL8LjoAqoyLhcv3nW6M8x5uI
O/aGLfv4FG+kPgvmRXrenlTVrDzd3pbh+xl0e8YS/VN1Ptjd69ZKust/0Pea
HvJi7PSwf3DIFaCtHnAm6oSFnOztW7X0b59aKGF0ylYkE1In/rOMMUYwJ1SM
dP0Urm7F0X3ufi56ksvtI+dWukHbhaC+JU5HyDw0aMTJuVy5iH4dfkULOCf0
yb81h7V4WKCvBZe2F8rP8XS7DSTZW+spSiGh5WqinDrhoEZL8d/AlVzmc6NF
kOK1bk7o3CxxpZTEoKPoZrbNohBP+5PVDhPM8cqgpCI4L3FydA41RP8S/Ua/
1AFW7S/x5jg6vgw2Y60UQqN1rZerPpGiqryTuCQj6fovW3JBkmZsIWr92JbR
xtMP84y9VcreXjJ4xOwzz86YfjQ/JpV1Iq3xFcuWNpupQoEgNSZ5XFr6y/XF
jSM6XFk5iyCpI7ZyXbesUgxSRjP8Sn0nd6oqqaidU+iMaF5n05S0dQSKApQ3
BcfQUI2wJnVwA7hPYsJBV+4mzLFMesk+Axl+fNE4FkhEbmUJKMJ9Os/oLizs
9r+0LBjDmPNhHx5v40+L8bb1bnpMZz0cofxv995KpDTBe2auevBurPPvDrXX
f/ZIHBQfeZYzNDutnYVBjqW+lx5vHRGXV/M99SBhbNbbVi0YP1bmBRYi2yBM
mDFWY+FKHTP2UAgjbPxr3pOLWOyBbuRF7ZB4HkYdsyvAWBUksnCRrGTBcvxw
qKqFUpm+WoOYg50TvTlG4Rdg6zHAkyyzNMzG83CstLXLV9c7N8DjUQLWkmKF
8zMMbxCfIJwBNp6uJUWJsntR4IZoYa7iYM6hiw9Jthu8otVmmLFuIDCCeFwp
2akrFrBH/pRCGyBwPoCDFzwHqykvToMrvOdB2bCiU69Edmhm86FGYP+DXDtF
KouCXb1EVaMe0vIwKTUFG5ruDXZarcfB+1lMS9V3u2w9Ojo56fThySWG79h7
4cP1fKZ64Vwky1VBth4dHu7yKzVa0NRkEK6FSqR8XDuophnsUHcXJBN4m3SF
pfiuYWh8PKDGDEOLETq0yo0queB+ViRTxLDcjgvjHDnjuLdrY/k4zOFrHvVM
cFLae6/1bI4Hh9TlNVhWuBNlz9Ai472SzmFCr/QLeyeSgf4A1O2ctMyK41q0
e/sFrnewvUOw2afZXPniB5Ho3UAMLQ8PGIopaBCd80SQGxzocnnQau/oKyZ7
jJN9Jld9utUehIoZHWbrB4bZ2ePJEBvGQRuMqzYpKC7yc5d87eI1rHzpKYCk
UFz6E2M3bDxhDAtHAIINLs1P5mpKzZdglWTJdD51bqzCeCfO6vmnGQwpKRCm
7iZZAm7aVenWcXMGp1AnbR+Sn2q32u3GOu0dftfW80QuhXVjoSncAwX4UpWf
/2hzX+yFucnBj44GzMIXFIBoX3p+zjVp0eCKLTaADg50KJTyI4IBWJN2Ounu
VI41A9cSc+IyS6Mgskb6hvF3d5zxX2kmsY+ZZd8pOilz6QFHKtBCowPdR936
Gs+TmHaCsdXXUOQRUuRrDDJ6N3M7PDEjhxTgcnDiSBeApdxmJOEjQkHbywag
n8B4G8vp9stsVIQ1QxH6PRr4/cqY3CF8YXrHdtjsGbm0HHse1a8FApYmh9fZ
MoV5HxvomWuAEM17rsRz6D/JhA/DMeonaLrLK9eMq+K1rGs5Fngj1Zewo09o
5kgcgo4vb9DpfPI1xU1woodfgdfDliw5DF5c/NkudGW7Vc81iRKqyDNR0a1/
9yspbh3HWqlS95BJHbSI1MHFBAuuVDVSqHIrc/R+RI7lk/Tc3RonHvdh6XpC
EN8Q7ZWwc4xoZjRqgtu5pJgnyczoX+yma4Z2/JGGnh669H1eOtkvLrHxsTAq
rGyek2UnMRj0pXCPypm7hKO9vLGHTGUPpwKiT2XjCn1RbTfqYD7yFhpszo7A
A0fYpRGoaM8b2RMgTW/OAdjcfwdt9XU9Dm4w2qWwKJGkXXjIGSdijGdozhMB
U5KOuQFStHiBcQJtAM9M+H+eiZCzBIaMAf4dwsVY22zLUQxRWNXMQZOD20bQ
lqzSHV+0qPf/0bSWUl/+Ro62Z41OIkBMCrQ2YaFFkZOFbQ4EjsNiCMjrPxRH
AyZIEFKRufWT3gN3BUXTJJz2Vry+8sHD7LSM8uPbqIPD/SEFbTiXHF0BogGw
efBex+OuztenwGAWPHl6Ndg7Ck5Pn8suguzVPMVsONolHPTm/FNPb/gbE3gy
+DBM86ElCdIpp22s7g8raH/fRveYr37mVNXW/wPjrW1W7K0AAA==

-->

</rfc>

