<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY I-D.ounsworth-pq-composite-keys SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ounsworth-pq-composite-keys.xml">
<!ENTITY I-D.ounsworth-pq-composite-sigs SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ounsworth-pq-composite-sigs.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC5280 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml">
<!ENTITY RFC5958 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5958.xml">
<!ENTITY RFC7292 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7292.xml">
<!ENTITY RFC4210 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4210.xml">
<!ENTITY RFC4211 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4211.xml">
<!ENTITY RFC6960 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6960.xml">
<!ENTITY RFC8411 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8411.xml">
<!ENTITY I-D.driscoll-pqt-hybrid-terminology SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.driscoll-pqt-hybrid-terminology.xml">
]>


<rfc ipr="trust200902" docName="draft-pala-klaussner-composite-kofn-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="k-of-n Composite Signatures">k-of-n Composite Signatures for Multi-Algorithm PKI</title>

    <author initials="M." surname="Pala" fullname="Massimiliano Pala">
      <organization abbrev="CableLabs">CableLabs Inc.</organization>
      <address>
        <postal>
          <street>858 Coal Creek Cir</street>
          <city>Louisville, Colorado</city>
          <code>80027</code>
          <country>United States of America</country>
        </postal>
        <email>director@openca.org</email>
      </address>
    </author>
    <author initials="J." surname="Klaussner" fullname="Jan Klaussner" asciiFullname="Jan Klaussner">
      <organization>D-Trust GmbH</organization>
      <address>
        <postal>
          <street>Kommandantenstr. 15</street>
          <city>Berlin</city>
          <code>10969</code>
          <country>Germany</country>
        </postal>
        <email>jan.klaussner@d-trust.net</email>
      </address>
    </author>
    <author initials="M." surname="Ounsworth" fullname="Mike Ounsworth">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <postal>
          <street>2500 Solandt Road -- Suite 100</street>
          <city>Ottawa, Ontario</city>
          <code>K2K 3G5</code>
          <country>Canada</country>
        </postal>
        <email>mike.ounsworth@entrust.com</email>
      </address>
    </author>
    <author initials="J." surname="Gray" fullname="John Gray">
      <organization abbrev="Entrust">Entrust Limited</organization>
      <address>
        <postal>
          <street>2500 Solandt Road -- Suite 100</street>
          <city>Ottawa, Ontario</city>
          <code>K2K 3G5</code>
          <country>Canada</country>
        </postal>
        <email>john.gray@entrust.com</email>
      </address>
    </author>

    <date year="2023" month="December" day="04"/>

    <area>Security</area>
    <workgroup>LAMPS</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>With the need to evolve the cryptography used in today applications, devices, and networks, there are many
scenarios where the use of a single-algorithm is not sufficient. For example, there might be the
need for migrating between two existing algorithms because of a weakening of earlier generations (e.g., from classic
or traditional to post-quantum or quantum-safe). Another example might involve the need to test, instead, the capabilities
of devices via test drivers and/or non-standard algorithms. Another very common case is the need to combine
certified cryptography (e.g., FIPS) with newer algorithms that are not yet certified or that are not planned
for certification.</t>

<t>This work extends the options provided by Explicit Composite, defined in <xref target="I-D.ounsworth-pq-composite-sigs"/>, by providing a
mechanism to manage backward and forward compatibility via k-of-n signature validation procedures.</t>

<t>This document provides the definition of a new type of the kofn-CompositePublicKey and kofn-CompositeSignature
which are aligned with the definitions of the respective structures for Explicit Composite <xref target="I-D.ounsworth-pq-composite-sigs"/>.</t>

<!-- End of Abstract -->



    </abstract>



  </front>

  <middle>


<section anchor="terminology"><name>Terminology</name>

<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL
NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;,
&quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as
described in BCP14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
These words may also appear in this document in
lower case as plain English words, absent their normative meanings.</t>

<t>This document is consistent with the terminology defined in
<xref target="I-D.driscoll-pqt-hybrid-terminology"/>. In addition, the following terminology
is used throughout this document:</t>

<t>ALGORITHM:
          A standardized cryptographic primitive, as well as
          any ASN.1 structures needed for encoding data and
          metadata needed to use the algorithm. This document is
          primarily concerned with algorithms for producing digital
          signatures.</t>

<t>BER:
          Basic Encoding Rules (BER) as defined in <xref target="X.690"/>.</t>

<t>COMPONENT ALGORITHM:
          A single basic algorithm which is contained within a
          composite algorithm.</t>

<t>COMPONENT KEY:
          One component of the Composite Key. For example, an RSA, a
          ML-DSA or a FN-DSA key.</t>

<t>COMPOSITE ALGORITHM:
          An algorithm which is a sequence of two or more component
          algorithms, as defined in <xref target="sec_kofn_keys"/>.</t>

<t>CLIENT:
          Any software that is making use of a cryptographic key.
          This includes a signer, verifier, encrypter, decrypter.</t>

<t>DER:
          Distinguished Encoding Rules as defined in <xref target="X.690"/>.</t>

<t>PKI:
          Public Key Infrastructure, as defined in <xref target="RFC5280"/>.</t>

<t>POST-QUANTUM ALGORITHM:
          Any cryptographic algorithm which is believed to be resistant
          to classical and quantum cryptanalysis, such as the algorithms
          being considered for standardization by NIST.</t>

<t>PUBLIC / PRIVATE KEY:
          The public and private portion of an asymmetric cryptographic
          key, making no assumptions about which algorithm.</t>

<t>K-of-N:
          A k-of-n signature is a signature that is valid if and only if
          at least k of the n component signatures are supported.</t>

<t>N:
          The number of component signatures in a K-of-N signature. The
          maximum value of <spanx style="verb">N</spanx> is <spanx style="verb">kofn-CompositeComponentsMax</spanx> (16).</t>

<t>K:
          The number of component signatures that must be supported
          (and correctly validated) in order for the k-of-n signature
          to be valid. The maximum value of <spanx style="verb">K</spanx> is <spanx style="verb">kofn-CompositeThresholdMax</spanx>
          (15).</t>

<t>SIGNATURE:
          A digital cryptographic signature, making no assumptions
            about which algorithm.</t>

<t>STRIPPING ATTACK:
          An attack in which the attacker is able to downgrade the
          cryptographic object to an attacker-chosen subset of
          original set of component algorithms in such a way that
          it is not detectable by the receiver. For example,
          substituting a composite public key or signature for a
          version with fewer components.</t>

</section>
<section anchor="intro"><name>Introduction</name>

<t>When the trust in the cryptographic algorithms is not static (e.g., not
enough crypto-analysis has happened yet or a new threat is envisioned to
be deployable in the next future), there might be the need to combine
multiple algorithms together to provide different security properties.</t>

<t>Similar considerations apply to the deployment of certified algorithms
together with experimental or non-standard ones.</t>

<!-- An example of such a situation can be found in the planning for the transition
to post-quantum cryptography (PQ or PQC). While classic algorithms will still
be trusted for some time (but we do not know how much), there is uncertainty
as to the strength of the new cryptographic algorithms. Unlike previous
cryptographic algorithm migrations, the choice of when to migrate and which
algorithms to migrate to, is not so clear. This work provides a flexible
mechanism to provide crypto-agility and migration paths especially suited
for critical infrastructures and device networks. -->

<t>Even after a migration period, it may be advantageous for an entity
cryptographic identity to be composed of multiple public-key algorithms
where different security and non-security properties might be provided through
the use of hybrid solutions (multi-algorithms). In other words, this work
provides a flexible mechanism for crypto-agility and migration paths deployments
especially suited for critical infrastructures, device networks, and
environments where the use of multiple algorithms is required but no
change in the protocol is desired.</t>

<t>For further considerations on the challenges related to crypto-agility,
please refer to <xref target="I-D.ounsworth-pq-composite-keys"/>.</t>

<section anchor="algorithms"><name>Alternative Algorithms Support (k-of-n)</name>

<t>Although Composite cryptography and Hybrid solutions can be used in many
common use-cases to protect against algorithmic failures over time, there
are other use-cases that mandate for supporting crypto-interoperability to
continue to be able to operate old devices (e.g., not upgradable) when
deploying newer devices and crypto algorithms.</t>

<t>This is particularly true in environments where deployed devices might be
distributed in the field such as infrastructure&#39;s network elements (e.g.,
network routers, amplifiers, monitoring devices, cable modems, public access
points, etc.) and access to resources outside the managed network is highly
restricted (i.e., control interface traffic, not user-generated traffic).
The use of multi-algorithms provides a mechanism for enabling forward and/or
backward compatibility across devices with mixed upgrade capabilities.</t>

<!-- At a practical level this means that we need a mechanism to still be able to
validate Composite signatures even when not all algorithms are supported by
all devices.  -->

<t>This work introduces the concept of K-of-N threshold signatures which joins the
family of hybrid options such as the Explicit Composite signatures and KEMs.</t>

</section>
<section anchor="overview"><name>Differences between K-of-N Composite and Explicit Composite</name>

<t>K-of-N Composite keys and signatures work very similarly to Explicit Composite signatures.</t>

<t>When generating a K-of-N Composite key, the process used is the same as the one used
for the Explicit Composite case with the addition of required parameters that provide
the details for the algorithms and the individual component&#39;s details.</t>

<t>When generating a signature, the process used for K-of-N Composite signatures is exactly
the same as the one used in the Explicit Composite case.</t>

<t>When validating a signature, the K-of-N Composite signatures&#39; validation process
MAY differ from the Explicit Composite case when parameters are present in the K-of-N
Composite public key. In fact, as discussed in more details in a later Section, K-of-N Composite
keys use parameters to specify the number of component algorithms that are required
to be known by the crypto layer (and must validate correctly) and/or which components
are considered required and which ones can be skipped.</t>

<t>In other words, the K-of-N approach differs from the Explicit Composite crypto in that
it allows relying parties to perform the validation of a subset of signatures if and
only if the K-of-N parameter is present in the PublicKey (i.e., with the <spanx style="verb">K</spanx> value)
and up to <spanx style="verb">X</spanx> algorithms are unknown to the device. It is obvious that <spanx style="verb">X</spanx> must be
less then or equal to <spanx style="verb">K - N</spanx> .</t>

<t>One of the important aspect that is worth mentioning is that the K-of-N approach only
allows to skip validations of signatures if the specific component algorithm is not
supported and it does NOT allow to skip the validation of a known algorithm if the
signature is not correctly verified.</t>

<t>In this work, we define <spanx style="verb">N</spanx> the number of component key in the K-of-N Composite key, and
<spanx style="verb">K</spanx> the minimum number of component algorithms that must be supported by the cypto layer
(and successfully verified) for the K-of-N Composite signature to be considered valid.
The maximum allowed value for <spanx style="verb">N</spanx> is <spanx style="verb">MaxComponents</spanx> (16) and the maximum
allowed value for <spanx style="verb">K</spanx> is <spanx style="verb">MaxThreshold</spanx> (15). When <spanx style="verb">K</spanx> is used, it MUST be
less than <spanx style="verb">N</spanx> to allow for <spanx style="verb">N - K</spanx> algorithms to be skipped (if unknown).</t>

<!-- ## 1-threshold and K-threshold signature validation {#threshold}

The MultiKey approach defined in this document leverages the same procedures
and data structures defined for pk-Composite {{I-D.ounsworth-pq-composite-keys}} with the
addition of an optional public key parameter. This optional parameter carries
the `K` value that represents the total number of skipped or erroneous signature
validations.

In practice, the MultiKey approach can support different validation policies
based on the value of the optional key parameter. For example, by setting the
value to one (1) it is possible to require that at least one (1) component
signature is correctly validated, thus providing support for true alternative
signatures. When using values greater than one (1), MultiKey keys can support
K of N models where at least K successful validations MUST take place before
the Composite signature is considered valid.

In the rest of the section we focus on the description of private and public key
structures, while in the next section we focus on the changes in the validation
process when compared to signatures generated via Composite Keys. -->

</section>
</section>
<section anchor="sec_kofn_keys"><name>K-of-N Composite Keys</name>

<t>K-of-N Composite Crypto algorithm is identified by the <spanx style="verb">id-kofn-CompositeCrypto</spanx>
OID defined as follows:</t>

<figure><artwork type="ASN.1" name="id-kofn-CompositeCrypto OID definition" align="center"><![CDATA[
  id-kofn-CompositeCrypto OBJECT IDENTIFIER ::= {
      iso(1) identified-organization(3) dod(6)
      internet(1) private(4) enterprise(1) OpenCA(18227)
      Algorithms(2) PublicKey(1) Experimental(999)
      kofn-CompositeCrypto(2) }
]]></artwork></figure>

<section anchor="sec_kofn_priv_keys"><name>Private Keys</name>

<t>This section provides an encoding for K-of-N Composite private keys intended for PKIX
protocols and other applications that require an interoperable format for
transmitting private keys, such as PKCS #8 <xref target="RFC5958"/>, PKCS #12 <xref target="RFC7292"/>,
CMP <xref target="RFC4210"/>, or CRMF <xref target="RFC4211"/>.</t>

<!-- The format for the individual component key in a K-of-N Composite key is defined
by the algorithm OID that identifies the component key. The format of the K-of-N
Composite private key described in this section is meant to provide an interoperable
format that can be adopted and implemented across implementations. -->

<t>Although it is possible to use different types of storage for the individual components
of a K-of-N Composite key (e.g., certified key modules and non-certified key
modules), this document does not cover this use-case.</t>

<t>The K-of-N Composite private key data use the same structure as in CompositePrivateKey
where each component key is a OneAsymmetricKey <xref target="RFC5958"/> object:</t>

<figure><sourcecode type="ASN.1" name="K-of-N Composite Private Key ASN.1 structures"><![CDATA[
MaxComponents INTEGER ::= 16
      -- Maximum number of allowed components in a Key

MaxThreshold INTEGER ::= 15
      -- Maximum value for required algoritmic threshold

CompositeThreshold ::= INTEGER (1..MaxThreshold)
      -- Allowed value ranges for the K-of-N threshold (K)

kofn-CompositePrivateKey ::= SEQUENCE SIZE (2..MaxComponents)
  OF OneAsymmetricKey
]]></sourcecode></figure>

<t>The parameters field is of type <spanx style="verb">kofn-CompositeParams</spanx> and is defined as follows:</t>

<figure><sourcecode type="asn.1" name="K-of-N Composite Key Parameters ASN.1 structures"><![CDATA[
kofn-CompositeParams ::= SEQUECE {
  hashAlgorithm           AlgorithmIdentifier,
    -- Identifier for the hash algorithm used to pre-hash the message
  threshold               CompositeThreshold OPTIONAL,
    -- Number of required supported algorithms (must be less than N)
}
]]></sourcecode></figure>

<t>The use of any Composite or hybrid algorithm (e.g., the <spanx style="verb">pk-kofn-CompositePublicKey</spanx> or any
of the Explicit Composite algorithms defined in <xref target="I-D.ounsworth-pq-composite-sigs"/>) is NOT allowed as a
component of a <spanx style="verb">kofn-CompositePrivateKey</spanx>.</t>

<t>The order of the component keys MUST be the same as the order defined for the corresponding
public key components.</t>

<t>When a <spanx style="verb">kofn-CompositePrivateKey</spanx> is conveyed inside a OneAsymmetricKey structure
(version 1 of which is also known as PrivateKeyInfo) <xref target="RFC5958"></xref>, the <spanx style="verb">privateKeyAlgorithm</spanx>
field SHALL be set to <spanx style="verb">id-kofn-CompositeCrypto</spanx> value, the privateKey field SHALL contain
the <spanx style="verb">kofn-CompositePrivateKey</spanx> data. Associated public key material MAY be present in the
the <spanx style="verb">publicKey</spanx> field.</t>

<t>In some usecases the private keys that comprise a composite key may not be represented in a
single structure or even be contained in a single cryptographic module; for example if one
component is within the FIPS boundary of a cryptographic module and the other is not; see
{sec-fips} for more discussion. The establishment of correspondence between public keys in a
<spanx style="verb">kofn-CompositePublicKey</spanx> and <spanx style="verb">kofn-CompositePrivateKey</spanx> not represented in a single composite
structure is beyond the scope of this document.</t>

</section>
<section anchor="sec_kofn_pub_keys"><name>Public Keys</name>

<t>K-of-N Composite Public Keys are identified by the <spanx style="verb">id-kofn-CompositeCrypto</spanx> OID and the
associated definition of K-of-N Composite public key (<spanx style="verb">pk-kofn-CompositePublicKey</spanx>) is
provided as follows:</t>

<figure><artwork type="ASN.1" name="pk-kofn-CompositePublicKey-asn.1-structures" align="center"><![CDATA[
kofn-CompositePublicKeyParams ::= SEQUENCE {
  params                  kofn-CompositeParams,
  componentsParams        SEQUENCE SIZE (1..MaxComponents)
      OF AlgorithmIdentifier,
}

pk-kofn-CompositePublicKey PUBLIC-KEY ::= {
  id id-kofn-CompositeCrypto
  KeyValue pk-kofn-CompositePublicKey
  Params TYPE kofn-CompositePublicKeyParams ARE required
  PrivateKey kofn-CompositePrivateKey
}
]]></artwork></figure>

<t>The use of any Composite algorithms (e.g., the <spanx style="verb">pk-kofn-CompositePublicKey</spanx> or any of the
Explicit Composite algorithms defined in <xref target="I-D.ounsworth-pq-composite-sigs"/>) is NOT allowed as a component
of a <spanx style="verb">pk-kofn-CompositePublicKey</spanx>.</t>

</section>
<section anchor="sec_kofn_keygen"><name>Key Generation</name>

<t>The <spanx style="verb">KeyGen() -&gt; (pk, sk)</spanx> is defined as a probabilistic key generation algorithm,
which generates a public key pk and a secret key sk.</t>

<t>The <spanx style="verb">KeyGen() -&gt; (pk, sk)</spanx> of a composite algorithm performs the <spanx style="verb">KeyGen()</spanx> of the
respective component signature algorithms and it produces a composite public key <spanx style="verb">pk</spanx>
as per <xref target="sec_kofn_pub_keys"/> and a composite secret key <spanx style="verb">sk</spanx> is per <xref target="sec_kofn_priv_keys"/>.</t>

</section>
</section>
<section anchor="sec_kofn_sigs"><name>K-of-N Composite Signatures</name>

<t>A K-of-N Composite signature allows two or more underlying signature algorithms to be combined
into a single cryptographic signature operation and can be used for applications that require
signatures. In this section, we detail the K-of-N Composite signature definition and two associated
algorithms for signature generation and validation.</t>

<t>Although K-of-N Composite signatures are defined as a sequence of component signatures, as detailed
in many parts of this document and in alignment with Explicit Composite processes, the sign and
verify algorithms are to be considered as a single atomic operations.</t>

</section>
<section anchor="sec_kofn_sig_structs"><name>Signature Data Structures</name>

<t>The <spanx style="verb">kofn-CompositeSignatureParams</spanx> and <spanx style="verb">sa-kofn-CompositeSignature</spanx> structures are defined as follows:
<!-- The `sa-kofn-CompositeSignature` structure is defined as follows: --></t>

<figure align="center"><sourcecode type="ASN.1" name="sa-kofn-CompositeSignature-asn.1-structures"><![CDATA[
kofn-CompositeSignatureParams ::= SEQUENCE {
  componentsParams    SEQUENCE SIZE 
      (1..MaxComponents) OF AlgorithmIdentifier,
  hashAlgorithm   OBJECT IDENTIFIER OPTIONAL,
}

kofn-CompositeComponentSignatureValue ::= SEQUENCE 
    SIZE (1..MaxComponents) OF BIT STRING
 
sa-kofn-CompositeSignature SIGNATURE-ALGORITHM ::= {
      IDENTIFIER id-kofn-CompositeCrypto
      VALUE kofn-CompositeSignatureValue
      PARAMS TYPE kofn-CompositeSignatureParams ARE optional
      PUBLIC-KEYS { pk-kofn-CompositePublicKey }
      SMIME-CAPS { IDENTIFIED BY id-kofn-CompositeCrypto }
}
]]></sourcecode></figure>

<t>When a K-of-N Composite Public Key has no defined <spanx style="verb">hashAlgorithm</spanx> parameter, the signer MUST
include the <spanx style="verb">hashAlgorithm</spanx> parameter in the <spanx style="verb">kofn-CompositeSignatureParams</spanx> structure to
specify which hash algorithm was used to pre-hash the message before signing as described in
<xref target="sec_kofn_sigs"/>.</t>

<t>When a K-of-N Composite Public Key has the <spanx style="verb">hashAlgorithm</spanx> parameter defined, the signer MUST
NOT include the <spanx style="verb">hashAlgorithm</spanx> parameter in the <spanx style="verb">kofn-CompositeSignatureParams</spanx> structure.</t>

<t>In case both the K-of-N Composite Public Key and the <spanx style="verb">kofn-CompositeSignatureParams</spanx> structure
contain the <spanx style="verb">hashAlgorithm</spanx> parameter, the verifier MUST ignore the <spanx style="verb">hashAlgorithm</spanx> parameter
from the <spanx style="verb">kofn-CompositeSignatureParams</spanx> structure and use the one from the K-of-N Composite
Public Key.</t>

<section anchor="sec_kofn_processes"><name>Cryptographic Primitives</name>

<t>In this section we define K-of-N Composite Signatures as a cryptographic primitive that consists
of three algorithms. The first one is the <spanx style="verb">kofn-KeyGen()</spanx> and is defined in <xref target="sec_kofn_keys"/>.</t>

<t>The remaining two algorithms are the <spanx style="verb">Sign()</spanx> and <spanx style="verb">Verify()</spanx> algorithms, which are defined in
<xref target="sec_kofn_sign"/> and <xref target="sec_kofn_verify"/> respectively and can be summarized as follows:</t>

<t><list style="symbols">
  <t>kofn-Sign(sk, Message) -&gt; (signature): A signing algorithm which takes
as input a secret key sk and a Message, and outputs a signature.</t>
  <t>kofn-Verify(pk, Message, signature) -&gt; true or false: A verification algorithm
which takes as input a public key, a Message, an optional hashing algorithm,
and a signature and outputs true if the signature and public key can be used
to verify the message.  Thus it proves the Message was signed with the secret
key associated with the public key and verifies the integrity of the Message.
If the signature and public key cannot verify the Message, it returns false.</t>
</list></t>

</section>
<section anchor="sec_kofn_sign"><name>The kofn-Sign() primitive</name>

<t>When using K-of-N Composite Private Keys to generate signatures, the process is
the same as in the Explicit Composite case (see section 5.1 of <xref target="I-D.ounsworth-pq-composite-sigs"/>).</t>

<t>Specifically, the generation of a K-of-N Composite signature involves pre-hashing
the message to be signed with key-binding data to provide non-separability properties
for the signature, and then applying each component algorithm&#39;s signature process to
the modified input message according to its specification. Each component signature value
is then placed into the CompositeSignatureValue structure defined in <xref target="sec_kofn_sig_structs"/>.</t>

<t>The following process is used to generate composite signature values.</t>

<figure title="K-of-N Composite Sign(sk, Message)" anchor="kofn-composite-sign"><artwork><![CDATA[
kofn-Sign (sk, Message) -> (signature)
Input:
    K1..KN             Signing private keys for each component. See note below on 
                        composite inputs.  

    A1..AN             Component signature algorithms. See note below on 
                        composite inputs.

    Message            The Message to be signed, an octet string
    
    HASH               The Message Digest Algorithm used for pre-hashing.  See section
                        on pre-hashing below.
    
    OID                The Composite Signature String Algorithm Name converted
                        from ASCII to bytes.  See section on OID concatenation
                        below.                 

Output:
    signature          The composite signature, a CompositeSignatureValue

Signature Generation Process:

  1. Compute a Hash of the Message
  
        M' = HASH(Message)
        
  2. Generate the n component signatures independently,
      according to their algorithm specifications.

        S1 := Sign( K1, A1, DER(OID) || DER(kofn-CompositeKeyParams) || M' )
        ...
        SN := Sign( KN, AN, OID || M' )

  3. Encode each component signature S1..SN into a sequence of BIT STRING
      according to its algorithm specification.

        signatureComponent ::= BIT STRING

        signature ::= SEQUENCE (1..N) OF signatureComponent

  4. Output signature
]]></artwork></figure>

<t>Note on composite inputs: the method of providing the list of component keys and algorithms
is flexible and beyond the scope of this pseudo-code.  When passed to the <spanx style="verb">Composite Sign(sk, Message)</spanx>
API the <spanx style="verb">sk</spanx> is a <spanx style="verb">kofn-CompositePrivateKey</spanx>. It is possible to construct a <spanx style="verb">kofn-CompositePrivateKey</spanx>
from component keys stored in separate software or hardware keystores. Variations in the process
to accommodate particular private key storage mechanisms are considered to be conformant to this
document so long as it produces the same output as the process sketched above.</t>

<t>Since recursive composite public keys are disallowed, no component signature may itself be a composite
of any kind (K-of-N or Explicit); this means that the signature generation process MUST fail if one
of the private keys K1..KN is a composite.</t>

<t>A composite signature MUST produce, and include in the output, a signature value for every component key
in the corresponding <spanx style="verb">kofn-CompositePublicKey</spanx>, and they MUST be in the same order; ie in the output, S1
MUST correspond to K1, S2 to K2, ..., and SN to KN.</t>

</section>
<section anchor="sec_kofn_verify"><name>The kofn-Verify() primitive</name>

<t>When validating composite signatures generated via <spanx style="verb">id-kofn-CompositeCrypto</spanx>
algorithm, the validation procedures, when compared to the Explicit Composite,
are modified to allow for a well-defined number of component signatures
validation failures to occur before failing the validation of the composite
signature as a whole.</t>

<t>The possibility to be able to still consider a composite signature valid
in the presence of unsupported algorithms is a useful feature for
guaranteeing the interoperability of newer devices with older ones that
might not be able to correctly process all the algorithms (but they can
still validate a subset of them).</t>

<t>In fact, when validating signatures generated via MultiKey keys, the
total number of successful component signature validations shall be equal
or greater than the public key parameter <spanx style="verb">K</spanx> (when present). After that,
additional component signatures&#39; validations may be skipped, if and only
if the algorithm is unknown to the crypto layer, without impacting the
validity of the whole composite signature. If any of the signatures of
supported algorithms should fail the validation, the K-of-N Composite
signature validation MUST fail, independently of the value of <spanx style="verb">K</spanx>.</t>

<t>When the public key parameter <spanx style="verb">K</spanx> is absent or its value is set to the
number of components in the signing key (i.e., <spanx style="verb">K = n</spanx>), the validation
process for MultiKey and Composite are the same as they both require the
successful validation of all the signatures.</t>

<t>When the public key parameter <spanx style="verb">K</spanx> is set to one (<spanx style="verb">1</spanx>), the validation
process for K-of-N Composite signatures provides support for fully
alternative signatures where a single successful component signature&#39;s
validation validates the whole composite signature.</t>

<t>When compared to the composite signatures&#39; validation process, we modify
the for..loop cycle where the invalid signature output is not emitted
if the algorithm is unknown, but only if the number of unsupported
algorithms is greated than the value <spanx style="verb">N - K</spanx>.</t>

<t>The second optimization allowed by MultiKey keys is to be able to consider
a composite signature successful right after at least <spanx style="verb">K</spanx> successful
component signatures&#39; validations, without the need for even attempting
at performing the remaining ones.</t>

<t>The Input and Output definitions are the same as defined in the Explicit
Composite case:</t>

<figure anchor="kofn-verify-process"><artwork align="center" name="K-of-N Validation Process"><![CDATA[
Input:
     P1, P2, .., Pn    Public verification keys. 

     HASH              The Message Digest Algorithm used for pre-hashing.  See section
                       on pre-hashing below.

     M                 Message
     
     S1, S2, .., Sn    Component signature values.
     
     A1, A2, ... An    Component signature algorithms.

Output:

    Validity (bool)    "Valid signature" (true) if the composite 
                        signature is valid, "Invalid signature" 
                        (false) otherwise.
]]></artwork></figure>

<t>The following process is used to perform composite signatures verification
with a K-of-N Composite algorithm:</t>

<figure anchor="kofn-comp-verify"><artwork align="center" name="K-of-N Composite Signatures Verify Process"><![CDATA[
1. Check keys, signatures, and algorithms for consistency.

   If Error during desequencing, or the three sequences
   have different numbers of elements, or any of the public
   keys P1, P2, .., Pn or algorithm identifiers A1, A2, ..,
   An are any type of composite (i.e., k-of-n or explicit)
   then output "Invalid signature" and stop.

2. Construct the modified message M' to be used for the validation
   process with each component signature.

       M' = HASH(Message)

   Set the initial counter `X` to zero to indicate the number
   of unsupported algorithms encountered during the validation
   process.

3. Process each signature component in order, from S1 to Sn 
   as follows:
    
   3.a Check the support for each component of the signature against
       the number of required supported algorithms (`threshold`).

       If the public key parameter `threshold` is NOT set and the
       component signature algorithm is not supported, the validation
       fails, output "Invalid signature" and stop.
        
       If the public key parameter `threshold` is set and the component
       signature is not supported, the counter `X` is incremented. If `X`
       is greater than `N - K`, the validation fails, output "Invalid
       signature" and stop.
        
       If a component signature is not supported and the corresponding
       `isRequired` field of the associated `kofn-CompositeComponentKeyParams`
       is present and set to `TRUE`, the validation fails, output
       "Invalid signature" and stop.

   3.b Check each component signature individually, according to
       its algorithm specification.

           Result := Verify(Kx, Ax, DER(OID) || DER(kofn-CompositeKeyParams) || M')

       If any of the component signatures S1, S2, .., Sn is not
       correctly validated according to the component's algorithm,
       the validation fails, output "Invalid signature" and stop.

4. Output "Valid signature"
]]></artwork></figure>

</section>
</section>
<section anchor="sec-deprecation"><name>Algorithm Management</name>

<t>Traditionally, a public key, certificate, or signature contains a single
cryptographic algorithm. To revoke such a certificate due to algorithm
depecation we still need to use serial-number-based revocations.</t>

<t>However, in a Composite environment (e.g., supported via Explicit Composite,
K-of-N Composite, or other Hybrid approaches), it might be possible to deprecate
an entire algorithm and still be able to securely continue performing
authentications and validations instead of revoking (or simply distrust)
the entire infrastructure (and without adding every single certificate
that relies on the deprecated algorithm on the revocation list).</t>

<t>By integrating the concept of deprecated algorithms, in the K-of-N case
it is possible to dynamically switch among which algorithms are going to
be used for signature validations by informing the validating entity about
the OIDs of the individual algorithms that are considered &quot;failures&quot;.</t>

<t>Additionally, by integrating the concept of required algorithms, in the
K-of-N case it is possible to make sure that specific algorithms are
always required to be supported by the validating entity. This could be
the case, for example, when the trust in one of the algorithm might be
higher (e.g., certified and/or longer crypto-analysis history).</t>

<!-- In fact, the validating entity can automatically "fail" the validation of
component signatures that match any value present in the list of revoked
algorithms, exactly in the same fashion as when the algorithm is not
supported in the first place. -->

<section anchor="validation_policy"><name>Validation Policy and Revocation Information</name>

<t>As we just mentioned, in multi-algorithm environments, there are situations
where the validation of a component signature that carries a deprecated
algorithm identifier might still be allowed, e.g. when at least another
<spanx style="verb">K</spanx> algorithms validate correctly. In a K-of-N environment, this means that
the device does not need to be re-provisioned (or replaced) and can continue
to operate by relying on the non-deprecated algorithm(s).</t>

<t>On top of that, there are also typical use-cases where the deprecation
of an algorithm is paramount to make sure that authentications do not
rely only on deprecated algorithms. This is the case, for example, when
older devices that can only successfully validate one algorithm from a
composite signature (e.g., it can validate RSA signatures but no other)
are still part of the network. When the only algorithm that they can use
is deprecated, validation of composite signature MUST fail.</t>

<t>The list of deprecated algorithms that are to be considered automatic
validation &quot;unknowns&quot; can be directly configured as a parameter in the
validating entity&#39;s process, or by accessing a trusted source of
information such as a trusted Certificate Revocation List (CRL) or Online
Certificate Status Protocol (OCSP) response.</t>

<t>Similarly, the list of required algorithms that cannot be skipped,
even if not supported by the device can be directly configured as a
parameter in the validating entity&#39;s process, or by accessing a trusted
source of information such as a trusted Certificate Revocation List (CRL)
or Online Certificate Status Protocol (OCSP) response.</t>

</section>
<section anchor="deprecated_key_types"><name>The <spanx style="verb">DeprecatedKeyTypes</spanx> extension</name>

<t>In an ecosystem such as the Internet PKI or IoT PKIs, since algorithm
deprecation can be seen as another form of (mass) revocation, a convenient
mechanism to distribute the list of deprecated algorithms by adding a
specific extension to Certificate Revocation Lists <xref target="RFC5280"/> or Online
Certificate Status Protocol <xref target="RFC6960"/> responses.</t>

<t>We define a new <spanx style="verb">DeprecatedKeyTypes</spanx> extension together with the
associated <spanx style="verb">id-ce-deprecatedKeyTypes</spanx> identifier. The data structure
of the extension is defined as a <spanx style="verb">SEQUENCE</spanx> of <spanx style="verb">OBJECT IDENTIFIER</spanx>. The
corresponding ASN.1 structures are defined as follows:</t>

<figure><sourcecode type="ASN.1"><![CDATA[
id-ce-deprecatedKeyTypes OBJECT IDENTIFIER ::= { 
      iso(1) identified-organization(3) dod(6) 
      internet(1) private(4) enterprise(1) OpenCA(18227)
      Extensions(3) deprecated-algs (2) }

DeprecatedKeyTypes ::= SEQUENCE SIZE (1..MaxThreshold) 
      OF OBJECT IDENTIFIER
]]></sourcecode></figure>

<t>When this extension is present in a CRL or OCSP response, the validating
party MUST consider the algorithms listed in the extension as &quot;unknown&quot;,
even in the case where the algorithm is supported by the device. At a
practical level, this means that the validation of a component signature
that carries a deprecated algorithm identifier MUST fail if the threshold
(or K-of-N) validations is not met because of the deprecation of algorithms.</t>

<t>For example, let&#39;s imagine a K-of-N Composite key that combines AlgorithmA
and AlgorithmB together. Let&#39;s also imagine that a device can only validate
AlgorithmA and does not have support for AlgorithmB. If the K-of-N threshold
is set to <spanx style="verb">1</spanx>, then the device can still validate the composite signature
since it can still rely on AlgorithmA. However, if AlgorithmA is deprecated
via the <spanx style="verb">DeprecatedKeyTypes</spanx> extension, then the validation MUST fail
because the device can no longer rely on AlgorithmA.</t>

</section>
<section anchor="required_key_types"><name>The <spanx style="verb">RequiredKeyTypes</spanx> extension</name>

<t>When backward or forward compatibility is required, it might be useful to
provide the possibility to pin specific algorithms to be required to be
supported during signature and validations processes.</t>

<t>For example, when a K-of-N is used with <spanx style="verb">N = 3</spanx> and <spanx style="verb">K =2</spanx>, there migth be
requirements to make sure that one of the two required algorithms to be
validated is a specific one (e.g., AlgorithmA).</t>

<t>To handle this situation, we define a new <spanx style="verb">RequiredKeyTypes</spanx> extension,
together with the associated <spanx style="verb">id-ce-requiredKeyTypes</spanx> identifier, that can
be added to Certificate Revocation Lists <xref target="RFC5280"/>, Online Certificate Status
Protocol <xref target="RFC6960"/> responses.</t>

<t>We define a new <spanx style="verb">RequiredKeyTypes</spanx> extension together with the
associated <spanx style="verb">id-ce-requiredKeyTypes</spanx> identifier. The data structure
of the extension is defined as a <spanx style="verb">SEQUENCE</spanx> of <spanx style="verb">OBJECT IDENTIFIER</spanx>. The
corresponding ASN.1 structures are defined as follows:</t>

<figure><sourcecode type="ASN.1"><![CDATA[
id-ce-requiredKeyTypes OBJECT IDENTIFIER ::= { 
      iso(1) identified-organization(3) dod(6) 
      internet(1) private(4) enterprise(1) OpenCA(18227)
      Extensions(3) required-algs (3) }

RequiredKeyTypes ::= SEQUENCE SIZE (1..MaxThreshold) 
      OF OBJECT IDENTIFIER
]]></sourcecode></figure>

</section>
</section>
<section anchor="sec-iana"><name>IANA Considerations</name>

<t>No IANA actions are required by this document.</t>

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

<t>TBD.</t>

</section>
<section anchor="contributors-and-acknowledgements"><name>Contributors and Acknowledgements</name>

<t>This document incorporates contributions and comments from a large group of experts. The Editors would especially like to acknowledge the expertise and tireless dedication of the following people, who attended many long meetings and generated millions of bytes of electronic mail and VOIP traffic over the past year in pursuit of this document:</t>

<t>Serge Mister (Entrust),
Scott Fluhrer (Cisco Systems),
Klaus-Dieter Wirth (D-Trust), and
Francois Rousseau.</t>

<t>We are grateful to all, including any contributors who may have
been inadvertently omitted from this list.</t>

<t>This document borrows text from similar documents, including those referenced below. Thanks go to the authors of those
   documents.  &quot;Copying always makes things easier and less error prone&quot; - <xref target="RFC8411"/>.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&I-D.ounsworth-pq-composite-keys;
&I-D.ounsworth-pq-composite-sigs;
<reference anchor="X.690" >
  <front>
    <title>Information technology - ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
    <author >
      <organization>ITU-T</organization>
    </author>
    <date year="2015" month="November"/>
  </front>
  <seriesInfo name="ISO/IEC" value="8825-1:2015"/>
</reference>
&RFC2119;
&RFC8174;
&RFC5280;
&RFC5958;
&RFC7292;
&RFC4210;
&RFC4211;
&RFC6960;
&RFC8411;


    </references>

    <references title='Informative References'>

&I-D.driscoll-pqt-hybrid-terminology;


    </references>


<section anchor="asn1-module"><name>ASN.1 Module</name>

<figure><sourcecode type="ASN.1"><![CDATA[
kofn-Composite-Crypto-2023
  { joint-iso-itu-t(2) country(16) us(840) organization(1) OpenCA(18277) 
    Algorithms(2) PublicKey(1) kofn-CompositeCrypto(2) }

DEFINITIONS IMPLICIT TAGS ::= BEGIN

EXPORTS ALL;

IMPORTS
  PUBLIC-KEY, SIGNATURE-ALGORITHM, AlgorithmIdentifier{}
    FROM AlgorithmInformation-2009  -- RFC 5912 [X509ASN1]
      { iso(1) identified-organization(3) dod(6) internet(1)
        security(5) mechanisms(5) pkix(7) id-mod(0)
        id-mod-algorithmInformation-02(58) }

  SubjectPublicKeyInfo
    FROM PKIX1Explicit-2009
      { iso(1) identified-organization(3) dod(6) internet(1)
        security(5) mechanisms(5) pkix(7) id-mod(0)
        id-mod-pkix1-explicit-02(51) }

  OneAsymmetricKey
    FROM AsymmetricKeyPackageModuleV1
      { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
        pkcs-9(9) smime(16) modules(0)
        id-mod-asymmetricKeyPkgV1(50) } 
       
;       
        
--
-- Object Identifiers
--

-- Defined in ITU-T X.690
der OBJECT IDENTIFIER ::=
  {joint-iso-itu-t asn1(1) ber-derived(2) distinguished-encoding(1)}

id-kofn-CompositeCrypto OBJECT IDENTIFIER ::= {
  iso(1) identified-organization(3) dod(6)
  internet(1) private(4) enterprise(1) OpenCA(18227)
  Algorithms(2) PublicKey(1) Experimental(999)
  kofn-CompositeCrypto(2)
}

id-ce-deprecatedKeyTypes OBJECT IDENTIFIER ::= { 
  iso(1) identified-organization(3) dod(6) 
  internet(1) private(4) enterprise(1) OpenCA(18227)
  Extensions(3) deprecated-algs (2) 
}

id-ce-requiredKeyTypes OBJECT IDENTIFIER ::= { 
  iso(1) identified-organization(3) dod(6) 
  internet(1) private(4) enterprise(1) OpenCA(18227)
  Extensions(3) required-algs (3)
}

--
-- Constants
--

MaxComponents INTEGER ::= 16
      -- Maximum number of allowed components in a Key

MaxThreshold INTEGER ::= 15
      -- Maximum value for required algoritmic threshold

CompositeThreshold ::= INTEGER (1..MaxThreshold)
      -- Allowed value ranges for the K-of-N threshold (K)

--
-- Private Keys
--

kofn-CompositePrivateKey ::= SEQUENCE SIZE (2..MaxComponents)
  OF OneAsymmetricKey

kofn-CompositeParams ::= SEQUECE {
  hashAlgorithm           AlgorithmIdentifier,
    -- Identifier for the hash algorithm used to pre-hash the message
  threshold               CompositeThreshold OPTIONAL,
    -- Number of required supported algorithms (must be less than N)
}

--
-- Public Keys
--

kofn-CompositePublicKeyParams ::= SEQUENCE {
  params                  kofn-CompositeParams,
  componentsParams        SEQUENCE SIZE (1..MaxComponents)
      OF AlgorithmIdentifier,
}

pk-kofn-CompositePublicKey PUBLIC-KEY ::= {
   id id-kofn-CompositeCrypto
   KeyValue pk-kofn-CompositePublicKey
   Params TYPE kofn-CompositePublicKeyParams ARE required
   PrivateKey kofn-CompositePrivateKey
}

--
-- Signature Algorithm
--

kofn-CompositeSignatureParams ::= SEQUENCE {
  componentsParams    SEQUENCE SIZE 
      (1..MaxComponents) OF AlgorithmIdentifier,
  hashAlgorithm   OBJECT IDENTIFIER OPTIONAL,
}

kofn-CompositeComponentSignatureValue ::= SEQUENCE 
    SIZE (1..MaxComponents) OF BIT STRING
 
sa-kofn-CompositeSignature SIGNATURE-ALGORITHM ::= {
      IDENTIFIER id-kofn-CompositeCrypto
      VALUE kofn-CompositeSignatureValue
      PARAMS TYPE kofn-CompositeSignatureParams ARE optional
      PUBLIC-KEYS { pk-kofn-CompositePublicKey }
      SMIME-CAPS { IDENTIFIED BY id-kofn-CompositeCrypto }
}

--
-- Extensions
--

DeprecatedKeyTypes ::= SEQUENCE SIZE (1..MaxThreshold) 
      OF OBJECT IDENTIFIER

RequiredKeyTypes ::= SEQUENCE SIZE (1..MaxThreshold) 
      OF OBJECT IDENTIFIER

END

]]></sourcecode></figure>

</section>
<section anchor="intellectual-property-considerations"><name>Intellectual Property Considerations</name>

<t>The following IPR Disclosure relates to this draft:</t>

<t><list style="symbols">
  <t><eref target="https://datatracker.ietf.org/ipr/3588/">https://datatracker.ietf.org/ipr/3588/</eref></t>
</list></t>

<section anchor="making-contributions"><name>Making contributions</name>

<t>Additional contributions to this draft are welcome. Please see the working copy of this draft at, as well as open issues at:</t>

<t><eref target="https://github.com/EntrustCorporation/draft-klaussner-pala-composite-kofn">https://github.com/EntrustCorporation/draft-klaussner-pala-composite-kofn</eref></t>

<!-- End of Contributors section -->

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+1963LbSJbm/3yKHPlHkRskLanKVbZqaqJpSXaxZV1alN1V
OzFRAklQRAkE2AAome1xx77DPsDuv32PnTfZJ9lzyxsA0nZN9+7ORjv6IpJA
IvPkyXO+c0W/31dVUqXxkb7v5/N+po/z5SovkyrW4+Qui6p1EZd6nhf6fJ1W
SX+Y3uVFUi2W+upspKLJpIgfdt6rZvk0i5bwgFkRzav+Kkqj/n0arcsyi4v+
1NzSv8/nWX//QKkn+h//od/XZRVls1+iNM/g3qpYx7rf/yeVrAr6VFaH+/sv
9g9VVMTRkR7H0zVMa6Me7470m+H51VjdPx7pUVbFRRZX/RN8tppG1RGMO1Pl
erJMyjLJs5vNCoYfnd68Umqaz5IM7l+X/aicJolaJUca/j3R0yiDb2MdFUW0
0Z1krqM01Zu47GqgzCIqF3oRF7HSusqnR/gD/FnmRVXE8/KIhpjF8wgoWMIV
5vfNkn/GjypaV4u8OFL4wD79r9ZJBr+eD/QV0Ey+mq/TlMl5HsEClkmaRFnu
X5EXsITjaJLGb6JJCSSYDuQXs1v2R/m+hGnGQJnnz57DFkapPobP9/o4KeSC
KVAWyJqvk/IhSdO4B5eleRHNcnNBvs6qAq55m8FWzvS4iipgm3yuh8u4SKaR
vW4GM3++v3/4nXwTL6MkBd5Iinha5cXv8lWcTaMBLKJJid8P9Bkwzr/9N2Cc
Bjl+D1tU/5V28VXjEuI8n1on/RvkKP16OfkxnNevUTawzPq7WZ84bwAcVSPd
Wb5cArtGwG8ZfDfQB8+CJR/sv/j2RUDNl3GRJlmdfq/jAsbZtHLB5TorH4Gn
FvK9sEFyHzd+olWdZjRb/Qa4BDalxgTya20dh8/29/U4T2Etlb7Oo5n+X//l
v+rxGs/0wf5+sILLqooeo56+zKqoSBqscBxl0Szc+LPDM/3162chiZewgEFu
FvC7mOc1AMGgWlngNRzBgAK/zxeZ/+1/pMX/CnMf3MHcw3VnObBBlTzEKA9G
/RNHn/7qT77MjDdAFPv5F/y8+44yuQvuwM9wx0+Db1/sH8ncRCHsjbI5zyPP
dBVPFxkc+ruN7uvh+GJwoOGgksDU1+s0hkHHq3iazOGw0w1w9l9GZTIFWvuX
6c7L0+tuDwmUZ3Bt2vj9GH7XsAX6JCkr+B6EzgJESv2yE7hsTyY8A2lzpC/y
h3g5iQt9uG9Pny9VLW+Mbt72b8zeg3iKywRW6i4ajS+fjk6PQVA9P3zWPzii
8VRiqOF2ZVYk5TRPUyBx1V9sJkUCEgJOcMKUOtKrP/3ifVaqD3oN5G5VRNNK
qT+CHtXVItZZDAsEvRA/5OlDTF9Ni82qyoEzVosNqp4Z8D9cMgP1E61WqVC5
7IFeeUimMfyBJAPBBHt+D58q1Eegr2JN8qScxhnyaakf6Qd8BCo02KVIw/Lv
0rgfWdWelDrLK12u57CdCXDmQL8CPRe/j5YrlP48+DK5W1R6QoMpWgLCBPi2
iHDf4JfqMY5h1o+wsve8mdo+pITfp5Gdw2Mc3ccZXgEf4whkI2zkXQxSlxeq
O/HgbtDT8yJf6mmKum+q4HFAylmCVwAnAQWBq6v+n9Ygh9dLVM3yZ7+M5nF3
oIewLJi7WYksIckc3c1WgPqqeihzqjia9XhLolU0AX1bAcMomKVQXj8kEV0O
AAd4oyhxJ57Cs4HB+wRiomLmrdvNAi7e4FFcwnGZRkAJoLs/B/hpkmSxmsZF
BQcLvgy4QijyanQ17upH5KUsfoRhPRJXi6giJsDt3MSVdkMh7fxfVyD2MhCU
uIdyFfPYQKmbBcwMGQsIBwpuxtPMV7wzqyJ/SGYw5GSjT98jbyaVg4LIoXNY
BTHwhw/9UPR8/NjD23gI4g+1BEkTZUm5RBIA80Z3sZ5E0/tHImNGXEZ/40gw
Q9qSDe2CwNDSgE/9EKXJjOURPGIazxCRmgUBMF0vgbnNAnhVNNvEiLAIaaor
AIn4CX8nmGpXd7WewHrP4g3NLPzNYmD1uEimC6I0zOcOafFojr57XGmeAFME
SYpyBjXTeuogeJO6bRSF9RGAPoUZIQITeUPwmSTQMpnN0hiB9o0TTvrDE09U
fUQawWJhYbDvsOF752/HN3s9/n99cUl/X5/+4e3o+vQE/x7/OHzzxv6h5Irx
j5dv35y4v9ydx5fn56cXJ3wzfKuDr9Te+fDnPRZqe5dXN6PLi+GbPZKBwdYh
TYFNQAglCPVXRYzwMwKrIy6nRTJhtnt5fPU///vBN0Csf7h+dXx4cPDi40f5
8Pzgu2/gA0jFjJ+WZ+lGPsJmbBRIWxBHOApCfpABSRWlKG5LXS7yx4yA/wCp
BQeYabVEIZ2WuXb3hrMG3JfmeFTp1MNIcPjgolMQw6DseJQeKgq8GGaRoDAR
3aOXcYRyEtm4xsfw9xT4CCQtfrIs5m2rdxYVcE6onoBzwFrQ0YwFKgu9Oai3
/BFPpq/I4Emkk6pFka/vFvm6Cld4pNTwzevL69HNj+dOr2o91EYgJn8OxRkA
hVWBWA2WSMR9jIHcUendDHpMkId3LFBWiuaxeAROfIR76d27jKuIvpbrgWdQ
9eAKrbgc6Do5vQFwcqBAUxTY2RSNSjnEnrTFSYAsma2nNIvkDlnFG8PKJdw7
gEE+ZbZjJSRGIEIJq9ExhwNzdXlxenGjt1GbNDuITxzc6XeWR8wuVZSYtSCP
e7dbueKRyH/m2enP/tMus5hvyZB4IsucoAIZWUMRYI1dj4e94Jnnb/on4yEq
p0i/uqC/QQaZx45HN6dblpq1LQ+gTfynNfAFS2/AIQhQ8sKbqM9fdid7DZqX
8fQXlO6EsJn2b0ZAhHAOG7D559UjCSXUrQnKgnvcT4tzQpantbkRiP+SbJqu
URtFxDBx0UOggEob/oK14AD45yyWP2EyJyEz7UTO29np6mzkj8K6DTcOxMK8
iOypa5IHJemzw+cyzOX4pv+Ht8OLm7fn23ZrUyNEy+ZNYsCAD3xWJ6QVExQe
/o4hRmIoCOgPhbdBfjQ4QId0Azf1AMii+i3D4+6f7kmM9CHhOQNxzvLEiSpG
EIBTLkbjG1zh25dvRsf6qb66Hr0bAk/WjgKqzhVTD2cFsuMBLBQAp4XFFcCv
5WYJYqmAiwJaeOMAe/QMB2WgTspyvRTQFU1Q6Aqw8I7nGUKgi1AKNGBRYpiL
PxpeJbSk0bll9GAy989HpdMYuEDfm9OdeQfeCTdSyuV6hcuNZzCnizptsjXZ
aTBK6/0ohzQvxH2N0jn2JXr0PlnCVsOk13S2bi9ucRG3IQg7Ng8oz6P3t7pz
8G0XqfSFMyIKLdGfMPGW5o3RQZJN8wK9WEA3wZ3xrIuLAXUOY88JcceN3Qj5
eSKglZbbssiztkXeLGCSizyd4Rr9WR08w9WOR68vhjdvr09DthAFVTuJdl5b
OM8bQm/lwvHN9ejqanTxWg9vbobHZ3VRXVUA6JE0fCudS/oO6ITMOUkJ1s0A
X8G8ZmxiuiHCGeeTX4HqeH2U2WH600UO8Ak2C1AUqiPvdpjmXYIGI//ibbmn
zJNMxIZ+BDiHDOCNkFTGRp4B4JxWNOHJRuD7NEY7MNR2PgyAKVVJtWZ72FOz
IjIQdKP4secTOcdXkmhkohwh/DEnm88uAaHFE/R7Ew4hcfPhSYIfAdL/cYHm
OEJC8o0lWd3V4Evi0roBKpB/U2NuwjcqzhD1yY19I2fRDw7/BcyLegGtTVLj
ZEABg7KMibOHBCdPcl1N0ABapfmGCCjzycDI1PM1Lr3b5mto2MdLjEygOe9b
vvldTEY2OgXYvgOGn89hMDzaEi7An1Zo7BIkG6M7PSqsHhDPA/pbNuQTWJjp
LgXiOHPaUyv20bQ/8Xt4QII3AMPVvQJAh9KYa3AujFsCRhbeA75Ys/bBEMQE
eWGdzQylyGZHLjKyBQw9mDper+rOkNB1cPUHnMvVH467A/3HRQLPFEXq0/Ax
AQgOrJqmuFHEM0Y15kv4AlalOxMUAECXnHjlPssfNZhFICynC7t7aC4gaEas
WYFJVRpqouc1uwMqGYUCvLKNHQf6bZaisxuMvIckX5dqG4QQFxS5x4jBF3nC
EPCRDkAuV8Sk6EgEqYB17O9V3rOnALEGWHNiJZA3xDoOIj1P4/cJMHHovjCc
Z07KHfsq8LF2knoVVQs4GGj0J2BjAohck8uaPDEwJ0I3SYDAyMckDijr9Buw
hX/6AGuM5hV6gvynABfmsx6KLrRPYUOj2QOwRnQXAy1ZxgAHZhVG0ULKwgro
a9FPLLBici7Yo8eyCx3S/lFgZ2PLuSNnJZ6E5kF0Z906lsTMVJ7Xkr2tsCvp
WvyDNBXnxCy7ZM2yp00s6srsnGrZOe12jin/yS1zsqBUje3Tu7avV9878j0o
FI5FntGITUdtm5iD9RRg4iSIWfEkZrnCRdxZYQoLrfJpnuKVsF68EAQOaqb5
uiDa1KRdLkphAWuBsxnjA1KEMiRxA6L01AoBIaq8OUvawBtlTaUnT/QwxUAs
OzCGbvpjhlK6w6CoC7rKLQ4UFty2IFXj7MhAjuGu/FjnBJGUxmlO/m/xssJ3
ffS5lHI4UXfr6C5CP68jK7D8PEpSOmf5A64MJJ3IMow3C1N5gxE8RJlesbYW
iEhGBZOM3FPI4pH4K0H7ofWdZGvjwTKoh66CgQDPWR+zU756vUJIhBd3SZ4p
ZkNCaoQFzD0ESenpvhQVpxH8ZxXBDKdr0Hio3jDAnmS6hQV5/NhNxhxQNQOL
rEiA72KrkkAZwrSNwRWy/Vel4XcdpzE/ghemzPdwzoFOeBxAEZLNC3/DziUV
zB+dKibaMSVqLfNZjOa6Mbam8FupVjlQG76Nq+mAQ0n8AxIX9jRfF7gKeBLy
Pc2a3cw2foLUWcAi042C69FEwxV2kkEMe4C7VuCBwh2dR1PSuhgoke0pAXxK
4AIPDf/WJQ9hcJI9UeUrklAKxRmsUzS8cYA/zQtlHeKhEzyaFnlZ2o0iALJM
3sM8mGvCIIZFHsD7MIVoyrIqBas7ZVmJvkZh70fBXf4MgZ4EDzzuVcb08Y6s
Z0jFqJxICyOt0KPqUSGwGwFOK/xd1jLQrN2c8k0E44rfntxyK0JlYjpWxiry
J8AGx6/AIXSbmkdLdOo5jWKiGr7PoMXv7pu7wGBnp+clS7oTUXY4LxMBkwm5
u/GWNmf+ExQ3D0n8+NFY8t6vKE/pTn85SAmKI5UMXhmp7pzwQAwBE10jK6Tt
aT2jQejwsDxlgpTRMjbEAQxLvykDQlseTn5u65A2HmakutVeII1gUDz8zG9y
JBSDbkCOaWlhrs8z2Yy+SrJZAtev0Z41ttBXpbmzdcmepdtYJz6pQRLfRVEi
WEdbX22jh5GIW8hhpmRCVG1T2jGDrxqxLRB858OfBWxxnHTnbuDDPaLj4QNk
XXJ8wnu8Om4xUAlbgfCr2BeYlNN1afRtXrgdI1cOwocCU7Q4rFBflSLGRtHo
8wCIFsonYKO6zT/TFuc07KRYpaI5khnDXHRhGm1gJHLYkEfHCizrvumaCC4L
C2dbk/L3vISWea0dQRadQSDlfQLGMOKtJhC1mwvWZZFHcCdvXLl753gJtD9R
pRISofkjYTRCAKTTBd6AdsoLHsrjFY74G69IwNPk+FPi+PPnaPeFYEPIJC4C
KvrRHnP0VZHjqquQPusVzur2p9u6yF9nvE3WwkaBDwxG/oJ8QrYe7zDeLF44
lZJCRyZGNfmnNcf/b890X1/caqA5xiPErEyWqFMi5BkKrVqPJyXIaEQiQBqk
XyJPatsgJIwSeiN7wu56hC2b1CTJIEkxbXwrpqVyOg/pBJs6y2EAjInS0+zD
2naSSecNSY9Vga8XVa3nm+RggrClNYl6ZMWTU59cqdtOHVp4gXyo6wzkIdx6
wlVJRv7Lzzm+DfeqPbfu2Co6tqCaUdxh7p9bTtdqh+1S0xqw9gSzr1X5vlai
Of+0ZjRvPMvn0XvnTmZfstU/crdqufvM3m39tLfsmtWkAeQC1BlknlOE3XE4
yBLaj1y4gWcEbH52Gzq8PJFDKapyrroG5gE4Oeg7UESwpd8Cknwe+/DEXiAp
AZQGTAkPVnC5SFAY5kYgWUR3sYcZXBYGyQQKyXpeDTMURVLv+x4yahqWVtAo
H08AtRjBgTzw/KlWgon7xl1jRds0KjAVTAWii1mziEXo8UqqHH15jqcN0VEQ
FWA8kUPF+fc9GcFnTqC2KPkmQVF9yCnwfCe+vs9RMcBcJxH5YTIjGtZW5NkF
1lYfRGDhgIEaIOyBdJQV5wRhOgddcXMD1ctEbFPReKJwTUDIXO+iqoH8aYmL
4NLXpZf3Y9ZLhxht0ch5DJSHXfnIrDGwzQsu9R36luOCj4pMpefISujCI6k6
QxpdkO2YGhvXLuXMky6BdKdTWUX35HUFo28Sw1QZnrZJGpOLEYgZFrgUy7QR
8pJhEUrfORwc64DhBJaV4WsTQ6R4ouVr5buUHsmP6zvRt43NLqLSXOuWqQwI
JnRItmXBnh9PsznjFnOuggi/8UE+aQph/BXESRhIb7FyjmseC6QkOyDJzy46
4TaZ9WuBPrrvVl2OTqwYiUrJXymPlPrLX/7C6SNK6y1368uXvz89vtGjk9OL
m9Gr0em1Pjr6QX8wGchlTqfCzqafF3dgCXN8uPN1F0TfrPNt1yYsc/EB3iPb
1/mmiy5WTFRKyhh/uFzF2fGwc/D88PA7c6NzkHUOuw5g4eWnXjSh8+LFC3NL
22rw5o+4bPXhCIAWeTb6mDL9w97W9RvikTzds3dR2toPe1Oa+x6MipbulbBk
fWdxrWZ7SdgaNnRejswl67RaWobb6ewiHTOT5HN1NvpJGacmm3+MrP2sWCO1
WVbB0zzvW0paeRmRqFEUMFkmLAP9p7qkgauz47F+8txkObx49hyTFvnbg0P5
+rvDF4fwtTo+v5Jvvjk82McLYc7H1+ev3LcHLkPvZuFPZqsdazBXu5XOnl1i
eCWnwx0e3FAGu4ZpjbfEG3vgTyT3kb9q3RIdJNdV/haLz6jygx91+it5Es1L
TKVoBgrLAGBUTsji+JkdWvYrUaMsZax3uKmn0Jp0qhPzNxmfVzkCkp3Uptze
LaQWN6wL++GXoEg4sUZiGsGvSn7t9mrgiDA+I3NyMS8YAvbFN3DTBmSDPUDo
ZHLYCFtZXcCeV3efHFQ4pxKQiSPfrDVMFGEK19BmpaDu9Hle4uyBJFUBJNaj
i5vT1yI0D74V0QR8fi7Q2kEmA5Md1YXBYY7KR8rhmM+aYzqg7axxZn/041v0
qhwru7FxTDN+52Aw8B/cdY8aBpi+YN1ZszYcju6cdZWqZQnbDaBHjk//8Pb0
4vhUj0f/+VR3DunBjoz45MtXjc1ol+QNHvGkciNbck8wvOdnYX99wsnHmOZc
Sy25wkvB2KGDWW7VrFGZATu03epWDAtGTYrVcq6K0MsLMd+NjKgqOGsCdsB9
ZelORXdO0HE6KgqduE8/kVEGUAaOO5bl2e0J/7Uwhck2tg+/sFxrOcyz2J0F
1jEWrDPcLrpqiwZuw0f6yu3Ltq0ziYTZxrsXaxDZe+0IIqKKwBKYUlvS1m8p
RyPbKBH7LT4nb4W7M/m7yCDWa8FMEqkgJTRqsJc9Gbci9DhZSqYTyKjSWMZN
FzTd4xuPfHOBqfR5hjhDecZgkCxD9sSueQmUf4g3tHKKGbWISrtVqmPycw44
5cAko2JGuLhrSu0egFVWXf3PImf/xWyZ/d2ei1vFh5US7MnYj0nPbsXCLLCM
d9uKIH8USQBmo3c7CVDZDPSwLPNpQsjfo+YSja8ENCh6nyd1JzKPvHL8Rk9n
U4iySIChTRC1hvsYH8B0ECsHiVL82A2pT0oNlWcya0ZK0p6dQkSjFyNP7PyR
lGdSOHJpmPDAOvt7jsBJTk4yR9vSY+ekNEnTOHOswtETTM6Jik1bqi+Paf1F
DFrZOfc97GSsMMe4P09W5UeuoyI3OjvWsQqHMBrYjRgPLBc2AcnyOGU5m4CT
2x7Wq6q+t24/cEI7dh5JXKevJZr14DtKU+LuJpdVltPcVM542IcDZS69OLQe
1pOttqF/C3qOv8AuJCQsxFeRY+Sw3KeJuByfd3aJUZR9yuarbLE76/rR3F1X
lBeiKVf8feNfm5pFbeXk2lVwZw1vHLTgDfwHmKNVB8NObF+55lzo/tnpz9ZW
xiTi9m2AH+Ged4Sjto8JV8kCbn6+Ot1WcSWXDK9PXdRHe3K1fp8DwVtU8vYJ
9Qne9D1tvMMy3qqlfajwRcpZtKH6qytnz2HHynnHXPjQIl1f26rMmj/nLs5k
/bdwHVzW6er+P+nO6h6s6fvubQ1AYs5BPqFshLKSQ+YqPt3SelI/Z/xOdKfn
2r3nFA+0QYuYrZnyfrBzIiyfm1Q0QbNSAlhy863ZAa80ryVPvB6XTiopB4rL
bXm+QPFbzIeE5/pVJlYIfpS1uZu9Vd6W90TT+s3W/0LJV02h5jX28DaQ+ASM
6l3xExP98ippQOPFBQcfWwlhcwYn5KFIMnTutatddz+nQBEXYBKTl9BFeYrb
XD2Bo3gUuiYkvoVh6U9FiTydQBrjkRLgRWP4maLzIE3b591s5nlVB56rYldS
QWSebc6HX73UVpcghTi4JiIt5bpRDLhsKF3myIwrUJe2QLBFpogPOJY4NT6O
gnoUadvUo7eNkBrPnPc3qnK0wu12cna65T99gk6MsYv/hOz4Cwvc0giVLeW1
vol6W0b9LZfd+oGmGqmttrZuuc8baItJzO4pp/h3Tryp99v0eKjDRWM3VflW
Jd60u5u+bmf5fqxjFfsIO3lW4sHcaVZbMAZO7OXoRmNlyMVrpdV2+mpbr9K3
1WOBH96b8nacgf/eDd+8reOHcAFy4dXweng+boMb9c1CuGFia+Zmi4DG+sMO
WAPgQPDY+ej8tH88vMLr7WJO9MuftwYmPm4DLdvJ2AZaGmBFrN8dSJuqOrLc
svltwEe3zpfkpAWoI7TUlVQysi7ddpsJQn3qdLszB9trUoMYGNRcQY9RudMd
JKE7miqlXZWBQ1t5qtQW1H8mnXavVEjYJBTisr8NsdjQpoSvSS55ObsWYczT
z36AEnt697x5yaaMlf04MGRefGK9yiZDfT57UK6R+MUxGmyHaOSduXUzuD0O
0MiVKUevBbdEOX506TNemFUSaHZBLgbe7ZXvxudBRfwlO+WK2MdTEqtJCgm7
S0Imk8fh1Zq7dksN8w3FopewfZQC8Jg3lDsOjXM3Y96+IxBAH71yadfgImgw
4J+jTLCs9y0DCvjewep04yO+cr3Eovs/103q/8RCmiZWAqY/54PNIN/Co+4R
VcDLIa8VGGMkH2sZKVSyWld1+0Fwt4wsrSHWFVwZ1M4O7GSEMCs3nZ67jGZG
aQ1YeBGlZYxz4/MwrZk7MClviv4End3QC6fmsj3wIAXLRc0v5pFD595aOO9/
bkWSu8J3mDoATi3utEBBT6gOsI52XYrN8yD+PJkjieSy1vmEya2oytnD1+4C
bwKEp1l6lBK4q+I7KhwST7E8CavpR59eDXq1vDVYUiZoSsA9YFfQLrFcwGPi
GK7rHdcQr2ZGoXJ6yq7QDNlFxqANEL2fipyUQXbx7oRi4PzYpZM8G5D3uc0T
gJWOplVXmkqWt2e8tIc/vdQWbpdUWuWK7nVfv0oqmrffQPb+JMlcdw4vPMxl
YCjypYjBlYLZlHIvL1o0VMZlmThgLZppWf8rLwnLkhTAA001n7HfkM+WmXk0
neYFzRKzbOF4lH5Ps4E+DR8VpMwBmEwkI5UyhHBsSWndAj49pdUuqH0byMhr
15DFcYmFO5ajpi37xulSAzJMlOVnvUuCgooD8nD19hlg+rOLwBE5FuEauO3J
aR7QaaDHMTWZQuiFKYzAZEEZuf/PzZy2Bgs/uA/gEJ4/DJ9/3LITvqr89zyW
H2oEmPfvxpNrPqezIJ5WMVZMY7ESDUD/8+Nw/GPtef4oJ8kdJoQNw2Amd5Ox
JwzoMHbne+s6KM3G3sQLH7iZoBe8ZSYtQAXNchzBzeoCxRBFwmrND8J/hLeG
4+PRiMizqah4x5s7zhHngRU7wDVZtHNBvILG10pdkgZj3nTbHyyr5RSg5txm
Cyq3eM/HecXH7AgZ4mBAN6/RZ6h/RLsiVD9KOw47/0r/QDvfMYfL/gR/HA7M
M6SmfVsrjFm8wuynrAJJbZoa+lKqovZQDt4EEsuwMf4bH2g01lGFwVnuwXnq
6ZPT6w5sRVf/67/S3yHItk52+h3W41YwGLi+NeMLb+ALGBj+i/tr7oELvx5w
F5pG6onbuDEcbxjJ+Ac9z5fvNmiuH6X0ltV7i7fPcSIDPQre0M1LQ+cGujQu
yI3RHAtv/gYbtCJHepm/YrE/IbJaZuyTR42abLbkATRALUb+L1CI5VlDSh0J
BKsW+YyzRE0+LX6PfvVG8j67pr0abVAftgQaf9oavluV8XqW93Eb4Tz+keuH
StE8ZCnsWMWtGl6N+CrxWu/MBZDqDz+lC60i0oU772SLsbZiTPti5cpAAwWC
adRE/ZuLGf2NF+OlILDegd0hHmZXSU1FVsifwIBLgBDU1MdW0QbpWSbTzBZL
skHl+Umt45TS4ThlDumsrMe2zHWas4PCDyVYSMgY3iRBGDhQ3sfVFPs+RRPA
4dTWAg9SgZX2pY1c1AIR4hFNSgkPYS1r6zHFsDscuTidU9qeFwOWeNc9iCzd
Ebb2ehZ2v9f1ktIQpXsI1CyF/ARYim2i7yJtA7whuCQJYizocm8FQTSkkLIn
PnF2vMg2M1F7gcHkcsxi07PTsZcybVT8dJMGh9o4mkWwG5vOIgPwnmIqy/c6
acxnfKDoevcYZBgU5OND+uuwh1KZhwdBil9d1OwXY7y3WzBijjfrElvoWM8C
356P7SzRWq65VwvSa+abtxs6ParAs+A9qImJqGVg3yDp3R2dvKIMV+uPlQ9T
OCXGQYg/GFka1l1ViyD7wYFPZMLHRZ6aFE4WYKbi36/y58JpIw/CEF9YiaOs
AMIkDNaJ66w1BY0OAaBHLF6Yx7Z7kLpbg9QDkzk2y2m0I4Axw+4BZLflKSVj
ZdLjQHHlv6TdRFYwm/IOc26xbjvIQy65TwxxPZjfihdvKy/9gkS4ZtlltyXX
lz7WuHErDwYVHz1OPqpX6rjaji1WnK33KLEBBi6Tagux1XBQZ1JzUDgPLZYO
dbi4lpNmsO3wXO6rerZYKWqdQlDXW5pOLVJg1PN7sylx2gSFErVSSr/ilQsz
sV1XAqds6hf9AGJwjhTi3jZmHKBjxWUj+PuQz1UrO5bwvHTGEjw8RO31zapt
K5wW6IVw2EzEb4428Jpcbd0e6jBGOWqwq4gfeQTy5IoajlWL/LBQwDgV713V
6+0ZoP3stluXcraixr5Cw7jZvSSOopHSuGF3vSu3Atq01SVJLnVtQz6XCrJc
qpm6PfjE5HdFrm1lh1/GRfWZyqvjCvswUNmVCRTvPphfBfLaiI3yE/wqRKhr
lTZt1lZNTwkDpGq4xh+WNBikeb7S0800jb3+PEnGnRO9/AVGZlJ7G2OBCQbo
t5/YHnXv8UuvHf95sl6Fsp4l0sxJJGZkqQ4VFQT6HcECuoiXppWlSQKabGp1
cklZU1NGQal2BeXtW0G6QRpPmXI6ZDR3jfqkxHNSimhgmspT8mYERMQmhNmd
wv4QnKljFJoLY0hPNVz6iB3nsHoxzfxu2/VTF5SxOvDhlcCgl5UT+ny/mL4C
DHZF6Av+P6Nv+MwF/v17qo4TM7PpEPob+YPa3UF89XnjaufF0MaRMSaAyYsb
0+LanG7GtejdiO6FIWNSbG235cagMZHx6NAA74xe6kzyPO3iV3vvwmO2pzsY
vuiaI+MYdKs3KSjQJL7r4XsuHuoDbx2gQ3GBLufvPiYYIgisfAbRfYuE2tME
W2sB3jkRJD4nk/S/0+dr+jy0onSfBRX3q27pRmM2QZgbvVyLeHpvCuH8fKPA
d8A9zkzL8emGOQtgwmlRwC+A7blnk3hz4ENPm06FFNc0bh7qKrqIHvyiLRaA
lMhkukX1woRI0W14Lwmv2kHMfbeYTRXG2grLmuRRw4akFCXa2Eb/jpai3qVp
K+WDiz2Lt5K3X4R9GxtRt4IqXwFhDtF1aDwYQQjCBB/OvxLZa497TRtrbfef
W0tu8aU5v1eLDxJ/GseVKC6QhQRE1xnBgp+oz8CfwTQg1xqYslProKTtwLu3
mx9Y1EkjYWI1b/7WJcAkvx4YRueluMPpZdlL+1x588f4ACc2Zke+HxM2gufr
QSTMS7LdgyM1atVRrGkDZ0gX6uBPVP7c2vqi266j/mi+A4G5O0xmLqIxk6Eu
I+xMMnWvaZEpNeCbjILYGc/O5/CpkXO/YQ3e/Jv91RsNSWqz9lmQm6AXUgNK
dgd8bUZKahX/gnYa7oX2VTfm84nFR617UF+Dt26/5kiGuU3Ka+EfqX8x3OeF
vbf1rbZOeJ8ApsaGpi5VQDfXb08/QQUzwidEFR2jiRyjrQ57VzuLMWTfJ28n
+lmuefh3HZeAQjGKIB6qs/cgod9/aXyi6588T020RlZqwEZa8dhz1+hY0Yi6
BH3GgnwLKz8+yY1bNsDFEhqQpxlT6Ju83C+AGq2JSUx7iz2oyt8DoefUI5Ec
0+Q07M+wLIi3E3GKexET8UOQreJeKBT3wt7Wkj7mcoa3dfUd6BtsP/KQ38em
ObI3KqibWPttI7ArpkwO7Th2OJnG0ZgeVlLRWp9FfJ8bqeDwLnD2I5hID6h5
qObJkcxrkWkKOZwgQEdUm9+yTngiAxeBSQNT0/6FasWxS69tg+sFQQzNYyXN
egOFwCwUNmTknrsxv7iE240604neOonDmGz6MHG9NC/AYhUItEf279AGLrEp
NjUAXZcAhpDdZT5h00/utGasOvR+YcqGtCzkIgC3jUqy+VPM87GNUGTJfnVr
bhqpmA2jYBfq3pcbSQ6KjIvLbw3ZNljZqzW0QjtPNXsKzDZwhjhnRpewIOTB
JcZnav3v2bS8y0UY+oCu3dU4wSn7xqzn7ZTOy9Ron4gM4tC+KcprX9DWDM8L
Nu0ZJ/ceRkZm/kmd7CRYvajeI5fyyNXSgmEZ0Uk1zYJsI7SQTipKH6ON18VY
UirqTcAaJJFGTlPyME64zhRn0vOrNsV7TAaHaXmfu75wQctwbmmLbV+xPWC9
0YN0BMR4XFw0O98nGO/b2FZb1nndvpuYTwcnL8c3OjE/0f7sNSMNrR4TLf2G
iQOzjXh9an35TPCXRabvOeqZ1pVB4GmOLoKcapMtzXZ0qrPtfjERlfKdTOuf
J4Ehi52q2N957c6q/2LJD0/cgn+hxlYYghriC6D0r7hl0p2P3N9ZvXVu0K/Y
f+thaRrnmybkzSBOO7STriTUCwwucQJDtRmTwjhO6JrwKfIPE9L6wiJ+7R81
x/MOQbP/JL+Gy0gjb4W9eghVuqNSK3HbUMRoOaqM7pNrVt640KEuGZyd1rWJ
tkYvKK/3NJw601JSRC2m6bVJz07ZpWaL8MQVn6uo8jeCyt7BrqbWwq5lttsU
D0YoeTOOz3ZkbqBx0CJT6tqLX0KgSNuRLxXm3irxRXhI8vQWsaE4+mUCYrZd
DY0c9iA0W4iyxc2eLFbpgFDzm4p8SXhEe//1eOifc+7ozjChS6FPZjTMOXCv
TCB8J43RKGKM83OzMKH2jXmLtaLEcEOVXu1UbA2ao4QSv6qRLa20dfqnWRpm
ZJ7vzt8TFzggTskz5pdBM2KZJ3drW1VWr4NQDdH6Venc97Cfk420/ub2uuYV
FtwCHMVr4kki0/DJXXfsAUxPfL3B5XeOr9/Q278vsxRfQuJfi6+/XmOPB+m9
37k8Hl91NVuGZexeNWKyb52wbmhby3cSdTWxQEU+8WReM0RFXYpM+ARBVaOw
5LcRVFmC6n8nQZUlqP4ygkqaw+2JZUmwDvHl7uUtv7S0ZGXjWBbLIH6hzlBc
yoGAepqXG5joMuj+bV4ij73HkAaj/Ab/JM8ohuMDm8OIMlvCgO0YkAbyzldy
1QKdOkuw/bsegO2RPspgU/GFu+FrRFyf/YBb2o8fbtFM3qVqQZcjAQy3YxfK
4GVun8nefMu3L77dl1oO3BMKQtqCGH4N0Cd2J3xxThU2asAMk2nsqSA3glPH
XB0TdhU1SUPuOfUy9FuT5Ed13reNwshbfvdYmODTeBPltpJSrw502xK29R00
jqjPbTxor/+tnQdPDY1KGtROFAFXqbmhoGpuYltXq3o7LTM37GxVXy05NUzI
mlqre1vl4Vqwwq/fEFPC8becVkfZKNUqya6y+TW1dBQ8Qg7FuufBxhl9tGdE
bGZBgodaAoyyRfwO6M0KqvZmhQaI+1xoqrZC09Y4R5g9Z2Iu3AytY+P53dDc
ZwQJKsF/O3cNpXHOgRe3C3rKpjH6w5JldMfnvrWPnmntgz0BSudjGlJTYPvx
pZUIA/0mZjcbgEkzNuMMX9UR8jFgSrlh+W1JBh9TnMmPDLgHDoy/u97VTbls
idsD9rJmdUVbS2rakmugWGkI8uN7BLB6hBho532ae9/rALspevX4J9WeN922
tBpltrq2niw35m7L/JzGNa7tdn1rEE2gbemk21eY5MWWV3p7LzcKPWKS4Vbl
puUOxyjCXLsVpvu2OB2MZeT7GzzDVuJWYfWYf0ZsBWid8x+DGmEToSVddnuh
f9BfSwnlmf7h8NZ7sR38PsHWIjQhfitO09TxvBZYp9kKFGklzmHNb/k0FKAk
H7Y63Dai6XaTw4nIZui0oWJWYzj7DeFFfe/Y6p5qaG/d1N5FYwAnr3oW6Spq
CCqvaf5ssNLbDhzVb4Aqu9j6c4DKrqX+h4Ap9QX8PwpSzDQFonxNEKW+eX8d
gPJEj4YXQwrjey9M42BIEmURFWrwNdHUJRm5F7RtdKMPGr4Whd+A1zYs/dIP
39CGsZaXJ3TvMb6KCu2CvGDX/XCK0CWNZxyoKRtviM+AO0DQUfbc1NxtPf9Y
1UDyhz0XGizUu1jfFfmaXDv0KstKStBPZwk99pEcsN7r7+gdjVQkYecijE1V
naX0wAOKUJ9MOOaJwxVVmO0S5yJZc8r+oi7Q1OOG6iKWcYx4j+fucoHBsk4T
eSEHlZ9JCsm0KvIMO/EhJMJb3l2OrswLuuRFb6hG0Fe3iSOyiVfrAl/n1+im
A+dlHCNxzhFIFrpzmnEgpKfG07yq9Kt0DZwFPxwn5TTXYzIrS/j5LAVd2z9J
yOr+Y4LvH+mc9G/4Zuqz86qIsn/7Hzk87TrHt+pEa5ZPFFXAJbLuQ19jT6oX
yNrLNm5LaWcWOSUQI94BkUpQNppR9R6nz3JaommQkDAqHtR5ZgLyhJo+0WtZ
8Vp51ZS9pPSnUeF7d/mNgJjZMzMFfDegZO5LfZeb8Ck67/JCYhlwDx4/O+JA
673jfLXhWnaKECypHB4bLt5hvkiJEBd3kbgopoSjFb58YU/3Rcw//0aabff7
fYIbFNAkgXhO3Rh3NOfrc/1C/3D/8GuY2Qd6ZVjVByHXBwXZr9AWopyFYkPv
AVmXneff7KNDyJN5gQD77jsRMTvau29v465OTl+NLkbYoGesR+dXb0bHoxt9
M3w95kK209ejC6VOf7q6vL4Z6+GbN98rBZfhJ+W3qOm1ddfptfUM+sDtal5d
X557Pzv3DpBm/wU1yAVS62cvDg71P//0bP8FkPPgX0SWfvh8reCpA1eKJxKw
86zrFVLhp9V98r7zHY7bX8L9++4e/sZFCPwZ7x92nj0namo9XlM7a0t+vM4t
GNvMH5g4Lq30//qK8IKDvkk/o7UcyFoaraLdxvlfX8ERiO5i5v13B/UVLWMO
heezDfKc4eiijGZl0jk4+PrZNy9wntPSXxF+7r/owC/lMlnGdBik53nbtgTz
ub97d9B5Bs/4aFNu1PfmD3MnnF74j77kt3w7/izxB/zlxCXujm7e9m/0T4Nv
X+wrtPpbIQse59ppBiSUHSANkABwY/IQz5AG6HgDebNOygXss3lnAVwIZP/y
d0h8wfsjfhM4+sL3RmwRNorX9sWOqi/Bf79peZ92Trmpfwl4/T888QZgxVkz
j1OCaIS4DVn7773123vrM638ZipErr9Fy/2/d7Rv7WhvtsC1Y27bgf9f2xvv
7m/8mQ2Of3uH489scSx75Fpa2MW37NXfW1L+vSXlb2lJKUzmFBzx1t8gQPTX
9+io04sTLnchxw4o8BRdBJhLd8UNqOoumXotzujqWp+AdZ/m5KYt4pSLEnNx
FRTRvKJmdf+4qKpVefT0KXr8qgJQeFwMkriaDwBoPE1WxdOvnz1//pSTp86j
e66595wzfspezW0TPI1cBI9xCqc1HugrTDuiCDSpDswS4ZFXG+fP4Nv4Nb5Y
P4//D6tH72OJL9eLcAl2AXdwUNeTAYz/VBwex+JPgsk8pcH69+jgKDMA0qso
jby2J8hFsEbOkDvNKKk08GCZ/kCYR/a/AYeKmomZngAA

-->

</rfc>

