<?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.35 (Ruby 3.2.11) -->


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

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC3339 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml">
<!ENTITY RFC4648 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8259 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY RFC8785 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
<!ENTITY RFC9110 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
<!ENTITY RFC9111 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9111.xml">
<!ENTITY RFC9457 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml">
]>


<rfc ipr="noModificationTrust200902" docName="draft-lightning-session-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Lightning Session Intent">Lightning Network Session Intent for HTTP Payment Authentication</title>

    <author initials="K." surname="Zhang" fullname="Kevin Zhang">
      <organization>Lightspark</organization>
      <address>
        <email>kevz@lightspark.com</email>
      </address>
    </author>
    <author initials="J." surname="Klein" fullname="Jeremy Klein">
      <organization>Lightspark</organization>
      <address>
        <email>jeremy@lightspark.com</email>
      </address>
    </author>
    <author initials="Z." surname="Lu" fullname="Zhen Lu">
      <organization>Lightspark</organization>
      <address>
        <email>zhenlu@lightspark.com</email>
      </address>
    </author>

    <date year="2026" month="April" day="17"/>

    
    
    

    <abstract>


<?line 75?>

<t>This document defines the "session" intent for the "lightning" payment
method using BOLT11 invoices on the Lightning Network, within the
Payment HTTP Authentication Scheme. It specifies a prepaid
session model for incremental, metered payments suitable for streaming
services such as LLM token generation, where the per-request cost is
unknown upfront.</t>



    </abstract>



  </front>

  <middle>


<?line 84?>

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

<t>HTTP Payment Authentication <xref target="I-D.httpauth-payment"/>
defines a challenge-response mechanism that gates access to HTTP resources
behind micropayments. This document registers the "session" intent for the
"lightning" payment method.</t>

<t>Unlike the "charge" intent, which requires a full per-request Lightning
payment, the session intent allows clients to pre-deposit a lump sum and
then authenticate subsequent requests by presenting the payment preimage as
a bearer token. The server tracks a running balance and deducts the
configured cost per unit of service. When the session closes, the server
refunds any unspent balance via a client-supplied return invoice.</t>

<t>This model is well-suited to streaming responses (e.g., Server-Sent Events
for LLM token generation) where the total cost is unknown upfront and
per-request Lightning round-trips would introduce unacceptable latency.
This design is inspired by the session intent defined for EVM payment
channels in <xref target="draft-tempo-session-00"/>. The proof mechanism differs:
Lightning session uses a prepaid balance with the deposit preimage as a
bearer token, while Tempo session uses cumulative vouchers against
on-chain escrow. Both implementations share the same abstract intent:
prepaid deposit, per-unit billing, and refund of unspent balance on
close.</t>

<section anchor="use-case-llm-token-streaming"><name>Use Case: LLM Token Streaming</name>

<t>The typical session flow proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>Client requests a streaming completion (SSE response)</t>
  <t>Server returns 402 with a session challenge containing a deposit invoice</t>
  <t>Client pays the deposit invoice and opens a session</t>
  <t>Server begins streaming; deducts cost per chunk from session balance</t>
  <t>If balance is exhausted mid-stream, server emits a payment-need-topup
SSE event and holds the connection open; client pays a new deposit
invoice and sends a topUp credential; server resumes the stream on
the same connection</t>
  <t>Client closes the session; server refunds unspent balance via the
return invoice provided at open time</t>
</list></t>

<figure><artwork><![CDATA[
   Client                        Server                   Lightning Network
      |                             |                             |
      |  (1) GET /generate          |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (2) 402 + deposit invoice  |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  (3) Pay deposit invoice    |                             |
      |------------------------------------------------------>    |
      |  (4) Preimage               |                             |
      |<------------------------------------------------------    |
      |                             |                             |
      |  (5) GET /generate          |                             |
      |      action="open"          |                             |
      |      preimage, returnInvoice|                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (6) 200 OK + SSE stream    |                             |
      |<--------------------------  |                             |
      |    data: {chunk}            |  (server deducts per chunk) |
      |    data: {chunk}            |                             |
      |    event: need-topup        |  (balance exhausted)        |
      |                             |                             |
      |  (7) GET /generate          |                             |
      |      (unauthenticated)      |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (8) 402 + deposit invoice  |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  (9) Pay new invoice        |                             |
      |------------------------------------------------------>    |
      |  (10) Preimage              |                             |
      |<------------------------------------------------------    |
      |                             |                             |
      |  (11) GET /generate         |                             |
      |       action="topUp"        |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (12) 200 {"status":"ok"}   |                             |
      |<--------------------------  |                             |
      |    data: {chunk} (resumed)  |                             |
      |    data: [DONE]             |                             |
      |                             |                             |
      |  (13) GET /generate         |                             |
      |       action="close"        |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |                             |  (14) Pay returnInvoice     |
      |                             |-------------------------->  |
      |  (15) 200 {"status":        |                             |
      |       "closed"}             |                             |
      |<--------------------------  |                             |
      |                             |                             |
]]></artwork></figure>

</section>
</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>

<dl>
  <dt>Session</dt>
  <dd>
    <t>A prepaid payment relationship between a client and server, identified
by the paymentHash of the deposit invoice.</t>
  </dd>
  <dt>Session Balance</dt>
  <dd>
    <t>The running total of deposited satoshis minus satoshis spent against
the session.</t>
  </dd>
  <dt>Deposit</dt>
  <dd>
    <t>A <xref target="BOLT11"/> payment from the client to the server that
establishes or extends the session balance.</t>
  </dd>
  <dt>Payment Preimage</dt>
  <dd>
    <t>A 32-byte random secret whose SHA-256 hash equals the paymentHash of
the deposit invoice. Revealed to the payer upon Lightning payment
settlement. Used as a bearer token for the lifetime of the session.</t>
  </dd>
  <dt>Return Invoice</dt>
  <dd>
    <t>A BOLT11 invoice with no encoded amount, created by the client at
session open. The server pays this invoice with the unspent session
balance on close, specifying the refund amount explicitly via
amountSatsToSend.</t>
  </dd>
  <dt>Top-Up</dt>
  <dd>
    <t>An additional Lightning payment to an existing session. The client pays
a new deposit invoice and submits the top-up preimage; the server adds
the amount to the session balance.</t>
  </dd>
</dl>

</section>
<section anchor="intent-identifier"><name>Intent Identifier</name>

<t>The intent identifier for this specification is "session". It <bcp14>MUST</bcp14> be
lowercase.</t>

</section>
<section anchor="encoding"><name>Encoding Conventions</name>

<t>All JSON <xref target="RFC8259"/> objects carried in auth-params or
HTTP headers in this specification <bcp14>MUST</bcp14> be serialized using the JSON
Canonicalization Scheme (JCS) <xref target="RFC8785"/> before encoding. JCS produces
a deterministic byte sequence, which is required for any digest or
signature operations defined by the base spec
<xref target="I-D.httpauth-payment"/>.</t>

<t>The resulting bytes <bcp14>MUST</bcp14> then be encoded using base64url
<xref target="RFC4648"/> Section 5 without padding characters
(<spanx style="verb">=</spanx>). Implementations <bcp14>MUST NOT</bcp14> append <spanx style="verb">=</spanx> padding
when encoding, and <bcp14>MUST</bcp14> accept input with or without padding when
decoding.</t>

<t>This encoding convention applies to: the <spanx style="verb">request</spanx> auth-param
in <spanx style="verb">WWW-Authenticate</spanx>, the credential token in
<spanx style="verb">Authorization</spanx>, and the receipt token in
<spanx style="verb">Payment-Receipt</spanx>.</t>

</section>
<section anchor="session-lifecycle"><name>Session Lifecycle</name>

<t>A session progresses through three phases, each corresponding to one or
more credential actions:</t>

<t><list style="numbers" type="1">
  <t><strong>Open</strong>: Client pays the deposit invoice and submits an
open action. The server verifies the preimage, stores session state, and
begins serving requests against the deposit balance.</t>
  <t><strong>Streaming</strong>: Client submits bearer actions to authenticate
requests without additional Lightning payments. The streaming layer
deducts the per-unit cost from the session balance for each chunk
delivered. When the balance is exhausted mid-stream, the server emits
a payment-need-topup event and holds the connection open. Top-up
actions extend the balance and allow the stream to resume.</t>
  <t><strong>Closed</strong>: Client submits a close action. The server
verifies session ownership, pays any unspent balance to the return
invoice, and marks the session closed. No further actions are accepted.</t>
</list></t>

<t>Sessions have no built-in expiry and remain open until explicitly closed
by the client or by the server. Servers <bcp14>SHOULD</bcp14> enforce an idle timeout on
open sessions to bound operational liability and storage requirements, and
<bcp14>MUST</bcp14> document their timeout policy. The <bcp14>RECOMMENDED</bcp14> idle timeout is 5
minutes of inactivity. When a server closes a session without a client close
action, it <bcp14>MUST</bcp14> follow the same refund procedure described in
<xref target="server-initiated-close"/>.</t>

</section>
<section anchor="challenge-request"><name>Challenge Request</name>

<t>When a request arrives without a valid credential, the server <bcp14>MUST</bcp14>
respond with HTTP 402 <xref target="RFC9110"/>, a
<spanx style="verb">Cache-Control: no-store</spanx> <xref target="RFC9111"/> header,
and a <spanx style="verb">WWW-Authenticate: Payment</spanx> header of the form:</t>

<figure><artwork><![CDATA[
WWW-Authenticate: Payment id="<challenge-id>",
  realm="<realm>",
  method="lightning",
  intent="session",
  request="<base64url(JCS-serialized JSON)>",
  expires="<RFC3339 timestamp>"
]]></artwork></figure>

<t>The <spanx style="verb">request</spanx> auth-param contains a JCS-serialized,
base64url-encoded JSON object (see <xref target="encoding"/>)
with the following fields:</t>

<dl>
  <dt>amount</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Cost per unit of service in base units (satoshis), as a
decimal string (e.g., "2"). For streaming responses, this is the
cost per emitted chunk. The value <bcp14>MUST</bcp14> be a positive integer.</t>
  </dd>
  <dt>currency</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Identifies the unit for <spanx style="verb">amount</spanx>. <bcp14>MUST</bcp14> be the string
"sat" (lowercase). "sat" denotes satoshis, the base unit used for
Lightning/Bitcoin amounts.</t>
  </dd>
  <dt>description</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Human-readable description of the service. This field
is carried inside the <spanx style="verb">request</spanx> JSON and is distinct from
any <spanx style="verb">description</spanx> auth-param that the base
<xref target="I-D.httpauth-payment"/> scheme may include at the
header level. Servers <bcp14>MAY</bcp14> instead (or additionally) convey the
description as the base spec's <spanx style="verb">description</spanx> auth-param.</t>
  </dd>
  <dt>unitType</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Human-readable label for the unit being priced
(e.g., "token", "chunk", "request"). Informational only; clients
<bcp14>MAY</bcp14> display this to users.</t>
  </dd>
  <dt>depositInvoice</dt>
  <dd>
    <t>CONDITIONAL. BOLT11 invoice the client must pay to open or top up
the session. <bcp14>REQUIRED</bcp14> for open and topUp challenges; <bcp14>MUST</bcp14> be absent
for bearer and close challenges, where no payment is required.</t>
  </dd>
  <dt>paymentHash</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. SHA-256 hash of the deposit invoice preimage, as a lowercase
hex string. Used by the server to verify open and topUp credentials.</t>
  </dd>
  <dt>depositAmount</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Exact deposit amount in satoshis, as a decimal string. When
present, <bcp14>MUST</bcp14> equal the amount encoded in depositInvoice. Informs the
client of the deposit size before it inspects the invoice. The BOLT11
invoice encodes a fixed amount; the client pays exactly that amount.
This document uses "depositAmount" (not "suggestedDeposit") intentionally:
the client cannot deposit a different amount than the invoice specifies.</t>
  </dd>
  <dt>idleTimeout</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The server's idle timeout policy for open sessions, in
seconds, as a decimal string (e.g., "300" for 5 minutes). When
present, informs the client how long the server will retain an open
session without activity before initiating a server-side close. Clients
<bcp14>SHOULD</bcp14> ensure their return invoice expiry exceeds this value. This field
is informational; the server's actual timeout behavior is authoritative.</t>
  </dd>
</dl>

<t>Servers <bcp14>MUST</bcp14> generate a fresh BOLT11 invoice for every unauthenticated
request. The invoice amount is the deposit amount as described in
<xref target="deposit-amount"/>.</t>

</section>
<section anchor="credential-schema"><name>Credential Schema</name>

<section anchor="structure"><name>Structure</name>

<t>The <spanx style="verb">Authorization</spanx> header carries a single base64url-encoded
JSON token (no auth-params) per <xref target="I-D.httpauth-payment"/>.
The decoded object contains three top-level fields:</t>

<dl>
  <dt>challenge</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. An echo of the challenge auth-params from the most
recent <spanx style="verb">WWW-Authenticate: Payment</spanx> header: <spanx style="verb">id</spanx>,
<spanx style="verb">realm</spanx>, <spanx style="verb">method</spanx>, <spanx style="verb">intent</spanx>,
<spanx style="verb">request</spanx>, and (if present) <spanx style="verb">expires</spanx>. This
binds the credential to a specific, unexpired, single-use
challenge issued by the server. For the <spanx style="verb">open</spanx> and
<spanx style="verb">topUp</spanx> actions, where a new deposit invoice was issued,
this also binds the preimage to the specific invoice.</t>
  </dd>
  <dt>source</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A payer identifier string, as defined by
<xref target="I-D.httpauth-payment"/>. The <bcp14>RECOMMENDED</bcp14> format
is a Decentralized Identifier (DID) per
<xref target="W3C-DID"/>. Servers <bcp14>MUST NOT</bcp14> require this field.</t>
  </dd>
  <dt>payload</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. A JSON object containing the session action. The
<spanx style="verb">action</spanx> field discriminates the type; action-specific
fields are placed alongside it. Implementations <bcp14>MUST</bcp14> ignore
unknown fields to allow forward-compatible extensions.</t>
  </dd>
</dl>

</section>
<section anchor="open-action"><name>Open Action</name>

<t>The open action proves the deposit invoice was paid and registers the
client's return invoice for future refunds.</t>

<dl>
  <dt>action</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "open".</t>
  </dd>
  <dt>preimage</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Hex-encoded payment preimage. SHA-256(preimage) <bcp14>MUST</bcp14> equal
challenge.request.paymentHash.</t>
  </dd>
  <dt>returnInvoice</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. BOLT11 invoice with no encoded amount. The server pays the
unspent session balance to this invoice on close. <bcp14>MUST</bcp14> have no amount
in the BOLT11 human-readable part. <bcp14>SHOULD</bcp14> have an expiry of at least
30 days to remain valid when the session eventually closes.</t>
  </dd>
</dl>

<t>Example credential (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "nX7kPqWvT2mJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "action": "open",
    "preimage": "a3f1e2d4b5c6a7e8...",
    "returnInvoice": "lnbcrt1p5abc..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="bearer-action"><name>Bearer Action</name>

<t>The bearer action authenticates a request against an existing session
without any Lightning payment. The client proves session ownership by
presenting the preimage that was revealed when the deposit invoice was
paid.</t>

<dl>
  <dt>action</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "bearer".</t>
  </dd>
  <dt>sessionId</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The paymentHash of the original deposit invoice, identifying
the session.</t>
  </dd>
  <dt>preimage</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Same preimage as the open action. SHA-256(preimage) <bcp14>MUST</bcp14>
equal session.paymentHash.</t>
  </dd>
</dl>

<t>The server verifies SHA-256(preimage) == session.paymentHash and that
the session is open. Balance checking and deduction are handled by the
streaming layer (see <xref target="streaming"/>); bearer verification
itself does not modify session.spent.</t>

<t>Security note: The payment preimage is a 32-byte random secret revealed
only to the payer upon Lightning payment settlement. Using it directly as
a bearer token allows the server to verify ownership with a single
SHA-256 check against the stored paymentHash, without ever storing the
secret. An alternative design using per-request HMAC tokens would require
the server to store the preimage, which is a worse security posture.
Implementations <bcp14>MUST</bcp14> use TLS (TLS 1.2 or higher; TLS 1.3 <bcp14>RECOMMENDED</bcp14>);
the preimage carries the same threat model as any API bearer token.</t>

<t>Example credential (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "pR4mNvKqU8wLsYtZ1bCdFg",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ..."
  },
  "payload": {
    "action": "bearer",
    "sessionId": "7f3a1b2c4d5e6f...",
    "preimage": "a3f1e2d4b5c6a7e8..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="topup-action"><name>TopUp Action</name>

<t>The topUp action proves payment of a new deposit invoice and adds the
deposited amount to the existing session balance.</t>

<dl>
  <dt>action</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "topUp".</t>
  </dd>
  <dt>sessionId</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The paymentHash of the original deposit invoice, identifying
the session.</t>
  </dd>
  <dt>topUpPreimage</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Preimage of the top-up invoice. SHA-256(topUpPreimage) <bcp14>MUST</bcp14>
equal challenge.request.paymentHash of the fresh invoice issued for
this top-up.</t>
  </dd>
</dl>

<t>To obtain a challenge for a top-up, the client submits an
unauthenticated request (no Authorization header) to a protected
endpoint. The request <bcp14>MAY</bcp14> target the same resource URI that required
the top-up (e.g., the paused stream) or a different protected resource
URI in the same realm; the server issues a fresh deposit invoice in
either case. The server assigns a new challenge <spanx style="verb">id</spanx> and returns 402. The client
pays the invoice, obtains the preimage, and submits a topUp
credential echoing that challenge. The server <bcp14>MUST</bcp14> verify the
echoed <spanx style="verb">challenge.id</spanx> exists, has not expired, and has
not been previously consumed before crediting the balance.
This ensures each top-up invoice can only be used once.</t>

<t>Upon successful verification, the server <bcp14>MUST</bcp14> atomically add the
top-up amount to <spanx style="verb">session.depositSats</spanx> and return HTTP 200
with body <spanx style="verb">{"status":"ok"}</spanx>. The top-up credits the shared
session balance; any streams that were paused waiting for
sufficient balance <bcp14>SHOULD</bcp14> observe the updated balance and resume
delivery autonomously. The server <bcp14>MUST NOT</bcp14> initiate a new stream
in response to a topUp credential.</t>

<t>Example credential (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "qS5nOwLrV9xMtZuA2cDeGh",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-03-15T12:10:00Z"
  },
  "payload": {
    "action": "topUp",
    "sessionId": "7f3a1b2c4d5e6f...",
    "topUpPreimage": "b9c3a4e1d2f5..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="close-action"><name>Close Action</name>

<t>The close action terminates the session and triggers a refund of the
unspent balance to the client's return invoice.</t>

<dl>
  <dt>action</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "close".</t>
  </dd>
  <dt>sessionId</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The paymentHash of the original deposit invoice, identifying
the session.</t>
  </dd>
  <dt>preimage</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Same preimage as the open action. Proves session ownership.</t>
  </dd>
</dl>

<t>After verifying the preimage and marking the session closed, the server
<bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Compute refundSats = session.depositSats - session.spent</t>
  <t>If refundSats &gt; 0, attempt to pay session.returnInvoice with
amountSatsToSend = refundSats. If refundSats is zero, the server
<bcp14>MUST NOT</bcp14> attempt to pay the return invoice.</t>
  <t>Return HTTP 200 with a Payment-Receipt header (per <xref target="receipt"/>) and
body {"status":"closed","refundSats":N,"refundStatus":"succeeded"|"failed"|"skipped"}.
If refundSats is zero, set refundStatus to "skipped". If the refund
payment succeeded, set refundStatus to "succeeded". If the refund
payment failed (e.g., the return invoice has expired or cannot be
routed), set refundStatus to "failed"; the server <bcp14>MUST</bcp14> still close the
session and <bcp14>MUST NOT</bcp14> reopen it. The server <bcp14>SHOULD</bcp14> log failed refunds
for auditability. The server <bcp14>MUST NOT</bcp14> retry the refund indefinitely;
a single best-effort attempt is sufficient.</t>
</list></t>

<t>Clients <bcp14>MUST NOT</bcp14> submit further actions on a closed session. Servers <bcp14>MUST</bcp14>
reject any action on a closed session.</t>

<t>Example credential (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "rT6oQxMsW0yNuAvB3dEfHi",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ..."
  },
  "payload": {
    "action": "close",
    "sessionId": "7f3a1b2c4d5e6f...",
    "preimage": "a3f1e2d4b5c6a7e8..."
  }
}
]]></sourcecode></figure>

<t>Example response (decoded receipt in Payment-Receipt header, body).
Success:</t>

<figure><sourcecode type="json"><![CDATA[
{ "status": "closed", "refundSats": 140, "refundStatus": "succeeded" }
]]></sourcecode></figure>

<t>Refund payment failed (session still closed):</t>

<figure><sourcecode type="json"><![CDATA[
{ "status": "closed", "refundSats": 140, "refundStatus": "failed" }
]]></sourcecode></figure>

<t>No refund owed:</t>

<figure><sourcecode type="json"><![CDATA[
{ "status": "closed", "refundSats": 0, "refundStatus": "skipped" }
]]></sourcecode></figure>

<t>The Payment-Receipt header <bcp14>MUST</bcp14> be present. For close, the receipt
<bcp14>MUST</bcp14> also include refundSats and refundStatus (see <xref target="receipt"/>).
Example decoded receipt for close (success):</t>

<figure><sourcecode type="json"><![CDATA[
{"method":"lightning","reference":"7f3a1b2c4d5e6f...","status":"success","timestamp":"2026-03-10T21:00:00Z","refundSats":140,"refundStatus":"succeeded"}
]]></sourcecode></figure>

<t>Close with refund failed:</t>

<figure><sourcecode type="json"><![CDATA[
{"method":"lightning","reference":"7f3a1b2c4d5e6f...","status":"success","timestamp":"2026-03-10T21:00:00Z","refundSats":140,"refundStatus":"failed"}
]]></sourcecode></figure>

</section>
</section>
<section anchor="deposit-amount"><name>Deposit Amount</name>

<t>The server determines the deposit amount when generating the challenge
invoice. The deposit <bcp14>MUST</bcp14> be at least 1 unit of service (i.e., at least
amount satoshis). The <bcp14>RECOMMENDED</bcp14> formula is:</t>

<figure><artwork><![CDATA[
depositSats = configured_depositAmount ?? (amount * 20)
]]></artwork></figure>

<t>The default multiplier of 20 is a recommendation that gives clients
~20 units of service before a top-up is required, balancing upfront cost
against top-up frequency. Servers <bcp14>MAY</bcp14> use a different multiplier and
<bcp14>MUST</bcp14> document their deposit policy.</t>

<t>Clients <bcp14>SHOULD</bcp14> inspect the depositAmount field in the challenge request
before paying to confirm the expected deposit size. The deposit amount
is encoded in the BOLT11 invoice and cannot be changed by the client.</t>

</section>
<section anchor="verification-procedure"><name>Verification Procedure</name>

<section anchor="open-verification"><name>Open Verification</name>

<t><list style="numbers" type="1">
  <t>Look up the stored challenge using <spanx style="verb">credential.challenge.id</spanx>. If not found or already consumed, reject.</t>
  <t>Verify the echoed <spanx style="verb">credential.challenge</spanx> exactly matches the stored challenge params.</t>
  <t>Decode preimage from hex</t>
  <t>Compute SHA-256(preimage) and verify it equals the paymentHash stored with the challenge</t>
  <t>Decode deposit amount from the BOLT11 invoice human-readable part</t>
  <t>Verify depositSats &gt;= amount (at least one unit of service)</t>
  <t>Verify the returnInvoice is a valid BOLT11 invoice on the same
network as the deposit invoice. Decode the returnInvoice and verify
that the encoded amount resolves to 0 satoshis. The invoice <bcp14>MAY</bcp14> omit
the amount field entirely, or <bcp14>MAY</bcp14> encode an explicit 0-satoshi
amount; both are accepted. Invoices encoding a non-zero amount <bcp14>MUST</bcp14>
be rejected, as the refund amount is determined by the server at
close time.</t>
  <t>Store session state: {paymentHash, depositSats, spent: 0,
returnInvoice, status: "open"}</t>
  <t>Return a receipt with reference = paymentHash (the session ID)</t>
</list></t>

</section>
<section anchor="bearer-verification"><name>Bearer Verification</name>

<t><list style="numbers" type="1">
  <t>Look up the session by payload.sessionId</t>
  <t>Verify session.status == "open"</t>
  <t>Compute SHA-256(payload.preimage) and verify it equals session.paymentHash</t>
  <t>Return a receipt</t>
</list></t>

<t>Bearer verification does not deduct from the session balance. All
billing is handled by the streaming layer (see
<xref target="streaming"/>).</t>

</section>
<section anchor="topup-verification"><name>TopUp Verification</name>

<t><list style="numbers" type="1">
  <t>Look up the stored challenge using <spanx style="verb">credential.challenge.id</spanx>. If not found, expired, or already consumed, reject.</t>
  <t>Verify the echoed <spanx style="verb">credential.challenge</spanx> exactly matches the stored challenge params. Mark the challenge consumed.</t>
  <t>Look up the session by <spanx style="verb">payload.sessionId</spanx></t>
  <t>Verify session.status == "open"</t>
  <t>Compute SHA-256(payload.topUpPreimage) and verify it equals
the paymentHash stored with the challenge</t>
  <t>Decode top-up amount from the BOLT11 invoice in the stored challenge's depositInvoice</t>
  <t>Atomically update session.depositSats += topUpSats</t>
  <t>Return a receipt</t>
</list></t>

</section>
<section anchor="close-verification"><name>Close Verification</name>

<t><list style="numbers" type="1">
  <t>Look up the session by payload.sessionId</t>
  <t>Verify session.status == "open"</t>
  <t>Compute SHA-256(payload.preimage) and verify it equals session.paymentHash</t>
  <t>Mark session.status = "closed"</t>
  <t>If refundSats &gt; 0, attempt to pay session.returnInvoice with
amountSatsToSend = refundSats. If refundSats is zero, the server
<bcp14>MUST NOT</bcp14> attempt to pay the return invoice.</t>
  <t>Return HTTP 200 with a Payment-Receipt header and body
{"status":"closed","refundSats":N,"refundStatus":"succeeded"|"failed"|"skipped"}.
The server <bcp14>SHOULD</bcp14> log failed refunds. The server <bcp14>MUST NOT</bcp14> retry the
refund indefinitely.</t>
</list></t>

</section>
</section>
<section anchor="idempotency"><name>Idempotency</name>

<t>Retrying a credential after a network failure <bcp14>MUST NOT</bcp14> result in
double-crediting or double-refunding. Servers <bcp14>MUST</bcp14> enforce
idempotency keyed by <spanx style="verb">credential.challenge.id</spanx>:</t>

<t><list style="symbols">
  <t>A challenge that has already been successfully consumed <bcp14>MUST</bcp14>
return the original HTTP response (same status code and body)
when presented again, without re-executing the action.</t>
  <t>Servers <bcp14>MUST</bcp14> store the result of each consumed challenge (status
code, response body) for at least the duration of the challenge's
<spanx style="verb">expires</spanx> window, or for a minimum of 5 minutes if no
expiry was set.</t>
  <t>Servers <bcp14>MUST</bcp14> atomically mark a challenge consumed and record
its result in a single operation, so that a crash between
verification and response does not leave the challenge in an
ambiguous state on retry.</t>
</list></t>

</section>
<section anchor="server-initiated-close"><name>Server-Initiated Close</name>

<t>A server <bcp14>MAY</bcp14> close an open session without a client close action. Common
triggers include idle timeout (no bearer or topUp action received within
the server's configured inactivity window) and planned maintenance. When
a server initiates a close, it <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Mark session.status = "closed" atomically before attempting the refund,
to prevent concurrent bearer actions from spending against a session
that is being closed.</t>
  <t>Compute refundSats = session.depositSats - session.spent</t>
  <t>If refundSats &gt; 0, attempt to pay session.returnInvoice with
amountSatsToSend = refundSats, subject to the same fee constraints as
a client-initiated close. If refundSats is zero, the server <bcp14>MUST NOT</bcp14>
attempt to pay the return invoice.</t>
</list></t>

<t>If the refund payment fails (e.g., the return invoice has expired or
cannot be routed), the server <bcp14>MUST NOT</bcp14> reopen the session. The server
<bcp14>SHOULD</bcp14> log the failed refund attempt including the sessionId and
refundSats for auditability. The server <bcp14>MUST NOT</bcp14> retry indefinitely;
a single best-effort attempt is sufficient.</t>

<t>After a server-initiated close, subsequent bearer or close actions
referencing that session will be rejected per the normal closed-session
handling (see <xref target="sec-replay"/>). Clients discover the
server-initiated close when their next bearer action is rejected and
<bcp14>SHOULD</bcp14> treat the rejection as a signal to open a new session.</t>

<t>To reduce the risk of return invoice expiry, clients <bcp14>SHOULD</bcp14> supply a
return invoice with an expiry that comfortably exceeds the server's
advertised idleTimeout. The <bcp14>RECOMMENDED</bcp14> return invoice expiry is at
least twice the idleTimeout value.</t>

</section>
<section anchor="streaming"><name>Streaming and Per-Chunk Billing</name>

<t>For streaming responses, the challenge request's <spanx style="verb">amount</spanx> field is the
cost per emitted chunk in satoshis. Bearer verification does not deduct
from the session balance; instead, the streaming layer deducts <spanx style="verb">amount</spanx>
sats from the balance for each chunk delivered, reading the per-unit
cost directly from the echoed challenge request.</t>

<t>When a streaming response exhausts the available session balance
mid-stream, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Stop delivering additional metered content immediately</t>
  <t>Emit a payment-need-topup SSE event on the existing connection</t>
  <t>Hold the connection open and pause delivery</t>
  <t>Poll or await an increase in <spanx style="verb">session.depositSats</spanx>. Once
a topUp credential is successfully verified and the session
balance is sufficient to cover the next unit of service, resume
delivery on the paused connection.</t>
</list></t>

<t>A top-up credits the shared session balance; the server does not
need to be explicitly notified which connection to resume. Any
paused streams that observe sufficient balance after a top-up
<bcp14>SHOULD</bcp14> resume autonomously. Servers <bcp14>SHOULD</bcp14> close any held
connection if the balance does not become sufficient within a
reasonable timeout (<bcp14>RECOMMENDED</bcp14>: 60 seconds). When the timeout fires,
the server <bcp14>MUST</bcp14> close the SSE connection. The server <bcp14>SHOULD</bcp14> emit a
final SSE event (e.g., event: session-timeout) with session balance
details before closing (see <xref target="session-timeout-event"/>), so the client
does not only observe a dropped connection.</t>

<t>Holding the connection open preserves any upstream state the server
maintains (e.g., an in-flight request to an upstream LLM provider).
Clients benefit because they do not need to replay the original request
or deduplicate partially-delivered content.</t>

<section anchor="payment-need-topup-event"><name>payment-need-topup Event</name>

<t>For SSE <xref target="SSE"/> responses, the payment-need-topup event
<bcp14>MUST</bcp14> be formatted as follows:</t>

<figure><artwork><![CDATA[
event: payment-need-topup
data: {"sessionId":"7f3a...","balanceSpent":300,"balanceRequired":2}
]]></artwork></figure>

<t>The event data <bcp14>MUST</bcp14> be a JSON object containing:</t>

<dl>
  <dt>sessionId</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The session identifier (paymentHash of the deposit invoice).</t>
  </dd>
  <dt>balanceSpent</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Total satoshis spent from the current deposit at the point of
exhaustion.</t>
  </dd>
  <dt>balanceRequired</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Satoshis needed for the next unit of service (i.e., the amount
that could not be covered).</t>
  </dd>
</dl>

</section>
<section anchor="session-timeout-event"><name>session-timeout Event</name>

<t>When the server closes a held SSE connection because the balance did
not become sufficient within the configured timeout, the server <bcp14>SHOULD</bcp14>
emit a session-timeout event immediately before closing the connection.
This allows the client to distinguish a timeout from a generic network
drop and to show session balance details to the user.</t>

<figure><artwork><![CDATA[
event: session-timeout
data: {"sessionId":"7f3a...","balanceSpent":300,"balanceRequired":2}
]]></artwork></figure>

<t>The event data <bcp14>MUST</bcp14> be a JSON object containing the same fields as
the payment-need-topup event: sessionId, balanceSpent, and
balanceRequired (see <xref target="payment-need-topup-event"/>). After emitting
this event, the server <bcp14>MUST</bcp14> close the SSE connection.</t>

</section>
<section anchor="client-top-up-flow"><name>Client Top-Up Flow</name>

<t>Upon receiving a payment-need-topup event, the client <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Continue holding the original SSE response reader open (do not close
the connection)</t>
  <t>Submit an unauthenticated request to the same resource URI to obtain
a new 402 challenge with a fresh deposit invoice</t>
  <t>Pay the deposit invoice and obtain the preimage</t>
  <t>Retry the request with a topUp credential; the server verifies
the preimage, credits the session balance, and returns HTTP 200</t>
  <t>Continue reading from the original SSE reader; the paused
stream observes the updated balance and resumes automatically</t>
</list></t>

<t>The topUp request returns HTTP 200 with body <spanx style="verb">{"status":"ok"}</spanx>
to acknowledge the balance credit. The actual stream content
resumes on the original connection, not the topUp response.</t>

<figure><artwork><![CDATA[
   Client                        Server                   Lightning Network
      |                             |                             |
      |  (1) [SSE stream open,      |                             |
      |       receiving chunks]     |                             |
      |<--------------------------  |                             |
      |    data: {chunk}            |                             |
      |    event: need-topup        |  (server pauses, holds open)|
      |                             |                             |
      |  (2) GET /generate          |                             |
      |      (unauthenticated)      |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (3) 402 + deposit invoice  |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  (4) Pay deposit invoice    |                             |
      |------------------------------------------------------>    |
      |  (5) Preimage               |                             |
      |<------------------------------------------------------    |
      |                             |                             |
      |  (6) GET /generate          |                             |
      |      action="topUp"         |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (7) 200 {"status":"ok"}    |                             |
      |<--------------------------  |                             |
      |    data: {chunk} (resumed)  |  (original SSE connection)  |
      |    data: [DONE]             |                             |
      |                             |                             |
]]></artwork></figure>

</section>
</section>
<section anchor="session-state"><name>Session State</name>

<t>Servers <bcp14>MUST</bcp14> persist session state in a durable store keyed by sessionId.
The minimum required state is:</t>

<dl>
  <dt>paymentHash</dt>
  <dd>
    <t>SHA-256 hash of the deposit preimage. Serves as the session identifier.</t>
  </dd>
  <dt>depositSats</dt>
  <dd>
    <t>Total satoshis deposited. Increases with each successful top-up.</t>
  </dd>
  <dt>spent</dt>
  <dd>
    <t>Running total of satoshis charged against the session.</t>
  </dd>
  <dt>returnInvoice</dt>
  <dd>
    <t>BOLT11 return invoice for refunds on close.</t>
  </dd>
  <dt>status</dt>
  <dd>
    <t>Either "open" or "closed".</t>
  </dd>
</dl>

<t>Servers <bcp14>MUST</bcp14> serialize all balance updates to prevent race conditions.
Concurrent bearer and topUp requests for the same session <bcp14>MUST NOT</bcp14> result
in double-spending the same satoshis.</t>

</section>
<section anchor="receipt"><name>Receipt</name>

<t>Upon successful verification of any action (including close), the server
<bcp14>MUST</bcp14> attach a payment receipt to the response via the Payment-Receipt
header per <xref target="I-D.httpauth-payment"/> {#receipt}. The header receipt
contains:</t>

<dl>
  <dt>method</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "lightning".</t>
  </dd>
  <dt>reference</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The session ID (paymentHash).</t>
  </dd>
  <dt>status</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "success".</t>
  </dd>
  <dt>timestamp</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Settlement time in <xref target="RFC3339"/> format.</t>
  </dd>
  <dt>refundSats</dt>
  <dd>
    <t>For close actions only. <bcp14>REQUIRED</bcp14> in the receipt when the action is
close. The unspent balance that was (or was attempted to be) refunded,
as a number. Omitted for non-close actions.</t>
  </dd>
  <dt>refundStatus</dt>
  <dd>
    <t>For close actions only. <bcp14>REQUIRED</bcp14> in the receipt when the action is
close. One of "succeeded" (refund payment completed), "failed"
(refund payment did not complete, e.g., return invoice expired or
could not be routed), or "skipped" (refundSats was zero, no payment
attempted). Omitted for non-close actions.</t>
  </dd>
</dl>

<section anchor="streaming-receipt-event"><name>Streaming Receipt Event</name>

<t>For streaming responses, the Payment-Receipt header is attached at
response initiation before any chunks are delivered. Because the final
consumption totals are not yet known at that point, the server <bcp14>MUST</bcp14>
also emit a final payment-receipt SSE <xref target="SSE"/> event once the stream completes,
with the following JSON data:</t>

<dl>
  <dt>method</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "lightning".</t>
  </dd>
  <dt>reference</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The session ID (paymentHash).</t>
  </dd>
  <dt>status</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The string "success".</t>
  </dd>
  <dt>timestamp</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Completion time in <xref target="RFC3339"/> format.</t>
  </dd>
  <dt>spent</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Total satoshis deducted from the session balance during
this stream, as a number.</t>
  </dd>
  <dt>units</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Number of chunks delivered in this stream.</t>
  </dd>
</dl>

<t>The payment-receipt event <bcp14>MUST</bcp14> be emitted before the [DONE] sentinel.
Example:</t>

<figure><artwork><![CDATA[
event: payment-receipt
data: {"method":"lightning","reference":"7f3a...","status":"success",
       "timestamp":"2026-03-11T00:00:00Z","spent":202,"units":101}

data: [DONE]
]]></artwork></figure>

</section>
</section>
<section anchor="error-responses"><name>Error Responses</name>

<t>When rejecting a credential, the server <bcp14>MUST</bcp14> return HTTP 402 (Payment
Required) with a fresh <spanx style="verb">WWW-Authenticate: Payment</spanx> challenge per
<xref target="I-D.httpauth-payment"/>. The server <bcp14>SHOULD</bcp14> include a response body
conforming to RFC 9457 <xref target="RFC9457"/> Problem Details, with
<spanx style="verb">Content-Type: application/problem+json</spanx>. The following
problem types are defined for this intent:</t>

<dl>
  <dt>https://paymentauth.org/problems/lightning/malformed-credential</dt>
  <dd>
    <t>HTTP 402. The credential token could not be decoded or parsed,
or required fields are absent or have the wrong type. A fresh
challenge <bcp14>MUST</bcp14> be included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/unknown-challenge</dt>
  <dd>
    <t>HTTP 402. The <spanx style="verb">credential.challenge.id</spanx> does not match
any challenge issued by this server, or has already been consumed.
A fresh challenge <bcp14>MUST</bcp14> be included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/invalid-preimage</dt>
  <dd>
    <t>HTTP 402. SHA-256(payload.preimage) or SHA-256(payload.topUpPreimage)
does not equal the paymentHash stored for the identified challenge.
A fresh challenge <bcp14>MUST</bcp14> be included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/session-not-found</dt>
  <dd>
    <t>HTTP 402. The <spanx style="verb">payload.sessionId</spanx> does not match any
session stored by this server. A fresh challenge <bcp14>MUST</bcp14> be included
in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/session-closed</dt>
  <dd>
    <t>HTTP 402. The session identified by <spanx style="verb">payload.sessionId</spanx>
has status "closed". No further actions are accepted. A fresh
challenge <bcp14>MUST</bcp14> be included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/insufficient-balance</dt>
  <dd>
    <t>HTTP 402. The session balance is insufficient to cover the
requested operation. The client <bcp14>SHOULD</bcp14> top up the session. A fresh
challenge <bcp14>MUST</bcp14> be included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/challenge-expired</dt>
  <dd>
    <t>HTTP 402. The challenge identified by
<spanx style="verb">credential.challenge.id</spanx> has passed its expiry time.
The client <bcp14>MUST</bcp14> obtain a fresh challenge. A fresh challenge <bcp14>MUST</bcp14> be
included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
  <dt>https://paymentauth.org/problems/lightning/invalid-return-invoice</dt>
  <dd>
    <t>HTTP 402. The <spanx style="verb">payload.returnInvoice</spanx> in an open action
is not a valid BOLT11 invoice, or encodes a non-zero amount. A fresh
challenge <bcp14>MUST</bcp14> be included in <spanx style="verb">WWW-Authenticate</spanx>.</t>
  </dd>
</dl>

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

<section anchor="bearer-token-exposure"><name>Bearer Token Exposure</name>

<t>The preimage is transmitted in every bearer request. Implementations
<bcp14>MUST</bcp14> use TLS (HTTPS) for all endpoints protected by this method (TLS 1.2
or higher; TLS 1.3 <bcp14>RECOMMENDED</bcp14>). The
preimage has the same exposure risk as any API bearer token; its security
properties are equivalent to a 256-bit random secret transmitted over an
encrypted channel.</t>

</section>
<section anchor="preimage-verification"><name>Preimage Verification</name>

<t>Servers <bcp14>MUST</bcp14> verify SHA-256(preimage) == paymentHash for all open,
bearer, and close actions. Failure to verify allows any party to
impersonate a session they did not fund.</t>

</section>
<section anchor="session-isolation"><name>Session Isolation</name>

<t>The paymentHash of the deposit invoice serves as the session identifier.
Payment hashes are globally unique within the Lightning Network for a
given invoice. Servers <bcp14>MUST NOT</bcp14> allow session IDs to be guessed or
reused across sessions.</t>

</section>
<section anchor="double-spend-prevention"><name>Double-Spend Prevention</name>

<t>Balance deduction is the exclusive responsibility of the streaming
layer (see <xref target="streaming"/>); bearer credential
verification itself does not modify <spanx style="verb">session.spent</spanx>.
The streaming layer <bcp14>MUST</bcp14> atomically deduct <spanx style="verb">amount</spanx> sats
from the available balance for each chunk delivered, to prevent
concurrent chunk deliveries from overdrawing the session balance.
TopUp actions <bcp14>MUST</bcp14> atomically increment <spanx style="verb">session.depositSats</spanx>
so that any paused streams observe the updated balance
immediately after the credit.</t>

</section>
<section anchor="return-invoice-validation"><name>Return Invoice Validation</name>

<t>Servers <bcp14>MUST</bcp14> verify that returnInvoice is a valid BOLT11 invoice with no
encoded amount before storing it. Servers <bcp14>SHOULD</bcp14> reject return invoices
that encode an amount, as the refund amount is determined by the server
at close time and must not be constrained by the invoice.</t>

</section>
<section anchor="top-up-invoice-binding"><name>Top-Up Invoice Binding</name>

<t>The topUpPreimage <bcp14>MUST</bcp14> be verified against challenge.request.paymentHash
— the payment hash of the fresh invoice the server issued for this
specific top-up request. This prevents a client from replaying an old
top-up preimage to fraudulently inflate their session balance.</t>

</section>
<section anchor="sec-replay"><name>Replay Prevention</name>

<t>Closed sessions <bcp14>MUST</bcp14> be retained in the store (with status: "closed")
to prevent replay attacks using the preimage of a closed session. Servers
<bcp14>MUST</bcp14> reject any action submitted against a closed session.</t>

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

<t>The "lightning" payment method is registered in the "HTTP Payment
Methods" registry by <xref target="I-D.lightning-charge"/>; this document does not
register it again.</t>

<section anchor="payment-intent-registration"><name>Payment Intent Registration</name>

<t>This document requests registration of the following entry in
the "HTTP Payment Intents" registry established by
<xref target="I-D.httpauth-payment"/>:</t>

<texttable>
      <ttcol align='left'>Intent</ttcol>
      <ttcol align='left'>Applicable Methods</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <ttcol align='left'>Contact</ttcol>
      <c><spanx style="verb">session</spanx></c>
      <c><spanx style="verb">lightning</spanx></c>
      <c>Prepaid session with per-unit streaming billing and refund on close</c>
      <c>This document</c>
      <c>Lightspark (<eref target="mailto:contact@lightspark.com">contact@lightspark.com</eref>)</c>
</texttable>

</section>
<section anchor="problem-type-registrations"><name>Problem Type Registrations</name>

<t>This document defines the following problem type URIs under
the <spanx style="verb">https://paymentauth.org/problems/lightning/</spanx> namespace,
for use with RFC 9457 <xref target="RFC9457"/> Problem Details:</t>

<texttable>
      <ttcol align='left'>Type URI</ttcol>
      <ttcol align='left'>HTTP Status</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">lightning/malformed-credential</spanx></c>
      <c>402</c>
      <c>Credential is unparseable or missing required fields</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/unknown-challenge</spanx></c>
      <c>402</c>
      <c>Challenge ID not found or already consumed</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/invalid-preimage</spanx></c>
      <c>402</c>
      <c>Preimage does not match stored payment hash</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/session-not-found</spanx></c>
      <c>402</c>
      <c>Session ID not found</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/session-closed</spanx></c>
      <c>402</c>
      <c>Session is closed; no further actions accepted</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/insufficient-balance</spanx></c>
      <c>402</c>
      <c>Session balance insufficient for requested operation</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/challenge-expired</spanx></c>
      <c>402</c>
      <c>Challenge has passed its expiry time</c>
      <c>This document</c>
      <c><spanx style="verb">lightning/invalid-return-invoice</spanx></c>
      <c>402</c>
      <c>Return invoice invalid or encodes non-zero amount</c>
      <c>This document</c>
</texttable>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

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

&RFC2119;
&RFC3339;
&RFC4648;
&RFC8174;
&RFC8259;
&RFC8785;
&RFC9110;
&RFC9111;
&RFC9457;
<reference anchor="BOLT11" target="https://github.com/lightning/bolts/blob/master/11-payment-encoding.md">
  <front>
    <title>BOLT #11: Invoice Protocol for Lightning Payments</title>
    <author >
      <organization>Lightning Network Developers</organization>
    </author>
    <date year="2024"/>
  </front>
</reference>
<reference anchor="I-D.httpauth-payment" target="https://datatracker.ietf.org/doc/draft-ryan-httpauth-payment/">
  <front>
    <title>The 'Payment' HTTP Authentication Scheme</title>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <date year="2026" month="January"/>
  </front>
</reference>


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="I-D.lightning-charge" target="https://datatracker.ietf.org/doc/draft-lightning-charge/">
  <front>
    <title>Lightning Network Charge Intent for HTTP Payment Authentication</title>
    <author >
      <organization>Lightspark</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="SSE" target="https://html.spec.whatwg.org/multipage/server-sent-events.html">
  <front>
    <title>Server-Sent Events</title>
    <author >
      <organization>WHATWG</organization>
    </author>
    <date year="2024"/>
  </front>
</reference>
<reference anchor="draft-tempo-session-00" target="https://datatracker.ietf.org/doc/draft-tempo-session/">
  <front>
    <title>Tempo Session Intent for HTTP Payment Authentication</title>
    <author >
      <organization>Tempo Labs</organization>
    </author>
    <date year="2026" month="March"/>
  </front>
</reference>
<reference anchor="W3C-DID" target="https://www.w3.org/TR/did-core/">
  <front>
    <title>Decentralized Identifiers (DIDs) v1.0</title>
    <author >
      <organization>W3C</organization>
    </author>
    <date year="2022"/>
  </front>
</reference>


    </references>

</references>


<?line 1109?>

<section anchor="examples"><name>Examples</name>

<section anchor="challenge-unauthenticated-request"><name>Challenge (Unauthenticated Request)</name>

<figure><sourcecode type="http"><![CDATA[
GET /generate HTTP/1.1
Host: api.example.com

HTTP/1.1 402 Payment Required
WWW-Authenticate: Payment id="nX7kPqWvT2mJrHsY4aDfEb",
  realm="api.example.com",
  method="lightning",
  intent="session",
  request="eyJhbW91bnQiOiIyIiwiY3VycmVuY3kiOiJCVEMiLCJkZXBvc2l0SW52b2ljZSI6ImxuYmNydDFwNW16ZnNhLi4uIiwicGF5bWVudEhhc2giOiI3ZjNhLi4uIiwiZGVwb3NpdEFtb3VudCI6IjMwMCJ9",
  expires="2026-03-15T12:05:00Z"
Cache-Control: no-store
]]></sourcecode></figure>

<t>Decoded <spanx style="verb">request</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "2",
  "currency": "sat",
  "description": "LLM token stream",
  "depositInvoice": "lnbcrt1p5mzfsa...",
  "paymentHash": "7f3a1b2c4d5e6f...",
  "depositAmount": "300"
}
]]></sourcecode></figure>

</section>
<section anchor="open-credential"><name>Open Credential</name>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "nX7kPqWvT2mJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "action": "open",
    "preimage": "a3f1e2d4b5c6a7e8...",
    "returnInvoice": "lnbcrt1p5abc..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="bearer-credential"><name>Bearer Credential</name>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "pR4mNvKqU8wLsYtZ1bCdFg",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ..."
  },
  "payload": {
    "action": "bearer",
    "sessionId": "7f3a1b2c4d5e6f...",
    "preimage": "a3f1e2d4b5c6a7e8..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="insufficient-balance-sse-event"><name>Insufficient Balance SSE Event</name>

<figure><artwork><![CDATA[
event: payment-need-topup
data: {"sessionId":"7f3a...","balanceSpent":300,"balanceRequired":2}
]]></artwork></figure>

</section>
<section anchor="topup-credential"><name>TopUp Credential</name>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "qS5nOwLrV9xMtZuA2cDeGh",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-03-15T12:10:00Z"
  },
  "payload": {
    "action": "topUp",
    "sessionId": "7f3a1b2c4d5e6f...",
    "topUpPreimage": "b9c3a4e1d2f5..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="close-credential-and-response"><name>Close Credential and Response</name>

<t>Credential (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "rT6oQxMsW0yNuAvB3dEfHi",
    "realm": "api.example.com",
    "method": "lightning",
    "intent": "session",
    "request": "eyJ..."
  },
  "payload": {
    "action": "close",
    "sessionId": "7f3a1b2c4d5e6f...",
    "preimage": "a3f1e2d4b5c6a7e8..."
  }
}
]]></sourcecode></figure>

<t>Response body:</t>

<figure><sourcecode type="json"><![CDATA[
{ "status": "closed", "refundSats": 140 }
]]></sourcecode></figure>

</section>
</section>
<section anchor="schema-definitions"><name>Schema Definitions</name>

<t>The schemas in this appendix use JSON Schema vocabulary for
illustrative purposes only. They are informational; the normative
definitions are in the body of this document. No specific JSON
Schema draft version is required or assumed.</t>

<section anchor="challenge-request-schema"><name>Challenge Request Schema</name>

<figure><sourcecode type="json"><![CDATA[
{
  "type": "object",
  "required": [
    "amount", "currency", "paymentHash"
  ],
  "properties": {
    "amount":          { "type": "string" },
    "currency":        { "type": "string", "const": "sat" },
    "description":     { "type": "string" },
    "unitType":        { "type": "string" },
    "depositInvoice":  { "type": "string" },
    "paymentHash":     { "type": "string" },
    "depositAmount":   { "type": "string" },
    "idleTimeout":     { "type": "string" }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="credential-payload-schema"><name>Credential Payload Schema</name>

<figure><sourcecode type="json"><![CDATA[
{
  "oneOf": [
    {
      "type": "object",
      "required": ["action", "preimage", "returnInvoice"],
      "properties": {
        "action":        { "const": "open" },
        "preimage":      { "type": "string" },
        "returnInvoice": { "type": "string" }
      }
    },
    {
      "type": "object",
      "required": ["action", "sessionId", "preimage"],
      "properties": {
        "action":    { "const": "bearer" },
        "sessionId": { "type": "string" },
        "preimage":  { "type": "string" }
      }
    },
    {
      "type": "object",
      "required": ["action", "sessionId", "topUpPreimage"],
      "properties": {
        "action":        { "const": "topUp" },
        "sessionId":     { "type": "string" },
        "topUpPreimage": { "type": "string" }
      }
    },
    {
      "type": "object",
      "required": ["action", "sessionId", "preimage"],
      "properties": {
        "action":    { "const": "close" },
        "sessionId": { "type": "string" },
        "preimage":  { "type": "string" }
      }
    }
  ]
}
]]></sourcecode></figure>

</section>
<section anchor="receipt-schema"><name>Receipt Schema</name>

<figure><sourcecode type="json"><![CDATA[
{
  "type": "object",
  "required": ["method", "reference", "status", "timestamp"],
  "properties": {
    "method":    { "type": "string", "const": "lightning" },
    "reference": { "type": "string" },
    "status":    { "type": "string", "const": "success" },
    "timestamp": { "type": "string", "format": "date-time" }
  }
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors thank the Spark SDK team, the Tempo Labs team for their
prior work on the session intent for EVM-based payment channels, and the
broader Lightning Network developer community. The authors also thank
Brendan Ryan for his review of this document.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+196XbbRtbg/3qKGvpHxDRJa7HsRG6nP1ly2kq8tSXbX9yn
zxAkQAkxCLABUDJjq888xDzAPMs8yjzJ3K02EKQkt5OO+7TPSUyTQC237r5V
v99XdVpnyZ5+kp6e1Xman+pnSX1RlO/0cVJVaZHro7xO8lpPilI/Pjl5oV9E
iyl+sT+vz+DvdBzV8JiKRqMyOfcHCgdQcTHOoylMFZfRpO5n5rl+xc/1NzfV
eVLixz0Nn2Hc5LQoF3s6zSeFSmflns6Lp0WcTmTOk3Je1dubm99ubqtqPpqm
NE69mCX4TpzMEvgfzDwu8irJq3m1pydRViVKRbD2otxTWvc1L+rH5DzN9duz
KD+FbzW8D0//OPC+SaZRmu3pd8n5L/9Fi69mUfluMC6m9HNRnsrm6Xtv6B+S
Mpku9I9ZkuZu7B8G3jcy9s/05M1GfwuHoJ/M3cBvB+afMuov8EQ2v86oKi/K
KYD2PEHQvPz+YHtr61v5uLOzYz7euXvnG/n4zda9O+bj9q554Jt73+zKx2+3
tjbdxy3z8c7uPfz48PmTE/5Sa0HEDn6nb8G3gDjnRTpO9IuyqItxkREOOvwS
RKw6/HpUnib1nj6r61m1d/v2aVqfzUe41dsW1W6Piqyubo+yYnR7GlV1Ut7e
2urPeJx+ko8BufLTwTSmER2S4J++B62ATg6T8yQrZoC59GQMaLuntze378A/
j/qHA1wQDmXmCXd7cpbor2QnXzGBhYSlj8dnyTRp3yRMFtVlNH6XlIM0qScD
WONtILTbTGPlIsr7zflvt25OUDV6l+inxftkEe7lbn9zSymkQw8/cHOOisdn
uLZwc8vAOqCnrslTPmnPzRW1b3eZnvzdwj+Pjx+FezlOSuBO/WNc5qPz1Xh3
Vk+zQTVLxoOLs6i+OKXlTedZnc4iWE3Fw1SEcDTMAN9Yvcg3j/dP3vx5GbV4
t3UynRUeB20gF/56Q0b+SUAPlrEG4rygJ9GoWsKvHfjmzc5B//DoMNzEYTKG
1ZVRlv6SxPoIOTpIACA3vQHPVl19vjXYbF/1xcXF4GKH1nry8nacxv1xUa7D
CFhAuLBt1QcZif/TsGiEQK3UyVlaadj8nMAXJ5M0TyoNQNQdAUEHWLEFNv1g
0bKjhQ7VNIEVxHpeIYEwJ4TXiOVVGs4L31uioJ6+AMaW0q/KnOBqtjHQR7VG
bESQVTrSszKZRWmsZKF6WsQJM9Y0H4P0gRGirKdhbSCLYrPWSlfztI5GWUKP
AiCSaAqrUojOtN5qPj7TUaWfPHmq6+IdyKTTJE9KWgus+QxGow0Bn+yXyd/n
SVXrcQH/Sys1z9/lxUWu57NJCfJ7wPCepnGcgay+hYhbFvF8THqGWoO7+sOH
No57eanMIUUauEKWJflpAsuoZqgZwGbhyzytprDCqNancPjw5Bi2BadaMHTh
4WJewldqlAD4Y1jeuCwMeAY6xIkyOU1RvKzHCtWCFZqxAmDwKs/Sdwy0DrMy
8z7CMwVwIxzTknY1mWdZAFuLOEoG7tFI5thlIQCK4qLS4yylQ4bNAn70QXMq
qhR+1dl8OoOjneoojxVCmshGAA6jzUcVzkc7pnkrPVrgGMjfEGvpyGVn8HU6
BR4IaKIiPUqiMikZVxB8uDZkjZrYDO6pnOeE+aMoi3JQA2ANQGyIBwRWVOsm
6ekc0ZQwCbav5zmsu5howcuBfoOL9nc+zgr4aKCBM6oymczzGKbMFzAAUAss
1kx6nkaINASgfjWfzeBTDLut52VuqHUgLIFpCT5cJFnWR4qBRwGmlly0QTng
XcngdNDTy1JFkZLTQkVdj4rqAqjU0I9u0A8dVisu6LKAjfbrMp3BIot5FiMi
EG0lMAqi/IypPIPjzceLgfC6pEpPc5wKNMxZihCHY27BJyazmBD80eunltUh
feVJhu8DjbaLrstLRoNZWcABOpoEfX8ClLSn3DbMrPPK52n2zJBD0uoMInuY
pyPlYx6REuyXBVMwLpDyPCNlR58XwN2QmqPTCCBQK1gwLA82k1TABS4G+mEB
U6bTWcYcFM8LeCJQLZ9XBdqVFSACrD1l1i3L7BEBEwaP0iyDjfYI5xk9Eaub
yAnskNAZEPDWLf0KWNlBVKExB+hzQuhzbDm1QtiCbQSUm9mNToD8EeDjJEH8
r+DgiCPsKbU10AeE9Y60Iw+TQa+GzRLT3QBdyWJ2V20PBKuFSip9Z3ObzyRy
VGi4MAwE8ErpWCN7YEJYascuAjCpCs5UHiEIgfadV250dccuYQSMGE/CrPu+
5SCWZYzPgH40UM7Urk7gq3ZBfE4stAH9k/dnEdicCbL/uM+j9gzjSqYpAcnY
EzkAtV8Xs/kMdQoEEil8tOKzIot5P7D/PCHRRtu4L7yGNxzpPLkwW1Zk4bld
A4/FQwNEnr2aaRDepBpF2X2zIDgTEEc8Da8VMQb1JIOSbnJ114KaOaRP3t6I
zCnbuCSyZBg7ZI2IXOcpwFyDYMX9gVo3BaH+j3/8Ax+WGVf8kTNc/rOkFYkW
93HVSNf51Y2xsdXVf350om8L801uPEZ/5Z/vbrCOz7KX7S7R3x+WCOe6Y/xx
9WZ+673sdFHxW97JZziXdX++a67jDqzDiJRP2ssamK7701jHupmutw7Yy+4/
i+v8V0Rc5EEHabzziWMYMd0TJiL+ny+P5u52wXbc1M9/BLJDvi/M9/pjfC6a
Q7N9T38gEXfZ2MuG8HQjEK0s7F5/jOuugwTfnnYS0V+HESJWuHZbx1g903XX
sXHv8+D6BqjKnhlk1vvl4ek3/0ay4VuWDagveXLhBmNczX5XnFlDd9hcJRy+
PNmwtVIRutnZGuFAmqqVDl8evWxtM2P/0KnAxptXnb1O8a5zef0xfh2+vsGK
PvKhG4/x18Pnzx79LXzq+mOsfuq6Y2xs7XxeHCPr5cvFsfVjbGzdYTYXKEg3
GWP9Tv1z2W3i+qfthQ8k7lyGT11vjH+5fEE7Vd3SL9nTyq7wJ1F+Ogfuzi6V
d8lCgwkKRnHn6avjk06P/9bPntPnl4/+8uro5aND/Hz8eP/JE/tByRPHj5+/
enLoPrk3D54/ffro2SG/DN/q4CvVebr/U4ddRJ3nL06Onj/bf4IuYrDEfV80
+aAKPUrI71SCko3+i6hSMTqv0lGCTkD98ODF//0/W3f0hw//Q+K+l5fyD4zx
wj8uztBdRu6WPFvIP0ELWqhoNksiDCCgP1mPo1laR1nVQ39SdYaOSfRbDpT6
+q8Imb/t6T+OxrOtO9/JF7jh4EsDs+BLgtnyN0svMxBbvmqZxkIz+L4B6XC9
+z8F/zZw977845+yNE90f+ubP32nEHlOknKa5kVWnC6UkmCc2tP71m9pHORl
krHn8CydwXnVFwk63I1DiF0+qLL3dGqiYBipFlesjPI4qs7QV9jiKxvY6fVD
8XDtkcvVeNrZrQwvy4uAGlVUFxU5t9N8Xrl/sv/H+EO17y2CaQ7FY4W7/PCB
Y1uAQmaj5Gwj5xdvDdCz9gIAZxGOmFToik6rM4yGlWAd1OTv8r3OYjnAhCYe
ZDQvmnlnuz9agEApAXTk3RsD7gPiAj/SgDz97d27+gzBBdQNCNsCRdlYE47A
D86TKGPvvryFwYcZrMn5pozzW8PMdc2e4QF6aWPyQwcREBsozNJJgi4yc4QO
pi/ZsSY8nzYYBg3Zx5oXmhIZcJZpMcfAD2wbzRSDKAafeGUMSTTbgyiM+FvJ
5e+Nju8b55/xtmrPH83Ow56EHBcmBCQubF4QHOUsS8dpDVzkPI3gff7+OKqr
k+IYThkDKsWs/2qGuwQSiOMU6QJwcwm6eAJRDkOmVe2FBngvnisVZ/GdqaEn
FZOHOKqE3tQ+2KfGF3Hfx0xYSCUoIVuxmNtEyFsm3O4C1iwvJFJiKbiUo2ea
GtvkJnQ328AhhXGJV44SlRUXSTmO2O2vH0nWij4ocrSyKfLw4ZZJZrlUah+Y
8g/Hz58BJUqaDpBiMfo5ITd4VJYpiwAJmZbRFAmO46xnSRRj4MNIlXCJsiIE
TyrxeY5mI0xwSnUQ5UWOIYf0Fz8srTd+ODjuyoLufbMLCxolAIdE2yQcDU+g
9xhjUxgvjDEiDUwIz3msia459jhOTDwU1ichUY5AYTwvTk8xBAb7wRAWKDIw
BybrSIjGBKyENEYAVdqjWhVJHvAposadEcLhSiqGBAVIR4mlP4YFjnn3zrzM
FG0Xk6dgu8fi898luirmiKUxnSPGekGZxXyijeGDYRfOvhFXMkJTo+AF9IWn
zNsKxbIFIotrepxje3COM5iKSBkA1JwaXwa1QE5AoppmMAwWCILhxBnmE9TF
HsFtKDGioYdECnBm+ObNm74Xo0+GHHh1wQphf2muhvuUkSGIMuS1M/MYJ+ms
9p4Ubt9/yb8MiRCMaHsCHHS8GGPqwL4lTECkUzgzjmuUxfwUWVmZAOcGAYDh
4CQCBBoXJcexYpaGwNASRJ0pYqa3ZrY1JEr29dfP4RS+/nrvWqEqw2oiCsRQ
RIRHC7gv/McJGyRcrFu0qgsM95tNoWKeEJxwLBPqwsg3hZpN1I5ldLAiy6e2
cf02SOhtwqxThJTsmLitd5wc8JGJDDatY9eVbNPGETOUnDiMF9l3cVAK0llt
ocFlicb53NAO5kGy9BwTV7zA/5XhO4/BUwgPB2qL4l0nfAfbI/lBYwjMWHMJ
1oJjUO6FH5sD2LIhP8C459dfH5Dh1HImEUvZFsTBaS3uWNl+AYY16pQ9CSq2
pDmIHGOz0gs0MhVOo/JdqHmxUTfQzwo9mZfwi0MRtDeY2ySx0zgr0LTOE9RO
RvM0q/sYO38/S8uFhLinGE0ncgCxmma+jsBzqVB7gaO3KQi4cxPxrbRo+wkm
KxKoQdZmCcUdETtBYaFpKrMutI2KOUeRWSwA4mZpNEqztOblId2hO6/0zECm
O+Kt1tSC5aSlnWlWwA4WfDyePREuB7ByV6FujVIEdL40Rziew8yCwpHBTQnL
uhi6pTcDE3pC8TmAjSAaA4f0XcxXdDGK+scoDn07EGSUZCiCpAVeB2fYp2FJ
8t3C/E2J279ksldKVmmSTVCfOE88bqDPQfrHHvsMKA6XqITpslwivQPd0iQu
MX/48hKArYYHQOpJH9ScuiwyzAXvEz8c2gfRxGCFpaeIwpblz57JHBvKk0bP
xszWPY5Lr3wHTu5B548ugSyNvwMzHDlglE3hF/qbv+Isrgdeghd+y7rfA6vW
8csEN3jdKgqoHPU9nQo1qS6PSzSTVPC0pGQTIoEgmM6+67C34mSFPDaZFohC
4QQ9ZafuG92FFEZWEjFSlACQrUp52VXWGGDsQk4OPAeYIsCQVWNQ3Y0dPwDd
tD0/C/VK0rnw+womEvOy2+NUHeToYxB+GfJInETSpjrbHdCLvvdTEV1uVU/s
lkpSEmymB3J3ZP4kLpguATfnidVjgeujeMSUHzyqU2ArSo3noBTk40WwIavV
V2ISpZzVN+TNDwd2TGHwKVURdGCDHb1hNXjYBH8FwxXIAQwAek4dpbHnFeu0
ykt+uP0wrccFKu40ZwVrZVKe1exhMM6JgX48n0Z5HyAVU3aX95izMyVhjnQ+
OktEWN9AqMBmaWh7hCVIauhwIgtszPIazS0QM0NvpgAXKdHSbBEeXqVu64rt
hWm0wATVbA5L4DfhJaHgDBPwHf9/uv8TLraGH/VGUXrqSLboshK7kAF8OERV
aAF8Va1cPQAaD+VkMUvWQTmLRpJaa1FklJAuVAKkEbwGm0mzRScfYSZ+EAgj
lh+ZrHsSTOh7MzlCqKngbgHyM9CjGO1BnAGylIwNhM7OY3Dw/NnhkVltw3ng
ydbpvCItljRglJW4hWKmSa3xnRKWIGiXrMyipsMJSYZPVvcdgY0q9ojg80a1
hDdYn3FvmIxhUBeMne8Zd7A1z00T0GXg1mn3gnn6NLlhLDESRr0XYhVHTaBj
IDxIu1os7dUKNw/u+4YPOgx59B7z/2x+LfsQgIId2dOSQqbHioDSJq+2x+Ak
p5XvizCsG8YLT97gkGWIokKF4KlAFBgrnKCFVCAKuXV8Ic9kxFEuGY0npjTk
9L31O933UYoUzwR3ny2Y+PmhAQwTpk5T7mUnACFwTOCOwCnnp2jMJ7G4Fztd
kahC3XuCnkYdinJ8zWUzcyYp6fDivTmLcn9/LlMeThHVtBPW0oIzdNo2sIhA
l2OFz9GCUTF7msq8KjCs87j9jC0r2Nnc7NAIu1q0wu7y+afuOM1mz0DFywpx
vQi6XqRZhio9qtYRa9eey88qaKJv2rNnxY8TMk25CrJ+TjUVYwR5j9W0qznn
uaZlM/1PdPzkPWeYEocimbssaFKfz/lut68wGb8mZBdAjxIwJlKsWaikjiOt
KVOX7A0RA0gjNqYIqAnAO2syPbIg4XE0iIKUDiUMmI/bGvBCsKF5L99GVVOT
lgf6/IDRoJ0bgXxhEeXuggkO1i+AUfS30BdiJB3LYrIB4HiyRC/pbYokMntK
gGh8n16XdKDVfq0T2hKzEFH8rMbIvhJ0jZKwdbqeZdkBF94H4258VhgO45J9
fRejNeunBUUQSqrzuYbKvqeHaTxEbXhIGvewp4esb+Mn5gjmZ9ZT2IrdSCeG
hLp6KJr0kBERndipCS8E3ikEtjg9e4Al/FrckxPoz0luuB2mVTVvyg3WVElz
QhocisdmSLJjaAxnI/Pa3dQXUSVj94jLIeZnVeGt2ia5G5+0rNqL/nAJS8DN
9iV24fmjmSP1GKGNe3SNjrZs4TIhM1lHelUBF9VvEVbS4FL8heMFNIyOTpH8
vG9CPtYBsiKKQ8wLDBcvt9x3Xnh+EzwG/ueQx0VlCmgYeC9VAdWcNJ/cl5f6
BqqowxARkL8D1K8xCj7kwMQr03qF2zY9zYHJwtumaENGQUQjOx1gdxGVWKk2
ncGLqEiSA4kkCSf6o79R70s5FMLecyNSwnXS7n9EHKKAI7tcvBIlxVLkq6rJ
v5FBTubkNZfcb1gCzxTA/cRaOZpTQPF8XCzOPfg4eW9tzGZhkFXfNsw3XU/V
8clsYNizpwfCjEFWRDDttSJlbQEwPqog4BU6zbwImfGLifFnHF5iD2sOohj9
SZ+F1gJwxXpgRCq9GlkXGfBR0JiyJCJGubOpY1pcYfxm7GG5aJY6kb9yjpqR
OI8ARKCBIlr6PG5DuH6X/R8/V3C2H9BYteDu7OkPlE7RSWP43Mn/+967F39/
c36yPf2hfFz9dCc6nDwakYNCo+0CTBkfi2bpIOH5sA7b/M68Gh8IvSM4PDFv
/Ml3kWhnD8EvyeKHwWBgfhA2jj9IHWl/a/dka3tvc3dvc/Mt1oVe4qMd4RZu
K4zF+CIhrIxnMI/WvzPZSrbjO6Pd8d3oXvKNN22AabSVfDQu663ZbjQa43M4
r7qU/JFb+iHbOj7RBp71wKte+e408d63xDiV1eDA0l7ytIcRUGYKSx5hZOzN
aj0rRlBLR5ZRmmC3RbAWxqKQsVzNG3jTyB1kLUfx0rMtiQygCp2maP42ZraZ
EAv2r4QR81YGdIw+UL8grA4Z6ComhM43srjM+CHraQveLA/04EHb6xLpAonp
Uy8wFo4oSK4GcL9k/I7UclsISZgDvBnsmDizaodqhFeMA89+fXnZvW/wj1cr
TTzSukqyCRhjsHq0nabYbWNh10xskHTs8bxEkwGdVnv+oTnIkuhvz8AwCKUo
kegaKRSNBAr8BXAgBsIne3KpntTUtbab7hb5TU0aaXLKuA4IzEHUjNzMsY+X
PWs9ofVADwj9KN4j6cBRBvI15xJCKaHkkLBfnPn46f4Br9qUZIqyo8LV0yIa
8UAb9o4wBQ0dV+ZggEpQaA9UqxICSqs+eXKsN/B/W4NtdPCcAdCT8r7mr3Z8
fa57XwWcwZghNqSA5kFUS/1rxBGm/RdHYY3vZ5I9s5d3ps/Of/z7q28unlQ/
1W+3Rgfx96e/rey5jlARTidjWG6HP92b7ERbo+3xnXg3uTvxpMpVwqchVE7I
9+TLFPZGhZqgoSFUIlZmwGBmC6Gvy/wKM1yawsdLdbmC5XPS92/D8WmuF21s
36bky/iS5mMdW4ZXByM0OP9a9dMGksjPYGAr5iB77sU/ixNThhOYKeyb8exH
yluRh3q+g8dLHGj4KqyugAZ/4DgQg7nLZizgQw0ME/huksezIjU6gnkdXcnc
QcMPFrLNqF+9PGKNwDhhlQdFcV4xG6dQBYuarqbdOL+bXYIdWOHAohjLjEDB
QdYVwbCyLpwm+qa5SlKKQFNOlK/DRxUyXVNG64CM/gMxgmyFsq8vKZvCYbGO
j6qZkBFkdDD1KY+7oROE5QIAzmGPv0TixyKZkP7wFQDP0D2NayXqq3ro1ia5
bL0QlIwA8g+/HGG6KKztPC3mFer8wO+xLMA49nBhqdXzLP1Kkg/68CpOpwhp
A/2onPI7SjgOVTDdv0JZXc2pT8ZkngWaxFKMFwyYYoqJYCivY8qGUDKPYzRD
Q8lyxpgR6B8Ux4a3Nzc5/jgq4oUeNooxhgxeGZv3LKIKy/Fd5xMBwH2SVoyv
lSi96IYRRL6IGGRIwdV8AvtL/bwJsdeKEW2VAz2zmLMtvVwPzutQkp6yQG2/
yIspndMyOqDHw4TfBXd5fZhSZbuWEE03ww+fS8r+/Xg3f37xpHz97fun9dv5
/vb4MPnz2e/LwtvavLaFxzLoRrI4EAQk0L8d70R3kq14e7LbIowpWycQxn6S
jubkRetTsq4o1PxB1J1Sdwmv1QPSx4oknRW+mqslMZfG/K5trxcrDFUYcX9S
G3NlsWSsmiylpquPc4eCbi9IYtLfopjO5rXxbCGz0c4+81iQ7ocWEGbNHU38
177Tm8CLa2xpQowMg6fmlbBUBxkXJYc1Up5hZjdec3hg0L8kZRFsA8ZweaDh
zLXN5HK4sYNJ6wEPNeZPI5nSxBo2OFogyZdgMdo8Q+S6HtOV+p5exy24s/fM
/tM8RoICOFLc+diZRGlGH6p36WyGxUEYB1y16YpMRjcYbtO+SaDiDeMTOIw1
Gs2Mq4awK1ozCC/V13AaHlIUySKOUduRoOOIUyPBQgSuu2J+gcL9JVEJijbW
0RD7YA9kwC88rzjRTho6LkUkZcWpWbx4bnEcUi/nMfbyovS2duEDWywXHkCo
m+YERVKSLe5zfqSJQAHP7icTGLe2aIh54lZUAuVKxNCNzyrTUuZgkZvUxtil
GPixAFUm5NdHiS18te2dzyQDy5O7xV/eP63ebC6ezffPH+7EjyaP09+fpcls
/VczNA0sreJhIGkTs0EraWciPWIW3YE6Zi3RB712dYWWheiAh+itO5vuK/uw
I1stK3wpGY0NknVp0pacwtP/5CUI5Zr5nxVWcF8k8Q1naN2iMDczAdLoCjZt
MmvEi8uhRinCYQKmxzlRlSKGJo3KY7Wuy5SwJ3EYOuY/sGjQPPyJmQ9e4lMO
YGzpwCcD3DAahOg6b0NSJ1xkSPjK5jnCt1YP3DzZ3gIlkPTAUADhwa0WQQJX
1tlIDsoB8sn+XjcgeGeUTi15MJrTZPSHW42Mg8AtbQpoktbsBfLtm2ZzokS5
4H6Q/2PetEldEprSW0vpnRvAGgc9F7ySyWyaZ3voeJ5FIEMkG9fXwx5o1/Pv
fwYpQvpPf9IbMvrXoN10HeGA5IrmGWa1YQ/WLOWc3+1N9psCGhdTIKyYHSbc
AJISmE2O3T/gUU5P9TYmJnVkbWWXndYTfR2haDryYQqqsi5lfmVScvnSIkxd
RN+s7zLxlr0q4dy2ueOEcydwRRWQVC7/2AVqHPIW94vzj4gcUrJLYKxSD0Pg
L6fiEZyxK8dPIAsxRCKfpogoiRshUN8DaRUnXAcsolGuSLkzrz0PA5oKnMDu
YuL+76ThPymKd3AIvhff7ZJ98UPPeA6cLqQU4pImXB0A8M8wWuscK9inCPUR
KqN5bX042vpwWkYe2iy4aVSPz2x3tsbaOEeG1PZDYrjO1KG8mbPkPXa5MxbM
cqQJQSpuJTiIFQWuMq1N5nYEv2vnbfAJm7XTOMKWaDa2lBOo+ET83QMz1obl
HFhn1eAdXXUvAGpoRhHtcti7sZDC+RJR18ml8XTUmhJhd7k8gwMgDmPzlcOM
AXJjZpRvUehNy9fCrDGk6mLK/ftql67JtIf4UYJW3UMEwyd5Agn+UwmM3uzL
wM5wvA+aFVpvfq2NKQ32SvYiQOC8j2aUmVUc2khnjLzkRax8Zd9luVmR0UyE
peQeY6GkWLH0DXAxilAFxWmgrQZRMw8PelxCjgoQV5F5wO9plp8mNn+pvrXm
a2Q1DyO3WRCDcPBRe8P3Ahwddv0o/Ho2YdyDCy0698C5SxydW4cAK0wPHshS
qWVlkyplnCuosyUyjDTe3LdSD5cjty5ky4HhlUVzA72fZUr6i+IZh6HjZmUe
aYIqDB0PvODTr8hxe87L/S/hvfppBHwjFIxmdmLMK7BmuIQ2QzzGq/BmdzXe
NGJSbchjeMv1uPtdx/cCF/wq5m7iMw1IfVU1Es2RZe87Pz97wls9an94wK5r
/AfyjmUkty7VL4taCWma01njTzrKflGew7s39RwiuNDux4l+FT/hdZxdVzi2
WOQs+ba4cUOMzaCp/zV13SgXLEr9AnDyRUdWu8C5MUfSmwj7A2BsMi7moBD1
XfANmJl8xwugCo8g41VKV1XqFoJthphJr+SeYC99rfc9ZkU6C7onDe+kAKEL
2PkhQlEL5OwDt79pfy/OHwrSCmKLpsLH3YX3yYoUVwQqSWjxuFyZMukn75Px
3BqY4vWHdQf7d6kuAkbQCqU+X5brNrnBS6Eyv5g6h8pCaUns7zRaJimAc67x
XcpN/wrHsFnhsOY8Li5I9HBIHltPTOdTfM+WZugU5ZUpy1xQtlyV1Esb8mKf
GKQIAv52T+yEGRcl1UPUlcMh5221JcqgIRV8wIiXyO2lX5DSoV4g0UeGiVUS
AB4SrfQy13NuShBNR2BhF9jsB1U4VKiJbKTJAtWDHJniYOHRH26tqBrmHgxM
hKDcSkgsD+pjVhQy25gQMOgpsH4bJjMOrKD2BnMfJN2Iq9VcHgyJlHORhECR
jhV+VXkOBa/0Wk6fOf8sw971GF4ivy0rUVSRY0uzza5tab6tvuZA03qh4KOH
8SswWw7b55CezFc0UCMCWDrXptbNLg3czBx7gxDnMimkXscexp20kopEKedH
ifnJQbGdX1m09TBsQO5/U+CAnGiSMAnVJR4P9rDn8ITc2GDx0WRmXykeLQ+n
ca4WjyoIHQVO6OraYSPlvB82ZtSyJBPx8UOtfvcHTxpSKpIvEV10hsinESg9
Iv6jPNDcJFIUhoduFBvaF0na5B+2kZS7YsSRt88fKmVMQJtp4/hKlvmGLhVA
4abpmjMTEjBXUCiyhKgWT9JlkzGIaKysRaPH1L1RgUjBfcoS1b5smymdlqAi
vG/QJzsLZUkIdTm2mpIoGVd+lp4iERd7neZci8Sxcs4IscGuEww/0BUe9G5a
vUMh1VqI17NXvcicdKPJQkeq8ThreLYAgROYiikeZTTK/II+x0tVFMPfdYqh
OK94ctnH214jiC6dWomkvjAlyd5AUjhIYshaqcihX8AJHNAtDg/FrgV5ZA1W
pdb0CWjxemLht1TxG/+ouW+mrY+AX7470NcwzdUq0/y+KVvvtVripkGOWZyq
iEzNYO1NcVxHHFSNIkv2psMOb8pmUtvRxIxeAs7A9vtYBqhpr8NYEZ0D9yFf
YPNWjRW9d5y4PMZic1k4nbFrKGTupcLKLqoKn4LqhJSXLVB4PZpSoW9L7x53
/YY4CG1Cq3cHBoiwx0XGrXoajX1YFcCcMLOyBZp7LwpgMcgpMU+Mes3gLVrY
QwC7X7Wlsw30cwQCCalm9hZzR08/l1KC2PbC8iS419fIS0wjJ/254XPIexp+
1Z5JRnPtkhYGJpLz5raODHp1Kt0yAnvHabBe4SFIA1KvqQ/8wjvjHHYP2q4N
kt7PFypIKJUEPZNu15KQZywzXrRhrTxgI+2u0TDI6KYLsGOzWHkrSicBhVl6
HmHsKFiF3M2G7DSqAGFHvobqscA9fXfT1IN3vV5V5tkJGiE91VQBbEoIobN3
TC0mcUKkoCZkwznsF41EGvKb25dk3i7z/SbBxlhCnlU2jxRWEYjJYAy+1RAk
ppgoNqfWgo1ySc0RRjouC7TtQ6xDMrRhyAYlkn1ZotOdOlnNpH0WWyuen4MU
dkralU0TefYnFMe1Wc/cP9KOglcnyZ01ZXdgI2mjJAcNh46ceABMswBEoP0Y
BGddITSeTSStYP6N6I+rxPBIigp/3/Jnw9LYu9rCweh6MJBsyz8JyFnQ4VF/
+AD/v7xsirpVLc2UieRy3S63B/augsJQqiBMy91G0ovczzyhkDgHwgWHjmeU
8bKzuWm/kp7K8Pi2l+bAWIpjel152mt699YlMtoqKq/c+OoOuejb9lccDkvd
cRsdcF0rWzHFbLyMVTnKs+dOsiIeGcEbQGikScoUOTnCbAuZNnZuQuwusKS0
UdewmMjEVAtCMvHdN0jWolY7KYvI95iRbUWGnLLBi3wScSwzjdVajil0bkxx
WUCgHzBfU8zXlrbAeOOpA01uFXISSXv36sRcK2JuZHQ6T7Eyz7FkPOiIUyTS
sfH8KeRe0giGml0vFQkb5ilGK/bmGQQk1djJv46ePKNaKtsrtY5t7Dnj0eQ8
8Lq4NV5jWUZcrGRfaGOxNUj6NSYVU8EM/bpsDq+UhRI6oNPkLsL6ezhlqVdg
ZxA7dFdtLKi78dOFsUp2nlD3RwMvy+n9S/BI1U6kC8yGiAnuzidxGrdevjCP
EyJREK2o7fF9HmFRjikjYpUSTUNsnuc0d3HWtxbPoMb7QmRW68V6XKBEWGAS
ujkkafNDeXkyyfJVdN6xmbpYG6uyZTSBahnSj7kCket0bP3Hrnccxq6xrLhx
JngU9z39lvJp5Tq8kWgSRJorCzeoy0yBvWnIS+fX2hkANFeo11SoKNQ5xtj+
IUvi05BTMihYhknXG1mr6AfKLKlo+OkdSvUI32pvjYyWgy/g3r2/evdlIfn0
bjgG/XFETkZw9bebjPFb3L113THW3ptlG1XMScPjnrQIs+6vcIfgf+7N8uCx
8290b9ad38mdirv/Rncq3v28dyqG12Z9gfRyb9W1Wb+ne7M2ArXBU9B+T/dm
SeK36XWPWRNJo+fdDD6BBRMm4nEUGYPf5JGlALtNKbBqPDeBM5Fue5eCjICu
gLDv5rpum15TJ3HWhPqdM8xdx0zKBtprGtq2JQFmOLJ3ldtLs5/bq0C2tfWV
Md6bF9vYQfGWhVOTomD6fNiQSrORlORDtTTHMjci295PMDlnJOzpR1yWLnei
wsMm4ttsU2hbMdMFSkYVZH208kO+ZTQm24H94dVAHSzHgG1TUtuY3/gPOHVD
4N9IVcHSYklLsYFj946Jb/BdWJKhta7+m7pNuCqtDRd0JBB0lyoyMUCIp2mt
Mu2ufTCpIGxbyV3TzewjJdlH65oc6g+3TEkLa9jyjkk6M/0OAdG56mNlKa2r
BSFskRzUlV6oo8PA+9T1saR9AlM3gk0tTOFI6CSyLXHIRYEETn3QsSk47JRd
ebw4CenC6983g6fkjPX6+IqxZ1NsjePHRi6VNpF0XO1ShbLpGYWNl/FvCfua
CEBX6IW7GFJwM59PR9gi8bkE1RBZMWk5WKbbh4Ha59zJ85zagviVZRuNcL5c
d0+BeZOWBgM0H4tT9riZx3uaPc9tEU8O/OvQT2ej/8gtbBnYhheXR6hyzoJr
jqy0A3T3alDe8gOoJnmPfIBXxEpXJPxR5Bapl655V5ZSTSdZcgpyXguwBDbJ
KHXdu67joec1pJiF4sSomcSE8EY5egcBtUhqzd0Tycsa1exmXb5YgArexGPI
kRDj8zF44bvLTXxwbLu2s93NZ1n12rrekyuNVIIvgGcc8FYIout4RnWV75tj
0Yhiq+5mAVXDtAVAX7mEe32K5ybq4W6e0U9IjIIlLjxib6CioaTjWvM0+QSN
o9PE6QX5cJmitnHDuySzZY3tUQ4jF4xL9lqlgKsKAEX/0+2FgFsnVAUohYAV
u3fh116HoNTZ29rculTKVz6NMvioLIFoXxpSFXe95JA0MleX/ah+ZxU0ajeE
yJVx3HZDD+K6/rxeDj2I9fX9YsNope3tHyZwIhNArJTyM0BV/e2d3Xty4wd8
Aqx9URagtUz1ITvaOd1UDQ/YXdbHLv17fGEVqya3Z/zCH7C+U7rFWHpW8iM1
fTVMinvg2mvauHwbMAa3Vu3dvi07w10OivLUTFDdtmhyexpluA/Mi7RnAZhv
oC7Nh5q3YgWiwfZmRpdPWbEIJQ3UXHnm+tFyn31q62YSPS9K6g4O28IuuXSW
ym9cbIhGToIIbvn6rsGNdi09bvt+l+hwyyuzmb0ehFirobTIjrY+y2mlzcWY
tONGxrMr2tBm57/yvkHOY2la32uC4ra9us4Ao7drSz9gAxYsrv1/S82H0fjd
PaFe+6nfDAwmsgXL7VNJz/LxL9fKNA4ej11pz5il/YXHPrjGfpT+nDuSK6ma
21mybeNVBUGa0FRSga1ZeOV1Wr8Z5YIRZGO0fZMHsmq7XiaS/16Qi6TsTUeJ
d9NW0KTWpEHSTSNhjutvtW13t5Oo6Ms82nEg/5CxdmAlKzujvtsV5UXWlc2p
pLpJ7UOAtmSbAjZQeg2WE3J/fvbFqkE/tW6QFcQbeEuG2t02IUisqBE8knR7
zS6xbXeJSKNk9Z88ffKWSVdU0AmwO7tc/umXhJ6QvH30flZU9hIGv5VtXUZ5
JepkmsudEeJxsVdFNHqtqrDXKgLvWCpSskybHoyV1xTRsDXWM217VnVFe1bu
ZG+XexZ5rVkT2RLnBa/ozXqf8NI0j0UdaIaJvKIAoX4BxyYUHWmQT/1RWjea
+voQIqKPcgVnWi5mnCqLRRQZG5/Wzx+W9gUuMam3a22h7As8A06KFSreVM+7
U8hYvfp7KdFyjYAl+QMBgvlY2IlYpVN0nxY5d94zDI6zvcS2R0tcjGhjqVVF
Frm+b1enGenqSpeouXIOXatyDqdZMeK6yjwFjPNTZ5YCswwXhZ0sXK3C8r0K
fOWAszgrSdQ8nSfErooSDFXKv4zGZVHZqkfxIhyyw/CYbqF9wT5KAsNDm/xi
ulTLnSnJeyDXChsii56fyjWL5hoy43pQV3eu9jTpwPW4oom1zcYl42rIvu5m
knWzXEuqqW1COOZcuwRul+N8dfa18+Iqr3AneAwJjsZG+onL6KLZzc717PTq
m5ZrzCgHmbCnNQNZ2dIxwvwgvXZNI0vlJ1dxmm19ZhMWCB/CK8r1a+T1a4hb
+sler6+DXNmgGg0YxLY3HbgxdaKR1ys9w0IXHGY2RbXXbMHclX7TVggqqr0+
CNyHEK9Ps3l3Uprk3nOVQ1xFjwlKZvsPU/K8ewkmllcagedSwiVysbYrsfp/
/+t/+0ZCEKoJWxV7jgHXtZjkkbJXyUgquHc5UloZtK5c/R4hMafDco2GLrLY
tHv176mZlNE8nqNoIbSdZJLCm5YtfaYJwSjF1rEaSlq0ZTrS0ckmplcWanwL
lmtAwxGwDU53Nr0mRA3vKj/iwjOSf/Nd5V1vPvMaSq/sWqfExdLsWscN8Grv
FFua2N3SR/vP9peUFkQNzwFlT1aUBiou4qtd3HY7pLkZz85TerLqyIOoySwk
ZmLH7XOA7PLyPqsktuWQzes3s2CpI+1ChLss54gLNF7yFFY8+kPZAFXpPeQu
ZDUuVniUaszU0k5kEn8n6FkbZWl1xmr5Kh/UnlIfzRI/6n32DiEjF9jAl4fe
5ZAfYR+mz8hHyjzDe/w+Khtkb4u2f1z5L/cZhrBMeghDD+0B4L8Az+m+Hr9Q
1l2O7WSXaefh+rjZeCSMEgL9IysL1QxrUjf+OOa9/Fdmv8Qmht91YXOsqrE7
DL1owVlWzcNkN1nVODvfnYbpikBBOeAyHeXwBibJUOegzcL6wFpQyJfmpnHb
dXyCdNonsgSAAOGQtLpbc9DqY/vxrT1a5R9iq98PTxY9rR/9u+BShAz59QgN
YYdT4MKpXOTu+/eWDjScccnn5k1nraejw/Wdra6apOngcnNYedVw44R3aLAY
umKSJfeRm+XYxUjcPq45HPPZ5bEwKYB+uo+RtSU3jLhgrobMsuNkeS7rMfHd
JZOibPORXDXjks+i7cBXuyCue9ShM8DN8TIMbcrjvkXfbEG1PKHCPJ4RCFgK
Z3BEhs1zt4ONV43MaLmAvEuRG2QlKsy5QiK/vTXYUo+LqsYIQNCmVSnzO+3D
CBRbj7H+EvA1F2DJZeBtXWE/4VLwZPHD2ejNt1uj/C/p8/RocZRepD/tvF6M
p6/nP+28g+9+OHj96Gn65OCHd2//++H5eDvbPH6zuz3azn5+e3x092j6fv7T
9NkiPvz+4tmbrbtv82dnT9I7cxxn/Ofvd0dvXs/jR2dn4+1THH/n7c/u97d/
fn0x2nk2ix99X4924LkDGO/npxdPD374NryMvP3mrRX3tXPY6lCiGUNzR2Oz
LS8jC3V9p8k65h5uapAa1fyld0Mzfo/VWxw6YeFoHvKbFAW3dU1/mVSRaYzb
8RTn1e1zG3fT7vGdrV4neGpF6Fj7fy5V+5UvVbs5qP9zh5CF4ZEvgYzbBpMi
JB/kt6r9sx3lbn6a/7mr4tPuqvC0TzQcTAIBGNH/6Zr+T5PWSz+N4eZNx7Xt
8cyXRIORQg1WnAugou8rmxcTzSht8z1ZRpSVJG+eF2DZzrOopJvJFZiKczbi
zhM9m5czKuXk5LkT9HNHdAf40l3cOX9xjuXgdinyMFcwYa0TGe+eckchTes+
wmUpWVZcRpMavVlG+bZ2TkEXN3HEPtQBReWzF2cHGIkmJgkeqmtkUV1aPqP/
KgjAUrvn6RO9UPDDc39j5LFhEA9/jNC3fz64mTkPq8O4F2osKx/GhaCP0Gg1
9uVQs7liJvQHnPBvVy9rSR1a93CoEl1v5H0HpDUPe51d1ozc5FyONb1g2m5H
hiJPnk/sqX9QJvVqGUcsCzF4YnhEzyP4XlM5+Zt9tQVLQk7jDsQeNCeEX/bc
0x5ruQLIst5QU1oBOfzDf8vLnwoIxx99qNwMCD4ARLEJ9uTz4Cu270PrN916
KGj/OSSQqp5VILgGFjTF/peGBSyCfxskQK7u8RGTwfxJksRoKSy3JfmzZwV7
z0/xXC1KrKrTetC+XPCc/YZ5ekmn63isVTWunMOkqdpXvSzV9ldZQ8DvMExI
7Qua/FrvuypnlCKiukR0RyX18sm5w/IxeaOPD3/UtW0LdYLNT/WTaFTRlyan
LS3VrEyxvADD3EUeRtDZo4+PPnr9tD+KKs/nKDkIVc90U1KjsqAE9uXweQw2
T4ZnhunfUxSv0gDPrJ0yy2kD6mGJ10fk+uUC/jehXA26NDtNLpb1IfX/Acl1
xWN0vQAA

-->

</rfc>

