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


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

]>


<rfc ipr="trust200902" docName="draft-kavian-aep-platform-hosted-identity-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="AEP Platform">AEP Platform Hosted Identity</title>

    <author initials="N." surname="Kavian" fullname="N. Kavian">
      <organization>Jarwin, Inc. (InFlow)</organization>
      <address>
        <email>nas@inflowpay.ai</email>
      </address>
    </author>

    <date year="2026" month="July" day="23"/>

    
    
    

    <abstract>


<?line 47?>

<t>This document defines interoperable hosted identity behavior for Agent
Enrollment Protocol (AEP) Platforms. It lets a Platform provision
Service-scoped Agent <spanx style="verb">did:web</spanx> identities, publish DID documents, custody
signing keys, and produce AEP client assertion JWTs through delegated signing
operations.</t>



    </abstract>



  </front>

  <middle>


<?line 55?>

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

<t>The Agent Enrollment Protocol defines how an Agent enrolls and authenticates
with a Service. The AEP core also names Platform as a role that can host Agent
identity material, but it does not define an interoperable Platform API.</t>

<t>This document defines AEP Platform Hosted Identity. A conforming Platform
provisions an Agent identity that is scoped to a supplied Service DID, publishes
the Agent DID document, and signs AEP client assertions for the Agent. The
Agent presents those assertions to the Service. The Service verifies the
assertion locally by resolving the Agent DID and applying AEP core verification
rules.</t>

<t>This specification does not make the Platform a Service. Service Inspect,
Enroll, Status, Grant, and Revoke remain Service endpoints defined by AEP core.
The Platform endpoints defined here help an Agent obtain and operate the
Service-scoped Agent identity that it uses with those Service endpoints.</t>

<t>This specification does not define verifier orchestration, attestation
issuance, Owner recovery procedures, private-key import, or private-key export.
Those functions can be implemented by a Platform, but they are separate from
the hosted identity API defined here.</t>

</section>
<section anchor="requirements-language"><name>Requirements Language</name>

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

<?line -18?>

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

<t>This document uses the Agent, Service, Platform, Owner, DID, and client
assertion terms from AEP core <xref target="AEP-CORE"/>. JSON values are encoded as
described by <xref target="RFC8259"/>. <spanx style="verb">did:web</spanx> resolution follows <xref target="AEP-DID-WEB"/>.</t>

<dl>
  <dt>Service-Scoped Agent DID:</dt>
  <dd>
    <t>A <spanx style="verb">did:web</spanx> identifier minted by a Platform for one Agent to use with one
supplied Service DID. The identifier is opaque outside the Platform and is not
reused across unrelated Services.</t>
  </dd>
  <dt>Platform Discovery:</dt>
  <dd>
    <t>A well-known JSON document that describes Platform API endpoint locations,
supported algorithms, DID publication templates, hosted verification support,
and key custody guarantees.</t>
  </dd>
  <dt>Delegated Signing:</dt>
  <dd>
    <t>A Platform operation that signs an AEP client assertion JWT for a managed
Service-scoped Agent DID without returning private signing material.</t>
  </dd>
</dl>

</section>
<section anchor="hosted-identity-overview"><name>Hosted Identity Overview</name>

<t>A Platform implementation follows this sequence:</t>

<t><list style="numbers" type="1">
  <t>Publish Platform Discovery at <spanx style="verb">/.well-known/aep-platform</spanx>.</t>
  <t>Accept an authenticated provisioning request that names a target
<spanx style="verb">service_did</spanx>.</t>
  <t>Mint or return a Service-scoped Agent DID for the authenticated Agent and
target Service DID.</t>
  <t>Publish a DID document for that Agent DID.</t>
  <t>Accept delegated signing requests for that Agent DID and target Service DID.</t>
  <t>Return signed AEP client assertion JWTs that can be verified by the target
Service using AEP core and the Agent DID document.</t>
</list></t>

</section>
<section anchor="role-and-trust-boundaries"><name>Role And Trust Boundaries</name>

<t>A Platform is not on the Service-facing AEP command path. An Agent uses the
Platform API to obtain and operate a Service-scoped Agent DID, then uses AEP
core commands directly with the Service. Services verify client assertions by
resolving the Agent DID and applying AEP core verification rules.</t>

<t>A Service <bcp14>MUST NOT</bcp14> require use of the hosted verification endpoint defined by
this document as a condition of accepting an otherwise valid AEP client
assertion. Hosted verification is optional and requires a separate
out-of-band trust relationship between the caller and the Platform.</t>

<t>A legal entity that operates both a Service and a Platform <bcp14>MUST</bcp14> keep those roles
logically separate. If both roles publish DIDs, the Service DID and Platform DID
<bcp14>MUST</bcp14> be distinct, and Service-role records <bcp14>MUST</bcp14> remain independent from
Platform-role identity records.</t>

</section>
<section anchor="platform-discovery"><name>Platform Discovery</name>

<t>A Platform that implements this specification <bcp14>MUST</bcp14> publish a discovery
document at <spanx style="verb">/.well-known/aep-platform</spanx> on the HTTPS origin used for Platform
APIs. The response media type is <spanx style="verb">application/aep+json</spanx>. HTTP semantics follow
<xref target="RFC9110"/>.</t>

<t>The discovery document has this structure:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "aep_version": "1.0",
  "platform": {
    "did": "did:web:p.example",
    "hosted_verification": true,
    "name": "Example Platform"
  },
  "http": {
    "endpoint_base": "/v1/aep"
  },
  "identity": {
    "did_methods": ["did:web"],
    "did_url_template": "https://p.example/a/{agent_did_id}/did.json"
  },
  "signing": {
    "algorithms": ["ES256"],
    "default_lifetime_seconds": "300"
  },
  "endpoints": {
    "hosted_verification": "/v1/aep/verifications",
    "lifecycle": "/v1/aep/agent-identities/{agent_identity_id}",
    "list": "/v1/aep/agent-identities",
    "provision": "/v1/aep/agent-identities",
    "sign": "/v1/aep/agent-identities/{agent_identity_id}/sign"
  }
}
]]></sourcecode></figure>

<t><spanx style="verb">platform.did</spanx> is <bcp14>OPTIONAL</bcp14>. If present, it <bcp14>MUST</bcp14> be a DID controlled by the
Platform. <spanx style="verb">identity.did_url_template</spanx> <bcp14>MUST</bcp14> describe where the Platform publishes
Service-scoped Agent DID documents. <spanx style="verb">signing.algorithms</spanx> lists the JOSE signing
algorithms the Platform can use for delegated signing. Values <bcp14>MUST</bcp14> be AEP core
signing algorithms or algorithms defined by registered extensions.</t>

<t><spanx style="verb">signing.default_lifetime_seconds</spanx> is the default lifetime, in seconds, for
delegated client assertions when a signing request does not include
<spanx style="verb">lifetime_seconds</spanx>. This field is an AEP-owned numeric value and is therefore
represented as a JSON string. The Platform <bcp14>MUST</bcp14> enforce the AEP core maximum
assertion validity interval of 300 seconds. A Platform <bcp14>MAY</bcp14> enforce a shorter
local maximum.</t>

<t>Platforms <bcp14>SHOULD</bcp14> send <spanx style="verb">Cache-Control</spanx>, <spanx style="verb">ETag</spanx>, and <spanx style="verb">Last-Modified</spanx> metadata on Discovery responses. Agents <bcp14>MUST</bcp14> honor usable freshness, validators, conditional requests, and <spanx style="verb">304 Not Modified</spanx>. <spanx style="verb">no-cache</spanx> requires revalidation and <spanx style="verb">no-store</spanx> prohibits persistence or reuse beyond the current fetch. When no shorter usable freshness policy is supplied, Agents <bcp14>SHOULD</bcp14> use 300 seconds. Cache keys use the advertised Discovery URL and <bcp14>MUST</bcp14> track the final URL after an accepted safe redirect. Discovery redirects <bcp14>MUST</bcp14> remain HTTPS, <bcp14>MUST NOT</bcp14> contain user information, and <bcp14>MUST</bcp14> satisfy implementation redirect, byte, and completion-time bounds.</t>

</section>
<section anchor="provisioning"><name>Provisioning</name>

<t>Provisioning creates or retrieves a Service-scoped Agent DID for an
authenticated Platform API caller acting for an Agent or Owner. Platform API
caller authentication is out of scope for this document, but the Platform <bcp14>MUST</bcp14>
authenticate and authorize the caller before processing the request. The
provisioning endpoint is relative to <spanx style="verb">http.endpoint_base</spanx> and is advertised by
<spanx style="verb">endpoints.provision</spanx>.</t>

<t>The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "service_did": "did:web:api.service.example"
}
]]></sourcecode></figure>

<t>Provisioning uses <spanx style="verb">POST</spanx> and <bcp14>MUST</bcp14> carry a non-empty <spanx style="verb">Idempotency-Key</spanx> header.</t>

<t>The Platform <bcp14>MUST</bcp14> validate that <spanx style="verb">service_did</spanx> is syntactically a DID. For
<spanx style="verb">did:web</spanx>, the Platform <bcp14>MUST</bcp14> resolve the DID before first delegated signing
unless local policy explicitly permits deferred resolution.</t>

<t>The Platform <bcp14>MUST</bcp14> mint a distinct Agent DID for each unrelated <spanx style="verb">service_did</spanx>
used by the same Agent. The DID path component <bcp14>MUST</bcp14> be opaque to external
observers and <bcp14>MUST NOT</bcp14> reveal the Agent, Owner, tenant, account, target
Service, or derivation inputs. A Platform <bcp14>MUST NOT</bcp14> reuse one public Agent DID
across unrelated Services unless explicit Owner policy requires reuse.</t>

<t>An observer comparing two Service-scoped Agent DIDs for the same Agent at
different Services <bcp14>MUST</bcp14> see no common structure beyond the Platform-controlled
origin or DID method prefix. A Platform <bcp14>MAY</bcp14> derive Service-scoped Agent DID
identifiers using a Platform-secret keyed derivation over internal Agent and
Service identifiers, but the derivation inputs and key material <bcp14>MUST NOT</bcp14> be
disclosed.</t>

<t>A successful response is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "created_at": "2026-07-06T12:00:00Z",
  "did_document_url": "https://p.example/a/4Yf7p2xQd9/did.json",
  "key_id": "did:web:p.example:a:4Yf7p2xQd9",
  "service_did": "did:web:api.service.example",
  "signing_algorithms": ["ES256"],
  "status": "active",
  "updated_at": "2026-07-06T12:00:00Z"
}
]]></sourcecode></figure>

<t>The Platform <bcp14>MUST</bcp14> return the same response for an exact replay as defined in
the Platform Idempotency section.</t>

</section>
<section anchor="listing-agent-identities"><name>Listing Agent Identities</name>

<t>The Platform <bcp14>MUST</bcp14> expose a listing endpoint for the authenticated caller's
Service-scoped Agent identities. The listing endpoint is relative to
<spanx style="verb">http.endpoint_base</spanx> and is advertised by <spanx style="verb">endpoints.list</spanx>.</t>

<t>The listing endpoint uses <spanx style="verb">GET</spanx> and <bcp14>MUST</bcp14> support these optional query
parameters:</t>

<texttable>
      <ttcol align='left'>Query parameter</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">descending</spanx></c>
      <c>Return records in descending creation order when <spanx style="verb">true</spanx>; otherwise ascending creation order.</c>
      <c><spanx style="verb">limit</spanx></c>
      <c>Maximum number of records to return.</c>
      <c><spanx style="verb">offset</spanx></c>
      <c>Number of matching records to skip before returning data.</c>
      <c><spanx style="verb">service_did</spanx></c>
      <c>Return only identities scoped to this Service DID.</c>
      <c><spanx style="verb">status</spanx></c>
      <c>Return only identities in this lifecycle state.</c>
</texttable>

<t>The Platform <bcp14>MUST</bcp14> apply deterministic ordering before applying <spanx style="verb">offset</spanx> and
<spanx style="verb">limit</spanx>. Unless a Platform publishes a stronger ordering contract, ordering is
by creation time and then by a stable Platform-local identifier. The Platform
<bcp14>SHOULD</bcp14> bound <spanx style="verb">limit</spanx> to protect service availability.</t>

<t>A successful response is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "count": "1",
  "data": [
    {
      "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
      "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
      "created_at": "2026-07-06T12:00:00Z",
      "did_document_url": "https://p.example/a/4Yf7p2xQd9/did.json",
      "key_id": "did:web:p.example:a:4Yf7p2xQd9",
      "service_did": "did:web:api.service.example",
      "signing_algorithms": ["ES256"],
      "status": "active",
      "updated_at": "2026-07-06T12:00:00Z"
    }
  ],
  "total": "1"
}
]]></sourcecode></figure>

<t>The Platform <bcp14>MUST</bcp14> only return Agent identities the authenticated caller is
authorized to inspect. <spanx style="verb">count</spanx> is the number of records in <spanx style="verb">data</spanx>. <spanx style="verb">total</spanx> is
the total number of records matching the query before <spanx style="verb">offset</spanx> and <spanx style="verb">limit</spanx> are
applied. Both fields are AEP-owned numeric values and are therefore represented
as JSON strings containing non-negative integers.</t>

<t>An Agent <bcp14>MAY</bcp14> use the listing endpoint with <spanx style="verb">service_did</spanx> to recover a missing
local reference to a Platform-hosted Agent identity. The presence of an identity
in the Platform proves that the identity was provisioned; it does not prove that
the Service currently recognizes the identity. The Agent uses the Service Status
command to determine the Service enrollment lifecycle state.</t>

</section>
<section anchor="did-document-publication"><name>DID Document Publication</name>

<t>The Platform <bcp14>MUST</bcp14> publish a DID document for each active Service-scoped Agent
DID. The DID document <bcp14>MUST</bcp14> contain public verification material suitable for
AEP client assertion verification by the target Service.</t>

<t>The Platform <bcp14>SHOULD</bcp14> use an opaque path component that does not reveal the
Agent, Owner, tenant, account, or target Service DID.</t>

<t>The Platform <bcp14>MUST</bcp14> maintain an internal mapping from the authenticated Agent or
Owner account and target Service DID to the Service-scoped Agent DID. A Service
does not need to know that the DID is Service-scoped and <bcp14>MUST</bcp14> be able to verify
the DID as an ordinary <spanx style="verb">did:web</spanx> Agent DID.</t>

</section>
<section anchor="delegated-signing"><name>Delegated Signing</name>

<t>Delegated signing produces an AEP client assertion JWT for an Agent identity
managed by the Platform. The signing endpoint is relative to <spanx style="verb">http.endpoint_base</spanx>
and is advertised by <spanx style="verb">endpoints.sign</spanx>.</t>

<t>The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "jti": "01J0AEPASSERTION0000000001",
  "lifetime_seconds": "300",
  "op": "enroll",
  "platform_context": {"authorization_handle": "opaque-value"},
  "service_did": "did:web:api.service.example"
}
]]></sourcecode></figure>

<t>Delegated signing uses <spanx style="verb">POST</spanx> and <bcp14>MUST</bcp14> carry a non-empty <spanx style="verb">Idempotency-Key</spanx>
header. <spanx style="verb">platform_context</spanx> is an optional, free-form JSON object whose members
are defined by Platform policy or a Platform profile. It is Platform-local
authorization or custody input. It <bcp14>MUST NOT</bcp14> be copied into client-assertion
claims, included in assertion signature inputs, or otherwise alter the
assertion semantics defined by AEP core. When returned, it remains opaque to
the Agent and <bcp14>SHOULD</bcp14> be transported unchanged.</t>

<t>The Platform <bcp14>MUST</bcp14> authenticate the caller and verify that the caller is
authorized to sign for the requested Agent identity and <spanx style="verb">service_did</spanx>. The
Platform <bcp14>MUST</bcp14> reject signing requests for inactive, suspended, terminated, or
revoked Agent identities.</t>

<t>If <spanx style="verb">lifetime_seconds</spanx> is present, it <bcp14>MUST</bcp14> be a string-encoded positive integer
and <bcp14>MUST NOT</bcp14> exceed 300 seconds. If <spanx style="verb">lifetime_seconds</spanx> is omitted, the Platform
uses <spanx style="verb">signing.default_lifetime_seconds</spanx>. The effective lifetime <bcp14>MUST NOT</bcp14> exceed
300 seconds. A Platform <bcp14>MAY</bcp14> reject values above a shorter local maximum.</t>

<t>When <spanx style="verb">op</spanx> is <spanx style="verb">authenticate</spanx>, the request <bcp14>MUST</bcp14> include <spanx style="verb">resource</spanx> with the absolute HTTPS protected-resource URI and the Platform <bcp14>MUST</bcp14> include that value in the assertion. For every other operation, <spanx style="verb">resource</spanx> <bcp14>MUST</bcp14> be absent.</t>

<t>A completed response uses <spanx style="verb">200 OK</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "client_assertion": "eyJhbGciOiJFUzI1NiIsImtpZCI6Ii4uLiJ9...",
  "expires_at": "2026-07-06T12:05:00Z",
  "issued_at": "2026-07-06T12:00:00Z",
  "jti": "01J0AEPASSERTION0000000001",
  "platform_context": {"authorization_handle": "opaque-value"},
  "service_did": "did:web:api.service.example",
  "status": "completed"
}
]]></sourcecode></figure>

<t>When signing has not completed, the Platform returns <spanx style="verb">202 Accepted</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "platform_context": {"authorization_handle": "opaque-value"},
  "retry_after_seconds": "5",
  "status": "pending"
}
]]></sourcecode></figure>

<t><spanx style="verb">retry_after_seconds</spanx> is required on a pending response and is a decimal string
from <spanx style="verb">"1"</spanx> through <spanx style="verb">"300"</spanx>. It controls polling cadence, not the total operation
deadline. The Platform <bcp14>MUST NOT</bcp14> send <spanx style="verb">Retry-After</spanx> for this contract. A pending
or completed response <bcp14>MAY</bcp14> contain <spanx style="verb">platform_context</spanx>; it <bcp14>SHOULD</bcp14> be omitted when
there is no context to return.</t>

<t>The JWT claims <bcp14>MUST</bcp14> satisfy AEP core client assertion requirements. The <spanx style="verb">iss</spanx>
and <spanx style="verb">sub</spanx> claims <bcp14>MUST</bcp14> be the Service-scoped Agent DID. The <spanx style="verb">aud</spanx> claim <bcp14>MUST</bcp14> be
the target Service DID. The <spanx style="verb">op</spanx> claim <bcp14>MUST</bcp14> be the AEP operation for which the
assertion is intended. For Platform-hosted <spanx style="verb">did:web</spanx> identities, the JOSE <spanx style="verb">kid</spanx>
header <bcp14>MUST</bcp14> identify the Service-scoped Agent DID carried in <spanx style="verb">key_id</spanx>. Platform
Hosted Identity does not use DID verification-method fragments such as
<spanx style="verb">#key-1</spanx>.</t>

<t>The Platform <bcp14>MUST</bcp14> apply an explicitly registered signing policy to every <spanx style="verb">op</spanx>.
The operations defined by AEP core are <spanx style="verb">enroll</spanx>, <spanx style="verb">grant</spanx>, <spanx style="verb">revoke</spanx>, <spanx style="verb">status</spanx>,
and <spanx style="verb">authenticate</spanx>; Inspect is unauthenticated and does not use delegated signing. An
unrecognized operation, or an operation for which the Platform has no policy,
<bcp14>MUST</bcp14> fail closed and <bcp14>MUST NOT</bcp14> produce an assertion. Extensions <bcp14>MAY</bcp14> register
additional operation policies without redefining Inspect as permanently
unsigned.</t>

</section>
<section anchor="lifecycle"><name>Lifecycle</name>

<t>The Platform <bcp14>MUST</bcp14> expose lifecycle state for each managed Agent identity. This
specification defines these states:</t>

<texttable>
      <ttcol align='left'>State</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">active</spanx></c>
      <c>The identity can publish DID documents and sign.</c>
      <c><spanx style="verb">revoked</spanx></c>
      <c>The identity is permanently revoked and cannot sign.</c>
      <c><spanx style="verb">suspended</spanx></c>
      <c>The identity is temporarily blocked from signing.</c>
      <c><spanx style="verb">terminated</spanx></c>
      <c>The identity is permanently terminated by Platform rule.</c>
</texttable>

<t>State names are lowercase ASCII strings. A Platform <bcp14>MUST NOT</bcp14> sign for
<spanx style="verb">revoked</spanx>, <spanx style="verb">suspended</spanx>, or <spanx style="verb">terminated</spanx> identities.</t>

<t>Key rotation changes verification material or key references; it is not a
Platform lifecycle state. This document does not define Platform key rotation
behavior or a key-rotation endpoint. Rotation of Agent-controlled key material
is performed by Agent-side tooling or a separate identity-management surface,
not by the Platform API defined here. Services continue to verify the resulting
DID document according to AEP core and the <spanx style="verb">did:web</spanx> identity method.</t>

<t>The lifecycle endpoint is relative to <spanx style="verb">http.endpoint_base</spanx> and is advertised by
<spanx style="verb">endpoints.lifecycle</spanx>. The endpoint identifies one Platform-local Agent identity
with an <spanx style="verb">{agent_identity_id}</spanx> path parameter. The Platform <bcp14>MUST</bcp14> authenticate the
caller and verify that the caller is authorized to inspect or modify that Agent
identity before returning state or changing state.</t>

<t>The Platform <bcp14>MUST</bcp14> support <spanx style="verb">GET</spanx> on the lifecycle endpoint to return the Agent
identity object described in the Provisioning section.</t>

<t>The Platform <bcp14>MUST</bcp14> support <spanx style="verb">PATCH</spanx> on the lifecycle endpoint to update the
identity lifecycle state. The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "status": "suspended"
}
]]></sourcecode></figure>

<t>A successful <spanx style="verb">PATCH</spanx> response is the updated Agent identity object:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "created_at": "2026-07-06T12:00:00Z",
  "did_document_url": "https://p.example/a/4Yf7p2xQd9/did.json",
  "key_id": "did:web:p.example:a:4Yf7p2xQd9",
  "service_did": "did:web:api.service.example",
  "signing_algorithms": ["ES256"],
  "status": "suspended",
  "updated_at": "2026-07-06T12:10:00Z"
}
]]></sourcecode></figure>

<t>This specification defines the state values that are carried on the wire. It
does not define a universal state-transition graph. A Platform defines its own
permitted transitions according to policy, custody model, and compliance
requirements.</t>

</section>
<section anchor="hosted-verification"><name>Hosted Verification</name>

<t>Hosted verification is <bcp14>OPTIONAL</bcp14>. If supported, the Platform advertises the
endpoint in <spanx style="verb">endpoints.hosted_verification</spanx> and sets
<spanx style="verb">platform.hosted_verification</spanx> to <spanx style="verb">true</spanx>.</t>

<t>Hosted verification does not replace local Service verification. A Service can
verify a client assertion locally by resolving the Agent DID and applying AEP
core verification rules. A Service <bcp14>MUST NOT</bcp14> require hosted verification as a
condition of accepting otherwise valid AEP client assertions. Hosted
verification is an optional convenience API for deployments that have an
out-of-band trust relationship with the Platform.</t>

<t>The hosted verification endpoint uses <spanx style="verb">POST</spanx> and <bcp14>MUST</bcp14> carry a non-empty
<spanx style="verb">Idempotency-Key</spanx> header. The request body is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "client_assertion": "eyJhbGciOiJFUzI1NiIsImtpZCI6Ii4uLiJ9...",
  "op": "enroll",
  "service_did": "did:web:api.service.example"
}
]]></sourcecode></figure>

<t>The Platform <bcp14>MUST</bcp14> verify the assertion signature, time bounds, <spanx style="verb">jti</spanx> replay
status, <spanx style="verb">op</spanx>, <spanx style="verb">aud</spanx>, <spanx style="verb">iss</spanx>, <spanx style="verb">sub</spanx>, and the current lifecycle state of the
managed Agent identity. The Platform <bcp14>MUST</bcp14> reject assertion replay according to
the same replay policy it applies to local delegated-signing audit records.</t>

<t>For <spanx style="verb">authenticate</spanx>, the hosted verification request <bcp14>MUST</bcp14> include <spanx style="verb">resource</spanx>, and the Platform <bcp14>MUST</bcp14> verify that it equals the assertion claim and intended protected-resource target. For other operations, <spanx style="verb">resource</spanx> <bcp14>MUST</bcp14> be absent.</t>

<t>A successful response for a recognized assertion is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "agent_did": "did:web:p.example:a:4Yf7p2xQd9",
  "agent_identity_id": "pai_01J0AEPPLATFORM000000000001",
  "op": "enroll",
  "reason": "verified",
  "service_did": "did:web:api.service.example",
  "status": "active",
  "verified": true
}
]]></sourcecode></figure>

<t>A response for an assertion the Platform cannot recognize or validate is:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "reason": "not_recognized",
  "service_did": "did:web:api.service.example",
  "verified": false
}
]]></sourcecode></figure>

<t>Hosted verification responses <bcp14>MUST NOT</bcp14> disclose whether a private Agent,
Owner, tenant, Service-scoped identity, or signing record exists unless the
request is authorized to learn that fact. A Platform <bcp14>MAY</bcp14> return a generic
unrecognized response instead of identity-specific failure detail when revealing
the distinction would create an enumeration risk.</t>

</section>
<section anchor="platform-idempotency"><name>Platform Idempotency</name>

<t>Provisioning, delegated signing, and hosted verification <bcp14>MUST</bcp14> support safe
retry through the <spanx style="verb">Idempotency-Key</spanx> HTTP header. Listing and lifecycle <spanx style="verb">GET</spanx>
requests do not use this header. Lifecycle <spanx style="verb">PATCH</spanx> remains naturally idempotent
while it only requests a target state.</t>

<t>The Platform <bcp14>MUST</bcp14> scope idempotency lookup by a stable authenticated principal,
including tenant scope where necessary, plus the key. It <bcp14>MUST</bcp14> retain the
complete replayable HTTP result for at least one hour. Exact retries <bcp14>MUST</bcp14> return
the stored result, including pending results. Durable operation invariants <bcp14>MUST</bcp14>
continue to prevent duplicate identities or other unsafe effects after the
retention period expires.</t>

<t>Each record <bcp14>MUST</bcp14> bind the normalized operation and a cryptographic hash of a
canonical representation of material path parameters and request content.
Authentication credentials, transport-only values, the <spanx style="verb">Idempotency-Key</spanx>
itself, and server-generated timestamps <bcp14>MUST</bcp14> be excluded. Reuse by the same
principal for another operation or changed material input <bcp14>MUST</bcp14> return <spanx style="verb">409
Conflict</spanx> with code <spanx style="verb">idempotency_conflict</spanx>.</t>

<t>An initial Sign request and a later completion request have different material
input and therefore <bcp14>MUST</bcp14> use distinct idempotency keys. Retries within either
stage reuse that stage's key.</t>

</section>
<section anchor="error-handling"><name>Error Handling</name>

<t>Platform endpoints use <spanx style="verb">application/problem+json</spanx> for errors. Implementations
<bcp14>SHOULD</bcp14> reuse AEP core Problem Details shape and error codes where the semantics
match. Problem <spanx style="verb">type</spanx> values <bcp14>SHOULD</bcp14> use the <spanx style="verb">urn:aep:error:&lt;code&gt;</spanx> form defined
by AEP core. Errors <bcp14>MUST NOT</bcp14> disclose whether a private Agent, Owner, tenant,
or Service-scoped identity exists unless the authenticated caller is authorized
to know that fact.</t>

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

<t>This document requests registration of <spanx style="verb">aep-platform</spanx> in the Well-Known URI
Registry established by <xref target="RFC8615"/>.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>URI suffix</c>
      <c><spanx style="verb">aep-platform</spanx></c>
      <c>Change controller</c>
      <c>AEP Foundation</c>
      <c>Specification document</c>
      <c>This document</c>
      <c>Related information</c>
      <c>Agent Enrollment Protocol Platform discovery</c>
</texttable>

<t>This document does not request creation of an AEP Platform endpoint registry or
an AEP Platform lifecycle-state registry. The endpoint names and lifecycle
state values defined here are closed over this document.</t>

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

<t>The Platform is a high-value key custody system. Platforms <bcp14>MUST</bcp14>
authenticate callers, authorize every provisioning and signing operation, audit
signing operations, rate-limit state-changing endpoints, and protect replay
inputs such as <spanx style="verb">jti</spanx> and <spanx style="verb">Idempotency-Key</spanx>.</t>

<t>Platforms <bcp14>SHOULD</bcp14> use hardware-backed keys for production custody. If an
implementation uses software-encrypted keys, it <bcp14>MUST</bcp14> separate key encryption
keys from encrypted signing-key records and <bcp14>MUST</bcp14> fail closed when production
custody configuration is incomplete.</t>

<t>Platforms <bcp14>MUST NOT</bcp14> return private signing material through the endpoints
defined by this document. Platforms <bcp14>SHOULD</bcp14> expose audit records for delegated
signing operations to the authorized Agent or Owner through an authenticated
management surface.</t>

<t>Platforms <bcp14>MUST NOT</bcp14> import or export private signing material through the
endpoints defined by this document. Recovery of a Platform account, Owner
credential, or Agent management credential is out of scope for this document.</t>

</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>Service-scoped Agent DIDs reduce cross-Service correlation. Platforms <bcp14>MUST NOT</bcp14>
reuse the same public Agent DID across unrelated Service DIDs unless explicit
Owner policy requires reuse. DID URLs and opaque identifiers <bcp14>SHOULD</bcp14> avoid
embedding account names, tenant names, Service hostnames, or other correlatable
business identifiers.</t>

<t>The Platform itself can correlate all Services for which it has provisioned
Service-scoped Agent DIDs. Agents or Owners that require unlinkability from the
Platform need a self-custody identity model rather than hosted identity.</t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>
<reference anchor="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</reference>

<reference anchor="AEP-CORE" target="https://datatracker.ietf.org/doc/draft-kavian-agent-enrollment-protocol/">
  <front>
    <title>The Agent Enrollment Protocol</title>
    <author initials="N." surname="Kavian" fullname="N. Kavian">
      <organization></organization>
    </author>
    <date year="2026" month="June" day="27"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-kavian-agent-enrollment-protocol-02"/>
</reference>
<reference anchor="AEP-DID-WEB" target="https://datatracker.ietf.org/doc/draft-kavian-aep-did-web-identity-method/">
  <front>
    <title>did:web Identity Method for the Agent Enrollment Protocol</title>
    <author initials="N." surname="Kavian" fullname="N. Kavian">
      <organization></organization>
    </author>
    <date year="2026" month="June" day="27"/>
  </front>
  <seriesInfo name="Internet-Draft" value="draft-kavian-aep-did-web-identity-method-00"/>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>





  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+1c6XbbyJX+X09Ro/xIMkPQktp2x0pOMmpbTsvtLZKcPklO
jlAEiiLaIMCgAMls23mWeZZ5srlLbVhoye5Ofo1PFoqs9dZdv3urkiQRbdGW
+kjuHZ+8lq9L1S7rZi2/rU2rc3ma6wp+3+4JtVg0+nrQbE/kdVapNXTPG7Vs
k7fqulBVovQm2dg2yYqGSgo7VLK/L3LVQpfD/cOHyf7XyeFXIoMvrupmeyRN
m4ti0xzJtulMe7i//2j/UJhusS6MKeqq3W6g5+nJxVNhWlXll6qsK02ttdgU
R0LKts6O5FYb+Gjqpm300vi/t+vwp+raVd1gjwT+K2VRwQ8v5/I72gN9xVvr
f1c3V6oqflQtrOZIPlPNTVHN5GmVzeWvTqunZX3za2qn16ooj2AI899FtYSv
N2o7V4UQFRAFel9rnPrs6ePfHD54ZD8+OjjYd98+PHiAH4HcyeNXZydHNKg7
q4uVlsdXQFB5UjV1Wa7x4+umhr3X5R43Vc2Vbo/kqm035ujePaC5ahuVvdXN
vNDtcg4buQfHd69/cjhoov2gycYOeo8GjQ/uYXL4NX1pdFNoA5useZESqNHq
ptJt8gTHHjLHrikSOGnsHQ4G/yVTBzN9OEirJ6dPku9PvumTKy/yoxu98Ows
X2iYIpfAn7L9l5EShAAmTmDiwPxrmvhnJObuSVDQfgI5Ba7Bc+p8PhciSRKp
Fga33gpxsSqMhF13RLFcL4tKGxgdVltvdKMWpZYs+9KtTC70CkYHqiPliepi
guryV3CSv/ZaxszlaStL3RqpgoYCrrkuUCWIc91cF5lOTAbz5vYwU3vmqZsc
qDqTm25RFmYlgUv80uHrDFRNnW+FKa6qorqSb/UWvgX1grPkXaaRtWRWFjiy
MnBGKP3y2fcXBvinqburFRCg1FcKd2tHEUQFbGgs7dZFnpdaiF/gmdLA+CtS
8hMs6Cm7qm9gSbYhi4+hNeIB4xZRiRpxU7QroJMlylzS4Lj6utFSlaamkzaB
kArJCqNp2IpqZQZz4LHZ4/FHB5wArKnKmVx0rSzgxGsYpard0ePa+ofvZzh+
fTrfxS+fsjpzeQzLJjbEU3HNhD96Ewji10mbgJksN7Q17M50mw0cXu6ogufv
mQFoFnRAzBjMAXiaZvL8TV9/EKkFD7NptEHWgl9ro+MusB7s0Tset6prIPAS
+BRbiMBmZZ2psgTh2UoYti6vkRj9JRMbwB63+JM/bR4vIx4UTVdq447BbHTm
fwonuVZvNY0cmCOs1K3ytMLe7cxK7kyegzbsQF7+2ChHtDN9XcNQDRrByvfU
Vb6pCyQLn36OW3KrnZMY+InHbVcatrTS5SYcer1ocXyckYWNVj+tEAYM0srO
wK5JWviQRqu8hViW7e2hNeAYZMBLLYs8kKEFaWyZ9uC7dKrK9Ey+uqmgaaOz
GvptUb1kOu8a0k1NcQ07SED5yGK9AddlBmP2vtbv8GukFC542VUZMxXK7EJj
r1Ij5zJlg7JkmQXSwJdARKM3ioi1bOo1Mf9QT4PE9ug+R6V1pv/RFQ1NYORz
VV11YMpZe+HibuomN3LvxZvzi70Z/798+Yo+n5386c3p2ckT/Hz+7fHz5/6D
sC3Ov3315vmT8Cn0fPzqxYuTl0+4M3wre1+JvRfHf9ljptt79fri9NXL4+d7
oIhgt7G6wW2D6CGRUEeBfOJ+lRG5NllTLHDzlfzm8ev//Z+D+/L9+/8AF+zw
4ODRx4/2j98cfH0f/rgBTcuz1RWIJP+JhBUgflo1OAoIK5zIpmhB285QvRpQ
3ZWj43/+DSnz9yP5u0W2Obj/e/sFbrj3paNZ70ui2fibUWcm4sRXE9N4ava+
H1C6v97jv/T+dnSPvvzdH0oUjuTgN3/4vUDmudCoxOuyvtoOTQEJotdnMyeI
s4h9SWxmrLaR+KyKIx0JZ7o2xM9B/b1/75znjx/n8tn5q5fyWpUdTIbcoKus
zoc8AFLz/r31ybFT8CJI83Y01xK0Xn1j7PjW4YTWwiue81jxQIMjcQSmbOiS
kNZYF2NxJbsCYY0dAPgWSMSqCr7FOGbCnrEpiUYGEtcb9Y9Oy7prDfww0OxA
xoI0GQzYaJgBaJE1tTGyqxpdkitjx0dV6Ds+KQxrL97VjS7L5G2FHE4k9sdK
etaR1vS8Aa9jybaRDpvZbYF+w4WUEA3CfteGDp1NtVXArV5jbIkq06qt2M65
QXA83CJqJuveSVBYaKI07eeJ99fO2V/j7fhleu+NN8JuAFqeHZ4gHZoCE1qB
Vsxh9kkrhJvBg4QjAaK3XUP+ptXxznP0vhap3YFTJF9d48D6RohotV71qx6L
khI0oLeB28GLFwdz+dq6wOPzBJMl03vzcKD34jg+nYtDcMiyTG9apEPsdebB
G8flNzihsRzA3qayQRSGG6lhylyCPMCoX83lC2SFurEUCU7HmHbO4+rPzr/D
cQsfrfVEQ9wP+1Y9H88OqNowx1w88PscOfVub2aiI/Hb1OwP52A7aWc4Cq73
E9GEdcEX3rMg5YB7DhR0o3em5+/R/JOuLNtv9PGPoc0FQivym7qrcoXRZp+T
2LshvvdOUbJUWZhqvabQSLUrIJTzxZwWFz1BB9014aTtPmAyphUPBpMJ2ped
EUwGuB9Zi3aX3TY98k4NU2074awvtuLL3Wfp3OdjT3xntYklYGGkpOuljPyp
3ghe5wXnVwycFJQTCHjygjrAWIrYEFcFLFHDyM1NAbOAGStiLgqGcO7URW9q
MgX4SZW0V7tinM75ggI0UlIvkwUxETEIGQEk3arYAD+2N1ozU2A4AgbGsZs7
cKIOykspY1fbHjocQB1Hpkz0wHdEzrdab6w7jhGpEeAvFBz9uIXO5emSh6IW
cUhvZjFP+JMNmu70iaBpQLjywgBdMxuvOHakMBi9c3RlqakNYYoq1xs4QVIZ
6DW7QbmLd5xtX5K3sYbtCRrHIU5vO13dizVoBRuvuHI/TmCZT6psJ8XfXly8
PgcFW1wVJFuMfPl4GgTVsPsAPLGBA9dyrfMCdPZ2o5F5UhQOuyic4b9+MHWV
zmlcOBgQTtDExlodQR4UQpnkE+GwfuGB11fK7RiYLQPliObpn//8p8ShxXvQ
cnsw0SV0QquydyT3Dub7e2jV99z24Mv3BF8hvrcXYL6jzVy/U0hYag+/szhe
xjKxx5ixbYBGCkc44X4RwC3lR5oUsb8woZPly4Uy1PHe9QESJrR3HNFb5CUj
cwa+/Jtb7d7fZ+H3rikvnX+DwzrE0e/onrr3ngBUNJ6XRf7xHvz/HGkWpram
KswcvCma+OT88MHDMK1eqq5sL8tiqdtirS+NRhWETfe+2t8Pw/q4OAw8TVdH
jHvx98adBc6TbbMyJts9xoQDUuc26aiIOw0DmPZTfV0775LcpTHS7HMXdI86
IX3ER2RdIVLHmnN0bVByXGhEWsuiQjNEH5weYncEKN4imOKNvdcvEIO4OedD
Dkl5FOdjYzTaDLz8gHHtdKk8DgpTWdaZB45JJdKb47Nnr85PPLoZmvRnROcF
LSFqmJH7NJd/5gjMbd8ZWw+9RsOiPx3+iiCjRl/BmmCvudTvWl0Zi7H65e/i
aToSXK1tIF2DGcbtttEMly7C0seeBEb9aDr7LmFAhsCulF2uRTqaH7UsLAG8
upKiL44nElDcMFEFx9AUGQepLj5Dm6+XSKFGW/6hoBXmp3AL1CfRtQeeEXU1
AqcZ84P3adbqXbHu1lHkTL4Emi4CRuAv9DtA8B055nFQBJG/H1chrgHRWiMI
oHRDR6GikRZ0gFXnMn2sspVOHjOrpzOZnlyoq5QNcPpcmTZ5Uefk8aZgf1qF
aRa0YCFAceYJF3VFRpN2uqor4JXOEOq8hEarShs4R9qaausGIX7nVsFKnQ9v
p/5q/758CcfmZwdBqOokw+WmwVdqtB0PqUYdoREElg00Al2zKhYFLGiDBguY
E+ItjmhQFhZ6W1tnKeuahpwI3WbgPn+PrFTVjpSjTchNDYZ3S4C2Dfpnbu+W
uDhB77yIzpTDoN8oXMqv8bjR8gdqvjl7TvsgGlI+i9qCmAGN6MdlS26edUNR
jNUSnQT2w+e9k+Hv+l4T+R2z4CmjmlPsgiBSZvNLtUXUqJmBL8xyOwxo3fgz
kP9WWxCoxjb4c4JCBk5hVznXKwpHgR/j4DRrNHmjHG5C+HNNfvAnI05ViX7A
2YtxnDuckaPO7R1A3TB0Ne/1EK5HGNN56V2L4keLsBFmFCB4GLcv6b21+YwQ
6M0fdeyuL0iNMORsjAuCrCxw8qIXxft4pTA2FLgmDDVFp2Te84BSp60iPoPo
Jg1Quh85tS6hU5oLBGYKM3L+Iowgdu3Uppjbn7yT56xv75gpgkxfvzq/SANz
ZapBmAMErkrAhoLSS09z+FCjvG6T7/Q2lSutcjgwIcYa1cq/TZT1YAwS0C1w
a9baeEUxKPcUbIkH/mbjw7MpHT4p5Dd7TMuiMRP4g+iqEtUCq1yrHPQ79M4L
DIw3CLNy0kQ3aCADbjm5JYQfObKgaGjA9xo0SYQG9nYsOhOgCQP+c5QFY8xO
QYyGMlpXOKaz+BaTBEZC292ArhH1AgcGxRlOiuPqaw2bjJBhCwPDaXGmKctA
5OGDRUY8cEyuB2FqJFfVpmsHdizMQVF7pS3EGAggdoKh0p6BI7tN6tjDiOwF
DI0xMUTudoNEDtWQ7N3UO3VOSCwGukKkJ8A8waniH34prDO1RhuCMAkCoC6g
is2OD1eDpylsPAhT4XFxaII+6rJ4NzL6RE69c8Ui4M7GolIhtE/AMoGqRYsE
faKDQdPBbgdanADiuQA+GjSovtHBepjXoabhdBdaYOhZ1sCqhE6YLkPlt+zK
EOpOKJ+Rr48qaKOKy/2DZ/vgS71+fnzx9NXZi/3w74BjUx+bTcajR+ro/l+W
X28O3/0pf8Qd2Bzll4piGlcStf/w4uDwaH8f/vNXboe+v7MDGATsig7D+CEy
pAGAQpd3X9ZnqN845rzcHWruGUoT42ioJK9tx26T37Z/p9/H2svixV5S/Jla
IwxLzBDHgmhpiz6ziyGKSvQUcWQE0I2y2vIX8jmpxSvLmqc+GpxaC+ZmMdVP
8VLPfk5j1myVf7kjMAuRJyvU0aB9oyzubJRlZJRxUGePRxOwAf3jSWw/bW4F
d4Na00GKoM+brUB4DpQICCvI0wf5p44S3O5L+UG+0IpM87/k3weYMun/k6Nv
ftZ/NGWKwTfQDPaV0jIc0u9ARFCwoQk7n6T6GtBjHEimiEOlv43gXbWj/Zyn
LAsw8WnYuXzBkRcGkAssRFj62cHKsozMfxJh03q5NDrM+UG+9FOB1s1WHAb7
Oc1bQozJkQlZLozn7rQOmrLnXUWEpbx7EI+ozod85V5G9DN3yRoq2uWOKV11
gYeyJPbUn0njD1NahLIQwDEtpctRJjM+eySgpajPVPhjQaNp2WIu37B3oiZA
IIzZwfpXV1SuYkclj0BlVG1ivyqMAE3hmY+iK4v2V5yqhg3HJV4J+6PBYPcB
CWFDVYrQPAPDkWHpJ+hbaVxO4FoVpVoUJcJdn2GwyQ8kkNhaS2A1NEAE7r23
NY5fbtaj3nc37dTpjuad2v5UE0+DfJaZpx6faeq5z63mnptNmXz65S5mHxt+
hP9l96GtW1XyEe92CEhSrVcwNKQ7bTCyu4+YSZMUXOI2lykxlocNxwoWVEGK
zIaYEa0Q25JzQX9N9PD6EhuR5XRyHYuzFxLVaKEY+JnLbzDtReAh17DswA5t
WShjwY1Twx49FOAJRdihcbAMLgoj4wpDTvQr0DUHVWE4iGF6YjDgUKWRz0Bp
2b7mJgtEIBEWRxQEPFjAsNEUzWSaizS9LrHJ037ZHisU3kNGeVasN7U/iqIa
wN5Nfa1tNr1dRfm5G9i7xyJ0/tteISv1ok4iziNayK7k7B4w/o+Wmfpr66fB
fW+ujhQuaw5bddpd99qFgviRXUFXFEO0Jy559jqUw0xJwWZ3qQNF9CyMk8Gc
8JVEva6Mnlj0zkbKvQyzj71MV7BpQBB9ss6h169X2uCz+YNNRUAnpsEZQBjA
C1xt5E4yQAfiFugAffOJko0pqAT2bisZQtC6Btkk1A8rz3YVpgAlGCKws+4o
FBnUBo+CbAzK7W/C77TSrLIw+xv4HUcLzpAbyfvxmHfCM4J+XC4hXCdFOQlQ
VEWlQDOFkrWoPAa5cVg8FddTubyIrZ2/Q9XUsIhb2Coqxx4hGYbH4sb/HIBS
3BYL4aB3xSZ/aAs0RNZrOD4/PznDLN8QC9iVUaUfa8wm77HQ99Palyhn+h0a
xvd7zi6RtFyuYBecOGUhSEjd73383JDdGdDxmX0pbCosbCrT4TZSm+dy0eIM
kxs6IbkiK1QvfkAX8IaqPtYa7SXY40bHGb+g2Blko1K7WNsvi1LTNZHCDJxS
0SMh9nTlgAQfUacIMAKVsikIIgBOYo5NPMeKrFQF1iTaDB8VDQd+RiIqQt4Y
mSLtEoV1JcbB/dr+UDwxVRLP6SH2ZzDxU7Q2s2ICjBpdXqBKFutpa8zogBvD
9ZRdlQHvXBEKNhF0xPmDQYGPLafymmWXy4R790iHFaBx7T15Nr3yP8o7DFEd
YojJijtQS2S8ZmBoDBXk5DPJ5hT5GCkuGrp8MIGkCHG6lOOkLPLMdGqeHaTE
lQpvalPEjpHowdX6XYa6uJeK2zlfDc4drTdWb4Kl79YsNqtBvVxqNuSuwXAt
4lNpXEtl5zAu0PXxKV05TOkSI6b1JuVyoIhhbFLD6UxaghUPmWL2oWsynYaK
PbWghIQrSrIRoM4T11a+OTsd1Zb1xyVu5DS59fyiArin6OZQUpJELxTyzuL1
BDtouD7y2OUTOWnCoSYfyCGQ8dV36Q6Y+HPAXtInl36xZAK2z1aLP2bFq+LZ
0zc/nh68LE7N6brd/PXx6cPT4n73vHj2aD6f8wD63QZzC9Nh04OAFuOFkzuA
ync0ZP9GyzRAiv2ReJNFjOhUAxaRoRPkmw0SbKw56QQPbUmvzsfn+FP3h3nk
7SVly2Nb/2C4mw2jen4v6UTHlL0ZyiHhJROQSdstcKXzZcBmZMUanW7SU4Kc
0BQC5NTfSkzJ40jJytnUD9UUlIT8gMmmW0lIwxCzeoERORh1vMcxVV6Caobr
Os5wF8kx7iINSWsHK6HisTsQdTMlZKiNXGwxdh8oRAtWzSpOgk4FhbdcsSxt
+wjyZFOHTiab7X6BgS+JGbmlTXTPiXeegjyxC5maDpzheLyFvsVppwFUl9tu
rpcYxz1Re9S0vea+jCfcS0BS36yKbDXwKQq+hYu2kbXhMLKevhvrK7zSt5je
ZYfO6l3G9baf3Cm5iew6wRAEQ6Wh7kEMrzH4CAbDOuwex4X2CjO4iuqKq2NN
h4GrEekvYOjkIJ12ZAg9pcSPz4hHxWI+MGEnElPQZCeQ2nz9MFzZnfLHCFJJ
2WfH+qUrvE2SkllBjwM/WQh5xszSs5O/dTcn8YC6qh8oYvMeRSZK544rgclo
C0HksWHjIGoHawQisb60+59xLfRSFaXkFGk//e6uPqsqtq4nvuDOehFMXaFy
X14VlkETFfaaJV95IbLiIThiKKqZAi+YIBbYId+RsPk3C4R8IuE2AEsCyuFi
yDGOBM7r4E6nvYzMeS0ah5NY5zSkzwd8cQZrmJ36CakpTlWwF5zadV3EEBcW
YE7ec/fXmee9dVnupSzLcKyidzjSedZUfaUq5NUwHqdQnFeeTo2Fhat1o5oC
bzODi4ljkdHyPB6vK7j16S3rCi17wSLe2cCcmeBjtDeRQIbL+kY3mYKzPj5/
fHrqgNDpEhEX2QhPqFm8TxK+3lp7EQcExxJcXOYzDsLMDugMxsEyBg+LGjJ9
9j6OCkHSKO00uFk/uKDs+72NliL8SwwUSqNO9at0oMhcnrmv6iWLUVQ+0iu5
EHwgOI1VmdSabx3WNXkbNJG/ehweqyAxpZWbrlkq8EcErn4A/YyvJIciGFxU
UXURnmVDEgPhE/odPSwTQbiGHCpoPro7NbKNW1sZ4/Pkjvg/a32cH9YFd35w
l1IzVKU0SLgNYDN++wHM70S1esqIqU/IT/l0QyBA3AUIkJO5EzzuNRbUbqNb
cuE1iVFymJU3OogoI/6bSTPvyhC4OsHecZk4GO8KhhqysAILO/XufxPDxVWE
oRjkE6t4fXzx+Ntb1sH5LqKpX8GEHN+hLtJHE14F+Xiily51y4rSprQ+m3kb
IjNMjv+vhPr3VkKFM7y1GOpgWAw1fpkieDFWnCy4QwKIds956JZVb4qGQFMx
esoF/NMCCzIptsTXJwhM5GuJ4PVuVj1T6d/+AR+jvqkEF6Eik4Vupq93rQvq
sVhQFbqMyroLfC5D9CKx6C70n+OHTcSOG4+9qzf+avkAIfAKme+uBrVbxcmB
iXtOrNKNbk1062eyHZoEKvGZTy81SlrBQJm22Fv/URhuG2WA0P8SViercQz7
BW/GiF2XXuUn7rxOXXTFHJLYcY119x3W6IKNu8QqhkcapRHQ6F/rqqBsMPoG
fN9oU9Zbd51S4S1DRDWr2y63enAyusp6cds13rulSsTOCvM7qfufjBiO80xf
kCeaKIUPbtZE/mMmowsZ4C3/0BapLcMUxr4WhEH3jIGRGQMsM0ZXZt4Xc3dl
hiEeX7IWuwO8cZ3oDxxqBoiHS0IjlSSiKlL60d28aSXXX1BlG8umD84Tf22t
yyk5427/IuwyBZNPcdQt0PlsBxgeO2QwNwyiSjM4EYaQyPm0iNAU4M4oFGNF
A8zc3AaaTxVo8UsYEVIRY1M/HUX/cp9kLAzgcxiWKvfawhda/cniZj+mfaDS
+2nDQuXoIZvBXUo2DJaS6B/7SygTpAy7gW6X4QC+bE/R6pfAWn75U0bM38wL
JsJV3iNUS0yl/DsnXJMhBjUZA2DRHTAF2CEZiBIm9Tu6lGovYqAycEI0ikdK
rRr7hsvSwtGDPJh9cwTWhCVUfYwteM8VbFrlqHt86OrcL8LQOspYt4im3XDW
FktQMPpsV+G5AaTVTd2Vub2HRmAlFW9ZOhbmbf/xgMh89K84zcYYIauKKR3T
i1jwFp+g3IPPE1DoO7JUdL/fmStXDI9TBI1MMZjwOdq89ggmZQFCZ9/BxyWc
yCaLQb5K4aZvxc2qwFcVWlfQZ0d3r8h8Kjakq3NFVNBf1vXbbtMrWx2+XQMn
U2xUOROsfckgEFPa4fhidaVR06kGOHJTdqxqIZYIFQSNphwGBc42zWGNCc1K
1GRQguUeH7VUpqXAfgUqFtFVvrCA9xL9VUrkT7ZOeNk0t0O4IgQCtEOGCH4B
/+lJx08wBii2qK5VA161vaEpYsxkg7yKyFHHrzzouGrS24SuotufnHY29nIo
ix6eGeG9wHI1SidlKeF8ThCItTLLxqOwtoxewS37OLZ9EiRrtpu2pjADZGul
zIp8SAHaEBifKwdtvt6jUx5E64Mcxj93grqBUkRot477Fy8zhKXhT3qvzZdN
JMR7HELNpgVEQMSjy6V9KJKueCWkRoiv0AcChltvQqZIv+O6EXwQiC4Gh+tz
wrOhNQoDS+yxERjZ75bqTHp3YdL7+4/E47pawkm2Nu2O1Qv0jIBbPCbXuAGX
dhZVgbunYi5PLT4MvPrWRFdt/c/kWocbaQEJpCVZl8UWn9ICKavh7hnGAoo3
lemFpMalCkCIdIHd0Vu80vaWHr/DhV/80pDgoZ48aRogzLeYnuW7vk4bhAck
sW/vBRNwgUA41vyKCScMcBSs1+jdOjaubp3n91jha+4vn5C6x/f91IYRRBqH
6G2i1xh8kY+g4t+5HyDFB1ZSF6ZHZY7EbXCcR0pvjmjQo9/hqL+n5bqIOxe9
YiEixecY4EFRJKZnd9jgscHdVUkdWV/RK0sk40tv3x6/PJbAoQgOWydz+CKg
V/icXmq8mKf9520sZPc9Pn/zHT1B9+bsVJxxJ1g0qXu8+RC97Pfw4AG9S/NB
PqVXGMa5Gn6j4ktTO1+c5KGRsPbFdMtl8W6wpsHOb1/TY9IV4WWRxo2EDPOU
3v4iqt4+0vng/VN7SB8GeYc7jHRmb9JGV//tmna+fhxAJv/WwIfRW8IBQbGK
3l+bWrri05FecLyFxYRi2Mj7NwlHnK7tAJy3GaXYIRI95K33di0hcJxopXr4
3t1+Eo1zDSEvittYPCI/h0o/VsXViotQek8cmi34fuuQdjcTLwSwrOLrF/6Z
AO1eow3Qt0sWEmoTMs0U6IrRDzAaGr2Ebi1YzNAj+V4V+ze16dKPBQTsLV6b
4LdgAaXPh+Z26mkR1JYr1eQ3QN1koSilSE9fLOntXPfItiMQgYGqEoPnJQjL
MfWypWFgQnRB7EihJtAnr+gtXm6ECCTPh3nM0NNSKOGMHl/98ChRnHOnYCEs
VLiTRBNdXHWNB7/AblqnskeHCJIjB2DXW5I9V9+fiIjKHPr8KEekdjdcY6ij
/8zPBF+4ovYoKOs/jeHXNXxTUowzg9Mb58eScUB+H/lOJBDBP9hNgjP3TjPq
kQg0dpcHaAMiuI8UqvL2osWH329/4sO+XgLrz8ZaYPd7ATADlmrQiwWJR4jr
xqGcQ4WAdBPOq7Kw1/ABhJ2vwfKUg0cQxKceQaDh3pw9N/YVSCpdjp8MsBym
rusiF1gCnlM84+5LkJ51for7y60Gw137lY9V3NYxCBILfJAA1xrNOIwd2ZGn
2gnXV9NDzj7JHEpqCn69LrpGtPtk/ENFjt0tMO3fjKzAbX1rbzz6WyTBi6Xr
HZg2L5eJr1v3iWlMmqDeXZEY2Yf7I7dtLv4P5gdC0eFlAAA=

-->

</rfc>

