@dexterai/x402 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -176,6 +176,67 @@ function PayButton() {
176
176
 
177
177
  ---
178
178
 
179
+ ## Batch settlement (EVM)
180
+
181
+ Batch settlement lets a buyer pre-fund an escrow channel once, make many
182
+ **discrete** paid API calls against it with cheap off-chain vouchers, and then
183
+ close the channel — the seller's many charges are batched into a handful of
184
+ on-chain transactions instead of one per call. It amortizes gas across
185
+ high-frequency discrete purchasing.
186
+
187
+ It is **not** a streaming primitive — it batches discrete purchases. EVM only
188
+ (Base, Arbitrum, Polygon). The buyer never needs a gas token: every step
189
+ (deposit, voucher, claim, settle, refund) is signature-based; the Dexter
190
+ facilitator submits the transactions and pays the gas.
191
+
192
+ ### Buyer
193
+
194
+ ```ts
195
+ import { openBatchChannel } from '@dexterai/x402/batch-settlement';
196
+
197
+ // Open a channel — signs an escrow deposit authorization (no gas needed).
198
+ const channel = await openBatchChannel({
199
+ wallet: evmWallet, // any { address, signTypedData }
200
+ network: 'eip155:8453', // Base
201
+ deposit: '0.30', // USDC escrowed for this channel
202
+ });
203
+
204
+ // Each call signs a cumulative voucher against the channel.
205
+ const a = await channel.fetch('https://api.example.com/v1/data');
206
+ const b = await channel.fetch('https://api.example.com/v1/data');
207
+
208
+ console.log(channel.state); // { deposited: '0.3', spent: '0.16', remaining: '0.14' }
209
+
210
+ // Close — the facilitator claims, settles to the seller, and refunds the rest.
211
+ const receipt = await channel.close();
212
+ console.log(receipt.settledAmount, receipt.refundedAmount);
213
+ ```
214
+
215
+ Channel state auto-persists (localStorage in the browser, a file under
216
+ `~/.dexter-x402/channels` in Node). If the process restarts mid-session,
217
+ calling `openBatchChannel` again with the same wallet, network, and store
218
+ transparently resumes the open channel — the channel's state is recovered from
219
+ storage, or from on-chain state if storage was lost. Pass a custom `store` (any
220
+ `ChannelStore`) to persist elsewhere.
221
+
222
+ ### Seller
223
+
224
+ Advertise the scheme from the existing server or middleware with one option —
225
+ Dexter operates the delegate authorizer, so the seller manages no signing key:
226
+
227
+ ```ts
228
+ import { x402Middleware } from '@dexterai/x402/server';
229
+
230
+ app.use(x402Middleware({
231
+ payTo: '0xYourReceivingAddress',
232
+ amount: '0.08',
233
+ network: 'eip155:8453',
234
+ scheme: 'batch-settlement',
235
+ }));
236
+ ```
237
+
238
+ ---
239
+
179
240
  ## Supported Networks
180
241
 
181
242
  All networks supported by the [Dexter facilitator](https://x402.dexter.cash/supported). USDC on every chain.
@@ -251,6 +312,9 @@ import { createX402Client } from '@dexterai/x402/client';
251
312
  // Client - Node.js (private key wallet)
252
313
  import { wrapFetch, createKeypairWallet } from '@dexterai/x402/client';
253
314
 
315
+ // Batch settlement - EVM escrow channel (gas amortization)
316
+ import { openBatchChannel } from '@dexterai/x402/batch-settlement';
317
+
254
318
  // React hook
255
319
  import { useX402Payment } from '@dexterai/x402/react';
256
320
 
@@ -0,0 +1,49 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 240" role="img" aria-label="x402gle by Dexter">
3
+ <defs>
4
+ <linearGradient id="dexterGradient" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" stop-color="#d13f00" />
6
+ <stop offset="42%" stop-color="#ff6b00" />
7
+ <stop offset="100%" stop-color="#ffb42c" />
8
+ </linearGradient>
9
+ <style><![CDATA[
10
+ @font-face {
11
+ font-family: 'X402gleJakarta';
12
+ font-style: normal;
13
+ font-weight: 700;
14
+ src: url(data:font/woff2;base64,d09GMgABAAAAAATYAA8AAAAACOAAAAR/AAISLQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbIBwqBmA/U1RBVEQAbBEICoYkhSMBNgIkAygLFgAEIAWEZgcgG0IHUVRRIgC+SLCpiHsuNpoiUrSljaJMlstVmsruw+HhQ/rfCL7f73XPfRBCyahRAVkAtJnY6EiZiSzaelKdClf55/tOmwmqKeDLBq4Ys+b2JdsD5CTnL4CIcNtPl6NWhF7R/wDXD5EhR55KQG2J2CeOmS4aR9NsoaFmYqZFte8mttEAo63/Hwuk6b35yeR1G9LzAdzQ0i+Txx9KoB6QhFAKgVodEsGlFbUZ+MihIgBDZwgNabzAp3OiF0QjgZbn6TkdRyW9dQ+wOR8nTtAio/jDv9fWVunAalxDZmAlQNEMmwEBqYf0BtCDLIRqCe1IGEB6uW0nIJn709ANkZBrBiFq0gcgE1LUgwAJGdqRBdpR7AFaBSNLZvAJNWrRptuQL37A4N/g3FxWWWG5xWYEKZ4QFS2oWl/bDmjAf+ISAPmpoJMQ2zc6PSKYlh5MCYwKDk5A1IapbnYc8KMiEn2XB01zucDo+/et0zweOMbt9ptqU4DRLlfDVDMc48EI7tTF4f4wQL3KfbNgrt9PWR2Cpt1iWJbjhVgM27bCNeHaOQix3ff9FoewmBBRRuPklVUYH3Zzf0RFFFRViSx+NmSv8LMis2XqwUy44ACadirJZq5Ffk8Vqt79SOJVTzQEQds9zz6v4i4NJFvXgW+91BwAAqA/bEMkBPxAIz+AnNWCChrZ1650DPsxriz/WB23RDNMJR+l18nGDFPWDGJJsEwFl5spl9BZDLGNUHLkivnjBcXIPEIlGaMzSkcOVahL6zGRIq02J5CVv7658tmMWNkVBvY7WZvDS1WLMRbrRVKH4KeooDoFiB8XtQ1QSoOGsA5I2ULajWja8Bm7a3iF6kES0RC1RjSoX6wqquZ/Ch48nCoT4wNLTJ3052llDHp6+QsMK8sgOV22KCvNAEU/xv0A9SeCTwYunf9YMnAuORF4PHjJ3EeiPcDIx5ELfXrOSoJZk7+kmWDPe+uMDUf464/M5OmiAoU2EzSgigl1yh1OQrGNDquoGl+n2u50KrdPqLcPE8iKMwmDIZOQFwn5siIB6t9mCWC3Xbl7slS5IJ6zgc2VZH8fmH5UYe1kF8q7BYU1JbQETYH+y85DIicYut7q0Nydea/H0bN+0HMvfbXtYwAEUitLNcG1tW6FP6pH9g/g5x5mNAD82TSvWp9iVP5dlJKVkp9W/h2BuB8CUrvUpleFXa2ozQZ0ugH+20E2QGlDft4nubXAOlM6iFpXvB2hxsrMBOq8WXl5DT4BUImhz3liUu0vMbPoIzE3ESaxMBs7oTSSuUyRqY/3lprLEHXvoF9Oq1cbP4jg+gzh0KFNO0IyPu5oTGb2Aluo9br1cwaVGnSVoAOhgYEmcy8nLtMB16lFUySDslXRhHY4B8ZAs8NChD5O+Tg42nT06/ZrxNYE14ODgOuCIwzRpwUng/Ima/1iGf4t5XDdmvGxceXgKWCmo6JTsIeWFaHuLyHDY61aOEZ3wPVK3j26TSsCzh+PUxUutjxsAlw1GdltWs5tsQKhQbcOTYxwPf3dyEBlaBQAAA==) format('woff2');
15
+ }
16
+ @font-face {
17
+ font-family: 'DexterOrbitron';
18
+ font-style: normal;
19
+ font-weight: 800;
20
+ src: url(data:font/truetype;base64,AAEAAAAQAQAABAAAR0RFRgRJBGkAAAJMAAAAdkdQT1P3RtZtAAAPVAAACbhHU1VCuPy46gAAAWAAAAAoT1MvMmHAzDIAAAHsAAAAYFNUQVR5lGutAAABiAAAACpjbWFwyaNyCQAACXAAAAKmZ2FzcAAAABAAAAEUAAAACGdseWYj0/guAAAZDAAALFxoZWFkCoykyQAAAbQAAAA2aGhlYQhIAysAAAE8AAAAJGhtdHjwWB56AAAMGAAAAzxsb2NhagZfIgAAAsQAAAGibWF4cADcAJgAAAEcAAAAIG5hbWU13mIfAAAG2AAAAphwb3N07p4E4gAABGgAAAJtcHJlcGgGjIUAAAEMAAAAB7gB/4WwBI0AAAEAAf//AA8AAQAAANAAUwAFAEMABAABAAAAAAAAAAAAAAAAAAIAAQABAAAD8/8NAAAFX/9F/fAFDQABAAAAAAAAAAAAAAAAAAAAzgABAAAACgAmACYAAkRGTFQAEmxhdG4ADgAAAAAABAAAAAD//wAAAAAAAQABAAgAAQAAABQAAQAAABwAAndnaHQBAAAAAAIAAQAAAAABBQMgAAAAAAABAAAAAgBCtKpsDl8PPPUAAwPoAAAAAMoDDTEAAAAA3R9Tk/9F/wYFDQPaAAAABgACAAAAAAAAAAQChgMgAAUAAAKKAlgAAABLAooCWAAAAV4AMgFcAAAAAAAAAAAAAAAAgAAAZxAAAEIAAAAAAAAAAE5PTkUAwAAg4AwD8/8NAAAD8wDzAAAAAQAAAAACRALQAAAAIAACAAEAAAAMAAAAAAAAAAIAEQABAAcAAQAKAAsAAQANABEAAQAVABkAAQAeACUAAQAoACgAAQAqACsAAQAtADEAAQA1AEAAAQBDAEQAAQBGAEoAAQBPAFMAAQBYAF8AAQBkAGUAAQBoAGwAAQBwAHQAAQCxALkAAwAAAAAAFgBBAE0AWQBlAHEAfQCJALgBAgElATABXQFzAX8BiwGXAaMBtwHyAgkCFQIhAi0COQJFAmcChAKTAq0CwwLPAwYDEgMeAyoDNgNCA3gDpgPlBBsEaAR0BIcEqwS3BMMEzwTbBPAFDgUuBUUFUQVdBXMFfwWoBbQFwAXMBdgF5AXwBi8GXgaCBo0GvQbwBvwHCAcUByAHOwd8B50HsAe9B8gH0wfeB+kIBwghCDkIYwiCCI4IxgjSCN4I6gj2CQIJTAl8Ca0JxQoTCh8KYAp8CqAKrAq4CsQK0ArkCwELHQtJC1ULYQt3C4MLugvLDAkMVgxyDKwM6w0EDV8Now2vDcAN0w3qDgEOFA4nDloOjQ6iDr8O7w8ADxEPMw9VD38PqQ+6D8sP2A/lD/IP/xAcEDgQShBbEG4QexB7EHsQsRDiEUMRchGGEZMRsRHLEd8R8BIDEiISkhLlEzMTZBOZE6YTuRPFE9MT4RPzFAUUMhRLFFgUYRRqFHMUexSEFI0UqhSyFLsUyBTRFN0U8RUmFVQVjRWpFcgV5xX7FhUWLgAAAAIAAAAAAAD/nAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAACQAyQDHAGIArQBjAK4AkAAlACYAZAAnACgAZQDIAMoAywApACoAKwAsAMwAzQDOAM8ALQAuAC8AMAAxAGYAMgDQANEAZwDTAK8AsAAzADQANQA2AOQANwA4ANQA1QBoANYAOQA6ADsAPADrALsAPQDmAEQAaQBrAGwAagBuAG0AoABFAEYAbwBHAEgAcAByAHMAcQBJAEoASwBMANcAdAB2AHcAdQBNAE4ATwBQAFEAeABSAHkAewB8AHoAfQCxAFMAVABVAFYA5QCJAFcAWAB+AIAAgQB/AFkAWgBbAFwA7AC6AF0A5wATABQAFQAWABcAGAAZABoAGwAcABEADwAdAB4AqwAEAKMAIgCiAIcADQAGABIAPwALAAwAXgBgAD4AQAAQALIAswBCALQAtQC2ALcABQAKAAMBAgEDAIQABwCFAA4A7wDwALgAIAAhAB8AYQAIACMACQCIAIMAXwEEAQUBBgEHAQgBCQEKAQsBDACOANwAQwCNANgA4QDbAN0A2QDaAN4A4AENAQ4BDwEQAREBEgETARQBFQEWB3VuaTAwQTAERXVybwd1bmkwMzA4B3VuaTAzMDcJZ3JhdmVjb21iCWFjdXRlY29tYgd1bmkwMzAyB3VuaTAzMEMHdW5pMDMwQQl0aWxkZWNvbWIHdW5pMDMyNwd1bmlFMDAyB3VuaUUwMDMHdW5pRTAwNQd1bmlFMDA2B3VuaUUwMDcHdW5pRTAwOAd1bmlFMDA5B3VuaUUwMEEHdW5pRTAwQgd1bmlFMDBDAAAAAAAADACWAAMAAQQJAAAA9gEMAAMAAQQJAAEAJADoAAMAAQQJAAIADgDaAAMAAQQJAAMAOgCgAAMAAQQJAAQAJADoAAMAAQQJAAUAGgCGAAMAAQQJAAYAJABiAAMAAQQJAA4ANAAuAAMAAQQJABAAEAAeAAMAAQQJABEAEgAMAAMAAQQJAQAADAAAAAMAAQQJAQUAEgAMAFcAZQBpAGcAaAB0AEUAeAB0AHIAYQBCAG8AbABkAE8AcgBiAGkAdAByAG8AbgBoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwATwByAGIAaQB0AHIAbwBuAC0ARQB4AHQAcgBhAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADIALgAwADAAMQAyAC4AMAAwADEAOwBOAE8ATgBFADsATwByAGIAaQB0AHIAbwBuAC0ARQB4AHQAcgBhAEIAbwBsAGQAUgBlAGcAdQBsAGEAcgBPAHIAYgBpAHQAcgBvAG4AIABFAHgAdAByAGEAQgBvAGwAZABDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADgAIABUAGgAZQAgAE8AcgBiAGkAdAByAG8AbgAgAFAAcgBvAGoAZQBjAHQAIABBAHUAdABoAG8AcgBzACAAKABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQAvAHQAaABlAGwAZQBhAGcAdQBlAG8AZgAvAG8AcgBiAGkAdAByAG8AbgApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAOgAgACIATwByAGIAaQB0AHIAbwBuACIALgAAAAIAAAADAAAAFAADAAEAAAAUAAQCkgAAAE4AQAAFAA4ALwA5AF0AfgCjAKgAsAC0ALYAuADPANcA3QDvAPcA/QD/ATEBUwFhAXgBfgLHAtwDAwMIAwoDDAMnIBQgGSAdICIgJiCsIhLgA+AM//8AAAAgADAAOgBfAKAAqACvALQAtgC4AL8A0QDZAN8A8QD5AP8BMQFSAWABeAF9AsYC2AMAAwcDCgMMAycgEyAYIBwgIiAmIKwiEuAC4AX//wAAAEUAAAAAAAAAEgAAAAn/+AAMAAAAAAAAAAAAAAAA/3P/HgAAAAD+vwAA/fgAAAAAAAD9rf2q/ZLggeCB4HvgZuBd3/PekiDEIMMAAQBOAAAAagCwAO4AAADyAAAAAAAAAO4BDgEaASIBQgFOAAAAAAFSAVQAAAFUAAABVAFcAWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdAIQAmwCKAKEAqwCtAJwAjQCOAIkAowCAAJMAfwCLAIEAggCpAKcAqACGAKwAAQAJAAoADAANABIAEwAUABUAGgAbABwAHQAeACAAJwAoACkAKgAsAC0AMgAzADQANQA4AJEAjACSAJYAvAA6AEIAQwBFAEYASwBMAE0ATgBUAFUAVgBXAFgAWgBhAGIAYwBkAGcAaABtAG4AbwBwAHMAjwCwAJAAqgCeAIUAoACiAMMArwCHAAUAAgADAAcABAAGAAgACwARAA4ADwAQABkAFgAXABgAHwAkACEAIgAlACMApQAxAC4ALwAwADYAZgA+ADsAPABAAD0APwBBAEQASgBHAEgASQBTAFAAUQBSAFkAXgBbAFwAXwBdAKYAbABpAGoAawBxACYAYAArAGUAOQB0AMAAuwDBAMUAwgCzALQAtQC4ALIAsQAAAfQAFANEADoDRAA6A0QAOgNEADoDRAA6A0QAOgNEADoFXwA2A0AAOwM2ADgDNgA4A0IAOgL+ADoC/gA6Av4AOgL+ADoC/gA6AtMAOgM+ADgDUwA5ANYAJADWAB4A1v/UANb/vQDW//wDDAAEAx0AOQMLADkDoAA4A0AAOANAADgDPAA2AzwANgM8ADYDPAA2AzwANgM8ADYFXgA1AxcAOAN0ADYDOQA4AzsANgM7ADYC9wAUAzwANgM8ADYDPAA2AzwANgM8ADYD6wAjBJsAIwMsAC4DJv/9Ayb//QMm//0DNQAzAzUAMwK2ADQCtgA0ArYANAK2ADQCtgA0ArYANAK2ADQEmgA0ApsANgK3ADMCtwAzApsAFwK0ADMCtAAzArQAMwK0ADMCtAAzAbMANQKrACkCnAA2AOIANADWACQA1gAcANb/0gDW/7sA1v/6AO//RQKGADYBTAA0A9IANgK4ADYCuAA2ArQAMwK0ADMCtAAzArQAMwK0ADMCtAAzBJkANAKYADYCmAAUAgwANAKuADACrgAwA0EAOQG9ADUCtwA1ArcANQK3ADUCtwA1ArcANQMWABUEIAAjArQALgKtACoCrQAqAq0AKgK6ADYCugA2A0IAOQGHAAEDPgA5AzoANQLaAAYDPgA5AzQAOQKUAAMDQgA5AzwANADmADYA7AA2APIANgD/ADMCPgA2ANwAOgDSADUCpgAfAqMAEwFzAHECAAAZAx0AIAIJAAYCCAAFASMANAEmADgBIQAXASEAMwETADYBFAAzAgUAOwLEADYDNgA2AzwANgHDAC0BwwA2AOUAIgDjADYBiAAnAPcAOwE7AAABOwAAAx8AIwJ8ACEDFAAiAt4AJwHEABECBQA7AiIANQIFAAkCfgA7AdsAOwHZAAUBlAAYA8YAMAMyADYDqgA1A0EAOAG3AC0A1gA2AAD/UAAA/7gAAP+PAAD/sQAA/2cAAP9pAAD/nQAA/0cAAAFNAigAZAEgAEgBFgAwANUAIQH8AGQBKf/+AR8AKADpABIBkwARAfQAVwDVAAoB9AC9AwMALgMQAAwDLwAxApsAGwLTAAkEcP//BIAASwMGADYAAQA2AAEAAAAKACYAQAACREZMVAAObGF0bgAOAAQAAAAA//8AAgAAAAEAAmtlcm4AFG1hcmsADgAAAAEAAQAAAAEAAAACApQABgAEAAAAAQAIAAECfAHmAAICSgAMAE8B1AHOAdQBzgHUAc4B1AHOAdQBzgHUAc4B1AHOAcgCZAHIAmQBwgG8AcIBvAHCAbwBwgG8AcIBvAG2A3gBtgN4AbYDeAG2A3gBtgN4AbABqgGwAaoBpAGeAaQBngGkAZ4BpAGeAaQBngGkAZ4BpAGeAaQBngGkAZ4BpAGeAaQBngGkAZ4BpAGeAaQBngGYAAABmAAAAZgAAAGSAAABkgAAAYwBhgGMAYYBjAGGAYwBhgGMAYYBjAGGAYwBhgGMAYYBjAGGAYABegGAAXoBgAF6AYABegGAAXoBdAAAAXQAAAF0AAABdAAAAXQAAAFuAWgBbgFoAWIBXAFiAVwBYgFcAWIBXAFiAVwBYgFcAVYBUAFWAVABSgAAAUoAAAFKAAABSgAAAUoAAAFEAAABRAAAAUQAAAE+AAABPgAAAAEBWwJEAAEBUAJEAAEBWwJDAAEBWgAAAAEBVAJEAAEBWf/+AAEBWQJCAAEBXAAAAAEBUQJEAAEAawJEAAEBWQAAAAEBWQJEAAEBbAAAAAEBbwJEAAEBmwLQAAEBkgLQAAEBngAAAAEBngLQAAEBkwAAAAEBkwLQAAEAbQLQAAEBjgAAAAEBjgLQAAEBuQLQAAEBogAAAAEBogLQAAIAEAABAAcAAAAKAAsABwANABEACQAVABkADgAeACUAEwAoACgAGwAqACsAHAAtADEAHgA1AEAAIwBDAEQALwBGAEoAMQBPAFMANgBYAF8AOwBkAGUAQwBoAGwARQBwAHQASgAJAAAALAAAACwAAAAsAAAALAAAACwAAAAsAAAALAAAACwAAQAmAAEBuQAAAAEAAAJEAAIAAQCxALkAAAACAAgAAQAIAAEAdAAEAAAANQbSBsQGvgaoBp4GiAZ6BkAGvgYqBhgGDga+BfQF4gXYBcYFrAWaBXwFVgVIBSYFHATiBMgElgR8BEYEHAPmA9QDhgN0A2oDKAL+AtwCqgKYApICTAIeAegBogGIAU4BRAEWAPwA9gDwAOIAAQA1AAEACQAKAAwADQASABMAFQAaABsAHAAdAB4AIAAnACkAKgAsAC0AMgAzADQANQA4ADoAQgBDAEUARgBLAEwATQBOAFQAVQBWAFcAWABaAGEAYgBjAGQAZwBoAG0AbgBvAHAAcwCGAI0AmgADAFYAEQBnABEAbQAiAAEALAAJAAEAbQAAAAYAOv/lAEb/5wBN//cAVv/mAGf/5gBz/+QACwA6/+cAQ//oAEb/6ABV/+8AVv/5AFj/5wBa/+cAYf/3AGP/7wBk//cAbv/3AAIARv/lAGj/7wAOADr/5gBD/+YARv/gAEz/1gBN/+8ATv/vAFb/9wBY/+kAWv/KAGP/ywBk/88AZ//7AGj/7wBw/+sABgA6/+UARv/iAE4ACQBa//MAZP/8AG0ACQARAEL/5wBD/+gARQABAEb/6ABL/+kATP/3AFX/9wBX/+YAWAABAFr/9wBh/+cAZP/qAGf/6ABu//cAb//uAHP/5wCa/+8ADQA6ABoAQgAJAEUALgBNABIATgABAFcAGgBjAAkAZAAJAGcACQBtAAQAcAAJAHMAEgB/AAkACwBD/+sARv/sAEz/9wBV/+gAWP/nAFr/7wBo/+EAbf/YAG7/5gBv/+cAc//nABEAOgARAEIACQBFABoARgAJAEsAEQBMAAkATQAJAE4AEQBWAAkAWAARAFoABABkABEAaAARAG0ACQBzAAkAf//9AID/VgABAGj/7gAEAEUABABOAAIAVAAJAGQAAQAMADr/6ABC//cAVv/mAFj/5QBa/+gAY//oAGT/6QBn/+4AaP/mAG3/5wBu/74Ab//kAAgAQv/kAEP/6ABG/+YATP/3AFr/6ABh/+YAZP/vAG//6gAKADr/5gBC/+YAQ//eAEb/3gBM/9sAVf/OAFf/zgBY//cAYf/PAG7/wgAQADoACABCAAMARQAaAEYABgBLAAkATgAaAFYACQBX//8AWAAJAFoABwBoAAkAbf/3AG7/9gBwABEAcwAJAJr/8wACAEb//wBOAAkABAA6AAkARv/9AFQAIgBoAAkAEwA6//wAQwAGAEUAEQBGAAkASwAKAEwAAABNABEAVQAJAFYAGgBYACAAYQANAGIAKABjABoAZAAiAGcAEQBtAAgAbgARAG8ACwBzAAkABAA6AAEARv//AEsAAQBOAAEADQA6/+gAQ//qAEb/6gBL//cATP/vAFf/9wBa/+kAY//oAGT/6wBo/+cAbv/aAHD/7wBz//cACgA6AAkARQAJAE0ACQBUABEAVgARAFgAEQBaAAkAZwAaAGgACgCA/5EADQBD/+gARv/oAEz/9wBN//cAVAAJAFb/5wBa/+8AY//5AGT/9wBt/8wAbv/ZAG//7ABw//cABgBG/+kAWv/pAGP/9wBo/+cAbv/3AHD/7wAMABX/7wA6//cAQv/3AEP/9wBG/+cATf/lAFX/5ABa//cAY//3AGf/5QBo/+YAc//kAAYAOv/3AEUABABo//cAbf/3AG7/7ACaAAkADgBC/+QAQ//hAEz/9wBN//cAVf/3AFb/6ABX/+QAWP/2AGP/6ABk/+kAbf/cAG7/1wBv/+wAc//kAAIANf//AEb/5gAIACr/+wA6/+MARv/DAE7//QBa/8MAYf/hAGT/xwBo/+MAAwAJ/+YAOv/vAEb/7wAJAAH/0gAg/9YAOv/LAEb/twBN/+YATv/cAFr/xQBo/8oAcP/uAAcAAf/xACD/+wAq//0ARv/VAE4ACQBa/9EAZP/KAAQAZP/3AG3/7wBu//cAb//3AAYAWv/aAGT/3ABo//EAbv/0AHD/8gBz//EABAAe/+QAM//gADX//wBu/+YAAgAy/+EAM//hAAQAAQABABr/zABFAAEAbQAAAAYAMv/eADP/3gA0/+AAQ//vAEz/9wBz/+8AAgA6//cAQ//tAAQAMv8zADP/jgA1/1kAVgAJAAUAAf/oABT/6gA6//cAWv/mAHD/9wAOABoAGgAbAAkALAARADoAEQBCAAkAWAARAFoACQBhABEAYgARAGMACQBkAAkAbQAlAG4ACQBvABEAAwAz/94ANf/yAEUACQAFABr/OwApAAEALAAKAHD//QB//+0AAgAd/+wAIP/tAAUAHf/vADL/3AAz/+YAOP/lAE7/9wABAEb/9wADADL/xgA1/9gATf/3AAIAM//aADX/7AACABQAAAHgAtAABAAJAAAhMSURIQMxESERAeD+NAHMJf5+AQLP/VUChv16AAIAOgAAAwoC0AAQABsAADMRNDY2MyEyFhYVESM1IRUjEyE1NCYjISIGFRU6J0EoAa8oQSiS/lKQkAGuAwP+XgMDAkAoQScnQSj9wO3tAX28AwMDA7z//wA6AAADCgPNAiYAAQAAAAcAtAGiAIz//wA6AAADCgPBAiYAAQAAAAcAtQGiAIz//wA6AAADCgObAiYAAQAAAAcAsQGiAIz//wA6AAADCgPNAiYAAQAAAAcAswGiAIz//wA6AAADCgPSAiYAAQAAAAcAtwGiAIz//wA6AAADCgPaAiYAAQAAAAcAuAGiAIwAAgA2AAAFDQLQABQAHwAAMzERNDY2MyEVIRUhFSEVIRUhNSEVETEhNTQmIyEiBhU2KEEnBEf9+QGh/l8CB/1p/lIBrgMD/l4DAwJAKEEnkY6SjpHt7QF9vAMDAwMAAAMAOwAAAwsC0AATACMAMwAAMxEhMhYWFRUUBgcWFhUVFAYGIyE3ITI2NTU0JiMhIgYVFRQWEyEyNjU1NCYjISIGFRUUFjsCJCdBKAQEEBQoQSj9wZYBogMDAwP+XgMDAwMBhgIEBAL+egMDAwLQJ0Eoig0XCxUxGZgoQSeRAwOJAgQEAokDAwEmAwJ9AwMDA30CAwABADgAAAMGAtAAFQAAMyImJjURNDY2MyEVISIGFREUFjMhFcgoQScnQSgCPv3kEBISEAIcJ0EoAbAoQSeRERH+lhASkQD//wA4/2cDBgLQAiYACgAAAAYAuQAAAAIAOgAAAwoC0AALABsAADMRITIWFhURFAYGIyUhMjY1ETQmIyEiBhURFBY6Aj8oQSgoQSj+VgGjAwMDA/5dAgQEAtAnQSj+UChBJ5EDAwGiAwMDA/5eAwMAAAEAOgAAAtIC0AALAAAzESEVIRUhFSEVIRU6Apj9+gGh/l8CBgLQkY6SjpH//wA6AAAC0gPNAiYADQAAAAcAtAGOAIz//wA6AAAC0gPBAiYADQAAAAcAtQGOAIz//wA6AAAC0gObAiYADQAAAAcAsQGOAIz//wA6AAAC0gPNAiYADQAAAAcAswGOAIwAAQA6AAAC0gLQAAkAADMRIRUhFSEVIRE6Apj9+gGh/l8C0JGOkv7hAAEAOAAAAwgC0AApAAAzIiYmNRE0NjYzITIWFhUVIzU0JiMhIgYVERQWMyEyNjU1IzUhERQGBiPIKEEnJ0EoAa8oQSiSAwP+XgMDAwMBogMDnwExKEEoJ0EoAbAoQScnQSg+NwMDAwP+XgMDAwN2kf7yKEEnAAABADkAAAMYAtAACwAAMxEzESERMxEjESEROZABv5CQ/kEC0P7hAR/9MAEf/uEAAQAkAAAAswLQAAMAADMRMxEkjwLQ/TD//wAeAAAA4QPNAiYAFQAAAAcAtABtAIz////UAAABCAPBAiYAFQAAAAcAtQBtAIz///+9AAABHQObAiYAFQAAAAcAsQBtAIz////8AAAAvgPNAiYAFQAAAAcAswBtAIwAAQAEAAAC1ALQABUAADMiJiY1NTMVFBYzITI2NREzERQGBiOUKEEnkAMDAaIDA5IoQScnQShXUAMDAwMCOf3AKEEnAAABADkAAALvAtAADgAAMxEzETMTMxUBARUjAyMROZGb8Jr++AEImvCbAtD+4QEfLv7G/sYuAR/+4QAAAQA5AAADCQLRAAUAADMRMxEhFTmQAkAC0f3AkQAAAQA4AAADYgLQAAsAADMRMxMTMxEjEQEBETiZ/Puakf78/vsC0P7TAS39MAH5/skBNv4IAAEAOAAAAwgC0AAJAAAzETMBETMRIwEROJkBpZKZ/lkC0P4KAfb9MAH4/gj//wA4AAADCAPaAiYAHgAAAAcAuAGTAIwAAgA2AAADBgLQABMAIwAAMyImJjURNDY2MyEyFhYVERQGBiMlITI2NRE0JiMhIgYVERQWxihBJydBKAGwJ0EoKEEn/lYBogMDAwP+XgMDAydBKAGwKEEnJ0Eo/lAoQSeRAwMBogMDAwP+XgMDAP//ADYAAAMGA80CJgAgAAAABwC0AZ4AjP//ADYAAAMGA8ECJgAgAAAABwC1AZ4AjP//ADYAAAMGA5sCJgAgAAAABwCxAZ4AjP//ADYAAAMGA80CJgAgAAAABwCzAZ4AjP//ADYAAAMGA9oCJgAgAAAABwC4AZ4AjAACADUAAAUMAtAAEwAjAAAzIiYmNRE0NjYzIRUhFSEVIRUhFSUhMjY1ETQmIyEiBhURFBbFKEEnJ0EoBEf9+QGh/l8CB/vBAaIDAwMD/l4DAwMnQSgBsChBJ5GOko6RkQMDAaIDAwMD/l4DAwACADgAAAMIAs8ADQAdAAAzESEyFhYVFRQGBiMFFRMhMjY1NTQmIyEiBhUVFBY4Aj8oQSgoQSj+UQYBogMDAwP+XgMDAwLPJ0InvidBJwHxAYMDArEDAwMDsQIDAAMANgAAA1oC0AAFABkAKQAAITU3FTMVISImJjURNDY2MyEyFhYVERQGBiMlITI2NRE0JiMhIgYVERQWAnCWVP1sKEEnJ0EoAbAnQSgoQSf+VgGiAwMDA/5eAwMDgBcGkSdBKAGwKEEnJ0Eo/lAoQSeRAwMBogMDAwP+XgMDAAMAOAAAAwgCzwAEABIAIgAAISczFxUhESEyFhYVFRQGBiMFFRMhMjY1NTQmIyEiBhUVFBYCbtW9sP0yAj8oQSgoQSj+UQYBogMDAwP+XgMDA/7RLQLPJ0InvidBJwHxAYMDArEDAwMDsQIDAAEANgAAAwYC0AA5AAAzIiYmNTUzFRQWMyEyNjU1NCYjISImJjU1NDY2MyEyFhYVFSM1NCYjISIGFRUUFjMhMhYWFRUUBgYjxSdCJpADAgGjAgQEAv5XJ0ImJkInAbEnQSiSBAL+XQIDAwIBqydBKChBJydBKD02AwMDA4MCAydCJ5EoQScnQSg9NgMDAwODAgMnQieRKEEnAP//ADYAAAMGA7oCJgAqAAAABwC2AZ4AjAABABQAAALkAtAACAAAITERITUhFSERATT+4ALQ/uECP5GR/cEAAAEANgAAAwYC0AAWAAAzIiYmNREzERQWMyEyNjURMxEUBgYjIcYoQSeQAwMBogMDkihBJ/5QJ0EoAkD9xwMDAwMCOf3AKEEn//8ANgAAAwYDzQImAC0AAAAHALQBngCM//8ANgAAAwYDwQImAC0AAAAHALUBngCM//8ANgAAAwYDmwImAC0AAAAHALEBngCM//8ANgAAAwYDzQImAC0AAAAHALMBngCMAAEAIwAAA+EC0AAHAAAhMQEzAQEzAQHE/l+nATgBOKf+XwLQ/eMCHf0wAAEAIwAABHIC0AANAAAhMQEzExMzExMzASMDAwEp/vqZpaWIpqWZ/vpwsrEC0P49AcP+PQHD/TAB5v4aAAEALgAAAv0C0AAQAAAzMTUBATUzFzczFQEBFSMnBy4BCP74mc/OmP74AQmZ0M0tATsBOy329i3+xf7GLvX1AAAB//0AAAMoAtAACQAAITERATMTEzMBEQFK/rOr6umt/rMBDQHD/toBJv48/vT////9AAADKAPNAiYANQAAAAcAtAGSAIz////9AAADKAObAiYANQAAAAcAsQGSAIwAAQAzAAADAwLQAAoAADMxNQEhNSEVASEVMwH4/ggC0P4IAfiYAaeRmP5Zkf//ADMAAAMDA7oCJgA4AAAABwC2AZsAjAACADQAAAKAAkQAEgAZAAAzIiYmNTUhNTQmIyE1ITIWFhURJSE1IRUUFsEmQSYBvgQC/kgBvydAJv5IASr+0AQnQCbdRgIEjidAJv5Jjl1XAgT//wA0AAACgANBAiYAOgAAAAcAtAFvAAD//wA0AAACgAM1AiYAOgAAAAcAtQFvAAD//wA0AAACgAMPAiYAOgAAAAcAsQFvAAD//wA0AAACgANBAiYAOgAAAAcAswFvAAD//wA0AAACgANGAiYAOgAAAAcAtwFvAAD//wA0AAACgANOAiYAOgAAAAcAuAFvAAAAAwA0AAAEQAJEABkAIAAqAAAzIiYmNTUhNTQmIyE1ITIWFhUVIRUUFjMhFSUhNSEVFBYlITU0JiMhIgYVwihAJgG+AwP+SAN/J0Am/kIEAgG4/IgBKv7RAwG8ATAEAv7cAgQnQCbdRgIEjic/J91GAwOOjl1XAgTLVwIEBAIAAgA2AAACggMCAA4AHgAAMzERMxUhMhYWFREUBgYjJSEyNjURNCYjISIGFREUFjaOATEnQCYmQCf+1QEkAwMDA/7cAgQEAwK+J0Am/tYmQCeOBAIBHAIEBAL+5AIEAAEAMwAAAn8CRAAWAAAzIiYmNRE0NjYzIRUhIgYVERQWMyEVIcAmQCcnQCYBvv5JAgQEAgG4/kEnQCYBKiZAJ44EAv7kAgSO//8AM/9nAn8CRAImAEMAAAAGALmzAAACABcAAAJkAwIADgAeAAAzIiYmNRE0NjYzITUzESE3ITI2NRE0JiMhIgYVERQWpShAJiZAKAExjv5BBwEkAgQEAv7cAgQEJ0AmASomQCe+/P6OBAIBHAIEBAL+5AIEAAACADMAAAJ/AkQAFwAhAAAzIiYmNRE0NjYzITIWFhUVIRUUFjMhFSETITU0JiMhIgYVwCZAJydAJgEyJ0Am/kIEAgG4/kEBATAEAv7cAgQnQCYBKiZAJydAJt1GAgSOAVlXAgQEAv//ADMAAAJ/A0ECJgBGAAAABwC0AVkAAP//ADMAAAJ/AzUCJgBGAAAABwC1AVkAAP//ADMAAAJ/Aw8CJgBGAAAABwCxAVkAAP//ADMAAAJ/A0ECJgBGAAAABwCzAVkAAAABADUAAAGgAwIAEQAAMzERNDY2MzMVIyIGFRUzFSMRNSdAJ93XAgTd3QJ1JkAnjwQCKY7+SgACACn/GwJ2AkQAGwArAAAXMTUhMjY1NSEiJiY1ETQ2NjMhMhYWFREUBgYjASEyNjURNCYjISIGFREUFocBWwIE/s8nQCcnQSYBMidAJiVBJ/7UASUCBAQC/tsCBATljwQCUCdAJgEqJkAnJ0Am/fIoQCYBcwQCARwCBAQC/uQCBAAAAQA2AAACggMCABQAADMxETMVITIWFhURIxE0JiMhIgYVETaOATEmQCeOAwP+3AIEAwK+J0Am/kkBsAIEBAL+UAAAAgA0AAAAwgMCAAQACQAAMzERMxEDMTUzFTSOjo4CRP28AnOPjwABACQAAACzAkQABAAAMzERMxEkjwJE/bwA//8AHAAAAN8DQQImAE8AAAAGALRrAP///9IAAAEGAzUCJgBPAAAABgC1awD///+7AAABGwMPAiYATwAAAAYAsWsA////+gAAALwDQQImAE8AAAAGALNrAAAC/0X/KwDOAwIADQASAAAHMTUzMjY1ETMRFAYGIxExNTMVu/UCBI4mQSeO1Y8EAgKE/XQnQCYDSI+PAAABADYAAAJ7AwIADwAAMzERMxEzNzMVBxcVIycjFTaOW8mT39+TyVsDAv5o2iz29iza2gAAAQA0AAABOwMDAA0AADMiJiY1ETMRFBYzMxUjwSZAJ48EAnJ6J0AmAnb9kQIEjgAAAQA2AAADiAJEABwAADMxESEyFhYVESMRNCYjIyIGFREjETQmIyMiBhURNgLEKEAmjgMDxwMDjwQCyAIDAkQnQCb+SQGwAgQEAv5QAbACBAQC/lAAAQA2AAACggJEABIAADMxESEyFhYVESMRNCYjISIGFRE2Ab8nQCaOAwP+3AIEAkQnQCb+SQGwAgQEAv5QAP//ADYAAAKCA04CJgBYAAAABwC4AVEAAAACADMAAAJ/AkQAFAAkAAAzIiYmNRE0NjYzITIWFhURFAYGIyE3ITI2NRE0JiMhIgYVERQWwCZAJydAJgEyJ0AmJkAn/s4HASQCBAQC/twCBAQnQCYBKiZAJydAJv7WJkAnjgQCARwCBAQC/uQCBAD//wAzAAACfwM/AiYAWgAAAAcAtAFZ//7//wAzAAACfwMzAiYAWgAAAAcAtQFZ//7//wAzAAACfwMNAiYAWgAAAAcAsQFZ//7//wAzAAACfwM/AiYAWgAAAAcAswFZ//7//wAzAAACfwNMAiYAWgAAAAcAuAFZ//4AAwA0AAAEPwJEABcAKAAzAAAzIiYmNRE0NjYzITIWFhUVIRUUFjMhFSE3MSEyNjURNCYjISIGFREUFiUxITU0JiMhIgYVwidBJiZBJwLwKD8m/kIEAgG4/IMGASUCBAQC/tsCBAQBuwEwBAL+3AIEJ0AmASomQCcnQCbdRgIEjo4EAgEcAgQEAv7kAgTLVwIEBAIAAAIANv8aAoICRAAOAB4AABcxESEyFhYVERQGBiMhFRMhMjY1ETQmIyEiBhURFBY2Ab8nQCYmQCf+zwYBJAMDAwP+3AIEBOYDKidAJv7WJkAn5gF0BAIBHAIEBAL+5AIEAAIAFP8aAmECRAAOAB4AAAUxNSEiJiY1ETQ2NjMhEQEhMjY1ETQmIyEiBhURFBYB0/7PKEAmJkAoAb/+SAEkAgQEAv7cAgQE5uYnQCYBKiZAJ/zWAXQEAgEcAgQEAv7kAgQAAQA0AAACAwJEAA0AADMxETQ2NjMhFSEiBhURNCdBJgFB/sUCBAG3JkAnjgQC/lAAAQAwAAACfQJEADoAADMiJiY1NTMVFBYzITI2NTU0JiMhIiYmNTU0NjYzITIWFhUVIzU0JiMhIgYVFRQWMyEyFhYVFRQGBiMhvSZAJ44EAgEkAgQEAv7VJkAnJ0AmATInQCePBAL+3AIEBAIBKydAJydAJ/7OJ0AmGhMCBAQCQQIDJ0AnTyZAJydAJhoTAgQEAkECAydAJ08mQCf//wAwAAACfQMuAiYAZAAAAAcAtgFUAAAAAQA5AAAC/wLQAC4AADMxETQ2NjMhMhYWFxUUBxYVFRQGBiMhNSEyNjU1NCYjITUhMjY1NTQmIyEiBhUROSdAJwGqIj0pBhMTJ0Em/qIBWAIEBAL+qAFYAgQEAv5iAgQCQihAJh81IKkmISAmmSZAJ44EAooDA4UEAowCAwMC/cUAAAEANQAAAaAC8wARAAAzIiYmNREzFTMVIxEUFjMzFSPDJ0Anjt3dBALX3SdAJgJmr47+3gIEjgAAAQA1AAACgQJEABYAADMiJiY1ETMRFBYzITI2NREzERQGBiMhwiZBJo4EAgEkAgSOJkAn/s4nQCYBt/5QAgQEAgGw/kkmQCf//wA1AAACgQNBAiYAaAAAAAcAtAFb/////wA1AAACgQM1AiYAaAAAAAcAtQFb/////wA1AAACgQMOAiYAaAAAAAcAsQFb/////wA1AAACgQNBAiYAaAAAAAcAswFb//8AAQAVAAADEgJEAAcAACExATMTEzMBAVT+waTa26T+wAJE/m4Bkv28AAEAIwAAA/8CRAANAAAhMQMzExMzExMzAyMDAwEH5JeFi46Ve5fabaaeAkT+wAFA/rwBRP28AW7+kgABAC4AAAKDAkQAEAAAMzE1Nyc1Mxc3MxUHFxUjJwcuzs6WlZSWzs6VlZUr/PIrsLAr8vwrt7cAAAEAKv8tAncCQgAdAAAXMTUhMjY1NSEiJiY1ETMRFBYzITI2NREzERQGBiOIAVsCBP7PJ0AnjgQCASUCBI4lQSfTjwQCPidAJgG1/lICBAQCAa79eCdAJv//ACr/LQJ3A0ECJgBwAAAABwC0AVAAAP//ACr/LQJ3Aw8CJgBwAAAABwCxAVAAAAABADYAAAKCAkQACgAAMzE1ASE1IRUBIRU2AXT+jAJM/o0Bc5YBII6W/uCO//8ANgAAAoIDLgImAHMAAAAHALYBWwAAAAMAOQAAAv8C0AAUABsAIgAAMyImJjURNDY2MyEyFhYVERQGBiMhNzEhMjY1EQUxASEiBhXHJ0AnJ0AnAaonQCcnQCf+VkgBXAIE/lYBYv6kAgQrRSYBqSdCKChCJ/5XJkUrlwMDASKpASgDAwAAAQABAAABeQLQAAcAADMxEQcjEzMR6iy94JgB/DcBC/0wAAEAOQAAAv8C0AAtAAAzMRE0NjYzITI2NTU0JiMhIgYVFSM1NDY2MyEyFhYVFRQGBiMhIgYVFRQWMyEVOSdAJwGkAgQEAv5iAgSOJ0AnAaomQScnQSb+XAIEBAICMgEWJ0AmBAKTAgQEAjY9J0AmJkAnoSdAJwQCegIEjgABADUAAAL7AtAAOQAAMyImJjU1MxUUFjMhMjY1NTQmIyE1ITI2NTU0JiMhIgYVFSM1NDY2MyEyFhYVFRQGBxYWFRUUBgYjIcMnQCePAwIBngIEBAL+RwGdAwMDA/5+AgOPJ0AnAY8nQCYDBBESJkEm/lUnQCYyKwIEBAKKAwOPAwKEAgQEAjQ7J0AmJkAnkQwZChMxGpgmQCcAAgAGAAACsALQAAsADwAAITE1ITUBMxEzFSMVATEzNQHA/kYBxoJiYv6c1rSCAZr+c4+0AUOxAAABADkAAAL/AtAAKQAAMyImJjU1MxUUFjMhMjY1NTQmIyERIRUhIgYVFRQWMyEyFhYVFRQGBiMhxydAJ44EAgGeAgQEAv3OAsb9zgIEBAIBpCZBJydBJv5WJ0AmNC0CBAQCjAMDAaqOBAKBAgMmQSebJkAnAAIAOQAAAv8C0AAeACsAADMiJiY1ETQ2NjMhFSEiBhUVFBYzITIWFhUVFAYGIyE3ITI2NTU0JiMhFRQWxydAJydAJwHI/j4CBAQCAaQmQScnQSb+VgYBngIEBAL+XAQnQCYBtidAJo4EAoACBCZAJ5wmQCeOBAKNAgSTAgQAAAEAAwAAAlkC0QANAAAhMRE0JiMhNSEyFhYVEQHLAwP+PgHJJ0AmAj0CA48mQCj9vQAAAwA5AAAC/wLQACAAMQBCAAAzIiYmNTU0NjcmJjU1NDY2MyEyFhYXFRQHFhUVFAYGIyE3MSEyNjU1NCYjISIGFRUUFhMxITI2NTU0JiMhIgYVFRQWxydAJwsICAsnQCcBqiI9KQYTEydBJv5WBgGeAgQEAv5iAgQEAgGeAgQEAv5iAgQEJ0AmmxIjERAkE44nQCYfNSCnJCMfJ5smQCeOBAKMAwMDA4wCBAEdBAKKAgQEAooCBAACADQAAAL8AtAAIQAvAAAzIiYmJyEyNjU1NCYjISImJjU1NDY2MyEyFhYVERQGBiMhEzEhNTQmIyEiBhUVFBbEIzsrBwIzAwMDA/5dKD8nJkEnAaonQSYmQSf+VgcBogMD/mQDAwMmQCgEAoMCBCdAJ5gnQCYmQCf+SiZAJwGskAIEBAKKAwMAAQA2AAAAxACOAAQAADMxNTMVNo6OjgAAAQA2/3sAxACFAAcAABcxETMVFAYGNo4lQYUBCnoiPCsAAAIANgAAAMQCRQAEAAkAABMxNTMVAzE1MxU2jo6OAbaPj/5Kjo4AAgAz/3sAwgJFAAcADAAAFzERMxUUBgYDMTUzFTSOJUEpj4UBCnojOysCNI+PAAMANgAAAkQAjgAEAAkADgAAMzE1MxUzMTUzFTMxNTMVNo8xjzCPjo6Ojo6OAAACADoAAADIAtAABAAJAAA3MREzEQcxNTMVOo6OjskCB/35yY6OAAIANQAAAMMCxQAEAAkAADMxETMRAzE1MxU1jo6OAg398wI3jo4AAgAfAAACjwLQAB8AJAAANzE1NDY2MzMyNjU1NCYjITUhMhYWFRUUBgYjIyIGFRUHMTUzFYQmQCfqAwMDA/4kAeInQSYmQSfoAwOPj8NJJ0AmBAKcAwOPJkAoqidAJwQCQcOOjgAAAgATAAAChALFAB8AJAAAMyImJjU1NDY2MzMyNjU1MxUUBgYjIyIGFRUUFjMhFSETMTUzFaEnQCcnQCfpAwOPJ0Ao6QIEBAIB3f4d748nQCarKEAmAwNHTig/JwQCnQIEjgI3jo4AAQBxAR4BAQGoAAwAABMiNTU0MzMyFRUUIyOuPT0VPj4VAR47Ezw8EzsAAQAZAQ0B5gLEAA8AABMxJzcnNxc1MxU3FwcXBye4dEhzLHKQcyx0SXNKAQ1UYiSKJ3p6J4okYlRhAAIAIAAAAvEC0AAcACEAADMxNyM1MzcjNTM3MwczNzMHMxUjBzMVIwcjNyMHEzEzNyM/ME96J4SyMZM0nDGSNEdzKH+tL5Axni1cmiiboI57j5iYmJiPe46goKABLnsAAAEABgAAAgkC0AAGAAAzMTUBNxUBBgHTMP4tlAI7AZP9xAABAAUAAAIIAtAABgAAITEBNTMBFQHY/i0wAdMCPpL9w5MAAQA0AAAA/gLQABYAADMiJiY1ETQ2NjMzFSMiBhURFBYzMxUjwSZBJiZAJz02AgQEAjY9J0AmAbUoQCaPAwL+WAIEjgABADgAAAEDAtAAFgAAMzE1MzI2NRE0JiMjNTMyFhYVERQGBiM4NgIDAwI2PSZBJydBJo4EAgGoAgOPJkAo/ksmQCcAAAEAFwAAAQoC0AAdAAAzIiYmNTUnNTc1NDY2MzMVIyIGFRUHFxUUFjMzFSPOJkEnKSknQSY8NgIEMjIEAjY8J0AmjBd+F30oQCaPAwKjKiqxAgSOAAEAMwAAASYC0AAdAAAzMTUzMjY1NTcnNTQmIyM1MzIWFhUVFxUHFRQGBiMzNgIDMzMDAjY8JkEnKSknQSaOBAKwKyqjAgOPJkAofBl7GosmQCcAAAEANgAAAQAC0AAIAAAzMREzFSMRMxU2yjw8AtCO/kyOAAABADMAAAD9AtAACAAAMzE1MxEjNTMRMzo6yo4BtI79MAAAAQA7AOAB2AFvAAQAADcxNSEVOwGd4I+PAAABADYA3wKMAW4ABAAANzE1IRU2Albfj48AAAEANgDfAvcBbgAEAAA3MTUhFTYCwd+PjwAAAQA2/3AC/P/+AAQAABcxNSEVNgLGkI6OAAACAC0BvwGOAskABwAPAAATMTU0NjY3ERcxNTQ2NjcRLSVCKEMmQSgBwHkkPCkH/vcBeSQ9KAf+9wAAAgA2AbsBlgLEAAcADwAAEzERMxUUBgYXMREzFRQGBjaPJkGqjiVBAbsBCXkiPCsHAQl5IjwrAAABACIBvwCwAskABwAAEzE1NDY2NxEiJUEoAb96IzwqB/72AAABADYBuwDEAsQABwAAEzERMxUUBgY2jiVBAbsBCXkjPCoAAgAnAgQBZgLEAAQACQAAEzE1MxUhMTUzFdmN/sGOAgTAwMDAAAABADsCAwDJAsQABAAAEzE1MxU7jgIDwcEAAAEAIwAAAuYC0AAmAAAhIiYmNTUjNTM1IzUzNTQ2NjMhFSEiBhUVIRUhFSEVIRUUFjMhFSEBDSg/J1xcXFwnPygB2f4uAwMBdP6MAXT+jAMDAdL+JydAJjSPLY83J0AmjgQCMI8tjy0CBI4AAAIAIf+bAm0CxAAYACIAAAUxNSMiJiY1ETQ2NjMzNTMVMxUjETMVIxUnMxEjIgYVERQWASJzJ0AnJ0Anc5C7u7u7/W1tAgQEZWUnQCYBMydAJ3Z2kP7QjmXzATAEAv7cAgQAAwAi/5wC5wM1ADYAQABLAAAFMTUjIiYmNTUzFRQWMzM1IyImJjU1NDY2MzM1MxUzMhYWFRUjNTQmIyMVMzIWFhUVFAYGIyMVATM1IyIGFRUUFgExMzI2NTU0JiMjAT6MKkEljgQCh4spQSYlQSqMjosqQSWOBAKHiypBJSZBKYv+6oeHAgQEARiHAgQEAodkZCdBKDo2AgSQJkIpkSlBJmVlJkEpOjYCBJYnPyWRKEEnZAIQlgQCigIE/uIEAoQDAwABACcAAAKqAtAAIgAAMzE1MzUjNTM1NDY2MyEyFhYVFSM1NCYjIyIGFRUhFSEVIRUnXFxcJ0EmAQsnQCeQAwP8AwMBNf7LAZiOjo6YKEAmJkAoMTMCBAQCmo6OjgAAAQARAFgBrgH1AAwAADcxNSM1MzUzFTMVIxWWhYWPiYlYiI+Gho+IAAEAOwDgAdgBbwAEAAA3MTUhFTsBneCPjwAAAQA1AFQB9wIDABAAADcxNzcnNTMXNzMHBxcXIycHNQGEhZdJS5cBhYUBl0tKVCysqyxmZiyrrCxlZQAAAwAJAAAB8AJjAAQACQAOAAA3MTUhFQUxNTMVAzE1MxUJAef+zI6OjvKPj/KPjwHTkJAAAAIAOwCEAkgB3AAEAAkAABMxNSEVBTE1IRU7Ag398wINAU6OjsqPjwABADv/8gHjAlgABwAAFzE1Nyc1BRU79vYBqA6mjo6k9HwAAQAF//QBrAJaAAcAAAUxJTUlFQcXAaz+WQGn9vYM9nv1pI6PAAABABgA1wGKAX4AEgAAJSInJiMiBzU2MzIXFjMyNxUGIwEsJDw8IyYvMSkmQkIZIDU5JdcgHyN2FR8gIXIXAAUAMAAAA5ACzwAGABsALABBAFIAADMxNQE3FQETIiYmNTU0NjYzMzIWFhUVFAYGIyM3MTMyNjU1NCYjIyIGFRUUFgEiJiY1NTQ2NjMzMhYWFRUUBgYjIzcxMzI2NTU0JiMjIgYVFRQWhgKZLv1nAic8IyM8J1MnPCMjPCdTCj4MEBAMPgwREQIEJzwiIjwnUyc8IiI8J1MKPwwQEAw/DBAQlgI4AZT9xwFzIjwnSic8IiI8J0onPCJ0EAw0DBERDDQMEP4fIjwnSic8IiI8J0onPCJzEAw2CxERCzYMEAAAAgA2AAAC/ALQAC8APAAAMyImJjURNDY2MyEyFhYVESEiJiY1NTQ2NjMzMhYWFRUzNTQmIyEiBhURFBYzIRUhEzM1NCYjIyIGFRUUFsQnQCcnQCcBqiZBJ/58JzgeHjgnQyc4HTcEAv5iAgQEAgIy/cigcAMDagMDAydAJgG1KEAmJkAo/pIeOCc6JzceHjcnS/wCAwMC/lgCBI4BQF4CBAQCWQIDAAIANf/zA3ACzwApADYAADMiJiY1NTQ2NyY1NTQ2NjMhMhYWFxUjNTQmIyEiBhUVBTUzFRcVJwYGIyUhMjY3JSciBhUVFBbCJkAnGxgOJ0AmAWoiPCkHjwMD/qQCBAGEjnaMFEAj/lwBPgoUCv6rDwQEBCZAJ74WLwwVJmooQSUfNSBUMwIDAwJxw2aiRpFQHiWOAwOsBhEchQIEAAMAOAAAAw8CxAASABwAIQAAITE1IyImJjU1NDY2MyERIzUjFQEzNSMiBhUVFBYhMTM1IwGl3ydAJydAJwJJjk3+mNnZAgQEAWpNTe4nQCa7JkEn/Tzu7gF9uAQCrAIEuAAAAgAtAWABnALFABQAJAAAEyImJjU1NDY2MzMyFhYVFRQGBiMjJzMyNjU1NCYjIyIGFRUUFrsnQCcnQCdTJ0AnJ0AnUwxrAwMDA2sDAwMBYCdAJ0onQCYmQCdKJ0EmfAQCYQMDAwNhAgQAAAEANv+bAMQDKgAEAAAXMREzETaOZQOP/HEAAv9QAoAAsAMPAAQACQAAEzE1MxUhMTUzFSGP/qCPAoCPj4+PAAAB/7gCgABIAw8AAwAAAzUzFUiQAoCPjwAB/48CgABRA0EABAAAAzEnMxdBMJIwAoDBwQAAAf+xAoAAdANBAAQAAAMxNzMHTzGSMQKAwcEAAAH/ZwKEAJsDNQAHAAADMTczFyMnB5lqYWl7IR4ChLGxNjYAAAH/aQKAAJcDLgAHAAADMSczFzczBy9odh8geWgCgK4yMq4AAAL/nQKDAGMDRgAPAB8AAAMiJjU1NDYzMzIWFRUUBiMnMzI2MTU0JiMjIgYVFTAWGR4sLB4zHisrHjQ0AQEBATQBAQECgyseMR4rKx4xHitBATcBAQEBNwEAAAH/RwKNALkDTgAOAAATIicmIyM1MzIXFjMzFSNaOTg2JUdUNTIzLVdfAo0qKm0rLGoAAQFN/2cCEAAPAAMAAAU3MwcBTTKRMZmoqP//AGQCgAHEAw8ABwCxARQAAP//AEgCgADYAw8ABwCyAJAAAP//ADACgADzA0EABwCzAKEAAP//ACECgADjA0EABgC0bwD//wBkAoQBmAM1AAcAtQD9AAD////+AoABLAMuAAcAtgCVAAAAAQAoAv4BEgN5ABAAABMiJjU3FBYXMzY2NTMGBiMjiS00XAECLgEBWwE0JDAC/jdDAQ8PAQEPD0Q3//8AEgLvANgDsgAGALd1bP//ABECjQGDA04ABwC4AMoAAAABAFcCfgGbAtAABAAAEzE1IRVXAUQCflJS//8ACv9nAM4ADwAHALn+vQAAAAEAvf8GATf/7wAEAAAXMTUzFb16+unpAAEALgAAAvMC0AAIAAAzMTUBITUhFQEvAbj+RwLF/dAsAhaOK/1bAAACAAwAAALSAs8AFQAiAAAhNTQmIiMhIiYmNTU0NjYzITIWFhURASE1NCYjISIGFRUUFgJEAQ4T/ngnQCcnQCcBqyZBJv3PAaMEAv5jAgQE+hQNJ0AnmCdAJydAJ/2/AaqQAgQEAooDAwAAAQAxAAAC9gLPABwAADMiJicnATUhIgYVFSM1NDY2MyEyFhYXFQEVIRUhvTFODAECNv5fAgSPJ0AnAasiPCgG/coCNv3HQC6EAS8gBAJBSCdAJh41IZH+0Q2OAAACABsAAAKCAtAAJAAoAAA3NTQ2NjMzMjY1NTQmIyEVIzU+AjMhMhYWFRUUBgYjIyIGFRUHNTMVtidAJqsCAwMC/ruOBSg8IgFOJ0AnJ0AnqQIEj4+4VCdAJgQCnQIDZH0hNSAmQCiqJ0AnAwNMuI6OAAABAAkAAAKzAs4AEAAAITE1ITUBMxUBMzUzFTMVIxUBw/5GAV+D/tz8jmJisoEBm0v+v4qKkLIAAAH//wAABDQC0AAQAAAhMQE1MwE1AzUzAREzESMnFQI4/ceYAajblwGokZjMAqQs/grHAQIt/ggB+P0w8/MAAQBLAAAEgALQABAAADMxETMRATMVAxUBMxUBIzUHS5EBqJjbAaaZ/ciYzALQ/ggB+C3+/skB+Cz9XPPzAAABADYAAAL7AtAACAAAMzERMxEBMxUBNo8BopT90QLQ/gUB+zf9ZwAAAgABAAACxQLQAAkADQAAMzE1ATMRIzUhBwExMzUBAi6Wj/71lgENlCsCpf0wsrIBQa0AAAIANgAAAvwC0AAJAA0AADMxETMBFSMnIRURMTMnNpYCMJaX/vaTkwLQ/VsrsrIBQa0=) format('truetype');
21
+ }
22
+ .wm {
23
+ font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
24
+ font-weight: 700;
25
+ letter-spacing: -0.02em;
26
+ font-size: 140px;
27
+ }
28
+ .by {
29
+ font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
30
+ font-weight: 700;
31
+ font-size: 18px;
32
+ fill: #888;
33
+ }
34
+ .dexter {
35
+ font-family: 'DexterOrbitron', 'Orbitron', sans-serif;
36
+ font-weight: 800;
37
+ letter-spacing: 0.01em;
38
+ font-size: 32px;
39
+ }
40
+ ]]></style>
41
+ </defs>
42
+ <text class="wm" x="300" y="120" text-anchor="middle">
43
+ <tspan fill="#4285F4">x</tspan><tspan fill="#EA4335">4</tspan><tspan fill="#FBBC05">0</tspan><tspan fill="#4285F4">2</tspan><tspan fill="#34A853">g</tspan><tspan fill="#EA4335">l</tspan><tspan fill="#FBBC05">e</tspan>
44
+ </text>
45
+ <g transform="translate(300, 200)">
46
+ <text class="by" x="-72" y="0" text-anchor="end">by</text>
47
+ <text class="dexter" x="-60" y="4" fill="url(#dexterGradient)">DEXTER</text>
48
+ </g>
49
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 573 157" role="img" aria-label="x402gle wordmark">
3
+ <defs>
4
+ <style><![CDATA[
5
+ @font-face {
6
+ font-family: 'X402gleJakarta';
7
+ font-style: normal;
8
+ font-weight: 700;
9
+ src: url(data:font/woff2;base64,d09GMgABAAAAAAQ4AA8AAAAACAgAAAPfAAISLQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbIBwqBmA/U1RBVEQAZBEICoRghAkBNgIkAyALEgAEIAWEZgcgG5gGAB6D424plMVSBvOu5PJojxZB/X5lz/tv6f7esQwjSVLExrBwcajYJpJVKsJEJvvXd9brYAFGnHgJTSrT2QOk4PwFqf8BqkVOXI7/Nz/9425MwdTWwLamY03vEuspzLfP84CjaINtIArYU9X5VOWAgjPqDIHYl0ATkISQhUCbfkKgZStySsBOhtb/AI6CEURo4lzOHcZ94McETM/pQjoKTNIDWgWwVhcTB4giHeiGv8a2jdn5sBKUBmaX1kClC7UAAWkQ7SUGoQuhLqEPDcPQLp3swIjO6fONPchRyLogiEZ6BaAQUjRBgIQCfegCfRg2AV3c0DGJmlardj0Gtv57z+tM7lhqiQWmhsBmIVrqBHXQBbThJUA/AXKEMUkipOVG8dwYLl1uwY7Mww8slhhltZZTzLCMawu9nFD7uoeW622Tr5oGrzSb98JuSEuXmkxcckL5MvOIK2cCjd5pcghOlsuQY75mMu3hu60x6qFMJtdOY5a53LvHsbStvKzY7VBWllQ0iiJ2TLFiliDa+cX63Gu8PfpYZWvIP2VRiTO0RzNOlrRSmyNTnOnT4xxLLmenjsovShs+ODMnoUGcnMmtC3eRR61tqXo8LSD9klT8g5UXruLkpIjl8qehnZpvydE1bEj5GtsuzEpzHTR+XxqhFV3zEw2dtrNWFZMzIDV5UE5u8gBjSnZsjfq928ChzPRlZH98cZfkCTdRKuElPRWLE/mqQWIukZjAh9i/Y75yeu123GXx3AepQnvRMZejbotm308eC4fLytv1WdsonLnlXq6yemx99laKyto6rqFiiCY9ToALC8+QjFitOj3WBgoOOh6Ik5duv0nImhekWEcoU8O+9PMOZ5Z1ETEZPZqY2nhRcG50wcftB5IpGPyszJB7e/qdXkPv2gFP9A4dYwAgkHrkn/dM5dW7xny1oxd/4PsumR8AvzbMqflf/v8/c0T+AqlKIPglDJ8Y+L+OARD4dvV0DWJSC2GaCkJ/xCYCHNNbs1IpcZoOPAh1x9jah5kjvRAoPbBycgNvwcGHIc7ySd1vvrDAOz4bFzK+Yk5UcFWjYrZKFJrxoqmRyxnlHvJ+taa2+Gwpkt4gBp3adcBY1JTSxVLiBVplC/QwokKzNOrWGGPEGslSzN2H4q3AgNSlVTOMJZER1oFk4DhFKkyE6VGiKCi061y7GjUhNCP1UsBI3UjYIHqtFB2UTv3sVdzhY0lC6tFCjaAUTiVaiXzZ8kXXsMkz1Pwm9Hy6TCvD8E6kPqzqke3aYOR1fyjVlAiRCBpKtR0FyrV+t8mZsEY9OjUrQupdR6MDrVYiAAAA) format('woff2');
10
+ }
11
+ .wm {
12
+ font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
13
+ font-weight: 700;
14
+ letter-spacing: -0.02em;
15
+ font-size: 140px;
16
+ }
17
+ ]]></style>
18
+ </defs>
19
+ <text class="wm" x="286.5" y="116" text-anchor="middle">
20
+ <tspan fill="#4285F4">x</tspan><tspan fill="#EA4335">4</tspan><tspan fill="#FBBC05">0</tspan><tspan fill="#4285F4">2</tspan><tspan fill="#34A853">g</tspan><tspan fill="#EA4335">l</tspan><tspan fill="#FBBC05">e</tspan>
21
+ </text>
22
+ </svg>
@@ -1,7 +1,7 @@
1
- import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-i7C2GiVY.cjs';
2
- export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-i7C2GiVY.cjs';
1
+ import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-B3kS1y_t.cjs';
2
+ export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-B3kS1y_t.cjs';
3
3
  export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, E as ETHEREUM_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, m as SKALE_BASE, n as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, o as USDC_ADDRESSES, X as X402_EXACT_PERMIT2_PROXY } from '../constants-qU-4U3L-.cjs';
4
- import '../types-CKiTYeJ-.cjs';
4
+ import '../types-Bcsi5jQb.cjs';
5
5
 
6
6
  /**
7
7
  * Check if an asset address is a known USDC contract (any chain).
@@ -1,7 +1,7 @@
1
- import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-BPKUVJEl.js';
2
- export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-BPKUVJEl.js';
1
+ import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-HFS_C6RX.js';
2
+ export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-HFS_C6RX.js';
3
3
  export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, E as ETHEREUM_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, m as SKALE_BASE, n as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, o as USDC_ADDRESSES, X as X402_EXACT_PERMIT2_PROXY } from '../constants-qU-4U3L-.js';
4
- import '../types-CKiTYeJ-.js';
4
+ import '../types-Bcsi5jQb.js';
5
5
 
6
6
  /**
7
7
  * Check if an asset address is a known USDC contract (any chain).
@@ -0,0 +1 @@
1
+ "use strict";var b=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var ne=(e,t)=>{for(var n in t)b(e,n,{get:t[n],enumerable:!0})},re=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ee(t))!te.call(e,a)&&a!==n&&b(e,a,{get:()=>t[a],enumerable:!(r=Z(t,a))||r.enumerable});return e};var ae=e=>re(b({},"__esModule",{value:!0}),e);var se={};ne(se,{InsufficientBalanceError:()=>w,UnsupportedNetworkError:()=>d,createFileChannelStore:()=>U,createLocalStorageChannelStore:()=>I,getDefaultChannelStore:()=>S,openBatchChannel:()=>G,resumeBatchChannel:()=>K});module.exports=ae(se);var i=require("viem"),u=require("viem/chains"),N=require("@x402/evm"),x=require("@x402/evm/batch-settlement/client"),k=require("@x402/core/client");var D=require("os"),$=require("path"),M=require("@x402/evm/batch-settlement/client");function U(e){return new M.FileClientChannelStorage({directory:e})}var v="dexter-x402-channel:";function I(e){return{async get(t){let n=e.getItem(v+t);return n?JSON.parse(n):void 0},async set(t,n){e.setItem(v+t,JSON.stringify(n))},async delete(t){e.removeItem(v+t)}}}function S(){let e=globalThis.localStorage;return e?I(e):U((0,$.join)((0,D.homedir)(),".dexter-x402","channels"))}var B=require("viem"),F=require("@x402/core/server"),H=require("@x402/evm/batch-settlement/server"),j=6;async function _(e,t,n){let{claims:r,settle:a}=await e.claimAndSettle();if(r.length===0&&BigInt(n.settledAtomic)>0n)throw new Error(`batch-settlement close inconsistency: channel accounting expected a settled amount of ${n.settledAtomic} atomic units, but the facilitator's claimAndSettle reported no claim transaction (claims was empty)`);let p=(await e.refund([t]))[0];return{claimTx:r[0]?.transaction??"",settleTx:a?.transaction??"",refundTx:p?.transaction??"",settledAmount:(0,B.formatUnits)(BigInt(n.settledAtomic),j),refundedAmount:(0,B.formatUnits)(BigInt(n.refundedAtomic),j)}}function q(e,t,n){let r=new F.HTTPFacilitatorClient({url:e});return new H.BatchSettlementEvmScheme(n).createChannelManager(r,t)}var w=class extends Error{constructor(t){super(t),this.name="InsufficientBalanceError"}},d=class extends Error{constructor(t){super(t),this.name="UnsupportedNetworkError"}};var W={"eip155:8453":{chain:u.base,defaultRpc:"https://mainnet.base.org"},"eip155:42161":{chain:u.arbitrum,defaultRpc:"https://arb1.arbitrum.io/rpc"},"eip155:137":{chain:u.polygon,defaultRpc:"https://polygon-rpc.com"}};function J(e){let t=W[e.network];if(!t)throw new d(`batch-settlement is not available on network "${e.network}" \u2014 supported: ${Object.keys(W).join(", ")}`);let n=e.rpcUrl??t.defaultRpc,r=e.wallet.signTypedData;if(typeof r!="function")throw new Error("batch-settlement requires an EvmWallet that supports signTypedData (EIP-712)");let a=(0,i.createWalletClient)({account:{address:e.wallet.address,type:"json-rpc"},chain:t.chain,transport:(0,i.http)(n)}).extend(i.publicActions),s=Object.assign(a,{address:e.wallet.address,signTypedData:o=>r.call(e.wallet,o)}),p=(0,N.toClientEvmSigner)(s),c=new x.BatchSettlementEvmScheme(p,{storage:e.store,depositPolicy:{depositMultiplier:4},depositStrategy:()=>e.depositAtomic}),l=new k.x402Client;l.register(e.network,c);let R=new k.x402HTTPClient(l);return{scheme:c,x402Cli:l,httpClient:R,rpcUrl:n}}var y=6,X="https://x402.dexter.cash";function oe(e,t){let n=t>e?0n:e-t;return{deposited:(0,i.formatUnits)(e,y),spent:(0,i.formatUnits)(t,y),remaining:(0,i.formatUnits)(n,y)}}function ie(e){let t=e.payload;if(!t||typeof t!="object")return"";let n=t.voucher;if(!n||typeof n!="object")return"";let r=n.channelId;return typeof r=="string"?r:""}function z(e){let{stack:t,store:n,facilitatorUrl:r,network:a}=e,s="",p="",c=e.depositedAtomic,l=0n;async function R(){if(!s)return;let o=await(0,x.getChannel)(n,s);o&&(o.chargedCumulativeAmount!==void 0&&(l=BigInt(o.chargedCumulativeAmount)),c===0n&&o.balance!==void 0&&(c=BigInt(o.balance)))}return{get channelId(){return s},get network(){return a},get state(){return oe(c,l)},async fetch(o,f){let{httpClient:m}=t,h=await fetch(o,f);if(h.status!==402)return h;let E=m.getPaymentRequiredResponse(g=>h.headers.get(g),await h.clone().json().catch(()=>{})),P=E.accepts?.[0];P?.payTo&&(p=P.payTo);let T=2,L;for(let g=1;g<=T;g+=1){let A=await m.createPaymentPayload(E),O=ie(A);O&&(s=O);let Q=m.encodePaymentSignatureHeader(A),C=await fetch(o,{...f,headers:{...f?.headers??{},...Q}});L=C;let{recovered:V}=await m.processPaymentResult(A,Y=>C.headers.get(Y),C.status);if(await R(),!(C.status===402&&V&&g<T))return C}return L},async close(){if(!s)throw new Error("cannot close a channel that has made no requests \u2014 call fetch() at least once first");if(!p)throw new Error("cannot close: the seller payout address is unknown (no 402 was observed)");let o=l.toString(),f=(l>c?0n:c-l).toString(),m=q(r,a,p),h=await _(m,s,{settledAtomic:o,refundedAtomic:f});return await n.delete(s.toLowerCase()),h}}}async function G(e){let t=e.store??S(),n=e.facilitatorUrl??X,r;try{r=(0,i.parseUnits)(e.deposit,y)}catch{throw new Error(`deposit must be a valid USDC amount in decimal units (e.g. "0.30"), got "${e.deposit}"`)}if(r<=0n)throw new Error(`deposit must be a positive amount, got "${e.deposit}"`);let a=J({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:r.toString()});return z({stack:a,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:r})}async function K(e){let t=e.store??S(),n=e.facilitatorUrl??X,r=J({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:"0"});return z({stack:r,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:0n})}0&&(module.exports={InsufficientBalanceError,UnsupportedNetworkError,createFileChannelStore,createLocalStorageChannelStore,getDefaultChannelStore,openBatchChannel,resumeBatchChannel});
@@ -0,0 +1,126 @@
1
+ import { ClientChannelStorage } from '@x402/evm/batch-settlement/client';
2
+ import { E as EvmWallet } from '../types-B3kS1y_t.cjs';
3
+ import '../types-Bcsi5jQb.cjs';
4
+
5
+ /**
6
+ * Channel persistence. This is the upstream `ClientChannelStorage` interface
7
+ * (`get` / `set` / `delete`, keyed by lowercased channelId). The SDK ships
8
+ * file-backed and localStorage-backed implementations; a consumer may pass any
9
+ * `ClientChannelStorage` (e.g. one backed by their own database).
10
+ */
11
+ type ChannelStore = ClientChannelStorage;
12
+ /** Channel accounting, all amounts USDC human units (e.g. "0.30"). */
13
+ interface ChannelState {
14
+ /** Total escrowed into the channel. */
15
+ deposited: string;
16
+ /** Cumulative amount spent via vouchers. */
17
+ spent: string;
18
+ /** deposited - spent. */
19
+ remaining: string;
20
+ }
21
+ /** Options for opening a fresh (or auto-resumed) channel. */
22
+ interface OpenBatchChannelOptions {
23
+ /** EVM wallet — any { address, signTypedData }. The same EvmWallet the exact scheme uses. */
24
+ wallet: EvmWallet;
25
+ /** CAIP-2 network: eip155:8453 (Base), eip155:42161 (Arbitrum), eip155:137 (Polygon). */
26
+ network: string;
27
+ /** Total escrow for the channel, USDC human units, e.g. "0.30". */
28
+ deposit: string;
29
+ /** Facilitator base URL. Default: https://x402.dexter.cash */
30
+ facilitatorUrl?: string;
31
+ /** RPC URL override. Default: per-network. */
32
+ rpcUrl?: string;
33
+ /** Channel persistence. Default: localStorage (browser) / file (Node). */
34
+ store?: ChannelStore;
35
+ }
36
+ /** Options for explicitly resuming an existing channel. */
37
+ interface ResumeBatchChannelOptions {
38
+ wallet: EvmWallet;
39
+ network: string;
40
+ facilitatorUrl?: string;
41
+ rpcUrl?: string;
42
+ store?: ChannelStore;
43
+ }
44
+ /** Result of channel.close() — the three settlement tx hashes and final amounts. */
45
+ interface CloseReceipt {
46
+ /** claimWithSignature tx hash. */
47
+ claimTx: string;
48
+ /** settle tx hash. */
49
+ settleTx: string;
50
+ /** refundWithSignature tx hash. */
51
+ refundTx: string;
52
+ /** Amount paid to the seller, USDC human units. */
53
+ settledAmount: string;
54
+ /** Unspent amount returned to the buyer, USDC human units. */
55
+ refundedAmount: string;
56
+ }
57
+ /**
58
+ * A live escrow channel. Returned by openBatchChannel / resumeBatchChannel.
59
+ * Hold this handle for the lifetime of a batching session.
60
+ */
61
+ interface BatchSettlementChannel {
62
+ /** On-chain channel id (bytes32 hex). Empty until the first fetch resolves it. */
63
+ readonly channelId: string;
64
+ /** CAIP-2 network. */
65
+ readonly network: string;
66
+ /** Live channel accounting; updated after each fetch. */
67
+ readonly state: ChannelState;
68
+ /** Drop-in fetch. On a batch-settlement 402, signs a voucher and retries. */
69
+ fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
70
+ /** Facilitator-driven claim -> settle -> refund. Resumable if interrupted. */
71
+ close(): Promise<CloseReceipt>;
72
+ }
73
+ /** Thrown by openBatchChannel when the buyer wallet lacks USDC for the deposit. */
74
+ declare class InsufficientBalanceError extends Error {
75
+ constructor(message: string);
76
+ }
77
+ /** Thrown when a network has no deployed x402BatchSettlement contract. */
78
+ declare class UnsupportedNetworkError extends Error {
79
+ constructor(message: string);
80
+ }
81
+
82
+ /**
83
+ * Opens a fresh batch-settlement escrow channel. No network call happens here:
84
+ * the channel is escrowed lazily on the FIRST `fetch`, where the upstream
85
+ * scheme signs an ERC-3009 deposit authorization (the facilitator pays the
86
+ * deposit gas — the buyer needs no native token, only USDC).
87
+ *
88
+ * The returned handle exposes accounting immediately (`deposited` from the
89
+ * `deposit` option, `spent` 0); `channelId` stays empty until the first fetch.
90
+ *
91
+ * @throws UnsupportedNetworkError when the network has no deployed contract.
92
+ * @throws Error when `deposit` is not a positive amount.
93
+ */
94
+ declare function openBatchChannel(options: OpenBatchChannelOptions): Promise<BatchSettlementChannel>;
95
+ /**
96
+ * Resumes an already-open batch-settlement channel — same buyer wallet, same
97
+ * network, no new deposit. The upstream scheme recovers channel state from the
98
+ * `store` (or, with an RPC, from on-chain) on the first `fetch`.
99
+ *
100
+ * Because no deposit is opened, the handle's accounting starts at zero and is
101
+ * corrected from the recovered channel context (its on-chain `balance`) once
102
+ * the first `fetch` resolves the channel; `channelId`, `fetch`, and `close`
103
+ * are fully functional throughout.
104
+ *
105
+ * @throws UnsupportedNetworkError when the network has no deployed contract.
106
+ */
107
+ declare function resumeBatchChannel(options: ResumeBatchChannelOptions): Promise<BatchSettlementChannel>;
108
+
109
+ /**
110
+ * File-backed ChannelStore for Node. This is the upstream FileClientChannelStorage,
111
+ * which persists each channel context as a JSON file under `{root}/client/`.
112
+ */
113
+ declare function createFileChannelStore(root: string): ChannelStore;
114
+ /**
115
+ * localStorage-backed ChannelStore for browsers. Channel contexts are stored
116
+ * under a prefixed key so they never collide with other localStorage entries.
117
+ * Implements the upstream ClientChannelStorage interface (get / set / delete).
118
+ */
119
+ declare function createLocalStorageChannelStore(storage: Storage): ChannelStore;
120
+ /**
121
+ * Returns the environment-appropriate default ChannelStore: localStorage in a
122
+ * browser, a file store at ~/.dexter-x402/channels in Node.
123
+ */
124
+ declare function getDefaultChannelStore(): ChannelStore;
125
+
126
+ export { type BatchSettlementChannel, type ChannelState, type ChannelStore, type CloseReceipt, InsufficientBalanceError, type OpenBatchChannelOptions, type ResumeBatchChannelOptions, UnsupportedNetworkError, createFileChannelStore, createLocalStorageChannelStore, getDefaultChannelStore, openBatchChannel, resumeBatchChannel };
@@ -0,0 +1,126 @@
1
+ import { ClientChannelStorage } from '@x402/evm/batch-settlement/client';
2
+ import { E as EvmWallet } from '../types-HFS_C6RX.js';
3
+ import '../types-Bcsi5jQb.js';
4
+
5
+ /**
6
+ * Channel persistence. This is the upstream `ClientChannelStorage` interface
7
+ * (`get` / `set` / `delete`, keyed by lowercased channelId). The SDK ships
8
+ * file-backed and localStorage-backed implementations; a consumer may pass any
9
+ * `ClientChannelStorage` (e.g. one backed by their own database).
10
+ */
11
+ type ChannelStore = ClientChannelStorage;
12
+ /** Channel accounting, all amounts USDC human units (e.g. "0.30"). */
13
+ interface ChannelState {
14
+ /** Total escrowed into the channel. */
15
+ deposited: string;
16
+ /** Cumulative amount spent via vouchers. */
17
+ spent: string;
18
+ /** deposited - spent. */
19
+ remaining: string;
20
+ }
21
+ /** Options for opening a fresh (or auto-resumed) channel. */
22
+ interface OpenBatchChannelOptions {
23
+ /** EVM wallet — any { address, signTypedData }. The same EvmWallet the exact scheme uses. */
24
+ wallet: EvmWallet;
25
+ /** CAIP-2 network: eip155:8453 (Base), eip155:42161 (Arbitrum), eip155:137 (Polygon). */
26
+ network: string;
27
+ /** Total escrow for the channel, USDC human units, e.g. "0.30". */
28
+ deposit: string;
29
+ /** Facilitator base URL. Default: https://x402.dexter.cash */
30
+ facilitatorUrl?: string;
31
+ /** RPC URL override. Default: per-network. */
32
+ rpcUrl?: string;
33
+ /** Channel persistence. Default: localStorage (browser) / file (Node). */
34
+ store?: ChannelStore;
35
+ }
36
+ /** Options for explicitly resuming an existing channel. */
37
+ interface ResumeBatchChannelOptions {
38
+ wallet: EvmWallet;
39
+ network: string;
40
+ facilitatorUrl?: string;
41
+ rpcUrl?: string;
42
+ store?: ChannelStore;
43
+ }
44
+ /** Result of channel.close() — the three settlement tx hashes and final amounts. */
45
+ interface CloseReceipt {
46
+ /** claimWithSignature tx hash. */
47
+ claimTx: string;
48
+ /** settle tx hash. */
49
+ settleTx: string;
50
+ /** refundWithSignature tx hash. */
51
+ refundTx: string;
52
+ /** Amount paid to the seller, USDC human units. */
53
+ settledAmount: string;
54
+ /** Unspent amount returned to the buyer, USDC human units. */
55
+ refundedAmount: string;
56
+ }
57
+ /**
58
+ * A live escrow channel. Returned by openBatchChannel / resumeBatchChannel.
59
+ * Hold this handle for the lifetime of a batching session.
60
+ */
61
+ interface BatchSettlementChannel {
62
+ /** On-chain channel id (bytes32 hex). Empty until the first fetch resolves it. */
63
+ readonly channelId: string;
64
+ /** CAIP-2 network. */
65
+ readonly network: string;
66
+ /** Live channel accounting; updated after each fetch. */
67
+ readonly state: ChannelState;
68
+ /** Drop-in fetch. On a batch-settlement 402, signs a voucher and retries. */
69
+ fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
70
+ /** Facilitator-driven claim -> settle -> refund. Resumable if interrupted. */
71
+ close(): Promise<CloseReceipt>;
72
+ }
73
+ /** Thrown by openBatchChannel when the buyer wallet lacks USDC for the deposit. */
74
+ declare class InsufficientBalanceError extends Error {
75
+ constructor(message: string);
76
+ }
77
+ /** Thrown when a network has no deployed x402BatchSettlement contract. */
78
+ declare class UnsupportedNetworkError extends Error {
79
+ constructor(message: string);
80
+ }
81
+
82
+ /**
83
+ * Opens a fresh batch-settlement escrow channel. No network call happens here:
84
+ * the channel is escrowed lazily on the FIRST `fetch`, where the upstream
85
+ * scheme signs an ERC-3009 deposit authorization (the facilitator pays the
86
+ * deposit gas — the buyer needs no native token, only USDC).
87
+ *
88
+ * The returned handle exposes accounting immediately (`deposited` from the
89
+ * `deposit` option, `spent` 0); `channelId` stays empty until the first fetch.
90
+ *
91
+ * @throws UnsupportedNetworkError when the network has no deployed contract.
92
+ * @throws Error when `deposit` is not a positive amount.
93
+ */
94
+ declare function openBatchChannel(options: OpenBatchChannelOptions): Promise<BatchSettlementChannel>;
95
+ /**
96
+ * Resumes an already-open batch-settlement channel — same buyer wallet, same
97
+ * network, no new deposit. The upstream scheme recovers channel state from the
98
+ * `store` (or, with an RPC, from on-chain) on the first `fetch`.
99
+ *
100
+ * Because no deposit is opened, the handle's accounting starts at zero and is
101
+ * corrected from the recovered channel context (its on-chain `balance`) once
102
+ * the first `fetch` resolves the channel; `channelId`, `fetch`, and `close`
103
+ * are fully functional throughout.
104
+ *
105
+ * @throws UnsupportedNetworkError when the network has no deployed contract.
106
+ */
107
+ declare function resumeBatchChannel(options: ResumeBatchChannelOptions): Promise<BatchSettlementChannel>;
108
+
109
+ /**
110
+ * File-backed ChannelStore for Node. This is the upstream FileClientChannelStorage,
111
+ * which persists each channel context as a JSON file under `{root}/client/`.
112
+ */
113
+ declare function createFileChannelStore(root: string): ChannelStore;
114
+ /**
115
+ * localStorage-backed ChannelStore for browsers. Channel contexts are stored
116
+ * under a prefixed key so they never collide with other localStorage entries.
117
+ * Implements the upstream ClientChannelStorage interface (get / set / delete).
118
+ */
119
+ declare function createLocalStorageChannelStore(storage: Storage): ChannelStore;
120
+ /**
121
+ * Returns the environment-appropriate default ChannelStore: localStorage in a
122
+ * browser, a file store at ~/.dexter-x402/channels in Node.
123
+ */
124
+ declare function getDefaultChannelStore(): ChannelStore;
125
+
126
+ export { type BatchSettlementChannel, type ChannelState, type ChannelStore, type CloseReceipt, InsufficientBalanceError, type OpenBatchChannelOptions, type ResumeBatchChannelOptions, UnsupportedNetworkError, createFileChannelStore, createLocalStorageChannelStore, getDefaultChannelStore, openBatchChannel, resumeBatchChannel };
@@ -0,0 +1 @@
1
+ import{createWalletClient as X,http as z,publicActions as G,parseUnits as K,formatUnits as k}from"viem";import{base as Q,arbitrum as V,polygon as Y}from"viem/chains";import{toClientEvmSigner as Z}from"@x402/evm";import{BatchSettlementEvmScheme as ee,getChannel as te}from"@x402/evm/batch-settlement/client";import{x402Client as ne,x402HTTPClient as re}from"@x402/core/client";import{homedir as _}from"os";import{join as q}from"path";import{FileClientChannelStorage as W}from"@x402/evm/batch-settlement/client";function I(e){return new W({directory:e})}var y="dexter-x402-channel:";function B(e){return{async get(t){let n=e.getItem(y+t);return n?JSON.parse(n):void 0},async set(t,n){e.setItem(y+t,JSON.stringify(n))},async delete(t){e.removeItem(y+t)}}}function g(){let e=globalThis.localStorage;return e?B(e):I(q(_(),".dexter-x402","channels"))}import{formatUnits as E}from"viem";import{HTTPFacilitatorClient as N}from"@x402/core/server";import{BatchSettlementEvmScheme as J}from"@x402/evm/batch-settlement/server";var P=6;async function T(e,t,n){let{claims:r,settle:i}=await e.claimAndSettle();if(r.length===0&&BigInt(n.settledAtomic)>0n)throw new Error(`batch-settlement close inconsistency: channel accounting expected a settled amount of ${n.settledAtomic} atomic units, but the facilitator's claimAndSettle reported no claim transaction (claims was empty)`);let c=(await e.refund([t]))[0];return{claimTx:r[0]?.transaction??"",settleTx:i?.transaction??"",refundTx:c?.transaction??"",settledAmount:E(BigInt(n.settledAtomic),P),refundedAmount:E(BigInt(n.refundedAtomic),P)}}function L(e,t,n){let r=new N({url:e});return new J(n).createChannelManager(r,t)}var x=class extends Error{constructor(t){super(t),this.name="InsufficientBalanceError"}},f=class extends Error{constructor(t){super(t),this.name="UnsupportedNetworkError"}};var O={"eip155:8453":{chain:Q,defaultRpc:"https://mainnet.base.org"},"eip155:42161":{chain:V,defaultRpc:"https://arb1.arbitrum.io/rpc"},"eip155:137":{chain:Y,defaultRpc:"https://polygon-rpc.com"}};function D(e){let t=O[e.network];if(!t)throw new f(`batch-settlement is not available on network "${e.network}" \u2014 supported: ${Object.keys(O).join(", ")}`);let n=e.rpcUrl??t.defaultRpc,r=e.wallet.signTypedData;if(typeof r!="function")throw new Error("batch-settlement requires an EvmWallet that supports signTypedData (EIP-712)");let i=X({account:{address:e.wallet.address,type:"json-rpc"},chain:t.chain,transport:z(n)}).extend(G),o=Object.assign(i,{address:e.wallet.address,signTypedData:a=>r.call(e.wallet,a)}),c=Z(o),l=new ee(c,{storage:e.store,depositPolicy:{depositMultiplier:4},depositStrategy:()=>e.depositAtomic}),s=new ne;s.register(e.network,l);let S=new re(s);return{scheme:l,x402Cli:s,httpClient:S,rpcUrl:n}}var C=6,$="https://x402.dexter.cash";function ae(e,t){let n=t>e?0n:e-t;return{deposited:k(e,C),spent:k(t,C),remaining:k(n,C)}}function oe(e){let t=e.payload;if(!t||typeof t!="object")return"";let n=t.voucher;if(!n||typeof n!="object")return"";let r=n.channelId;return typeof r=="string"?r:""}function M(e){let{stack:t,store:n,facilitatorUrl:r,network:i}=e,o="",c="",l=e.depositedAtomic,s=0n;async function S(){if(!o)return;let a=await te(n,o);a&&(a.chargedCumulativeAmount!==void 0&&(s=BigInt(a.chargedCumulativeAmount)),l===0n&&a.balance!==void 0&&(l=BigInt(a.balance)))}return{get channelId(){return o},get network(){return i},get state(){return ae(l,s)},async fetch(a,h){let{httpClient:p}=t,m=await fetch(a,h);if(m.status!==402)return m;let R=p.getPaymentRequiredResponse(d=>m.headers.get(d),await m.clone().json().catch(()=>{})),A=R.accepts?.[0];A?.payTo&&(c=A.payTo);let b=2,v;for(let d=1;d<=b;d+=1){let w=await p.createPaymentPayload(R),U=oe(w);U&&(o=U);let j=p.encodePaymentSignatureHeader(w),u=await fetch(a,{...h,headers:{...h?.headers??{},...j}});v=u;let{recovered:F}=await p.processPaymentResult(w,H=>u.headers.get(H),u.status);if(await S(),!(u.status===402&&F&&d<b))return u}return v},async close(){if(!o)throw new Error("cannot close a channel that has made no requests \u2014 call fetch() at least once first");if(!c)throw new Error("cannot close: the seller payout address is unknown (no 402 was observed)");let a=s.toString(),h=(s>l?0n:l-s).toString(),p=L(r,i,c),m=await T(p,o,{settledAtomic:a,refundedAtomic:h});return await n.delete(o.toLowerCase()),m}}}async function ie(e){let t=e.store??g(),n=e.facilitatorUrl??$,r;try{r=K(e.deposit,C)}catch{throw new Error(`deposit must be a valid USDC amount in decimal units (e.g. "0.30"), got "${e.deposit}"`)}if(r<=0n)throw new Error(`deposit must be a positive amount, got "${e.deposit}"`);let i=D({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:r.toString()});return M({stack:i,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:r})}async function se(e){let t=e.store??g(),n=e.facilitatorUrl??$,r=D({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:"0"});return M({stack:r,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:0n})}export{x as InsufficientBalanceError,f as UnsupportedNetworkError,I as createFileChannelStore,B as createLocalStorageChannelStore,g as getDefaultChannelStore,ie as openBatchChannel,se as resumeBatchChannel};