<?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.4.13 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-gpew-priv-ppm-01" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.9.1 -->
  <front>
    <title>Privacy Preserving Measurement</title>
    <seriesInfo name="Internet-Draft" value="draft-gpew-priv-ppm-01"/>
    <author initials="T." surname="Geoghegan" fullname="Tim Geoghegan">
      <organization>ISRG</organization>
      <address>
        <email>timgeog+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Patton" fullname="Christopher Patton">
      <organization>Cloudflare</organization>
      <address>
        <email>chrispatton+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="E." surname="Rescorla" fullname="Eric Rescorla">
      <organization>Mozilla</organization>
      <address>
        <email>ekr@rtfm.com</email>
      </address>
    </author>
    <author initials="C.A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare</organization>
      <address>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2022" month="March" day="07"/>
    <area>SEC</area>
    <abstract>
      <t>There are many situations in which it is desirable to take measurements of data
which people consider sensitive. In these cases, the entity taking the
measurement is usually not interested in people's individual responses but
rather in aggregated data. Conventional methods require collecting individual
responses and then aggregating them, thus representing a threat to user privacy
and rendering many such measurements difficult and impractical. This document
describes a multi-party privacy preserving measurement (PPM) protocol which can
be used to collect aggregate data without revealing any individual user's data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    mailing list (),
  which is archived at <eref target=""/>.</t>
      <t>Source for this draft and an issue tracker can be found at
  <eref target="https://github.com/abetterinternet/ppm-specification"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>This document describes a protocol for privacy preserving measurement. The
protocol is executed by a large set of clients and a small set of servers. The
servers' goal is to compute some aggregate statistic over the clients' inputs
without learning the inputs themselves. This is made possible by distributing
the computation among the servers in such a way that, as long as at least one of
them executes the protocol honestly, no input is ever seen in the clear by any
server.</t>
      <section anchor="disclaimer" numbered="true" toc="default">
        <name>DISCLAIMER</name>
        <t>This document is a work in progress. We have not yet settled on the design of
the protocol framework or the set of features we intend to support.</t>
      </section>
      <section anchor="conventions-and-definitions" numbered="true" toc="default">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL</bcp14>
NOT", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP&nbsp;14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>The following terms are used:</t>
        <dl>
          <dt>
Aggregation function:  </dt>
          <dd>
            <t>The function computed over the users' inputs.</t>
          </dd>
          <dt>
Aggregator:  </dt>
          <dd>
            <t>An endpoint that runs the input-validation protocol and accumulates input
 shares.</t>
          </dd>
          <dt>
Batch:  </dt>
          <dd>
            <t>A set of reports that are aggregated into an output.</t>
          </dd>
          <dt>
Batch duration:  </dt>
          <dd>
            <t>The time difference between the oldest and newest report in a batch.</t>
          </dd>
          <dt>
Batch interval:  </dt>
          <dd>
            <t>A parameter of the collect or aggregate-share request that specifies the time
 range of the reports in the batch.</t>
          </dd>
          <dt>
Client:  </dt>
          <dd>
            <t>The endpoint from which a user sends data to be aggregated, e.g., a web
 browser.</t>
          </dd>
          <dt>
Collector:  </dt>
          <dd>
            <t>The endpoint that receives the output of the aggregation function.</t>
          </dd>
          <dt>
Input:  </dt>
          <dd>
            <t>The measurement (or measurements) emitted by a client, before any encryption
 or secret sharing scheme is applied.</t>
          </dd>
          <dt>
Input share:  </dt>
          <dd>
            <t>An aggregator's share of the output of the VDAF
 <xref target="I-D.draft-cfrg-patton-vdaf" format="default"/> sharding algorithm. This algorithm is run by
 each client in order to cryptographically protect its measurement.</t>
          </dd>
          <dt>
Measurement:  </dt>
          <dd>
            <t>A single value (e.g., a count) being reported by a client. Multiple
 measurements may be grouped into a single protocol input.</t>
          </dd>
          <dt>
Minimum batch duration:  </dt>
          <dd>
            <t>The minimum batch duration permitted for a PPM task, i.e., the minimum time
 difference between the oldest and newest report in a batch.</t>
          </dd>
          <dt>
Minimum batch size:  </dt>
          <dd>
            <t>The minimum number of reports in a batch.</t>
          </dd>
          <dt>
Leader:  </dt>
          <dd>
            <t>A distinguished aggregator that coordinates input validation and data
 collection.</t>
          </dd>
          <dt>
Aggregate result:  </dt>
          <dd>
            <t>The output of the aggregation function over a given set of reports.</t>
          </dd>
          <dt>
Aggregate share:  </dt>
          <dd>
            <t>A share of the aggregate result emitted by an aggregator. Aggregate shares are
 reassembled by the collector into the final output.</t>
          </dd>
          <dt>
Output share:  </dt>
          <dd>
            <t>An aggregator's share of the output of the VDAF
 <xref target="I-D.draft-cfrg-patton-vdaf" format="default"/> preparation step. Many output shares are
 combined into an aggregate share via the VDAF aggregation algorithm.</t>
          </dd>
          <dt>
Proof:  </dt>
          <dd>
            <t>A value generated by the client and used by the aggregators to verify the
client's input.</t>
          </dd>
          <dt>
Report:  </dt>
          <dd>
            <t>Uploaded to the leader from the client. A report contains the secret-shared
 and encrypted input and proof.</t>
          </dd>
          <dt>
Server:  </dt>
          <dd>
            <t>An aggregator.</t>
          </dd>
        </dl>
        <t>This document uses the presentation language of <xref target="RFC8446" format="default"/>.</t>
      </section>
    </section>
    <section anchor="overview" numbered="true" toc="default">
      <name>Overview</name>
      <t>The protocol is executed by a large set of clients and a small set of servers.
We call the servers the <em>aggregators</em>. Each client's input to the protocol is a
set of measurements (e.g., counts of some user behavior). Given the input set of
measurements <tt>x_1, ..., x_n</tt> held by <tt>n</tt> users, the goal of a <em>privacy
preserving measurement (PPM) protocol</em> is to compute <tt>y = F(p, x_1, ..., x_n)</tt>
for some function <tt>F</tt> while revealing nothing else about the measurements.</t>
      <t>This protocol is extensible and allows for the addition of new cryptographic
schemes that implement the VDAF interface specified in
<xref target="I-D.draft-cfrg-patton-vdaf" format="default"/>. Candidates include:</t>
      <ul spacing="normal">
        <li>
          <tt>prio3</tt>, which allows for aggregate statistics such as sum, mean, histograms,
etc. This class of VDAFs is based on Prio <xref target="CGB17" format="default"/> and includes improvements
described in <xref target="BBCGGI19" format="default"/>.</li>
        <li>
          <tt>poplar1</tt>, which allows for finding the most popular strings among a
collection of clients (e.g., the URL of their home page) as well as counting
the number of clients that hold a given string. This VDAF is the basis of the
Poplar protocol of <xref target="BBCGGI21" format="default"/>, which is designed to solve the heavy hitters
problem in a privacy preserving manner.</li>
      </ul>
      <t>This protocol is designed to work with schemes that use secret sharing. Rather
than send its input in the clear, each client shards its measurements into a
sequence of <em>input shares</em> and sends an input share to each of the aggregators.
This provides two important properties:</t>
      <ul spacing="normal">
        <li>It's impossible to deduce the measurement without knowing <em>all</em> of the shares.</li>
        <li>It allows the aggregators to compute the final output by first aggregating up
their measurements shares locally, then combining the results to obtain the
final output.</li>
      </ul>
      <section anchor="system-architecture" numbered="true" toc="default">
        <name>System Architecture</name>
        <t>{#system-architecture}</t>
        <t>The overall system architecture is shown in <xref target="pa-topology" format="default"/>.</t>
        <figure anchor="pa-topology">
          <name>System Architecture</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
                    +------------+
                    |            |
+--------+          |   Helper   |
|        |          |            |
| Client +----+     +-----^------+
|        |    |           |
+--------+    |           |
              |           |
+--------+    |     +-----v------+         +-----------+
|        |    +----->            |         |           |
| Client +---------->   Leader   <---------> Collector |
|        |    +----->            |         |           |
+--------+    |     +-----^------+         +-----------+
              |           |
+--------+    |           |
|        |    |           |
| Client +----+     +-----V------+
|        |          |            |
+--------+          |   Helper   |
                    |            |
                    +------------+
]]></artwork>
        </figure>
        <t>[[OPEN ISSUE: This shows two helpers, but the document only allows one for now.
https://github.com/abetterinternet/ppm-specification/issues/117]]</t>
        <t>The main participants in the protocol are as follows:</t>
        <dl>
          <dt>
Collector:  </dt>
          <dd>
            <t>The entity which wants to take the measurement and ultimately receives the
 results. Any given measurement will have a single collector.</t>
          </dd>
          <dt>
Client(s):  </dt>
          <dd>
            <t>The endpoints which directly take the measurement(s) and report them to the
 PPM system. In order to provide reasonable levels of privacy, there must be
 a large number of clients.</t>
          </dd>
          <dt>
Aggregator:  </dt>
          <dd>
            <t>An endpoint which receives report shares. Each aggregator works with the other
 aggregators to compute the final aggregate. This protocol defines two types
 of aggregators: Leaders and Helpers. For each measurement, there is a single
 leader and helper.</t>
          </dd>
          <dt>
Leader:  </dt>
          <dd>
            <t>The leader is responsible for coordinating the protocol. It receives the
 encrypted shares, distributes them to the helpers, and orchestrates the
 process of computing the final measurement as requested by the collector.</t>
          </dd>
          <dt>
Helper:  </dt>
          <dd>
            <t>Helpers are responsible for executing the protocol as instructed by the
 leader. The protocol is designed so that helpers can be relatively
 lightweight, with most of the state held at the leader.</t>
          </dd>
        </dl>
        <t>The basic unit of PPM is the "task" which represents a single measurement
(though potentially taken over multiple time windows). The definition of a task
includes the following parameters:</t>
        <ul spacing="normal">
          <li>The type of each measurement.</li>
          <li>The aggregation function to compute (e.g., sum, mean, etc.) and an optional
aggregation parameter.</li>
          <li>The set of aggregators and necessary cryptographic keying material to use.</li>
          <li>The VDAF to execute, which to some extent is dictated by the previous
choices.</li>
          <li>The minimum "batch size" of reports which can be aggregated.</li>
          <li>The rate at which measurements can be taken, i.e., the "minimum batch window".</li>
        </ul>
        <t>These parameters are distributed out of band to the clients and to the
aggregators. Each task is identified by a unique 32-byte ID which is used to
refer to it in protocol messages.</t>
        <t>During the duration of the measurement, each client records its own value(s),
packages them up into a report, and sends them to the leader. Each share is
separately encrypted for each aggregator so that even though they pass through
the leader, the leader is unable to see or modify them. Depending on the
measurement, the client may only send one report or may send many reports over
time.</t>
        <t>The leader distributes the shares to the helpers and orchestrates the process of
verifying them (see <xref target="validating-inputs" format="default"/>) and assembling them into a final
measurement for the collector. Depending on the VDAF, it may be possible to
incrementally process each report as it comes in, or may be necessary to wait
until the entire batch of reports is received.</t>
      </section>
      <section anchor="validating-inputs" numbered="true" toc="default">
        <name>Validating Inputs</name>
        <t>An essential task of any data collection pipeline is ensuring that the data
being aggregated is "valid". In PPM, input validation is complicated by the fact
that none of the entities other than the client ever sees the values for
individual clients.</t>
        <t>In order to address this problem, the aggregators engage in a secure,
multi-party computation specified by the chosen VDAF
<xref target="I-D.draft-cfrg-patton-vdaf" format="default"/> in order to prepare a report for aggregation. At
the beginning of this computation, each aggregator is in possession of an input
share uploaded by the client. At the end of the computation, each aggregator is
in posession of either an "output share" that is ready to be aggregated or an
indication that a valid output share could not be computed.</t>
        <t>To facilitiate this computation, the input shares generated by the client
include information used by the aggregators during aggregation in order to
validate their corresponding output shares. For example, <tt>prio3</tt> includes a
distributed zero-knowledge proof of the input's validity <xref target="BBCGGI19" format="default"/> which the
aggregators can jointly verify and reject the report if it cannot be verified.
However, they do not learn anything about the individual report other than that
it is valid.</t>
        <t>The specific properties attested to in the proof vary depending on the
measurement being taken. For instance, if we want to measure the time the user
took performing a given task the proof might demonstrate that the value reported
was within a certain range (e.g., 0-60 seconds). By contrast, if we wanted to
report which of a set of N options the user select, the report might contain N
integers and the proof would demonstrate that N-1 were 0 and the other was 1.</t>
        <t>It is important to recognize that "validity" is distinct from "correctness". For
instance, the user might have spent 30s on a task but the client might report
60s. This is a problem with any measurement system and PPM does not attempt to
address it; it merely ensures that the data is within acceptable limits, so the
client could not report 10^6s or -20s.</t>
      </section>
    </section>
    <section anchor="message-transport" numbered="true" toc="default">
      <name>Message Transport</name>
      <t>Communications between PPM entities are carried over HTTPS <xref target="RFC2818" format="default"/>. HTTPS
provides server authentication and confidentiality. In addition, report shares
are encrypted directly to the aggregators using HPKE <xref target="I-D.irtf-cfrg-hpke" format="default"/>.</t>
      <section anchor="errors" numbered="true" toc="default">
        <name>Errors</name>
        <t>Errors can be reported in PPM both at the HTTP layer and within challenge
objects as defined in <xref target="iana-considerations" format="default"/>. PPM servers can return responses
with an HTTP error response code (4XX or 5XX). For example, if the client
submits a request using a method not allowed in this document, then the server
<bcp14>MAY</bcp14> return status code 405 (Method Not Allowed).</t>
        <t>When the server responds with an error status, it <bcp14>SHOULD</bcp14> provide additional
information using a problem document <xref target="RFC7807" format="default"/>. To facilitate automatic
response to errors, this document defines the following standard tokens for use
in the "type" field (within the PPM URN namespace "urn:ietf:params:ppm:error:"):</t>
        <table align="center">
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">unrecognizedMessage</td>
              <td align="left">The message type for a response was incorrect or the payload was malformed.</td>
            </tr>
            <tr>
              <td align="left">unrecognizedTask</td>
              <td align="left">An endpoint received a message with an unknown task ID.</td>
            </tr>
            <tr>
              <td align="left">outdatedConfig</td>
              <td align="left">The message was generated using an outdated configuration.</td>
            </tr>
          </tbody>
        </table>
        <t>This list is not exhaustive. The server <bcp14>MAY</bcp14> return errors set to a URI other
than those defined above. Servers <bcp14>MUST NOT</bcp14> use the PPM URN namespace for errors
not listed in the appropriate IANA registry (see <xref target="ppm-urn-space" format="default"/>). Clients
<bcp14>SHOULD</bcp14> display the "detail" field of all errors. The "instance" value <bcp14>MUST</bcp14> be
the endpoint to which the request was targeted. The problem document <bcp14>MUST</bcp14> also
include a "taskid" member which contains the associated PPM task ID (this value
is always known, see <xref target="task-configuration" format="default"/>).</t>
        <t>In the remainder of this document, we use the tokens in the table above to refer
to error types, rather than the full URNs. For example, an "error of type
'unrecognizedMessage'" refers to an error document with "type" value
"urn:ietf:params:ppm:error:unrecognizedMessage".</t>
        <t>This document uses the verbs "abort" and "alert with <tt>[some error message]</tt>" to
describe how protocol participants react to various error conditions.</t>
      </section>
    </section>
    <section anchor="protocol-definition" numbered="true" toc="default">
      <name>Protocol Definition</name>
      <t>PPM has three major interactions which need to be defined:</t>
      <ul spacing="normal">
        <li>Uploading reports from the client to the aggregators</li>
        <li>Computing the results of a given measurement</li>
        <li>Reporting results to the collector</li>
      </ul>
      <t>We start with some basic type definitions used in other messages.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
/* ASCII encoded URL. e.g., "https://example.com" */
opaque Url<1..2^16-1>;

Duration uint64; /* Number of seconds elapsed between two instants */

Time uint64; /* seconds elapsed since start of UNIX epoch */

/* An interval of time of length duration, where start is included and (start +
duration) is excluded. */
struct {
  Time start;
  Duration duration;
} Interval;

/* A nonce used to uniquely identify a report in the context of a PPM task. It
includes the time at which the report was generated and a random, 64-bit
integer. */
struct {
  Time time;
  uint64 rand;
} Nonce;
]]></artwork>
      <section anchor="task-configuration" numbered="true" toc="default">
        <name>Task Configuration</name>
        <t>Prior to the start of execution of the protocol, each participant must agree on
the configuration for each task. A task is uniquely identified by its task ID:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
opaque TaskId[32];
]]></artwork>
        <t>A <tt>TaskId</tt> is a globally unique sequence of bytes. It is <bcp14>RECOMMENDED</bcp14> that this
be set to a random string output by a cryptographically secure pseudorandom
number generator. Each task has the following parameters associated with it:</t>
        <ul spacing="normal">
          <li>
            <tt>aggregator_endpoints</tt>: A list of URLs relative to which an aggregator's API
endpoints can be found. Each endpoint's list <bcp14>MUST</bcp14> be in the same order. The
leader's endpoint <bcp14>MUST</bcp14> be the first in the list. The order of the
<tt>encrypted_input_shares</tt> in a <tt>Report</tt> (see <xref target="uploading-reports" format="default"/>) <bcp14>MUST</bcp14> be the
same as the order in which aggregators appear in this list.</li>
          <li>
            <tt>collector_config</tt>: The HPKE configuration of the collector (described in
<xref target="key-config" format="default"/>). Having participants agree on this absolves collectors of the
burden of operating an HTTP server. See
<eref target="https://github.com/abetterinternet/prio-documents/issues/102">#102</eref> for
discussion.</li>
          <li>
            <tt>max_batch_lifetime</tt>: The maximum number of times a batch of reports may be
used in collect requests.</li>
          <li>
            <tt>min_batch_size</tt>: The minimum number of reports that appear in a batch.</li>
          <li>
            <tt>min_batch_duration</tt>: The minimum time difference between the oldest and
newest report in a batch. This defines the boundaries with which the batch
interval of each collect request must be aligned. (See
<xref target="batch-parameter-validation" format="default"/>.)</li>
          <li>
            <tt>protocol</tt>: named parameter identifying the VDAF scheme in use.</li>
        </ul>
      </section>
      <section anchor="uploading-reports" numbered="true" toc="default">
        <name>Uploading Reports</name>
        <t>Clients periodically upload reports to the leader, which then distributes the
individual shares to each helper.</t>
        <section anchor="key-config" numbered="true" toc="default">
          <name>Key Configuration Request</name>
          <t>Before the client can upload its report to the leader, it must know the public
key of each of the aggregators. These are retrieved from each aggregator by
sending a request to <tt>[aggregator]/key_config</tt>, where <tt>[aggregator]</tt> is the
aggregator's endpoint URL, obtained from the task parameters. The aggregator
responds to well-formed requests with status 200 and an <tt>HpkeConfig</tt> value:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  HpkeConfigId id;
  HpkeKemId kem_id;
  HpkeKdfId kdf_id;
  HpkeAeadKdfId aead_id;
  HpkePublicKey public_key;
} HpkeConfig;

uint8 HpkeConfigId;
opaque HpkePublicKey<1..2^16-1>;
uint16 HpkeAeadId; // Defined in I-D.irtf-cfrg-hpke
uint16 HpkeKemId;  // Defined in I-D.irtf-cfrg-hpke
uint16 HpkeKdfId;  // Defined in I-D.irtf-cfrg-hpke
]]></artwork>
          <t>[OPEN ISSUE: Decide whether to expand the width of the id, or support multiple
cipher suites (a la OHTTP/ECH).]</t>
          <t>The client <bcp14>MUST</bcp14> abort if any of the following happen for any <tt>key_config</tt>
request:</t>
          <ul spacing="normal">
            <li>the client and aggregator failed to establish a secure,
aggregator-authenticated channel;</li>
            <li>the GET request failed or didn't return a valid key config; or</li>
            <li>the key config specifies a KEM, KDF, or AEAD algorithm the client doesn't
recognize.</li>
          </ul>
          <t>Aggregators <bcp14>SHOULD</bcp14> use HTTP caching to permit client-side caching of this
resource <xref target="RFC5861" format="default"/>. Aggregators <bcp14>SHOULD</bcp14> favor long cache lifetimes to avoid
frequent cache revalidation, e.g., on the order of days. Aggregators can control
this cached lifetime with the Cache-Control header, as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
  Cache-Control: max-age=86400
]]></artwork>
          <t>Clients <bcp14>SHOULD</bcp14> follow the usual HTTP caching <xref target="RFC7234" format="default"/> semantics for key
configurations.</t>
          <t>Note: Long cache lifetimes may result in clients using stale HPKE keys;
aggregators <bcp14>SHOULD</bcp14> continue to accept reports with old keys for at least twice
the cache lifetime in order to avoid rejecting reports.</t>
        </section>
        <section anchor="upload-request" numbered="true" toc="default">
          <name>Upload Request</name>
          <t>Clients upload reports by using an HTTP POST to <tt>[leader]/upload</tt>, where
<tt>[leader]</tt> is the first entry in the task's aggregator endpoints. The payload is
structured as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  TaskID task_id;
  Nonce nonce;
  Extension extensions<4..2^16-1>;
  EncryptedInputShare encrypted_input_shares<1..2^16-1>;
} Report;
]]></artwork>
          <t>This message is called the client's <em>report</em>. It contains the following fields:</t>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt> is the task ID of the task for which the report is intended.</li>
            <li>
              <tt>nonce</tt> is the report nonce generated by the client. This field is used by the
aggregators to ensure the report appears in at most one batch. (See
<xref target="anti-replay" format="default"/>.)</li>
            <li>
              <tt>extensions</tt> is a list of extensions to be included in the Upload flow; see
<xref target="upload-extensions" format="default"/>.</li>
            <li>
              <tt>encrypted_input_shares</tt> contains the encrypted input shares of each of the
aggregators. The order in which the encrypted input shares appear <bcp14>MUST</bcp14> match
the order of the task's <tt>aggregator_endpoints</tt> (i.e., the first share should
be the leader's, the second share should be for the first helper, and so on).</li>
          </ul>
          <t>Encrypted input shares are structured as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  HpkeConfigId aggregator_config_id;
  opaque enc<1..2^16-1>;
  opaque payload<1..2^16-1>;
} EncryptedInputShare;
]]></artwork>
          <ul spacing="normal">
            <li>
              <tt>aggregator_config_id</tt> is equal to <tt>HpkeConfig.id</tt>, where <tt>HpkeConfig</tt> is the
key config of the aggregator receiving the input share.</li>
            <li>
              <tt>enc</tt> is the HPKE encapsulated key, used by the aggregator to decrypt its
input share.</li>
            <li>
              <tt>payload</tt> is the encrypted input share.</li>
          </ul>
          <t>To generate the report, the client begins by sharding its measurement into a
sequence of input shares as specified by the VDAF in use. To encrypt an input
share, the client first generates an HPKE <xref target="I-D.irtf-cfrg-hpke" format="default"/> context for
the aggregator by running</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
enc, context = SetupBaseS(pk,
                          "pda input share" || task_id || server_role)
]]></artwork>
          <t>where <tt>pk</tt> is the aggregator's public key, <tt>task_id</tt> is <tt>Report.task_id</tt> and
<tt>server_role</tt> is a byte whose value is <tt>0x01</tt> if the aggregator is the leader
and <tt>0x00</tt> if the aggregator is the helper. <tt>enc</tt> is the HPKE encapsulated key
and <tt>context</tt> is the HPKE context used by the client for encryption.  The
payload is encrypted as</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
payload = context.Seal(nonce || extensions, input_share)
]]></artwork>
          <t>where <tt>input_share</tt> is the aggregator's input share and <tt>nonce</tt> and <tt>extensions</tt>
are the corresponding fields of <tt>Report</tt>.</t>
          <t>The leader responds to well-formed requests to <tt>[leader]/upload</tt> with status 200
and an empty body. Malformed requests are handled as described in <xref target="errors" format="default"/>.
Clients <bcp14>SHOULD NOT</bcp14> upload the same measurement value in more than one report if
the leader responds with status 200 and an empty body.</t>
          <t>The leader responds to requests with out-of-date <tt>HpkeConfig.id</tt> values,
indicated by <tt>EncryptedInputShare.config_id</tt>, with status 400 and an error of
type 'outdatedConfig'. Clients <bcp14>SHOULD</bcp14> invalidate any cached aggregator
<tt>HpkeConfig</tt> and retry with a freshly generated Report. If this retried report
does not succeed, clients <bcp14>MUST</bcp14> abort and discontinue retrying.</t>
          <t>The leader <bcp14>MUST</bcp14> ignore any report whose nonce contains a timestamp that falls in
a batch interval for which it has received at least one collect request from the
collector. (See <xref target="pa-collect" format="default"/>.) Otherwise, comparing the aggregate result to
the previous aggregate result may result in a privacy violation. (Note that the
helpers enforce this as well; see <xref target="aggregate-request" format="default"/>.) In addition, the
leader <bcp14>SHOULD</bcp14> abort the upload protocol and alert the client with error
"staleReport".</t>
        </section>
        <section anchor="upload-extensions" numbered="true" toc="default">
          <name>Upload Extensions</name>
          <t>Each UploadReq carries a list of extensions that clients may use to convey
additional, authenticated information in the report. [OPEN ISSUE: The extensions
aren't authenticated. It's probably a good idea to be a bit more clear about how
we envision extensions being used. Right now this includes client attestation
for defeating Sybil attacks. See issue#89.] Each extension is a tag-length
encoded value of the following form:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
  struct {
      ExtensionType extension_type;
      opaque extension_data<0..2^16-1>;
  } Extension;

  enum {
      TBD(0),
      (65535)
  } ExtensionType;
]]></artwork>
          <t>"extension_type" indicates the type of extension, and "extension_data" contains
information specific to the extension.</t>
        </section>
      </section>
      <section anchor="pa-aggregate" numbered="true" toc="default">
        <name>Verifying and Aggregating Reports</name>
        <t>Once a set of clients have uploaded their reports to the leader, the leader can
send them to the helpers to be verified and aggregated. In order to enable the
system to handle very large batches of reports, this process can be performed
incrementally. To aggregate a set of reports, the leader sends an AggregateReq
to each helper containing those report shares. The helper then processes them
(verifying the proofs and incorporating their values into the ongoing aggregate)
and replies to the leader.</t>
        <t>The exact structure of the aggregation flow depends on the VDAF.  Specifically:</t>
        <ul spacing="normal">
          <li>Some VDAFs (e.g., <tt>prio3</tt>) allow the leader to start aggregating reports
proactively before all the reports in a batch are received. Others (e.g.,
<tt>poplar1</tt>) require all the reports to be present and must be initiated by the
collector.</li>
          <li>Processing the reports -- especially validating them -- may require multiple
round trips.</li>
        </ul>
        <t>Note that it is possible to aggregate reports from one batch while reports from
the next batch are coming in. This is because each report is validated
independently.</t>
        <t>This process is illustrated below in <xref target="pa-aggregate-flow" format="default"/>. In this example, the
batch size is 20, but the leader opts to process the reports in sub-batches of
10. Each sub-batch takes two round-trips to process. Once both sub-batches have
been processed, the leader can issue an AggregateShareReq in order to retrieve
the helper's aggregated result.</t>
        <t>In order to allow the helpers to retain minimal state, the helper can attach a
state parameter to its response, with the leader returning the state value in
the next request, thus offloading the state to the leader. This state value <bcp14>MUST</bcp14>
be cryptographically protected as described in <xref target="helper-state" format="default"/>.</t>
        <figure anchor="pa-aggregate-flow">
          <name>Aggregation Process (batch size=20)</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Leader                                                 Helper

AggregateReq (Reports 1-10) -------------------------------->  \
<------------------------------------ AggregateResp (State 1)  | Reports
AggregateReq (continued, State 1)      --------------------->  | 10-11
<------------------------------------ AggregateResp (State 2)  /


AggregateReq (Reports 11-20, State 2) ---------------------->  \
<------------------------------------ AggregateResp (State 3)  | Reports
AggregateReq (continued, State 3) -------------------------->  | 20-21
<------------------------------------ AggregateResp (State 4) /

AggregateShareReq (State 4) -------------------------------->
<-------------------------------- AggregateShareResp (Result)
]]></artwork>
        </figure>
        <t>[OPEN ISSUE: Should there be an indication of whether a given AggregateReq is a
continuation of a previous sub-batch?]</t>
        <t>[TODO: Decide if and how the collector's request is authenticated.]</t>
        <section anchor="aggregate-request" numbered="true" toc="default">
          <name>Aggregate Request</name>
          <t>The AggregateReq request is used by the leader to send a set of reports to the
helper. These reports <bcp14>MUST</bcp14> all be associated with the same PPM task and batch.</t>
          <t>For each aggregator endpoint <tt>[aggregator]</tt> in <tt>AggregateReq.task_id</tt>'s
parameters except its own, the leader sends a POST request to
<tt>[aggregator]/aggregate</tt> with the following message:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  TaskID task_id;
  opaque agg_param<0..2^16-1>;  // VDAF aggregation parameter
  opaque helper_state<0..2^16>; // helper's opaque state
  AggregateSubReq seq<1..2^24-1>;
} AggregateReq;
]]></artwork>
          <t>The structure contains the PPM task, an opaque, VDAF-specific aggregation
parameter, an opaque <em>helper state</em> string, and a sequence of <em>sub-requests</em>,
each corresponding to a unique client report. Sub-requests are structured as
follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  Nonce nonce;                     // Equal to Report.nonce.
  Extension extensions<4..2^16-1>; // Equal to Report.extensions.
  EncryptedInputShare helper_share;
  opaque message<0..2^16-1>; // VDAF message
} AggregateSubReq;
]]></artwork>
          <t>The <tt>nonce</tt> and <tt>extensions</tt> fields have the same value as those in the
report uploaded by the client. Similarly, the <tt>helper_share</tt> field is the
<tt>EncryptedInputShare</tt> from the <tt>Report</tt> whose index in
<tt>Report.encrypted_input_shares</tt> is equal to the index of <tt>[aggregator]</tt> in the
task's aggregator endpoints. [OPEN ISSUE: We usually only need to send this in
the first aggregate request. Shall we exclude it in subsequent requests
somehow?] The remainder of the structure is dedicated to VDAF-specific request
parameters.</t>
          <t>In order to provide replay protection, the leader preprocesses the set of
reports it sends in the the AggregateReq as described in <xref target="anti-replay" format="default"/>. Any
reports filtered out by this procedure <bcp14>MUST</bcp14> be ignored.</t>
          <t>The helper handles well-formed requests as follows. (As usual, malformed
requests are handled as described in <xref target="errors" format="default"/>.) It first looks for PPM
parameters corresponding to <tt>AggregateReq.task_id</tt>. It then preprocesses the
sub-requests as described in <xref target="anti-replay" format="default"/>. Any sub-requests filtered out by
this procedure <bcp14>MUST</bcp14> be ignored.</t>
          <t>In addition, for any report whose nonce contains a timestamp that falls in a
batch interval for which it has completed at least one aggregate-share request
(see <xref target="aggregate-share-request" format="default"/>), the helper <bcp14>MUST</bcp14> send an error messsage in
response rather than its next VDAF message. Note that this means leaders cannot
interleave a sequence of aggregate and aggregate-share requests for a single
batch.</t>
          <t>The response is an HTTP 200 OK with a body consisting of the helper's updated
state and a sequence of <em>sub-responses</em>. Each sub-response encodes the nonce and
a VDAF-specific <tt>message</tt>:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  opaque helper_state<0..2^16>;
  AggregateSubResp seq<1..2^24-1>;
} AggregateResp;

struct {
  Nonce nonce;
  opaque message<0..2^16-1>; // VDAF message
} AggregateSubResp;
]]></artwork>
          <t>The helper handles each sub-request <tt>AggregateSubReq</tt> as follows. It first looks
up the HPKE config and corresponding secret key associated with
<tt>helper_share.config_id</tt>. If not found, then the sub-response consists of an
"unrecognized config" alert. [TODO: We'll want to be more precise about what
this means. See issue#57.] Next, it attempts to decrypt the payload with the
following procedure:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
context = SetupBaseR(helper_share.enc, sk,
                     "pda input share" || task_id || server_role)
input_share = context.Open(nonce || extensions, helper_share)
]]></artwork>
          <t>where <tt>sk</tt> is the HPKE secret key, <tt>task_id</tt> is <tt>AggregateReq.task_id</tt> and
<tt>server_role</tt> is the role of the server (<tt>0x01</tt> for the leader and <tt>0x00</tt> for
the helper). <tt>nonce</tt> and <tt>extensions</tt> are obtained from the
corresponding fields in <tt>AggregateSubReq</tt>. If decryption fails, then the
sub-response consists of a "decryption error" alert. [See issue#57.] Otherwise,
the helper handles the request for its plaintext input share <tt>input_share</tt> and
updates its state as specified by the PPM protocol.</t>
          <t>After processing all of the sub-requests, the helper encrypts its updated state
and constructs its response to the aggregate request.</t>
          <section anchor="leader-state" numbered="true" toc="default">
            <name>Leader State</name>
            <t>The leader is required to buffer reports while waiting to aggregate them. The
leader <bcp14>SHOULD NOT</bcp14> accept reports whose timestamps are too far in the future.
Implementors <bcp14>MAY</bcp14> provide for some small leeway, usually no more than a few
minutes, to account for clock skew.</t>
          </section>
          <section anchor="helper-state" numbered="true" toc="default">
            <name>Helper State</name>
            <t>The helper state is an optional parameter of an aggregate request that the
helper can use to carry state across requests. At least part of the state will
usually need to be encrypted in order to protect user privacy. However, the
details of precisely how the state is encrypted and the information that it
carries is up to the helper implementation.</t>
          </section>
        </section>
        <section anchor="aggregate-share-request" numbered="true" toc="default">
          <name>Aggregate Share Request</name>
          <t>Once the aggregators have verified at least as many reports as required for the
PPM task, the leader issues an "aggregate-share request" to each helper. The
helper responds to this request by extracting its aggregate share from its state
and encrypting it under the collector's HPKE public key.</t>
          <t>[OPEN ISSUE: consider updating the <tt>checksum</tt> algorithm to not permit
collisions]</t>
          <t>First, the leader computes a checksum over the set of output shares included in
the batch window. The checksum is computed by taking the SHA256 hash of each
nonce from the client reports included in the aggregation, then combining the
hash values with a bitwise-XOR operation.</t>
          <t>Then, for each aggregator endpoint <tt>[aggregator]</tt> in the parameters associated
with <tt>CollectReq.task_id</tt> (see <xref target="pa-collect" format="default"/>) except its own, the leader sends
a POST request to <tt>[aggregator]/aggregate_share</tt> with the following message:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  TaskID task_id;
  Interval batch_interval;
  uint64 report_count;
  opaque checksum[32];
  opaque helper_state<0..2^16>;
} AggregateShareReq;
]]></artwork>
          <ul spacing="normal">
            <li>
              <tt>task_id</tt> is the task ID associated with the PPM parameters.</li>
            <li>
              <tt>batch_interval</tt> is the batch interval of the request.</li>
            <li>
              <tt>report_count</tt> is the number of reports included in the aggregation.</li>
            <li>
              <tt>checksum</tt> is the checksum computed over the set of client reports, computed
as described above.</li>
            <li>
              <tt>helper_state</tt> is the helper's state, which is carried across requests from
the leader.</li>
          </ul>
          <t>To respond to an AggregateShareReq message, the helper first looks up the PPM
parameters associated with task <tt>task_id</tt>. Then, using the procedure in
<xref target="batch-parameter-validation" format="default"/>, it ensures that the request meets the
requirements of the batch parameters. It also computes a checksum based on its
view of the output shares included in the batch window, and checks that the
<tt>report_count</tt> and <tt>checksum</tt> included in the request match its computed
values. If so, it aggregates all valid output shares that fall in the batch
interval into an aggregate share. The response contains an opaque,
VDAF-specific message:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  opaque message<0..2^16-1>; // VDAF message
} AggregateShare;
]]></artwork>
          <t>Next, the helper encrypts the aggregate share <tt>agg_share</tt> under the collector's
public key as follows:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
enc, context = SetupBaseS(pk,
                       "pda aggregate share" || task_id || server_role)
encrypted_agg_share = context.Seal(batch_interval, agg_share)
]]></artwork>
          <t>where <tt>pk</tt> is the HPKE public key encoded by the collector's HPKE key
configuration, <tt>task_id</tt> is <tt>AggregateShareReq.task_id</tt> and <tt>server_role</tt> is the
role of the server (<tt>0x01</tt> for the leader and <tt>0x00</tt> for the helper).
<tt>agg_share</tt> is the serialized <tt>AggregateShare</tt>, and <tt>batch_interval</tt> is obtained
from the <tt>AggregateShareReq</tt>.</t>
          <t>This encryption prevents the leader from learning the actual result, as it only
has its own share and not the helper's share, which is encrypted for the
collector. The helper responds to the collector with HTTP status 200 OK and a
body consisting of the following structure:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  HpkeConfigId collector_hpke_config_id;
  opaque enc<1..2^16-1>;
  opaque payload<1..2^16>;
} EncryptedAggregateShare;
]]></artwork>
          <ul spacing="normal">
            <li>
              <tt>collector_hpke_config_id</tt> is <tt>collector_config.id</tt> from the task parameters
corresponding to <tt>CollectReq.task_id</tt>.</li>
            <li>
              <tt>enc</tt> is the HPKE encapsulated key, used by the collector to decrypt the
aggregate share.</li>
            <li>
              <tt>payload</tt> is an encrypted <tt>AggregateShare</tt>.</li>
          </ul>
          <t>The leader uses the helper's aggregate share response to respond to the
collector's collect request (see <xref target="pa-collect" format="default"/>).</t>
        </section>
      </section>
      <section anchor="pa-collect" numbered="true" toc="default">
        <name>Collecting Results</name>
        <t>The collector uses CollectReq to ask the leader to collect and return the
results for a given PPM task over a given time period. To make a collect
request, the collector issues a POST request to <tt>[leader]/collect</tt>, where
<tt>[leader]</tt> is the leader's endpoint URL. The body of the request is structured
as follows:</t>
        <t>[OPEN ISSUE: Decide if and how the collector's request is authenticated. If not,
then we need to ensure that collect job URIs are resistant to enumeration
attacks.]
~~~
struct {
  TaskID task_id;
  Interval batch_interval;
  opaque agg_param&lt;0..2^16-1&gt;; // VDAF aggregation parameter
} CollectReq;
~~~</t>
        <t>The named parameters are:</t>
        <ul spacing="normal">
          <li>
            <tt>task_id</tt>, the PPM task ID.</li>
          <li>
            <tt>batch_interval</tt>, the request's batch interval.</li>
          <li>
            <tt>agg_param</tt>, an aggregation parameter for the VDAF being executed.</li>
        </ul>
        <t>Depending on the VDAF scheme and how the leader is configured, the leader and
helper may already have prepared all the reports falling within <tt>batch_interval</tt>
and be ready to return the aggregate shares right away, but this cannot be
guaranteed. In fact, for some VDAFs, it is not be possible to begin preparing
inputs until the collector provides the aggregation parameter in the
<tt>CollectReq</tt>. For these reasons, collect requests are handled asynchronously.</t>
        <t>Upon receipt of a <tt>CollectReq</tt>, the leader begins by checking that the request
meets the requirements of the batch parameters using the procedure in
<xref target="batch-parameter-validation" format="default"/>. If so, it immediately sends the collector a
response with HTTP status 303 See Other and a Location header containing a URI
identifying the collect job that can be polled by the collector, called the
"collect job URI".</t>
        <t>The leader then begins working with the helper to prepare the shares falling
into <tt>CollectReq.batch_interval</tt> (or continues this process, depending on the
VDAF) as described in <xref target="pa-aggregate" format="default"/>.</t>
        <t>After receiving the response to its CollectReq, the collector makes an HTTP GET
request to the collect job URI to check on the status of the collect job and
eventually obtain the result. If the collect job is not finished yet, the leader
responds with HTTP status 202 Accepted. The response <bcp14>MAY</bcp14> include a Retry-After
header field to suggest a pulling interval to the collector.</t>
        <t>Once all the necessary reports have been prepared, the leader obtains the
helper's encrypted aggregate share for the batch interval by sending an
<tt>AggregateShareReq</tt> to the helper as described in <xref target="aggregate-share-request" format="default"/>.
The leader then computes its own aggregate share by aggregating all of the
prepared output shares that fall within the batch interval.</t>
        <t>When both aggregators' shares are successfully obtained, the leader responds to
subsequent HTTP GET requests to the collect job's URI with HTTP status 200 OK
and a body consisting of a <tt>CollectResult</tt>:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
struct {
  EncryptedAggregateShare shares<1..2^16-1>;
} CollectResult;
]]></artwork>
        <ul spacing="normal">
          <li>
            <tt>shares</tt> is a vector of <tt>EncryptedAggregateShare</tt>s, as described in
<xref target="aggregate-share-request" format="default"/>, except that for the leader's share, the <tt>task_id</tt>
and <tt>batch_interval</tt> used to encrypt the <tt>AggregateShare</tt> are obtained from
the <tt>CollectReq</tt>.</li>
        </ul>
        <t>If obtaining aggregate shares fails, then the leader responds to subsequent HTTP
GET requests to the collect job URI with an HTTP error status and a problem
document as described in <xref target="errors" format="default"/>.</t>
        <t>The leader <bcp14>MUST</bcp14> retain a collect job's results until the collector sends an HTTP
DELETE request to the collect job URI, in which case the leader responds with
HTTP status 204 No Content.</t>
        <t>[OPEN ISSUE: Allow the leader to drop aggregate shares after some reasonable
amount of time has passed, but it's not clear how to specify that. ACME doesn't
bother to say anything at all about this when describing how subscribers should
fetch certificates: https://datatracker.ietf.org/doc/html/rfc8555#section-7.4.2]</t>
        <t>[OPEN ISSUE: Describe how intra-protocol errors yield collect errors (see
issue#57). For example, how does a leader respond to a collect request if the
helper drops out?]</t>
        <section anchor="batch-parameter-validation" numbered="true" toc="default">
          <name>Validating Batch Parameters</name>
          <t>Before an aggregator responds to a collect request or aggregate-share request,
it must first check that the request does not violate the parameters associated
with the PPM task. It does so as described here.</t>
          <t>First the aggregator checks that the request's batch interval respects the
boundaries defined by the PPM task's parameters. Namely, it checks that both
<tt>batch_interval.start</tt> and <tt>batch_interval.duration</tt> are divisible by
<tt>min_batch_duration</tt> and that <tt>batch_interval.duration &gt;= min_batch_duration</tt>.
Unless both these conditions are true, it aborts and alerts the peer with
"invalid batch interval".</t>
          <t>Next, the aggregator checks that the request respects the generic privacy
parameters of the PPM task. Let <tt>X</tt> denote the set of reports for which the
aggregator has recovered a valid output share and which fall in the batch
interval of the request.</t>
          <ul spacing="normal">
            <li>If <tt>len(X) &lt; min_batch_size</tt>, then the aggregator aborts and alerts the peer
with "insufficient batch size".</li>
            <li>The aggregator keeps track of the number of times each report was added to the
batch of an AggregateShareReq. If any report in <tt>X</tt> was added to at least
<tt>max_batch_lifetime</tt> previous batches, then the helper aborts and alerts the
peer with "request exceeds the batch's privacy budget".</li>
          </ul>
        </section>
        <section anchor="anti-replay" numbered="true" toc="default">
          <name>Anti-replay</name>
          <t>Using a client-provided report multiple times within a single batch, or using
the same report in multiple batches, may allow a server to learn information
about the client's measurement, violating the privacy goal of PPM. To
prevent such replay attacks, this specification requires the aggregators to
detect and filter out replayed reports.</t>
          <t>To detect replay attacks, each aggregator keeps track of the set of nonces
pertaining to reports that were previously aggregated for a given task. If the
leader receives a report from a client whose nonce is in this set, it simply
ignores it. A helper who receives an encrypted input share whose nonce is
in this set replies to the leader with an error as described in
<xref target="aggregate-request" format="default"/>.</t>
          <t>[OPEN ISSUE: This has the potential to require aggreagtors to store nonce sests
indefinitely. See issue#180.]</t>
          <t>A malicious aggregator may attempt to force a replay by replacing the nonce
generated by the client with a nonce its peer has not yet seen. To prevent this,
clients incorporate the nonce into the AAD for HPKE encryption, ensuring that
the output share is only recovered if the aggregator is given the correct nonce.
(See <xref target="upload-request" format="default"/>.)</t>
          <t>Aggregators prevent the same report from being used in multiple batches (except
as required by the protocol) by only responding to valid collect requests, as
described in <xref target="batch-parameter-validation" format="default"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="operational-capabilities" numbered="true" toc="default">
      <name>Operational Considerations</name>
      <t>PPM protocols have inherent constraints derived from the tradeoff between
privacy guarantees and computational complexity. These tradeoffs influence how
applications may choose to utilize services implementing the specification.</t>
      <section anchor="entity-capabilities" numbered="true" toc="default">
        <name>Protocol participant capabilities</name>
        <t>The design in this document has different assumptions and requirements for
different protocol participants, including clients, aggregators, and collectors.
This section describes these capabilities in more detail.</t>
        <section anchor="client-capabilities" numbered="true" toc="default">
          <name>Client capabilities</name>
          <t>Clients have limited capabilities and requirements. Their only inputs to the
protocol are (1) the parameters configured out of band and (2) a measurement.
Clients are not expected to store any state across any upload flows, nor are
they required to implement any sort of report upload retry mechanism. By
design, the protocol in this document is robust against individual client upload
failures since the protocol output is an aggregate over all inputs.</t>
        </section>
        <section anchor="aggregator-capabilities" numbered="true" toc="default">
          <name>Aggregator capabilities</name>
          <t>Helpers and leaders have different operational requirements. The design in this
document assumes an operationally competent leader, i.e., one that has no
storage or computation limitations or constraints, but only a modestly
provisioned helper, i.e., one that has computation, bandwidth, and storage
constraints. By design, leaders must be at least as capable as helpers, where
helpers are generally required to:</t>
          <ul spacing="normal">
            <li>Support the collect protocol, which includes validating and aggregating
reports; and</li>
            <li>Publish and manage an HPKE configuration that can be used for the upload
protocol.</li>
          </ul>
          <t>In addition, for each PPM task, helpers are required to:</t>
          <ul spacing="normal">
            <li>Implement some form of batch-to-report index, as well as inter- and
intra-batch replay mitigation storage, which includes some way of tracking
batch report size with optional support for state offloading. Some of this
state may be used for replay attack mitigation. The replay mitigation strategy
is described in <xref target="anti-replay" format="default"/>.</li>
          </ul>
          <t>Beyond the minimal capabilities required of helpers, leaders are generally
required to:</t>
          <ul spacing="normal">
            <li>Support the upload protocol and store reports; and</li>
            <li>Track batch report size during each collect flow and request encrypted output
shares from helpers.</li>
          </ul>
          <t>In addition, for each PPM task, leaders are required to:</t>
          <ul spacing="normal">
            <li>Implement and store state for the form of inter- and intra-batch replay
mitigation in <xref target="anti-replay" format="default"/>; and</li>
            <li>Store helper state.</li>
          </ul>
        </section>
        <section anchor="collector-capabilities" numbered="true" toc="default">
          <name>Collector capabilities</name>
          <t>Collectors statefully interact with aggregators to produce an aggregate output.
Their input to the protocol is the task parameters, configured out of band,
which include the corresponding batch window and size. For each collect
invocation, collectors are required to keep state from the start of the protocol
to the end as needed to produce the final aggregate output.</t>
          <t>Collectors must also maintain state for the lifetime of each task, which
includes key material associated with the HPKE key configuration.</t>
        </section>
      </section>
      <section anchor="data-resolution-limitations" numbered="true" toc="default">
        <name>Data resolution limitations</name>
        <t>Privacy comes at the cost of computational complexity. While affine-aggregatable
encodings (AFEs) can compute many useful statistics, they require more bandwidth
and CPU cycles to account for finite-field arithmetic during input-validation.
The increased work from verifying inputs decreases the throughput of the system
or the inputs processed per unit time. Throughput is related to the verification
circuit's complexity and the available compute-time to each aggregator.</t>
        <t>Applications that utilize proofs with a large number of multiplication gates or
a high frequency of inputs may need to limit inputs into the system to meet
bandwidth or compute constraints. Some methods of overcoming these limitations
include choosing a better representation for the data or introducing sampling
into the data collection methodology.</t>
        <t>[[TODO: Discuss explicit key performance indicators, here or elsewhere.]]</t>
      </section>
      <section anchor="aggregation-utility-and-soft-batch-deadlines" numbered="true" toc="default">
        <name>Aggregation utility and soft batch deadlines</name>
        <t>A soft real-time system should produce a response within a deadline to be
useful. This constraint may be relevant when the value of an aggregate decreases
over time. A missed deadline can reduce an aggregate's utility but not
necessarily cause failure in the system.</t>
        <t>An example of a soft real-time constraint is the expectation that input data can
be verified and aggregated in a period equal to data collection, given some
computational budget. Meeting these deadlines will require efficient
implementations of the input-validation protocol. Applications might batch
requests or utilize more efficient serialization to improve throughput.</t>
        <t>Some applications may be constrained by the time that it takes to reach a
privacy threshold defined by a minimum number of reports. One possible solution
is to increase the reporting period so more samples can be collected, balanced
against the urgency of responding to a soft deadline.</t>
      </section>
      <section anchor="protocol-specific-optimizations" numbered="true" toc="default">
        <name>Protocol-specific optimizations</name>
        <t>Not all PPM tasks have the same operational requirements, so the protocol is
designed to allow implementations to reduce operational costs in certain cases.</t>
        <section anchor="reducing-storage-requirements" numbered="true" toc="default">
          <name>Reducing storage requirements</name>
          <t>In general, the aggregators are required to keep state for all valid reports for
as long as collect requests can be made for them. In particular, the aggregators
must store a batch as long as the batch has not been queried more than
<tt>max_batch_lifetime</tt> times. However, it is not always necessary to store the
reports themselves. For schemes like Prio in which the input-validation protocol
is only run once per report, each aggregator only needs to store its
aggregate share for each possible batch interval, along with the number of times
the aggregate share was used in a batch. (The helper may store its aggregate
shares in its encrypted state, thereby offloading this state to the leader.)
This is due to the requirement that the batch interval respect the boundaries
defined by the PPM parameters. (See <xref target="batch-parameter-validation" format="default"/>.)</t>
        </section>
      </section>
    </section>
    <section anchor="sec-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>Prio assumes a powerful adversary with the ability to compromise an unbounded
number of clients. In doing so, the adversary can provide malicious (yet
truthful) inputs to the aggregation function. Prio also assumes that all but one
server operates honestly, where a dishonest server does not execute the protocol
faithfully as specified. The system also assumes that servers communicate over
secure and mutually authenticated channels. In practice, this can be done by TLS
or some other form of application-layer authentication.</t>
      <t>In the presence of this adversary, Prio provides two important properties for
computing an aggregation function F:</t>
      <ol spacing="normal" type="1"><li>Privacy. The aggregators and collector learn only the output of F computed
over all client inputs, and nothing else.</li>
        <li>Robustness. As long as the aggregators execute the input-validation protocol
correctly, a malicious client can skew the output of F only by reporting
false (untruthful) input. The output cannot be influenced in any other way.</li>
      </ol>
      <t>There are several additional constraints that a Prio deployment must satisfy in
order to achieve these goals:</t>
      <ol spacing="normal" type="1"><li>Minimum batch size. The aggregation batch size has an obvious impact on
privacy. (A batch size of one hides nothing of the input.)</li>
        <li>Aggregation function choice. Some aggregation functions leak slightly more
than the function output itself.</li>
      </ol>
      <t>[TODO: discuss these in more detail.]</t>
      <section anchor="threat-model" numbered="true" toc="default">
        <name>Threat model</name>
        <t>In this section, we enumerate the actors participating in the Prio system and
enumerate their assets (secrets that are either inherently valuable or which
confer some capability that enables further attack on the system), the
capabilities that a malicious or compromised actor has, and potential
mitigations for attacks enabled by those capabilities.</t>
        <t>This model assumes that all participants have previously agreed upon and
exchanged all shared parameters over some unspecified secure channel.</t>
        <section anchor="clientuser" numbered="true" toc="default">
          <name>Client/user</name>
          <section anchor="assets" numbered="true" toc="default">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>Unshared inputs. Clients are the only actor that can ever see the original
inputs.</li>
              <li>Unencrypted input shares.</li>
            </ol>
          </section>
          <section anchor="capabilities" numbered="true" toc="default">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Individual users can reveal their own input and compromise their own privacy.</li>
              <li>Clients (that is, software which might be used by many users of the system)
can defeat privacy by leaking input outside of the Prio system.</li>
              <li>
                <t>Clients may affect the quality of aggregations by reporting false input.
                </t>
                <ul spacing="normal">
                  <li>Prio can only prove that submitted input is valid, not that it is true.
False input can be mitigated orthogonally to the Prio protocol (e.g., by
requiring that aggregations include a minimum number of contributions)
and so these attacks are considered to be outside of the threat model.</li>
                </ul>
              </li>
              <li>Clients can send invalid encodings of input.</li>
            </ol>
          </section>
          <section anchor="mitigations" numbered="true" toc="default">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>The input validation protocol executed by the aggregators prevents either
individual clients or coalitions of clients from compromising the robustness
property.</li>
              <li>If aggregator output satisifes differential privacy <xref target="dp" format="default"/>, then all records
not leaked by malicious clients are still protected.</li>
            </ol>
          </section>
        </section>
        <section anchor="aggregator" numbered="true" toc="default">
          <name>Aggregator</name>
          <section anchor="assets-1" numbered="true" toc="default">
            <name>Assets</name>
            <ol spacing="normal" type="1"><li>Unencrypted input shares.</li>
              <li>Input share decryption keys.</li>
              <li>Client identifying information.</li>
              <li>Aggregate shares.</li>
              <li>Aggregator identity.</li>
            </ol>
          </section>
          <section anchor="capabilities-1" numbered="true" toc="default">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Aggregators may defeat the robustness of the system by emitting bogus output
shares.</li>
              <li>
                <t>If clients reveal identifying information to aggregators (such as a trusted
identity during client authentication), aggregators can learn which clients are
contributing input.
                </t>
                <ol spacing="normal" type="1"><li>Aggregators may reveal that a particular client contributed input.</li>
                  <li>
                    <t>Aggregators may attack robustness by selectively omitting inputs from
certain clients.
                    </t>
                    <ul spacing="normal">
                      <li>For example, omitting submissions from a particular geographic
region to falsely suggest that a particular localization is not
being used.</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>Individual aggregators may compromise availability of the system by refusing
to emit aggregate shares.</li>
              <li>Input validity proof forging. Any aggregator can collude with a malicious
client to craft a proof that will fool honest aggregators into accepting
invalid input.</li>
              <li>Aggregators can count the total number of input shares, which could
compromise user privacy (and differential privacy <xref target="dp" format="default"/>) if the presence or
absence of a share for a given user is sensitive.</li>
            </ol>
          </section>
          <section anchor="mitigations-1" numbered="true" toc="default">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>The linear secret sharing scheme employed by the client ensures that privacy
is preserved as long as at least one aggregator does not reveal its input
shares.</li>
              <li>If computed over a sufficient number of reports, aggregate shares reveal
nothing about either the inputs or the participating clients.</li>
              <li>Clients can ensure that aggregate counts are non-sensitive by generating
input independently of user behavior. For example, a client should
periodically upload a report even if the event that the task is tracking has
not occurred, so that the absence of reports cannot be distinguished from
their presence.</li>
              <li>
                <t>Bogus inputs can be generated that encode "null" shares that do not affect
the aggregate output, but mask the total number of true inputs.
                </t>
                <ul spacing="normal">
                  <li>Either leaders or clients can generate these inputs to mask the total
number from non-leader aggregators or all the aggregators, respectively.</li>
                  <li>In either case, care must be taken to ensure that bogus inputs are
indistinguishable from true inputs (metadata, etc), especially when
constructing timestamps on reports.</li>
                </ul>
              </li>
            </ol>
            <t>[OPEN ISSUE: Define what "null" shares are. They should be defined such that
inserting null shares into an aggregation is effectively a no-op. See issue#98.]</t>
          </section>
        </section>
        <section anchor="leader" numbered="true" toc="default">
          <name>Leader</name>
          <t>The leader is also an aggregator, and so all the assets, capabilities and
mitigations available to aggregators also apply to the leader.</t>
          <section anchor="capabilities-2" numbered="true" toc="default">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Input validity proof verification. The leader can forge proofs and collude
with a malicious client to trick aggregators into aggregating invalid inputs.
                </t>
                <ul spacing="normal">
                  <li>This capability is no stronger than any aggregator's ability to forge
validity proof in collusion with a malicious client.</li>
                </ul>
              </li>
              <li>
                <t>Relaying messages between aggregators. The leader can compromise availability
by dropping messages.
                </t>
                <ul spacing="normal">
                  <li>This capability is no stronger than any aggregator's ability to refuse to
emit aggregate shares.</li>
                </ul>
              </li>
              <li>Shrinking the anonymity set. The leader instructs aggregators to construct
output parts and so could request aggregations over few inputs.</li>
            </ol>
          </section>
          <section anchor="mitigations-2" numbered="true" toc="default">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>Aggregators enforce agreed upon minimum aggregation thresholds to prevent
deanonymizing.</li>
              <li>If aggregator output satisfies differential privacy <xref target="dp" format="default"/>, then genuine
records are protected regardless of the size of the anonymity set.</li>
            </ol>
          </section>
        </section>
        <section anchor="collector" numbered="true" toc="default">
          <name>Collector</name>
          <section anchor="capabilities-3" numbered="true" toc="default">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>Advertising shared configuration parameters (e.g., minimum thresholds for
aggregations, joint randomness, arithmetic circuits).</li>
              <li>Collectors may trivially defeat availability by discarding aggregate shares
submitted by aggregators.</li>
              <li>Known input injection. Collectors may collude with clients to send known
input to the aggregators, allowing collectors to shrink the effective
anonymity set by subtracting the known inputs from the final output. Sybil
attacks <xref target="Dou02" format="default"/> could be used to amplify this capability.</li>
            </ol>
          </section>
          <section anchor="mitigations-3" numbered="true" toc="default">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>Aggregators should refuse shared parameters that are trivially insecure
(i.e., aggregation threshold of 1 contribution).</li>
              <li>If aggregator output satisfies differential privacy <xref target="dp" format="default"/>, then genuine
records are protected regardless of the size of the anonymity set.</li>
            </ol>
          </section>
        </section>
        <section anchor="aggregator-collusion" numbered="true" toc="default">
          <name>Aggregator collusion</name>
          <t>If all aggregators collude (e.g. by promiscuously sharing unencrypted input
shares), then none of the properties of the system hold. Accordingly, such
scenarios are outside of the threat model.</t>
        </section>
        <section anchor="attacker-on-the-network" numbered="true" toc="default">
          <name>Attacker on the network</name>
          <t>We assume the existence of attackers on the network links between participants.</t>
          <section anchor="capabilities-4" numbered="true" toc="default">
            <name>Capabilities</name>
            <ol spacing="normal" type="1"><li>
                <t>Observation of network traffic. Attackers may observe messages exchanged
between participants at the IP layer.
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>The time of transmission of input shares by clients could reveal
information about user activity.
                    </t>
                    <ul spacing="normal">
                      <li>For example, if a user opts into a new feature, and the client
immediately reports this to aggregators, then just by observing
network traffic, the attacker can infer what the user did.</li>
                    </ul>
                  </li>
                  <li>
                    <t>Observation of message size could allow the attacker to learn how much
input is being submitted by a client.
                    </t>
                    <ul spacing="normal">
                      <li>For example, if the attacker observes an encrypted message of some
size, they can infer the size of the plaintext, plus or minus the
cipher block size. From this they may be able to infer which
aggregations the user has opted into or out of.</li>
                    </ul>
                  </li>
                </ol>
              </li>
              <li>Tampering with network traffic. Attackers may drop messages or inject new
messages into communications between participants.</li>
            </ol>
          </section>
          <section anchor="mitigations-4" numbered="true" toc="default">
            <name>Mitigations</name>
            <ol spacing="normal" type="1"><li>All messages exchanged between participants in the system should be
encrypted.</li>
              <li>All messages exchanged between aggregators, the collector and the leader
should be mutually authenticated so that network attackers cannot impersonate
participants.</li>
              <li>Clients should be required to submit inputs at regular intervals so that the
timing of individual messages does not reveal anything.</li>
              <li>Clients should submit dummy inputs even for aggregations the user has not
opted into.</li>
            </ol>
            <t>[[OPEN ISSUE: The threat model for Prio --- as it's described in the original
paper and <xref target="BBCGGI19" format="default"/> --- considers <strong>either</strong> a malicious client (attacking
soundness) <strong>or</strong> a malicious subset of aggregators (attacking privacy). In
particular, soundness isn't guaranteed if any one of the aggregators is
malicious; in theory it may be possible for a malicious client and aggregator to
collude and break soundness. Is this a contingency we need to address? There are
techniques in <xref target="BBCGGI19" format="default"/> that account for this; we need to figure out if they're
practical.]]</t>
          </section>
        </section>
      </section>
      <section anchor="client-authentication-or-attestation" numbered="true" toc="default">
        <name>Client authentication or attestation</name>
        <t>[TODO: Solve issue#89]</t>
      </section>
      <section anchor="anon-proxy" numbered="true" toc="default">
        <name>Anonymizing proxies</name>
        <t>Client reports can contain auxiliary information such as source IP, HTTP user
agent or in deployments which use it, client authentication information, which
could be used by aggregators to identify participating clients or permit some
attacks on robustness. This auxiliary information could be removed by having
clients submit reports to an anonymizing proxy server which would then use
Oblivous HTTP <xref target="I-D.thomson-http-oblivious" format="default"/> to forward inputs to the PPM
leader, without requiring any server participating in PPM to be aware of
whatever client authentication or attestation scheme is in use.</t>
      </section>
      <section anchor="batch-parameters" numbered="true" toc="default">
        <name>Batch parameters</name>
        <t>An important parameter of a PPM deployment is the minimum batch size. If an
aggregation includes too few inputs, then the outputs can reveal information
about individual participants. Aggregators use the batch size field of the
shared task parameters to enforce minimum batch size during the collect
protocol, but server implementations may also opt out of participating in a PPM
task if the minimum batch size is too small. This document does not specify how
to choose minimum batch sizes.</t>
        <t>The PPM parameters also specify the maximum number of times a report can be
used. Some protocols, such as Poplar <xref target="BBCGGI21" format="default"/>, require reports to be used in
multiple batches spanning multiple collect requests.</t>
      </section>
      <section anchor="dp" numbered="true" toc="default">
        <name>Differential privacy</name>
        <t>Optionally, PPM deployments can choose to ensure their output F achieves
differential privacy <xref target="Vad16" format="default"/>. A simple approach would require the aggregators
to add two-sided noise (e.g. sampled from a two-sided geometric distribution) to
outputs. Since each aggregator is adding noise independently, privacy can be
guaranteed even if all but one of the aggregators is malicious. Differential
privacy is a strong privacy definition, and protects users in extreme
circumstances: Even if an adversary has prior knowledge of every input in a
batch except for one, that one record is still formally protected.</t>
        <t>[OPEN ISSUE: While parameters configuring the differential privacy noise (like
specific distributions / variance) can be agreed upon out of band by the
aggregators and collector, there may be benefits to adding explicit protocol
support by encoding them into task parameters.]</t>
      </section>
      <section anchor="robustness-in-the-presence-of-malicious-servers" numbered="true" toc="default">
        <name>Robustness in the presence of malicious servers</name>
        <t>Most PPM protocols, including Prio and Poplar, are robust against malicious
clients, but are not robust against malicious servers. Any aggregator can simply
emit bogus aggregate shares and undetectably spoil aggregates. If enough
aggregators were available, this could be mitigated by running the protocol
multiple times with distinct subsets of aggregators chosen so that no aggregator
appears in all subsets and checking all the outputs against each other. If all
the protocol runs do not agree, then participants know that at least one
aggregator is defective, and it may be possible to identify the defector (i.e.,
if a majority of runs agree, and a single aggregator appears in every run that
disagrees). See
<eref target="https://github.com/abetterinternet/ppm-specification/issues/22">#22</eref> for
discussion.</t>
      </section>
      <section anchor="infrastructure-diversity" numbered="true" toc="default">
        <name>Infrastructure diversity</name>
        <t>Prio deployments should ensure that aggregators do not have common dependencies
that would enable a single vendor to reassemble inputs. For example, if all
participating aggregators stored unencrypted input shares on the same cloud
object storage service, then that cloud vendor would be able to reassemble all
the input shares and defeat privacy.</t>
      </section>
      <section anchor="operational-requirements" numbered="true" toc="default">
        <name>System requirements</name>
        <section anchor="data-types" numbered="true" toc="default">
          <name>Data types</name>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="protocol-message-media-types" numbered="true" toc="default">
        <name>Protocol Message Media Types</name>
        <t>This specification defines the following protocol messages, along with their
corresponding media types types:</t>
        <ul spacing="normal">
          <li>HpkeConfig <xref target="task-configuration" format="default"/>: "application/ppm-hpke-config"</li>
          <li>Report <xref target="upload-request" format="default"/>: "message/ppm-report"</li>
          <li>AggregateReq <xref target="aggregate-request" format="default"/>: "message/ppm-aggregate-req"</li>
          <li>AggregateResp <xref target="aggregate-request" format="default"/>: "message/ppm-aggregate-resp"</li>
          <li>AggregateShareReq <xref target="aggregate-share-request" format="default"/>: "message/ppm-aggregate-share-req"</li>
          <li>AggregateShareResp <xref target="aggregate-share-request" format="default"/>: "message/ppm-aggregate-share-resp"</li>
          <li>CollectReq <xref target="pa-collect" format="default"/>: "message/ppm-collect-req"</li>
          <li>CollectResult <xref target="pa-collect" format="default"/>: "message/ppm-collect-result"</li>
        </ul>
        <t>The definition for each media type is in the following subsections.</t>
        <t>Protocol message format evolution is supported through the definition of new
formats that are identified by new media types.</t>
        <t>IANA [shall update / has updated] the "Media Types" registry at
https://www.iana.org/assignments/media-types with the registration information
in this section for all media types listed above.</t>
        <t>[OPEN ISSUE: Solicit review of these allocations from domain experts.]</t>
        <section anchor="applicationppm-hpke-config-media-type" numbered="true" toc="default">
          <name>"application/ppm-hpke-config" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-hpke-config</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="task-configuration" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-report-media-type" numbered="true" toc="default">
          <name>"message/ppm-report" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-report</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="upload-request" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-aggregate-req-media-type" numbered="true" toc="default">
          <name>"message/ppm-aggregate-req" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>message</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-aggregate-req</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="aggregate-request" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-aggregate-resp-media-type" numbered="true" toc="default">
          <name>"message/ppm-aggregate-resp" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-aggregate-resp</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="aggregate-request" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-aggregate-share-req-media-type" numbered="true" toc="default">
          <name>"message/ppm-aggregate-share-req" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-aggregate-share-req</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="aggregate-share-request" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-aggregate-share-resp-media-type" numbered="true" toc="default">
          <name>"message/ppm-aggregate-share-resp" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-aggregate-share-resp</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="aggregate-share-request" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-collect-req-media-type" numbered="true" toc="default">
          <name>"message/ppm-collect-req" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-collect-req</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="pa-collect" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
        <section anchor="messageppm-collect-req-media-type-1" numbered="true" toc="default">
          <name>"message/ppm-collect-req" media type</name>
          <dl>
            <dt>
Type name:  </dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>
Subtype name:  </dt>
            <dd>
              <t>ppm-collect-req</t>
            </dd>
            <dt>
Required parameters:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Optional parameters:  </dt>
            <dd>
              <t>None</t>
            </dd>
            <dt>
Encoding considerations:  </dt>
            <dd>
              <t>only "8bit" or "binary" is permitted</t>
            </dd>
            <dt>
Security considerations:  </dt>
            <dd>
              <t>see <xref target="pa-collect" format="default"/></t>
            </dd>
            <dt>
Interoperability considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Published specification:  </dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>
Applications that use this media type:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Fragment identifier considerations:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Additional information:  </dt>
            <dd>
              <dl>
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>
Person and email address to contact for further information:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Intended usage:  </dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>
Restrictions on usage:  </dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>
Author:  </dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>
Change controller:  </dt>
            <dd>
              <t>IESG</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="upload-extension-registry" numbered="true" toc="default">
        <name>Upload Extension Registry</name>
        <t>This document requests creation of a new registry for extensions to the Upload
protocol. This registry should contain the following columns:</t>
        <t>[TODO: define how we want to structure this registry when the time comes]</t>
      </section>
      <section anchor="ppm-urn-space" numbered="true" toc="default">
        <name>URN Sub-namespace for PPM (urn:ietf:params:ppm)</name>
        <t>The following value [will be/has been] registered in the "IETF URN
Sub-namespace for Registered Protocol Parameter Identifiers" registry,
following the template in <xref target="RFC3553" format="default"/>:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Registry name:  ppm

Specification:  [[THIS DOCUMENT]]

Repository:  http://www.iana.org/assignments/ppm

Index value:  No transformation needed.
]]></artwork>
        <t>Initial contents: The types and descriptions in the table in
<xref target="errors" format="default"/> above, with the Reference field set to point to this
specification.</t>
      </section>
    </section>
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>The text in <xref target="message-transport" format="default"/> is based extensively on <xref target="RFC8555" format="default"/></t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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="RFC2818">
          <front>
            <title>HTTP Over TLS</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla">
              <organization/>
            </author>
            <date month="May" year="2000"/>
            <abstract>
              <t>This memo describes how to use Transport Layer Security (TLS) to secure Hypertext Transfer Protocol (HTTP) connections over the Internet.  This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2818"/>
          <seriesInfo name="DOI" value="10.17487/RFC2818"/>
        </reference>
        <reference anchor="I-D.irtf-cfrg-hpke">
          <front>
            <title>Hybrid Public Key Encryption</title>
            <author fullname="Richard L. Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Karthik Bhargavan">
              <organization>Inria</organization>
            </author>
            <author fullname="Benjamin Lipp">
              <organization>Inria</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="2" month="September" year="2021"/>
            <abstract>
              <t>This document describes a scheme for hybrid public key encryption (HPKE). This scheme provides a variant of public key encryption of arbitrary-sized plaintexts for a recipient public key. It also includes three authenticated variants, including one that authenticates possession of a pre-shared key and two optional ones that authenticate possession of a key encapsulation mechanism (KEM) private key. HPKE works for any combination of an asymmetric KEM, key derivation function (KDF), and authenticated encryption with additional data (AEAD) encryption function. Some authenticated variants may not be supported by all KEMs. We provide instantiations of the scheme using widely used and efficient primitives, such as Elliptic Curve Diffie-Hellman (ECDH) key agreement, HMAC-based key derivation function (HKDF), and SHA2.

 This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-hpke-12"/>
        </reference>
        <reference anchor="RFC7807">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="E. Wilde" initials="E." surname="Wilde">
              <organization/>
            </author>
            <date month="March" year="2016"/>
            <abstract>
              <t>This document defines a "problem detail" as a way to carry machine- readable details of errors in a HTTP response to avoid the need to define new error response formats for HTTP APIs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7807"/>
          <seriesInfo name="DOI" value="10.17487/RFC7807"/>
        </reference>
        <reference anchor="RFC5861">
          <front>
            <title>HTTP Cache-Control Extensions for Stale Content</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document defines two independent HTTP Cache-Control extensions that allow control over the use of stale responses by caches.  This  document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5861"/>
          <seriesInfo name="DOI" value="10.17487/RFC5861"/>
        </reference>
        <reference anchor="RFC7234">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <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 defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7234"/>
          <seriesInfo name="DOI" value="10.17487/RFC7234"/>
        </reference>
        <reference anchor="I-D.thomson-http-oblivious">
          <front>
            <title>Oblivious HTTP</title>
            <author fullname="Martin Thomson">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Christopher A. Wood">
              <organization>Cloudflare</organization>
            </author>
            <date day="24" month="August" year="2021"/>
            <abstract>
              <t>   This document describes a system for the forwarding of encrypted HTTP
   messages.  This allows a client to make multiple requests of a server
   without the server being able to link those requests to the client or
   to identify the requests as having come from the same client.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-thomson-http-oblivious-02"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items.  The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources.  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="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="CGB17" target="https://crypto.stanford.edu/prio/paper.pdf">
          <front>
            <title>Prio: Private, Robust, and Scalable Computation of Aggregate Statistics</title>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <date year="2017" month="March" day="14"/>
          </front>
        </reference>
        <reference anchor="BBCGGI19" target="https://eprint.iacr.org/2019/188">
          <front>
            <title>Zero-Knowledge Proofs on Secret-Shared Data via Fully Linear PCPs</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="BBCGGI21" target="https://eprint.iacr.org/2021/017">
          <front>
            <title>Lightweight Techniques for Private Heavy Hitters</title>
            <author initials="D." surname="Boneh">
              <organization/>
            </author>
            <author initials="E." surname="Boyle">
              <organization/>
            </author>
            <author initials="H." surname="Corrigan-Gibbs">
              <organization/>
            </author>
            <author initials="N." surname="Gilboa">
              <organization/>
            </author>
            <author initials="Y." surname="Ishai">
              <organization/>
            </author>
            <date year="2021" month="January" day="05"/>
          </front>
        </reference>
        <reference anchor="Dou02" target="https://link.springer.com/chapter/10.1007/3-540-45748-8_24">
          <front>
            <title>The Sybil Attack</title>
            <author initials="J." surname="Douceur">
              <organization/>
            </author>
            <date year="2022" month="October" day="10"/>
          </front>
        </reference>
        <reference anchor="Vad16" target="https://privacytools.seas.harvard.edu/files/privacytools/files/complexityprivacy_1.pdf">
          <front>
            <title>The Complexity of Differential Privacy</title>
            <author initials="S." surname="Vadhan">
              <organization/>
            </author>
            <date year="2016" month="August" day="09"/>
          </front>
        </reference>
        <reference anchor="I-D.draft-cfrg-patton-vdaf">
          <front>
            <title>*** BROKEN REFERENCE ***</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes">
              <organization/>
            </author>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews">
              <organization/>
            </author>
            <author fullname="D. McCarney" initials="D." surname="McCarney">
              <organization/>
            </author>
            <author fullname="J. Kasten" initials="J." surname="Kasten">
              <organization/>
            </author>
            <date month="March" year="2019"/>
            <abstract>
              <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names.  Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate.  As of this writing, this verification is done through a collection of ad hoc mechanisms.  This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance.  The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAH14JmIAA+29+3Ybx7Un/H89RR/qD5EKAJGyfAnlOIeWZJufrcuIVJIz
Hh2xATTItgA0TndDFCLrPMv3LPNks3/7UpdGg7LjzFqZtayVFUsAurpq175f
h8Oha8t2Xhxne8/r8m0+2WTP66Ip6rfl8jJ7UuTNui4WxbLdc9NqsswX9Mtp
nc/a4eWquB6u6JnharUYHh65Sd4Wl1W9Oc6adurKVX2ctfW6ae8dHv7x8J7L
6yI/zs4eP3SuafPl9HU+r5a02qZo3Ko8zn5sq8kga6q6rYtZQ3/bLOQv9N5F
vlrRfl45l6/bq6o+dtnQZfKnXDbH2fko+7aoLq+Ky3xpX8hmz8vF9ldVTf8o
/563ZbU8zk7PXnxr3xSLvJzTxsvFJT30h7JoZ/9+ic9Gk2rhuq99OMqe521b
dd758Koum7ZaXRV15/v0xQ/n1Xo6mxNkOq+fYIEVP/mxLTweZS+KZlLV8zzd
xOO6nGx9lb7/SfX3ch6+1JcXb+p/r9vZYteJT0bZX6tquvvInR/80jPn1/9+
VeS453HZNqNl0TrnyuWsqhf07NvimDaTPfz266PPj/nRCG+r44yxty0G2Ytq
TEg3yAjFsrNJPs/H8yJ7WC1W65a3kFWz7OTysiZ8aIvsDB82bTlp9njRKX14
nN07PPp8ePjJ8Oi+vCmvL4uWXnXVtqvm+O7dSb1ZtdUIeEzbm46K6foukUJ1
d5Wvinq0ms5kNY+t/GcoIPxuRNup65KgMvy2HI+b9OtHo+xrIowrnPbrrx9+
++3p0R/TA//Poq6G3y+r63kxvSzo5FU1azI62VkxqYt2eHZF0J1mj/I2z96W
efbNej7fZD+UyyInfHz4vHPUe0dEvcPDT/uPWtC5lu2ozCf1iG7yLoHmj3eP
vvjihgP6EySfPsanm3nxq4DxlOi6nI+rPP34P0bZaXOVlwFG945SGP1QXl61
1wX+PzsvJlfL8r/WRZPRbRmmZN8V+dtN9l3ZtkX9G0Fy7+guYcy/DEgeVevD
eyk8zq8I1zfjcp6dtG0+edM5773h0SH9r/+883L5ZtTg0JeE3MQV7k6u8hVB
7e7R4ejo8PDzu58MP71/OLz/6ef3vxh+8fre/Rsg8f+NsL1Jsa6x07/k06PP
tncKcp0X78p2A2p9VM5mRU0yqMznmUqpDrV+Njz8Ynj4x/79r+SRtqrmzagh
kTYiAnmbK93OynnRJL/RjyZ+E/rl66OPUPbZCAe6IjnjhsNhlo+bts4nxMbo
THWREVVmi3y5yZqyXTMvaui57PqqnFxlZZuVTTYtmrJmjtVWdJA39EAQwQ2A
QUfOnTyyKiraYDahdcop8d2moL+AUxIqLLP2isQ4cdWmIBlK/8gAQAIorQrR
Tp+4aG28fN2sc3CKZUX/XNL9Fk1LfIS2KG+6je1Oy7fllH6X0bcrejMR1Xjd
ujpvwfrpt7nx1invFci8fIt3V0t6alEQ3KYNPf1f67LG5ufzYtJiR2FtF9YG
F6eVw7K69wXOtMY6K6grS/48p89Iy2gBvDXpMJlenMMqhEAEJPxM7mBNEEyA
OyU0KyfrecsvLRcr3F1JEmSUnV/hbqrJGr90dEmTuhxjd9mCfl8OV3lNkNW3
ZaugQMUQ3n/+/MkBfVmRolPN9donhCzjArudYtcKjgBEhmF2XRLU1i2d4W2R
z/modIToMnBauh4GuCDfopxOibO4W4QLbV1N1xPcAFAxOkoWH8XvDEzy5rMA
IoXzD9CKxbtissadjze01BwkSPjYAmMn85LhC6jmWbMgHLOvsDQxX1lO/3E7
u6xyXpPhAblNS1WLIgJKY1I7q+gRxm59y22CCj3ROAPZnITeUpFGv2P8aYr5
26LRq6X/LfJpka2qpilBfXSKKb2AQLMGZjl+Q6RD5ItKl9RdA/MZpeiyciKy
qxwqSJPN8Tv6b847aejUy4JOjgUXBjTeUAD/Ff2kaeebARGi7JgB/JYpnCih
XOqBIc4B7uVGYUdXf+tW9uj07OEPJ6dPHr/o3naJa76u6jdM03VF4GwIBH8t
sqv8bcF0v6GLocshVjyFRoEXgSddLnXTEZbUpPjxYlWtkOA7nREBEpo02XXB
XGTJiN2sVytS7WWHgSMIVjwqZuWy5H8zr8zeFBvsk/jE3pOXZ+d7A/lv9vQZ
//3F4//x8vTF40f4+9l3Jz/84P/i9Bdn3z17+cOj8Lfw5MNnT548fvpIHqZP
s+Qjt/fk5D/2RHnce/b8/PTZ05Mf9gTkMSTByulUYzliTVQC3M8bzxuYbX79
8Pn//v+P7mfv3//bi28e3js6+uOHD/qPL44+v0//uCbWJm+rlsR55Z8ETGJZ
qxXuFwyV6GVCenGbzxvGqeaqul5mECkEzjs/AjKvjrMvx5PV0f2v9AMcOPnQ
YJZ8yDDb/mTrYQFiz0c9r/HQTD7vQDrd78l/JP82uEcfClrMiDtW10zMRb1o
+BbAOckyMI0exDlbL5nZHbvjjB/Tfxs3mQauAb7pecYoLAPRfpydLEloTlcV
3TFTdFavl01gJMO3xIun8k5PFszlJoQm63kO0uZfQk1ooJXjHV/n7eSKlzeS
ISFGtNHIO3CoSIbSuytaNCNeRgvZ49l0XefxGclgLViCQVGaEAMrSPsthICr
OWGlSLVlcY2/ygsZubIx1vPrMjrTuWR/JNeIyOkT7FJ4oMgnInm/xyGfjCU6
1uZDNKtiUs5KZW3YHEBQ56RB2lJ2aGVnto2HzMftWB78s7paqMjMRbaT0J+K
xFNKDEAbZMXocjQAsyvGePG4rq4b5o8P5QByv8kb5IKLSUEKlGxbQG77zXsw
jBY8xf3aYom4JxjF+sUBGbqwNVREirwa0MZJ3BYsz+niYFeW4i6ocETYc4w5
QPpmQkKjYC6+WtHjU3u94JZibO5R+HYjX9gJ0vP85dHJN3jP+/d/Ph0+GolT
ZzKrL4fieBi+neYzYlFYYsoqx/yyqkmqLlRo+n9jR0QZdC6sV+RQa/h0uFvi
4qA1EuVsM1/W+eoKStV8wzQDZCJrP1EunIv8TkootAESy4SY6yLbt9udVOtl
e0AgxPYEn1LwjrIn0M9WYmIl2t6CpDQhzWVdrVeezOw9QbNZCtE9Ifm0WC8E
S7eIb9H7LWnNtd44NKo8I/2PtO/mzSArR8VIlHJ71EjkN5Fwusum/HvR3eFy
vRgLNUfkFxb4oSAtSFgf6z8EjXXZXEG0eawSQplUFbAisLgsYobYJtspdCBT
8JlYgt+FWCHdjG3v45QmLDvPLok6lx2+mSwcSCFF/rzz6oQaY6oZZZ3FWM4w
+yL8aYrFeC5PRfywqgWB8BGpMqS+enb9TI72f5NCSfsAo2YwkcW2IqwHO6mi
N/szkAgcl8tIruTpYdlhZC9PbiKQv3PschIgC0leFsuiztsIMMIAgAls2+jH
4eis3tOdljP+hvYmj9xuPNG94OvFa16u5hVhJmuSWGbOeCpCIbyNbs7Igmzi
Ni9VWAsbFTHFXknsSpktQwJgwmcrHItefMba9NZt0Tfvj8f1B9fVq9eN1+HZ
FhWAzUnarXMReKr03b//2YcP0IGzZ29hVRXX2ftblf71gyg5/zyryv0V9j99
Htsp+Pud6BrujLLHgWMb9A3Q8WZyp+snfFSZMbNidlCwqcYSelyQWVFW9QE8
Vm+Vk8nyspJLVrp49/pokI1GtNq718sLUnDnfPAL+jvracIx2Tqk9+TZHTPv
f5HBfadjUl5ssj9l3+yv8LbovQcXDtyaT+GZz8U3F1A+5kVkgZO1dIX/FvOG
8HoMW7NNVQAwJkaU9EpbuGlgZPLVQaMVvyTTx3RampOaGH0qNJ0oAKonlvBO
8Tk9ubLyNstJdpj+Bex2H+Efo+wh7QS8m3n5ZL6ewtd+J7uAS/uTi4HpXWGr
PZZ4o+Yv/rsYAAxkyVwhJkC7XzQDoruinajqMJkTJ8UZsW02v8d5IxYnvPlE
LuznJ97GrhjZU8M+GaIWhi2tl9ha79+bs5wpDLuvVkQxR337n8F1ogb8oiJp
Sr8lfZ2uvYWm1ah9DwEW5FdMdYr1eP7lix+UYZc12e6ENisi+gNA4rog4qP/
MnHAjZDxE0EI23J8oVck5IOE440ouORyG9WTm7LRF9J6z/mQAcOY15hL/MMH
O7u6Fi+XwkObak72Ppa7Yif4lTjBaT1aiFBzIWpBnxMoXy5Zkd5C7Hh9dgvA
A5MlKEtU3NFpR9kLdhw6+n7JKj1rg+r1iBwdg0SvZJ206SqOjQo14lNkikCF
ImjcKYOG3NxhfBLLIV9m0VfYNb+hoy5U4KN21rclsLC9roCJJGZy2gp9THpe
S6YO08wps9CFdyTRsiS31pOiyxy8T+/NUkzaO4Sfd+z13ljEioa5PQLUmFlX
8QDfnJV10yZ+0/VKMLBMLRNTEeYV6+UDcbiKpmBUIkoTv7MaQ7Qq/nW0nVu3
srMN6SCL7KSeEFYR5dBb3PtbDX86zKNPVd5B/LHwkufiXwCtxNnBBL7Kh221
qubV5YZp/L/pjwURkz9/GEZ//tD7k5+Tfzj/xB/Sn3xXzOl2+Sc/9zzaWeXn
TKxX2cAfor38p+0lXeXn5PF0E+l3u3ff/5x89rZ7qBgy3c3Id1/1vyd9Y3rQ
oX9Q7Af6y5fRx97k3gLir3jj7jP+Z/R5zxl/LeDCEeNHbjp+fM9/6Qft9st/
Gc5lPX86q/T9pIP/TCfvj7NbEQFJuO1Pez3UukeE+eOPz54/fpqdnp29fHws
QgiEKMzvijdI6thYdR6vCLMTU7kVHN2QtcTeRs5CcZfE9NZjjiHmZN+2CMjQ
/y2L9i6ySFRtmbACfbdsmnXR3D06+vzVK/UALsB5EG0pJ+UqXwb3UfC/wZnS
qKsQPLnH48NxMBGM17yIBdu6PJrNlznZ5qTq0Mli75AYhMwUye4gc0vkdsrh
ia2xZ907Fry96D1d+81B1xXV6N6mJb2wnW9690bPZRLWYoOH4wmitGNncDUI
Q+VYoHfCqBBjU7ZacqBxThrtnDUKFffM/xGqXJP4GPNyZntsaS43ukzlFB5o
ulMVbWJ1RG4F6AyNKA1sCrNagHd/TOJ5ZVS1JY8KU4QVVGC3m1XBgXRYDmHF
Y2VZYkcJ5dHevqH9sDYQAdzAwkEUuU6sp6YoHhe6SNwo58FYhZNMwpqsGIA0
vBPFpKxtfQSp38W2YLEKCAchRCU/MgQIBMqBBSLtAoHoNixF75kUooELPG0D
AtGEBBrz7PZ4PeisAjOcVaGXiTM4PakYst1jYnEy0tt6PQmrB6ByWLBfx2wq
1Zn1nRPS5sZ47ZxThebsiZyHHJCBIBbr+qZitbBf2MjM28irMDIj/1y17Um2
Xpb8GKhK1fA9OPL2PIqr4R9QI4ah24emd3lFVkYrWQxK0+rVWqiPUpz4pAxO
iXMdyOmnPjQmNi9e67xB1CZBEe+tF1WUwwKE9niwi8wj/b7X1RZRmdo5kUkH
I044D4ISKwnruyxZyW/EXqOOg5iUxZUJLMzrTWrnIvwntgbkA+GjhPNtMbaG
oK6Lc8RMHDZrCH5sYEsyRTlpY58UXdLbslqDDUyuqnICBftO4h7dC57TvdhJ
6mP1aZzBHgdtAYnkZ4lqrc/wbcd+373UZyyXvsd2FdI2wlUyOQVCn0LXxtbG
+dK7w2JfkMqA2H4RVgvMAVSI/RMOsm+AvUprTo3KPrk3HG/oGKePgsmoWQmu
LmYiPspWI8dCkQvc3iXbKY/WtVG3938roSU8NLbiiMFVZsZByWdXIsm1gVvl
kzdYWLjaemXuebmPQWTFxWzPuAYfV6y6siFjkJ2jkN+Bg86MwUcCyHhKIa4q
pliEYukyGryoxicuvGgQuyIBraUl7jRFgfDNopqqd5Ok8KNiVYjTQcLqrita
DCoITLAexdYwtCgVnFgx1485hcWwE0zEgXcI+tiWOtLBrLxURvSKiEg+OHHR
WtZNto+zvX9vzv7l5VBipx8+KFMQD7n/vV4cy5Uk38g8XkGWbIGIKX0ApNNg
TWRVgwfKShZK4g3znSq8IFzgCV6wW2tg8KN1At+BryIvWwf/zNxnSdUajkzi
JI0JZITdYOj+xcMgO5W8kve3tuFCChKpRE2j6WtMhWCFdH8cu4z8S6tyVRDk
WMUolo1RlEonDqhIqCsODzfZHr90jxU9klCD7XgMPG5IZoNiHdjhDKlpvPxS
klL8+eHNEAUsY79MhJ2WhiJ4whTLLjUXJSMF3TBWPfPpFOkmkkihbqbBlk+j
WF7CZc7up4b4e10MXJxjFSfhBCen6SVXFcFZ4iYfC5qUiVYMHlF4BpP4OBG5
yk5aJvxxcVku2SfC0FK46n4GWxylZPMEWEsHNxGubicnDGptkY0kboIX6m1M
Q+j9xjc5eVN4UVHyBdL79uJI0J56j4HO+XSzFTvn0P6Sr1PMMM1KEHxKgkrw
a5L2hLShceGTK8CEKiBXOSdEyllV7wIqCgQIU9oRPzJNJ/Np4LSfXfGkqRBM
rIhEl+yUHgp1gJHoESVVGE4cK1P9/10OD/vA3ODBDZ27WB7/HdnYb3w2NseQ
7M74jLcbgR2MzthLbXpLKq1ZY/gJ9hOxNY2PiZ33E2Llrc+cyMoZ87d8qRfA
P+asgO+qa9CpZBKRdc5XxIlw4DsStggRiySnUyRNTPo53QLjCx9CRYwZ6pH7
kxSgVqwEKAreKidIvAWnnd4g/zSCz0qSAB9WQb6cEPTplNcFm+lYVx/ixVlb
bjWJx7VV9QYRd+CJ5IKKQc4MN+xlwRnh02JRLUXgBQYrkUxLI3DXuVijzIom
dEa4HiSDRbXiw+Fnh2BShENQ17/ecNixzlF9ELZtKhRDVq6cNXnViZ+qEt34
o9A3kAiD+K5l2xrVzJ46eE0uTXyH010zQW6d7unwiHZDYDv0v5crxhmPwKf5
goNTmyAN5exySYqwLLFnKLwnmjVyAyaalrPHtDRpydZu9vj+XLg/fyo5ArtD
CHvoJZ8cctGC2DTel2RaEP9aTu8+O4wSNXMfo2CTDoI0RiVzI9M5Ya5NK8JM
oD+wc7HC0ZxJorJ9wMoFQYaVw4bTFhOBixcaEkwmxaoVl0m5IJ11IBpj4XTL
gRvqpR0d/udnDfjp8N5hw0pD9kQ05uycEKnhs7mH1WJBOvhEE8It6wOb97KY
mW1e16Xlrn13fv78zPIKvzj6AlE8/sz5MIUEfDlRHetMQmoGodFMrAC603bD
ioMFHgepmwZVW5HaHDxS1Rb7XcPwzb57/v1j7Auyt6zbmYjeq9WbQgLft7LH
dU0/d07+Gyx3zd4p5ejjCncrF4GDZfN8o24WvY/JFWl+pC4UrhqDNTZQ+MTl
owHBMl/mQ8uOF/ACTuwb02g43l4X7bpehnx2p3gl7y2wTf8lwY6k0f79v/0N
9/rp3/520BEW5SwWX816DExhxUKy4wRKuebBC2bCfpc9J0mmGodpffDePTn5
D9stvBfrRrZz//DTbP+JLPiUFjyRBQ8I3n9NV9BzTBujHT2erMaqtuZ1mqPQ
8IK091QGyzGMFL0HWFDy8y8OPweogyLAFvK6rfD8xOf3sxnPeDBIzx58d4mH
gwsH8xoclUSFxHKJuTgVN3twd+yRsQGnzr7iCb7Alb988ZRr1ZoVAuR7BMRj
lNYds6ndHK9Wi2PeyvHewbFzP2fncJ30+t8fcdyZuXbfD37bn5/dz8fDHX92
f/NP+YPAxnrpGf/UmJWcmv0k+gm7lSSpzV/lNTvzVBRYTvgq30C/5S8X+RwI
RApK1n3TOSSAh2/sQzabi0lGXm6ou15C61IJf/pIViWlBkre9CF43GV8a/H+
sZ2gcioyL/3DwiEv1Y+BhSUEPCexB4kAqi3eXeXrRqptzgOBRSQqiM1ynm3g
ly9O1autmhVp655hkTqGlc6UL1kKN4fM+zGYXRjCS1m9K61YhxnzCopZzer3
6clT5EVdQmfdmAGPaAttcshrkfE+0pBW45QBkIhfzXPRsvemBekdc6MsqC/z
ub5cTr9nAn9P1Sg+wLhw7VWcYlsFnddzRNyFlGwBM9TjmzIVXiyfN5W3B3Jx
wJLZS3fKMQl10cV5X3nTVJOSL9RSL+He2mdOw9t0nMZ6nW8aDsOT9BPo4KfD
BAkAIrZnZeuIQ00tLTrh2deFvzNlUnolojrwPYt+NWOtVTkwxycGmZZReat7
tiZA0713bRJYdfIgdkDPuts9lHt7T17DTh/P7D1YmZCUZwo4buCKPcvvjXYm
whESj5tsj05bt3tSTZHPi1rfefGjeGp5O0qTry72oJtZTk92VV0HR2MS8SO7
dcK4RHYF3Lm6DtRwqSERVeu5PRyqS5wDHlzl7M0rEE38STI3Cy71gvolaLQs
xIwZewJlj7qkIYZk46abgdijF9FjD5MQi2VSsBGwFTSkn0vao7zFJ10krjKH
zD6iN4MnQ1NCFcyZQ9BAfbiwgxmxIo8tgsJ372QnZw9PT6HiVfBCvHzxw0iT
50O5qyAdgrZ72Z27rlrlcBi/rOdfHo1G9/7z6LPh0VcP2AWsygFB9LP7DzJa
/akPGKqdlBXzfMUGvGU3I5uGmQcdlFZ35zDroiW6DxKzntjpad2XT0//lhHE
6NbwNE609FUMTB1Yj/4LXbEN2dkIG8AkkoVKn/k2ZWzdl4//4OznB5K7Jz8Z
4VUStsreuyzjLfMTD1B9a3CwZx+4DyjC4x09kC3C5TYJZX/igye9Wp3zm+CK
siQoYmzFO4mieG6GMGEaDOLD+khEZECmEk+SRskGmVaLQfbZ/eG4bM2m7D0c
1sXZ5F74SZzqKU7xgFEJqj2L8Ycx28ze3+rhpUggLqva8NrfpUYJQ+jAGIA6
vCI2INHp/BJkTIStIIpe7D38AqgTH//owlr9h1DTVUIcC3EonuNQp9MfP7n3
Sg96kl3IZxdijl7OqzE7oTWSEmefIaTScDSXfhrVP5mVWTao/vQqgtyIJv9F
qVx5T/WEeEczoon1tJIHncbn9aKrOg79CNvrjxfGopI5StlKBmhgZK99dsIF
0r5ZFQL5vfih8WHXIODzTpb7yfNTJID6BAe1+mbVejnVTdqXt1XPUg3CCKDJ
Qca1hYWdBYlvN0G/sEckko3sN30YC4puIe5Anz554W3b1+yrey1m74U4oC+E
FV+Y0rQ2/j9U/o+oR/RSWpC3qZCWd/kK7yT66av7WlMsEUy88Cz+tWDzhaQQ
sFWd4ndakEXIvh+nwzpUDbwpNkp4rOB9l7/VWw+y1AhItpGPOTG0CatGmabj
NR2H3wuPn8Q9zEjW8lNSX/HLH28dHd57tf9Lcn6IDQxNe2h8ws/hvQOOKaAc
ppms2aXN4Fnk715zZOb1vJwVYEoKIPqiU9+CLxsrbYkDORIDAi9TyWg1baqQ
NvKmcqlvQjD44mNVNOIjDyWbVlGTrGTyoLPaLyvdow3vrPzR+vTIZB6DsEg9
KtTSD/KAn3BZIiIlKJuCwdJ/SD/mlItRti+3+/49LzH03CMqgySb/0ASx4Vv
00lhsEyjQkKTcKYOcTTfKtuWEueHLAm6lhBhYwlTDby8ZTVVNig0GS4iDgUP
wrmX3XBoHLAKkVGGhM/juUX7+L7YdETaCwXQ+1sRgTn3tRTyRcogmJxur2x9
/lNnh6VCGvaHyLz1eF5OHEqg7Wp6cpIzyROQXBs6VwEbmbXRbmhojOpw8bwH
NxRt4uLH8KNXd+l1xnJMM0p+cKGJLy5h657zkhgYaGKw7UNsHhI8QcyMkpwT
InDvjoLgKObzoTgIPCmqeiu+rnuHh5Z3cvHd6k0ht3IhpovK7EhvCT85JfhP
H+hH3xcL+vebYvE6+mw6w2fTWfTZCd2PfJ7T36IvnvP9AC3kpl4T6KALhfeR
jgc96YtkCw9Mn0jWSDRoPHT0mX87PZPdvSvmi3Cqbadq/Ayf7EH2657BCX/J
M6z5JEmhj4oJHISEK2KyIiFnZeGF63Laerwtpxx81xYAPt3JkRDCk826BE3u
I8kwewZ5cvfxw+8ORq8k1KTEJD6AsQa+uL5t1tFnrsCARfPD9xcRTjvFKNZq
IhJlfAq0MsvLuWjk9Fuy18vmKopDx7mIw8ivDofRFeoiSLuX1b99fO5JTdeE
4V1Ol7dbcw9ZRBWELrt8QD/SBcKHUSl1nn3/+Mkg+/7RNwzPk8cnj6Ii3OhU
CHrQm1wWojhJomZjXl54KliAT4hpMEeutGpVlxrCd+6/VW8HyLZa15NCvb2f
fvHZEby9PS+Y5W9pp9wEA4tAExO5LS6Jt1U5dTOGFPPLCRssQZ5YIbfmg3jl
bZpvmvR94LUcfavmTuLNWGzq3xcSSx/ii+FD+S3qX5gNJynDUleQ/PAYKsaQ
TOc/ffHZ/cNDoQcTSHZYXkAjXpArCWjVM37vE/R9aIpFvuSqKWAr3bZLtDvY
508r9Db6oQ90UGG0ihX6i+5C3JiEt3NVGGnZ5kESW9aNAlDlcs36uoS1QqYb
wIRCJDwspGSdS9rrciIOvXQ/SSoFX6kGqyNHiQpTEeomQQMAO0KcLB7vk2UY
Pn9GxM8yS8Tmq7vyhMkq578wOaX6P61eb4IHrnlzu4np3Rsk6nhUbzWyxliQ
rGvu6tFBjdg4hiH4iFdWEcEmsZj3+OdjKfcjBC7sb82X9yOmTz8xE4SziLh5
W9ZvliTS4oMqRmqVsgpo/m3G/zmzMs8V6OR3BMB32CBNXKWBibKLVxJIL/RY
HqbmQVXOy/8Eimx5G9idgtYvkiN5weDwy+iPxAWyI/NDdVpxOFsqok8Q7uSE
S+g2XltUcalubzXtd2lNJoImCxqELTfPN6a6hmtS894s3fCF7/yiDiNFL0Xu
GQHyAfzI/AbB02F4GGHQO7vtzuRWujXKqqemamEKjtjK9ZbnDWupzcLSdaGm
QcJqI8Lp9wZk+yGrVYhOkoOaK8TDYTgWkcJ7W6t4xauX/FQcAnW0kCjimu5Z
0Q3CB/94x0HYl/eLiDbRDKMzCQtWOlZtjcCWUJ3/QnlFhyR7aFnpM3Wm+Fcx
khE7lCznSK8dldOgicfqbmlZ/JGOsGUgaNws6XslkDLs89TIooI+yFcNt6xh
1j/YkWUl9Yx8Rtg0bEemSytc/PK9eCc5Ykb6EeEmmbCcbcfSwPcg6VR89hV8
pljRbGcJaqk0m5qIUOsOO5l5yU4EHW2/XDt6U6KD99bCidEBIG2iXnMOoeAl
vX3gf/+n7IyUw9XXeVOc7a/eDHqru+TP3mqax2fdy37+2eQQ/ioumdekuhQH
goGKS6s3/m4SW06sGbn8hPOrF2zkP4M34iJaXxklp49fc1RTYoB49vDd4dGF
ZUWkqZGBKXB/Pvz08IafqlX+C5BXllOYpj81QMfYbXfM+oB14Bll0uLOawQR
IueNXJ19+SdbdnRW5PN9kWt0BYHpa06ucPn0OqIv+u8lLlLmg6kw5b9H0opT
dcQlGGc2ijwHYZg3M80S/6gJ3qd2de1yp3Y5Mqw22biabtCDZN5dCjskQ2k6
Fwbdqd+XeDLkY0ev5ji4CFfvCY6ZgGLbkuQ8gwCR/GWUJhnl7HcSYLY9C9EJ
doIp9U5U63ZYzYacWtrh35ofPbBsWsG5ix4hMQoCYZBs7X60NY33Oo7x3U4z
HW77AL5BrVz6jFdYw2oPRc6XRKpIiimUZUmvyMgqa67mm0g/UzaQnWrMW/xO
prU7n2nXrMmkQBMuM0wi0507A5WNN0D4legDkACbHygvl9YYyydPgrcIeXk9
KRdPb5svVuKFnZHiC6px5vv1ns6gqpYth0NCckncnbHrCDVvlotKFaBBSkW6
fgj1MXsGT8h12RQDTnfOfUnMVvOhttJmilKRtP2D1MQLrRjo53PNStmHhejT
FZ0VdBRI05po1rU2oXigeQ2hZ5sejredpP9hKb0GRSS5ObZqhQjTXncc1o/4
KOMP46rbY2NU8GYvNQEfB236/a1tJZnUPGi48mMyFzX7cZc+zh2pFNsAubWk
lk3QZ3LjQg7bIEvdNnFKW7mM9JBR1imALqL3gdPCkZOsNZLWD8hdyceogs4u
qwqOx8L3p8vGcPYCqaV3p6RgX1XX7hp60tuyYydqWjRk1Sh7wQmx4iQO0erG
O7I4+ZpPwv1rpgX6cOJx6fqcc9fnhkM0GcdZbn3xx9ErDb15I5UFeZtfDiVa
7iwvQFjslscN0PP+kkjDxh9/w5xI51/xGtzrgf7GlGz/JXJuvzxM9O0PYaUH
joOI64V/yfnXj/YPD0xP2v/s008/+fQgfeic38cidy/dxV5mfFnNWyuWtF9p
H9B0e3ue9yQZkT4jXv37/iGrFvJ1VFjTt6sM8Q2iA2InnkKJBJ6B0flEccNv
zqD2ZSMtFzPsiH5Ecg99hrlyrN2uE1b8tPqBxCnKiB35dwotckO/Xsm0pg9F
pmOBjRaKM+cVU1X3pgmeVqilAWBN2C+maT0X6+WBJ3oYRGv5k/luLr5tG/EL
l8Zy7MqEH0OKdIrRzz00JFik29QKRLefVMFJsn1jvYmqmpbyNdx0G1oV5TvC
VcvLKinbOtCG1Gji2Lk0FYTFO+Q4eXu2tzMefI1SVdHEBXOkuZ5ZGwUCJXty
zpAgJL2WtHZBi1oOJPs4hifqFzkhI+4co4CXBkHIlUKNte9dqS3GtlsKanxK
y+ZEPtoWEH23Fk0Hvh94dy1BTS2vZohbXJIznCLHUejVxHXpd5AAhjsMeVey
4nCYFUysHD4MBXtCGeiczaJXtrMI7SNrhFQzUnlW5p0VuSPFMXHDn1iYR2li
3gHlW4mFL1kbWMIyCXAjFULaoofah3ExySHb4jJHq8wBKKBoMkYUKB+KujQx
zWGN+XwtlSFwt+DmrbNOUA2AWHDnn2pWgE86BJBDgTSWu3cYmoAo+lQruTV7
aQcxmvV4GJiDOzq0cl37nKuApGcDQ3zIEI9WJDTiKDkKBOLVwBfduIiId9rl
gCL4El7B2jcUjNiJbRFVF5hk5DdmlReaWbfA0VNSxFfrgit2ONaPSHPLM0rC
j3hbLJyv4MfgPPkQLOeSa983ohiEKIY3SxBLMhSXx80cCjilyp62zK9mMwut
h4c6JdTS8SVaDio5UpV2dnHtNenkjENeKLRs8l2Cft0f6S8R9frEte2b9Dwa
Hh0eZB9Lcf8qy/6X+/Jjv8KfWJw0K1L4GRhHB0glt4yEdCdm1BDahR/jz66d
/Jxh6MbRb9nPPXrFXbcTJkdDUKj/6f8dmHzya2DyyU13xDC5dzi895tgcv8A
INmm8PD1x9b96uOv3+IgeP8LZgsHScOllK9a26W4XbnKqWw/8NY/3Ts84DZM
sRFyJl7ylv1G40L8lb5KF9V/Goq3tOLkKriBp16HfyIPFqhnpX9+Re89f/bo
mQ/xc7x9yhnZbZxydtu3huHVE2volRNzL/TS9UE/6DfJ1qJFYr9cpI8U0uS0
0y29iuxeS4ixL7VkYM6A6iQ3eieSrwrA8awHsu/90xMn3MqJWWYX8VG8j/R2
46LsyuIdx1i1z0Wf9ioRzpCd49LsHI9EF+EEwQrTqN8viU6qwUXrveb9xbYW
Z4Fstf31xwhPC8RfM1e3Bb7iXBUvK/WX/BN6MBDLeowbb4r/ksDJvfsaOImh
6COaUUQnDYyFTtrchAbvGvDWfQex+AzhKqLfZ3dUAPMe72jO7cD66cYdJEEa
5vO7M3CaLRc7WTl5V9N/fXMT8SOcRQ9vB6ncziBVHEfuFYcE7scWN1LXHP96
9Auizn0Ph1+OdgSl7d4lquXRQdEvQSXDJP0uvmBBgeiOdzm0zXXNBq+nWVFH
OMMWdpw2olRdeFc3hbNyUZKhob0ts4v4JBchyIyV+ryzFyGjzacEX+vrp8U7
6FoWJNmZTxxF+SQihwfhld/iKNjFjakKiVT4a+HnNnHXGCtdUWOfXUUuhFRj
24SRkoCDQlrULWl5g3b5IaxvNDHH8Neh0ITEwJ9fSdujtAwqplZORzWfN+0m
pU1dL2KRHVU6tKnjGjRVMX3rCOWdaNsR2+nWVdqbG62yV8v/6AqebYU1TQhA
Xz+/2qycYySWNGBi/DLTaooT+3R1dltbnwTlMeIgafoDLCFUPcr2T3QM1yCU
S7pfGz85QHqHXPe8qt7o1LvnT2KRtMW/+uUYZ4qoRyQFtmsSxvYLIJklT3TA
6T4KzsRLbTl+/1BkgBShj0UGZPZb2w0N7Jh54va77nX+OjjZDxKTj88mOs0y
KoKTzJ1lKI6OiwGhO7AtF7PVURaHADj/J6eDz7WlobQG4bqemj6TPpSRYIsc
bLHHLz2bJoFZx0PTkoT+daNl4zO1EEp79r0FkRBHk/l0PEvC+IRXE9YrcVuI
pblT9Gph/p3IV+DfLR5qoX9BAISn8w7HuVCIXWwL2huVmi3dhdT8G5WXZvXA
7RLjv01kYmUvMzt8pQhgEQ3yoiNuLxIuk7IHt14lAXIklEibiJhFaN9uJJ10
9GmXiNMoksmhQkQEucwnbmcQX6CihxRELt1eXGiq29mTKBNJPrFL/lrchsTS
TiXjQoIqxKEmpe/Ff43GNYEo4sDHp5+PXmVPiZg4+14bgzRxaksbJQOawu2i
wiljU4pNPekbL/YToHCWR7MroeNX5XJEekWUefBsVSz7Mw/ifaSpB82bNDki
XHE3A6RXNvTngbC/j/7hdQKpi9/XTBBL8Irapmrih+XKyH4PRrv1Qh6Y0q01
cL1pD4mBpqTAaKk3zY70vJw3ATvdbuxEIbx/jBl3wMwOeoVQcHQoT6/iFNXw
MlJcUNUyz0tBozjjI80PAcSFZ0rXROWbPUlOsJB8N1nnTmYtK0zeIw6Vz24o
EsuJnFJdVl6lrFpNOm0jI4yuSZyU3RrooGmyR+CWNQlnb0wS9i/9WFApvl6j
JCruwTkvuFufWVz+BS13WDzfilwjcaSb38yaglcMGp3khz4ltemJszV02JE7
tQkbSDNFYwdTS/2AEBm7Mi+K65xT5mx+apSJkmez4totyiUKjwaacY15ENIB
eF5N3hBjKK4NOtr9O4JObKeqqLW+q+mAtmSaTzKOLfhJpChJw+N5XW8MhyZ1
1Xh/TsMN6ETvWWlxbvAVo6+184cNpfJxql+iy/OUr3gg6yiLW5Q5aS+hPaiZ
idPC5m7y544SsLTKJI6/aizGWaIAnEmrNNAZRqbkOo8q9VCJlRvKu3apcxqZ
TTO11E4NQVSDH3c+ibp15hGWKzd0wZ/RxuSAakhu9bBDN9vrlqwxDehh44wl
zdeRgxGHIC7DHQ80o7I7A4p5qucvLhqXJE9ka7b6us5AFiIhjXDU8V/6OcXM
Siz8cDG5KiZvmvXiIq5lkZZ1UorCeTecG9G8cu4bKC5pYEcaD0Lht7XCgEf1
GaazsKLMbWnrGPXglViwX8h3LlTW6ocnE485uffpZ7AWriwj24kA7jaFCOGv
NGE8clH1zdxwvLQGk02hLlsIleHfnr2wMlxG5HMeHNrX1fYG16VoOT014NIB
60I75ycy39rHRIlPBx/1b7ot/2a2w79pgu63eTmt2YJc7OvS914IDQz4Sl4z
I470crt2qfb/mG3wYTuMGJK9d9VO9DmjWVhHvhB6PN25X6Vjt/pRmipg6cH4
ZP6xvrF/O3FRCtE9VeoSniK2h6gmCSohR8N+iAKF2D0grY7wkhiu/kXeONRY
qe9GbQ3wOqJK4udZJ4eiMv6nrW+2w0GKT4nGEztN1Crq+E22rg/XehHcJUKI
6yZKFVGPBg/iuql0mq2RrS6Evhy7KGRytVPp4SfCB7yIK215bFBT9XJHP2wL
Kfw8hS6dP7jNJrMumxRHuawYdIwO9kkedsCkznr+aILUbWC1Trgea+pNJWaa
XWDDuut2N9omOHmSDTtPLTtGHo6yxJkR/Ec+tOBSZ8JOTvQPWvdRlYhYpX06
eKpSq3GAOI5yzF6R7II03q6I+YcqD9hU7ezjRnM1OMT9ZrsJ8ymvG2T+hzsL
Fzqahm9f1J1PYUrJVoHlTgPX2ENi5WZ9Vq77R63c6HoPRi6+w9Lc2Jh6wP6P
zsYuhOz6pIMZxC6EKrYOdWEZQaHOgQPAOoMunavJ/YJ9AvOklf7ACHAPtLU6
4g1QUnwD/1CkAO0tZeZSU+OZedqKv02zqyOrJ9Vi434nzH6l+0jI4n/2vXgR
3Q7PY9xKUmMVH6kPCx1ZUNvzm2rE0gqxXvpPWsCkLxRE7TaI4TKDXf0WOCWu
6+fv0er+kZqwcBGp3ywqRyx2lIXB6+2vv4vhaSWAbyi3nYWVmSkU3A6RyE8w
6rbvaONlTp8eq5m6CiBJzZUGbJyaaz/UtgT+/LzHAFVWOLTndEhhsPdrnQUa
AIgslxeIj13SNnxWQjLymCutpfMJZ8cuMBPKjw+wGNGgczdmQ/bo31bSoz++
oZR6u9ESt4kDFJjMUi2Uh/b5GLdLxE5fA4l/JLtEHcvsW1sidGleCF8JzCOq
BeQ/VWP03vSDicrGelwjlVxtKGcJ8q9+k3lxY37FzekVHyIcijz9nf45fIq0
OnuQpESgE2qPATGIr+h20zEkRlqeKptmKdO/Sy+/+CBSn2BDijEFpm+Ch3X3
iW85ePxMLHeyNeHpVBGAfNx8LtMK2Mei4xqmW8nC0P3wcu3824UBOzK417QO
PgiE2GUrhHtcb5GzY09SXMsmNNt3l2sCCS2s+fGYpTEIfkFOtR5oarC2548z
hLmyVc+BSlCZFZKFKSSBgsPY0dRKi1sqCS+JOPuFtAttNSUKs97YIEsbXXXi
yZvl5KqultW64dThl8RKJXd7pW0H4xcklxUKdVnZT8aWWIjU2y/ZL7Ff/jEL
KrYXygXRDQw1naTTdOCahzjrlibxyeEnHC5iJ76GJX+oNNHuyrxOvqKAW/u6
bmOrmP0IP9KSh2reN0B+EHVscHsd3rWXSkXmegp0jM0znI8Nh2isCeuUgtVK
IY5NoVgV6GqU+9JRlZM3w8wWRA8G26McgO4HPTkAST3LBx+GSGvTYwEORTJs
qivMFpwZbpHmbx+fu0igdUGObsuQu0BI40Z6vWnrPP412A3rwZpJ40fcWqq3
VD2mDylto9dqg9rKTZE4JkN3qx5V9V52woEJ63nsoYA4Q+hy/AL1kUMGm1PE
k2wlZPisLy+5ORxZQsL3vKXbVZZHVkykDDMMQDLWyYxVs+eFuyYULgBpokDC
7cQh33Ugq5TouKvGQopSBOV67JOOv74nq2RXhsVoiz6848Osk+4m0VczKnEJ
ETHnBcwu/0LUWr4rSKXlvowvCMGB20mbChTINg16O2+83ZaAO7J6XJSHZXif
FGd3sJLuBai/wzqSQu2+vIyYvQPjezIldpguWW9zmmSxYN1E+XB59lboGllw
O9a+aAZdLJDGLbvwYGDOaLmsxA4PZiibx6Y/wWLpM6qtOa/1h+ixqXti0eqJ
TISxc8Q95FdJHVjgykkEuq/mvIMF7iNYEHAgnWOhyCBYoH3WnW/ffVNN/lZ9
tla25B3kM4umT5fxpXp8hEePf3h8/ji7mYcPQhebSd4UveDhJJQU1+9nTyu0
bWx51mVqd5z0VLxN62q1fS85iyvW6MLAXJcvOHxrraXhAMGEQJAwFMUS6jXk
ghT5ssZbaYB+w2g5yk4ePnnsu7SNddwS/Qiarh/QxJNB/JwmDKLhNpZyQdzv
jpYGXvCF1Y113JkV4EiYWCSjlIvmOLNerChgRejvTVGP0Od9VNWXd+n+7161
i/ndejb54tNPP73VSLLl8PPR/dG9V1tmW9ShvcS8o6EvCNeRBxsWUXaT+iEs
bmcZEt2xKViLGwjknduV1Oqu9S5NQsxAwOU14NUoXbiVTub7mtnz86BYvr91
gwbpu3gm/YsTQtzeTDQrrhOfHTjr7imBBVFGtlz7vnOCFPcXHwvMxeYeO/p5
gaZK6RfG/EjjpYnxAM0u9dvvtAv55DxbB+COmsra2Ioo20RTluMYxFP6G3Ku
yzZ5IxDeddjtiGtOL/o48cj3zdVZqCiUhyE13ri+7rqaHkAv2rVQ9tWfsp4H
R+7lco5KHJbeYjyFqQKSKVKj0gDhiLEE860Dgs7NLApxTLo9bb/RASgU+eDj
//iNJBcgvTh46BpnUcRxKdVpA1r8UND5/3ZBN7WsFKU69TNJ57aoTaC1xoD7
iQev9Ez+4zlM/OwN8ZZudJLkP8nBi3mx3P/bQfZl1umxHAnAaDO7AU2SViZY
kGK6nhGrk6ZRYYJvd8gxd1osUEwKDmjb67aMjmtr0TU/n04L71LMQj/pvqAi
mwlRXjKcEHQHyTKWGIL6555+1qEiSwtbI7CYWtwHEpRmG/Zle4Y+UIaKaRQ7
5hYV0kpkvJ5eFr4vx0nI10bqS5S97dxLnfakPUHVJeFnzyfzq6OheToJm9/L
HUvZqOeMCy7lCEDyK/gzi9MHgjq34ArBTmYYRmk/Lowx9F0Ok8G62i/F+xLk
6JeVoCeRC5ypToMg0MyvrOhAHYLat8CCf8I/1IXR7dbUyAST1hy9kuPOGe6y
qIdZIzFq/W33jd0cjh6sVVrmhJPGrWQ8obr4k6bkPPfPcGoeTB6NvMRjEs3I
dV4E6wD6MBcVgYbcd3qJsu7LxjezbwpJrG2QbrVxksEPMwxTGBSF6dFo+WV/
l7jOC1z0gv7mCZ2pZl3Dob//TUe94fiYzUrwA9ut7RO3KMAi+aU1n2xaKAyy
yYarZFATwwNYCnSyCImhR18coi7yBKUdxK3ivj86mzgMKcykiU9uuDHeyN8m
hsr8Qreje6alCynouGd6IYwdesamQGUMZm2eVxYAZNAOnHUZCX0tivC60NLi
5OQRo48FijSaOEjnFjOpJ3IDgUpUKQXx0tvvTXHySpuZTbRZ6Mhp3yVtGBQ1
MUrbG4czpayG8Td01eljPdm+GJAuztPzA+RFzz3AB3qOOLYmgrLrZoUF6zp2
1Y1eTEwvembJXYR7D5MRhsSdq/DlcJKv8jGP2i3QNinO+1WvTrmEKsgDKnkq
KA/goOVK3zKeQ4c1UVA1m9n4Aed5pXm6G60K8HN8MeqZ62Te8RTJc1aYbB2g
0GwulRxocZSvZP40HwG4PrmqKvH6rclSREMJ8PlyUjQhT9P3KIi5r8wHeN4z
GyqLgUFw4vmZmy6IoBLQdRBf8izLW8CgEBvFAHu4WS90OqsE7iLPNfLVw097
R1UN1JOHYyhhDWJxoUk0ftjGSKLzan555tWYLhqfztrdSe6sCvGHNngg/DA0
WWZk4NGlKKyI1+qeje+yrAXFNTahClDo/UXv3j866NoqIZzDYg8jcKR93TTb
v3fAU/y8dA6N/nLmoFBXVtJKwvNVKFNJhjI+WIdOuwTDJVh9zc06NoFk4U02
NJJVqjpSf0PLafS8WxRo4F42C0zxdYIcg4Tkt1EFGbXVWKYQwTfaZlsj0PUl
Dv4dzuqS2VXJusoeJSwePBAS+2XVGuDv5CrDYEju+DvtOAI4W/kX33fA0Ihp
bF92hyBilxCRQKHJUH6BuQxiLyAdwyQLbgOMMjlWPETYOFwjCtuqOmYdgofK
DSTUYKxJvCiMeoQtqO1qSYtgnRM5wGzZSlvgnhcmU8aBeTyIQDsIy05c9C4e
2mzXbXDzg0+iDG6G9pxLLbS5i4XLrdcLUFik8XyeoOGxc8PsTGcfxB6uMNxK
s2KspVvUkyguzIPunJly94BDFsOMJ0lgSgE6I+VLQNqa06bzguIQFMs+840q
jmZxuchWrSVrpCFLPT5096i+akIcZ1DVhQ1A4rXV0Gv90+LdwBoUckYR7Mah
zroRx5IYW6oCEcKUGvvUq9yCHL/xOpeUBKjLAjO/DLf8gqiRzp1WRWGTKWaV
lVmEHjkjaZ5low8y/YFMEQqQTFT4aKsW3dk+AVSryw2O+pHaWTilNpWWPFgj
oYR/+yugXXr0NHROENPdhJh97R2FC3eQ7pwtkW2oTkX1S8YJcdcTEzBsknpV
X1gfQKpucOgiuv9fgITxAXcjYTiEXJzvMK54GbCuB+dob9Gdbd+NAeSMXxAX
6phA9r7vjkwOA7b45xILskmUqr4ndiWuZbqeFB0xwSDk4FdZq+2kKnqQXFEC
epDUgx2ieuASmgpKuFd04zRgAS/mi2S+b4qlJJXLtxozH0Q6Tve62Li1uzFl
1E8EjA/irLPikqvfkfIjKxhk+FpLEPQ2gGKIy+hAJEejfwFHMVLc8JMtrNO+
IBwDJsxbROLpIm85WbM3rd9STzvjhFl9fYTh8pijMl935SFPR2TVm6QZRK+J
Del7ulsB/ytXyOUzuGZ94J1DFpwfS3dH1s3JN4+bAx2XwgFSqU4iRkY4yHBA
THAibqeoER4Q3AtUDiM+fP4ym2wmc53lElW1ifE7lEh1ziU9BM+J8QdG08jk
kdgtN4DkxHSkNAguhLaLqoUi0RA/UpS+qqv15dVqHQrUuCel03vUh3w/OOTP
oU1Ly54qsGb/fKlTDL2rTyu5BIHdpKwna47sBID7MrT8Lel3rB4oSIeMPFab
FegYGRCxGcQy2awfbSqplru00Qy+STVTzQElifBkgeTZVXl5lekMncnGd8AX
I8vy4hi97AtvxYcOnsjOcf56g7JWZIm2xKJQRtezyxlaqrYpFBMlRmPjIGzo
iQNRxv+BuUpDxzCqE9tBcCqTgbxM0ZymiwCRz1jxv1J+gqdlO9W8uuSKM2td
JYMDYVHA1yKF69ptNBdXBrcnYSuM88vBvuZNwVrd6BVHkkKbVky1xT3prTfV
zDzNU5JCc8zdg2OHPycEnQsGKHx1vIVn4FmSecSuUltFksOcUKO24Qs3YFoH
YWrxNmcPnLpJfH/eRDp4anFSq8NIf0IijYnBvxPMgJhxV7igP4OeGRo5WklY
3kgJA4A7UappYxEAOTHwfGnBPUku6EAmOpPNiWDTL67lZGEmt50v3e4Gtdog
m1NjQ5OdDpoM1KcEDdGlLFT84KPsCdFAwGR/r1zu6vlgYYEGlxaT+ghMl7kF
tTpLaH/B+YUSMfGBfPjIlR0ww/Vv8zUBCiA2bmseJe55GEGd6XPL0zKO4B2c
WcKjtIOpNt2Ek1M6UZr3B4OyCX/n0zjkl++ehInunFGuo8k3DFrHppXHa1zI
5lzr3TVaN800X/gewXqJHF/P5yDeqTOTm9VW4pTK+botuRjr7CZTv1Eo54EZ
sFDINtzZlQ1vUzS7Dah22dED7L+jeKkrQQM/HM7oog3DnGkvXhjCnn08E/Hs
c/KDeQFeFMYc1baOt8F6s+r73SjjzcpXVUeVVVGQEJ5QnuCWb6XR+zta5FOv
Pi04I1b8YGuSY1u7cKyAqX/HGt6Gd4SsKvNXc14avZDL/3xpvesNn3EMKqov
Dzm4+ZwswybKffNOptZ3EJN+z02BKbii0kryMkb0vikyjK0OCSk3krvzru41
xlFMOHk/syk33QiPb90VhRRQnNeXWCejsI3C0vgyGdQMRq+DdqKbyTQaWxTh
SXOH+5Gy++ch4Agm4vcUHne+TpA/D4Zd6HJbF/CUxw1nfV/ZtOPsgbMex9O1
/y7C6xAZ789QkK98goLrSVCIMxM0jvCRSbbuVnaG2Y8QgVtO+KaYDCfJhzrX
PPjM6JauSeUgvTqfEjIy0vmbEWtwI8UhYOYLbl5DisaSz0FcLlyeeo+Zsqbc
TBxpzryMXxmkaB0qQoRpf0OaXVuv2yvax0HqzU37ia+XE/FYyCHmTTiJjDdG
N012zdHNS0hWWBaaL9OH8NPZxKocUz7kQwvf+iwXrRdIbTvSI3iH803SzkTc
J6pHbW9JlmalfEF6/cQ8p06Ho0u/cE3q7Z3YKSBdcTeESaHBXmVqU+7YvcnO
fzhzltkvuVrmPIhE7RDh3Tp+idh6p1pnzwrvxDuSwr0NBN4hz/+ahTuxiVzi
CgjuwssDViyai45G7Lu97Jtj5474DqXRxnlXAsQRBw2oM/eJYnW0x2/i8u3g
jVa/tmDRwEr9OF8NyvMIr37BXvElt+o+Sdl6vJEYDXZz0SyzECCQK48QOxqy
jP4pW/vnQ403Qc3AWjPCoSLbJ0M1pQgdmyeP+yqPEMIS3oihs3z/JEgkI7KW
EcwNZA28AH7SSBJsE/KRe54Wq3m1YZYmYhAG9wy+Hxc6iU+u0H5cNVEkKzRy
q09U7QpJLukFA3RRh3bITzjux5JQQlgF51KFFNrQiWX/JH4ERh1h/RWjol1t
rNoSW7w3Sgwjj3pk6BENqZXYh5zcmu5N1syh+9LtQJRjL9woh703tpRFRVoS
xbORb0is4+AVMJ0QmJhsZNMXPPJxWsyV+kJIbcBtLrXqSzu4iE/Ih+2kxYls
hy/MmA8qBOInSyQYNChq2ZfGWXbP0NtLRhOLvMqcgTW7CCzpiuuRLbvUOwcl
QVSnbBDJr2teSN3KVWxkSU9BlziCFdECkaghL8JlKocFWgjp+vQGF7ycNvSV
U1F0IypGq04M0qqJGdbbsiKOhPrCrZCGUsM1sUaREYP2HRjypRZ1sWKRVL0x
B2JYrZeh2ZWyeeXlSRD0LvoNaU+lE74npqCXS11b42pZHIJkFsKBJylstZBJ
wS8v9Ad1eQknIxDXgnO8cP+ETevr9DDx/x5B7PhoIbbaqBn+tsjnil4oWpCl
LPCuSkL42qgYC9pJ9sWoY4Nk1l5LIg30VTU5C1/Ha56/kD+oqMVsN1/qFKGQ
MbZhAvb+OJApD4i27MNAL8mOOLVlNjM1DSY6UD1qQSnjjiJmrZxaWI40I7gj
609yFVhm/0IPWI8JgwPobSbGQAvR/ZgO5G+OrLfBN+EV3o4ROoBLnCivutRg
p6pLJqjFvNNJKuONrSfqqq9+S84WSnq2TWeeW12O2VBuDmw1HXoqrM7oUeaC
iNLp+251bqGNOGByDSwqCw50iJEX3MLmNTRsfRL4ASPrubH/rEdI+wrQ7Xmh
PhWnUZ7otoLkyqSAEuZHsS/YB+zx3heMef3CqXYk+H86SywqTTuCeCXjMErr
gLveMPr9++kKRSNQ2pjzIDGpnjYOeANcN0JJtQ7r5A3PkJ9/sRWj7+M+u5gE
M4SQJxX1GcQg7ugas7jOMMqE5J+cpJZdk3wIz+pUUmJ2MqU4iQpUqwwgBXvK
LLifGKiPY0PV5bqxwF58tnCpyuJ2HCNu7CdVA2vxDuSg3YZn3OghLJxgE9AS
zfsgSbRh1BddV2tJwjW6QH7G15RD9MDD82eWs8HH4bVRW8suePdSKtMjsHJ5
HPsrebpSZUBVm02ri+SP9wupYRj1a7mTllb4ZZhJNjJZThM5owNcFjbVJWn9
QlvWW2GGjGJaLTvchsG8mgQXpThdkrWicXYdAZh3YBMbxBJcKU1ipIhXFzNJ
KoYWWTEebpXxRMTFzAsLcbAFms4lh/jRnTpOxufo2JwZtsZjPAdg0SiXDcu9
zmetlFLx3pBwC6Ywq4gtqv0bH05aEHHlp+7aeLFiSwdRZCdrTWVsq5aAFQRH
zEIsF2KiU7djGMatF7N9mcG5kxkeWEpmMFmRap/lY2/A5pE3yhKI+R2saZN0
AgbfJErgjs1raziLxRhBpU9AsYCFtJXSmnTGsgqIjNMneKf1W+mKbvZmb+Pu
KvJDGCNqdcYuFuuwrKTVGZ06lBlsOb4HW3inL8CyZkhJtrpaB1GEUgNgqRHi
SbsjwuMeF+GdjCWWSbcc+msAFDVL2GMcq0jxpDCcgy9wXJCiXqIHT8JDfMq3
H+quPnudAaWZIz5PHCLf0MgycVWMcBpC2fj0HFgjCqKsmpA6z6XHrPjoExHi
mZM2WOhTqWBdSwW2sUhRkA2BGYJfs2RSeKu2F7Kn1epCF6lsb7mez/eSot+p
9KMUHVZfsJVkIIlrC+v90iVWqJ7eYFBG/VgwwTJZqtoLJuwwno/eeFxBtDZ5
h/FYfRWzdqCAddKI2Im6+Ds62sCcqCx3/ObIdlZMRfAB/Ql4IJ4kxyFgtOx2
XBnHMM7Fts8Y46JrYitYMj0CRLJ9svNyxOwGWdFOSHpHM/oQ5bSlfNNh1gZD
G18uyrDKik69IjzB3A+8c7XW+21jEVrgk/qNWe3gHPZy2RRikuDh0Bsv7SWn
Iq9gDBH5jfT7YbWKKwD++MVISxSlCXK3/bF4OOPaw4HZAf7eWJscbCXwJiZ8
yEjoqFPygtUq2DS+ZeIuK7VHbsapEcrQw4w9CNVkRKZKUtxgV5hGkpTUJtKG
tmVlVKGfiMpARBIkDx4U1jyQYEeCwMYn5ImARxup4H3nDRt+dU5aqiLAs3R2
7F6cnsU830RtShvLo4+PtAWrHXqOI56NotZVvOA/7bysMwEz7My7taazKxLM
vuNtTlxls8AqTdEmZyl9J/BO0ponV6f2GERcYzjNuopPDEzsZZa4s+I6yX/e
ViZiXckGX8euJTO2YzL1IW1Nq2MBBVhMCz3h33ki+Y0m5az8RSYlsfA18RPH
mjRbliyhw8xErF1P57FVpW7YbYh3Ugp32nCILLRiL6uzK00Fjtxq6sMwMEWg
manWF13KIPuJu3/VdH3VYsm9YKLsLs2Rag5EY4ny7UijJ/J+K9xcTcpErwe+
lw0JmGlffwRWzLyHZ7xJSArv+n4ZXGXl8qdC41idLSQavclZm5T0BksE7agT
H5NaDWsdGCUz4nGmEVF1jPsz5OK7Y9tuPfZdt/HrN2HXTUh9lARGTVuU4d28
mjqAfnxUrQ/vvVLSMV8eGCXypGYbC2AZd/glhKPST/nCtu/Vu7XDJUIowvWK
re1LHn4viQGRjxIH18G/LGHFxRXG87lzB7dhiI0yRSQmHtys8PDJWlzbZs6s
u84edYgc6BGWMExCjquF+VIbF0AcoVdQxbSBIBhUE9dMiiW9ppJj3+gBlMMx
/kATlRjCkqRTVb9x7q+Feu4Fg9+RoubNPH2m6TwE8+1NEHCxn3+nHvFsDAvN
D560lYggYFKN/P6EVCv+dRGEqQ8POPYjbL/YsmRPn2cciA1+l3PLdZKagGWj
TpCuAc3ty0z7VoIw+0212OClEkOOTSaehs2UttMFgxaH8mOejiyKDcHgOgMr
XKMjjeWSyg4St0ncySxkqUhCVcKgGKt+WkuLfwGhmnz+TwfumkJguMEjkjkq
dW3GF+96Wk4DPDs3qVck1CVwC4OQ/cq+dhuNPhZA4ABVddiLdyjl817Dugm0
yYsUczpFxbbJaiYJgDFIsHFNdg7n7/ILP5xlQH+VuBpGeljlffhD6AiLaSxz
PSQxXli75DluLCPPtHODdxnBJOsI3nATiOhWylHoYeGdtElmqucEk6L2zeA+
QmPc8sYTGKfd/sSVtsU1NuK/4ReFBAuJ1NxA+luShrjnNh33E3GSRRqsMuzH
X+boFyzaJYu4758SmvZoAwJ4429Hqog5IwyggS+qH6IE3NEeiIeddqASeW/C
m+IcPEF5bzbDMXXJ/lTLcWpidwh7H8qFhuWjaIoHR9fBZR2F+rai756uFwtf
6cnOm1nU1WYbBdWzGzCRM6/TMvpUDMkMQsTPMDyZe0bf7tQ9JcHVVb7S1ovv
33/99cNvvz09+uOHD/ywxb+a7M4dcVDcudNnVO7LPYEFNkiogsJ6QM9U3d9z
b602Dkdy5ME/bhrIAcxhFyc2+nWJgS1vt6FWeiptbTdZJOMT27Zx/v0P9PBV
vUGUUvmDT/ATJ+vW6eIcaG7C7Ewt4S6nNSda2PZo4yozcu3qKCmzUefcfDol
Idj8OfNZLY40qSueadtI6VN0D6ISRiUfWPxBvJ6UFjF7Eh69uV2jfJgTrfK5
Zdg/7AveZJKBUDSSJOvTP86q+VtzpXzxR03RDyYbtKh3UvkN/Q59St6hfcnD
dAyLGN5S95Ov35GWguy5WLpbzIngB4Py9PlAeqhxSgHR2LIVfhkl8zTqfocG
XZKU6A1KxS8Z+DSQWJFPjRuWDxon63cOYx8yJUcEm5kJcIdFaVjsMug/6ySw
pEX1VrYAHzBRjb1DmUQ0d5s9DCncN5bnJ3C4tlnlHBlwz8bz8i2wl+H4/v2/
nQ4fjdqrakFcc4jmZMMKvwCCA7vYKXNN+nsnXxHDOKzcGDJOOqtY1J2rvGUT
W+k8nM3N0fKcMyKqmYOOw5kd/XeV4qAFJ6TPybrRbPKvO31rufAhyt5LxnPx
JqL8L618WPQkdXEbIZc4F63sjIeVecdI1B1IrKgkj2S7U04kMBIxlRiEa83Q
j/LCpJZL+2OqidipKBRvsPhgts9k0dpIGvtmAuI516vrJshLJyCSgNWqtULF
retl2DqJLcx2QJXhTcDjoW1KE77O3QtNa9SHnhXcP5a7VGyv1mhLxDSzWHYa
mv0hE/ddJ91DuiT5WInEIhyHRSV1zvfvGHhO9LxaQSMwHnzvCIaw1aREhGl8
pFy6rcYmDd00twjy33Sz+bU0sdf4vkXGt3PPVtYAYNDBZuWrvqmHjwtwqpIY
+N9YZmPjei38H/+ST48+e4UaJW4exLUsdZV7fmIn7ohTJ/ILqbPDhjtTLSv4
VMVAl3KSqcW8w48uC4I2/M4cRfIOCshSpSVMDocx3E3X5/xd9lXJi5Jg2sCf
R6820gosMBblUverB0Hgj5IL8YU5LMvF6evfp22HWLpwfp94QxrN8Sp5HDzy
6aWecYFG+BO0h3xs21pG+eTc2JI0tpo9VQRBMaDAMjfe2eZnKWvb1RkXM7BB
lcvxxD0jUwEkNF4vWMmOE2fSkeZcx9rTVMT4Ry/y6JWjTsP52p74YpvsbvY2
r0uc+cBCgLGzOG5YIrFnF19Kkjmt1Q2mrY2LJcFehaNghq889LnM1mZgvPGZ
V1hloQWZKTfVdNaQTG0qcpxJHumwkgnv3BOUCSddgOIuNJLaTwcRhjKQgqC0
jUlIdfA9a4Cq1qNl169tC73ZFNoLjCMNEiXcbrZKu0LZA3CCjGMS5auqjEq5
ZRpUsUS1W3Iv3OHMR7wshd/bdD6jb8y1OH6kjb+WnvZ1GlaetGobNF3jYIJk
2GWwDGNPDFodFbnQGyez6hJ+YJZ1m46FtoGTOQ0nmYsSMJ+7eLM4QePD0cBd
VQASMxr0qip6lAThUgYGPzw7q4VX9FgesfbJZMdP0NPi8XXs1lrkP1W15ubw
5nRXOsxbWgDG/RwDcISToD6KA60Ec362OeCQqfvx1r17r/atc+0lXct6PJpU
i7u5lBGzeUw2+d3VajFMOkTdlbEnd+/dO9A2TZw27ovvT5ezOvczStBRlPAW
cTfXSdH3dnJfzgXwQG+Cs5vhI+GuTSIJJiWXWyEjSJeQDjIGE2K5U5meg5LI
pljgW8tK3nIfzucuVXriXXBt1nTb4WykZXnjKF+czKv11FVj9vVYAaF23vLK
JPKe8Tvb5LVRk3mtoi0biiZv5ByjJHlYIH8mnp2kkVbazyz+6oP4rrlXQrtZ
wZVMl3fy9KRTjZU2BHuizr4n8Jpm5/Lc+XYTRwn1iw6ezPaWZcyf0i2pK+vO
qGn2zsr+5P+5A0kYIkVaG3j7MAnCffhwnO1F5UOMxBj4pD/boyVeiIK43e6O
HtXd8WOi/+EJn/+JOUS97Q47jya/6KzQrH71Es0qWcPPWryhYfvO1fzv+pbs
7O3Xrin7jGY2pZOgOs/r57aXpLP9L30Sv92z3nOmpYVyzoBDvpNmMqwMIkRK
aEZgUimKikqFrCvrJgJcF2WDc5u4QtxYuL2bozDXTp6NgnzK8nWWOIIUEYKj
oA309yNBkiSYDAUnvQq6ok4If8Uv2ouob4+zSBs0WiM2bwz9+vp6RLpYzi3I
iZuUl0sm+rv8uqHQk6+W1BW23ChRU9CJB2nO3uFAlXMEtfzg0VTZPKtES0Np
ih+E2TBbq8zdzZbDtEK3GO5TgCwjzeO5kYajTdDV43IxzYnYw3FcOejc2Xrc
Jt92FnLuhfmLg4LIP3x69yQYZVtfQui7x6ZqpsWq/Auuo9j7Yly2e/B37I3L
JWn+e5xTyV4l5Fs7XwPbs4KMUevjbyi+oq0wb9cwf8/zfABtYgZXe8yh+Qfb
3Xd7m6iwxwJmk4d4WP4bknGLKHW+lPE9vVs5CRV8EZbx919O51+5jP7TfvUk
vyTjQkz6/ebg+Mu79OGX0+lXtAb9fWq/e4RGJxJEIDUZjvN8IZWcGhDCPnc9
/A2sIDLYkMlZLW96zRO0hW2r5godhwthI0hl3PnMXRzFPeegBcvqgnB7bj5g
TdxpUSzI7Xy0Cq0LENz9ybq94vkmJ/Js4SlR7h91zHQ7Mi71OHv47MmTZ0+B
z7DLtCgQzVX8L+QWeNVf9JKHHPqRFANwW3nq9PHZt0qgPZLyBrq0+az9NCnP
/8uTY1df+J0UfyfFfzVSTDXPf5gik2X+5QmzR5v+nTZ/p81/ZdokU+k3qbHp
Wr9T6O8U+juF/jMpNLhJ/klk6hf8f4hWO/6f3yn2d4r916fYf55kDSv+TrO/
0+zvNPvPotnY8f+bSDVa6F+eQuNwxu9E+TtR/k6UvxPl70T5O1GmRJm9lJYf
jw2M2QuN8Wquhc+sDa2iUQ1SSuRZqt98WJjj4LaSz/aWV/gsYU3Z9Q9pao6l
8qcRc/r9esH4Z60jpQ0E6s+u0fJYug6EJKA2Wds31tdu9YRcko/38sXTjLjJ
kPFtlU+kPgP5dvvrenmMmdrHzCWaY+IxB9n7W2A19NWQf63j58I+pXH/j9w0
aFzcRRwd3a5f6VZkRKJsZe/08fk32IDb3sCL8GufHeCHXmennjyjWPzAhV3w
SdF3B9F8rvX4txffPPzk008/+fCBQPjf//3fzq5XeGgGDkqMK+EqWfbjj+ff
nZ5lj549fPnk8dNz1HggiaUp26re0PeI/d8U+udFTzEZSgBDjzytpGozVCzI
4JcR74p+XHIW6ERmvTdaecRhf0lCQoWRzvBTQPJMlIwHgtp8e8kNGIR8gxcF
Z5hOLPMdBULoFsAF8IyfZeO2xhJmJxOfK6vd2Hk7hNsCVhVkQz4SYon0atQ+
8twTpQBp/oVf/5kuAQPZieej8GmcT964/wNnJXl+shkBAA==

-->

</rfc>
