@serve.zone/coremail 1.0.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.
Files changed (75) hide show
  1. package/.smartconfig.json +50 -0
  2. package/changelog.md +10 -0
  3. package/cli.js +4 -0
  4. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts/00_commitinfo_data.js +9 -0
  6. package/dist_ts/classes.auth.d.ts +45 -0
  7. package/dist_ts/classes.auth.js +204 -0
  8. package/dist_ts/classes.config.d.ts +2 -0
  9. package/dist_ts/classes.config.js +72 -0
  10. package/dist_ts/classes.coremail.d.ts +41 -0
  11. package/dist_ts/classes.coremail.js +155 -0
  12. package/dist_ts/classes.desiredstate.d.ts +40 -0
  13. package/dist_ts/classes.desiredstate.js +382 -0
  14. package/dist_ts/classes.gateway.d.ts +62 -0
  15. package/dist_ts/classes.gateway.js +669 -0
  16. package/dist_ts/classes.inbound.d.ts +49 -0
  17. package/dist_ts/classes.inbound.js +702 -0
  18. package/dist_ts/classes.maintenance.d.ts +16 -0
  19. package/dist_ts/classes.maintenance.js +339 -0
  20. package/dist_ts/classes.models.d.ts +161 -0
  21. package/dist_ts/classes.models.js +595 -0
  22. package/dist_ts/classes.server.d.ts +40 -0
  23. package/dist_ts/classes.server.js +309 -0
  24. package/dist_ts/classes.storage.d.ts +32 -0
  25. package/dist_ts/classes.storage.js +317 -0
  26. package/dist_ts/classes.submissions.d.ts +33 -0
  27. package/dist_ts/classes.submissions.js +385 -0
  28. package/dist_ts/classes.transfer.d.ts +41 -0
  29. package/dist_ts/classes.transfer.js +289 -0
  30. package/dist_ts/coremail.cursor.d.ts +20 -0
  31. package/dist_ts/coremail.cursor.js +191 -0
  32. package/dist_ts/coremail.log.d.ts +3 -0
  33. package/dist_ts/coremail.log.js +11 -0
  34. package/dist_ts/coremail.mime.d.ts +8 -0
  35. package/dist_ts/coremail.mime.js +63 -0
  36. package/dist_ts/coremail.persistence.d.ts +148 -0
  37. package/dist_ts/coremail.persistence.js +695 -0
  38. package/dist_ts/coremail.quota.d.ts +29 -0
  39. package/dist_ts/coremail.quota.js +149 -0
  40. package/dist_ts/coremail.selectors.d.ts +3 -0
  41. package/dist_ts/coremail.selectors.js +21 -0
  42. package/dist_ts/coremail.validation.d.ts +9 -0
  43. package/dist_ts/coremail.validation.js +325 -0
  44. package/dist_ts/index.d.ts +4 -0
  45. package/dist_ts/index.js +39 -0
  46. package/dist_ts/interfaces.d.ts +92 -0
  47. package/dist_ts/interfaces.js +2 -0
  48. package/dist_ts/plugins.d.ts +11 -0
  49. package/dist_ts/plugins.js +12 -0
  50. package/license.md +19 -0
  51. package/package.json +48 -0
  52. package/readme.md +199 -0
  53. package/ts/00_commitinfo_data.ts +8 -0
  54. package/ts/classes.auth.ts +321 -0
  55. package/ts/classes.config.ts +104 -0
  56. package/ts/classes.coremail.ts +249 -0
  57. package/ts/classes.desiredstate.ts +508 -0
  58. package/ts/classes.gateway.ts +811 -0
  59. package/ts/classes.inbound.ts +898 -0
  60. package/ts/classes.maintenance.ts +335 -0
  61. package/ts/classes.models.ts +530 -0
  62. package/ts/classes.server.ts +444 -0
  63. package/ts/classes.storage.ts +448 -0
  64. package/ts/classes.submissions.ts +554 -0
  65. package/ts/classes.transfer.ts +379 -0
  66. package/ts/coremail.cursor.ts +328 -0
  67. package/ts/coremail.log.ts +21 -0
  68. package/ts/coremail.mime.ts +94 -0
  69. package/ts/coremail.persistence.ts +1156 -0
  70. package/ts/coremail.quota.ts +214 -0
  71. package/ts/coremail.selectors.ts +35 -0
  72. package/ts/coremail.validation.ts +446 -0
  73. package/ts/index.ts +38 -0
  74. package/ts/interfaces.ts +109 -0
  75. package/ts/plugins.ts +11 -0
@@ -0,0 +1,309 @@
1
+ import * as plugins from './plugins.js';
2
+ import { CoreMailAuthenticationError, CoreMailAuthorizationError, CoreMailCapabilityDeniedError, CoreMailAuth, coreMailPreAuthDeadlineKey, coreMailSessionKey, } from './classes.auth.js';
3
+ import { CoreMailQuotaExceededError } from './coremail.quota.js';
4
+ const privacySafeError = (errorArg) => {
5
+ let code = 'INVALID_REQUEST';
6
+ let retryable = false;
7
+ if (errorArg instanceof CoreMailAuthenticationError) {
8
+ code = 'AUTHENTICATION_FAILED';
9
+ }
10
+ else if (errorArg instanceof CoreMailCapabilityDeniedError) {
11
+ code = 'CAPABILITY_DENIED';
12
+ }
13
+ else if (errorArg instanceof CoreMailAuthorizationError) {
14
+ code = 'AUTHORITY_REVOKED';
15
+ }
16
+ else if (errorArg instanceof CoreMailQuotaExceededError) {
17
+ return new plugins.typedrequest.TypedResponseError('CoreMail request rejected.', {
18
+ code: 'QUOTA_EXCEEDED',
19
+ retryable: true,
20
+ ...(errorArg.retryAfterMs === undefined
21
+ ? {}
22
+ : { retryAfterMs: errorArg.retryAfterMs }),
23
+ });
24
+ }
25
+ else if (errorArg instanceof Error
26
+ && errorArg.message.includes('gateway')
27
+ && errorArg.message.includes('unavailable')) {
28
+ code = 'GATEWAY_UNAVAILABLE';
29
+ retryable = true;
30
+ }
31
+ else if (errorArg instanceof Error
32
+ && errorArg.message.includes('idempotency')) {
33
+ code = 'IDEMPOTENCY_CONFLICT';
34
+ }
35
+ else if (errorArg instanceof Error
36
+ && errorArg.message.includes('fence')) {
37
+ code = 'STATE_CONFLICT';
38
+ retryable = true;
39
+ }
40
+ else if (errorArg instanceof Error
41
+ && (errorArg.message.includes('byte budget')
42
+ || errorArg.message.includes('content budget')
43
+ || errorArg.message.includes('exceeds'))) {
44
+ code = 'PAYLOAD_LIMIT_EXCEEDED';
45
+ }
46
+ return new plugins.typedrequest.TypedResponseError('CoreMail request rejected.', {
47
+ code,
48
+ retryable,
49
+ });
50
+ };
51
+ const asPeer = (toolsArg) => {
52
+ const peer = toolsArg?.localData?.peer;
53
+ if (!peer
54
+ || typeof peer.id !== 'string'
55
+ || !(peer.data instanceof Map)
56
+ || typeof peer.close !== 'function'
57
+ || typeof peer.terminate !== 'function') {
58
+ throw new CoreMailAuthenticationError();
59
+ }
60
+ return peer;
61
+ };
62
+ export const countCoreMailActiveSessions = (sessionsArg, bindingArg, configEpochArg) => {
63
+ const counts = new Map();
64
+ for (const session of sessionsArg) {
65
+ if (session?.kind === 'workload'
66
+ && session.tenantId === bindingArg.tenantId
67
+ && session.serviceId === bindingArg.serviceId
68
+ && session.bindingId === bindingArg.bindingId
69
+ && session.bindingRevision === bindingArg.revision
70
+ && session.configEpoch === configEpochArg) {
71
+ const key = `${session.credentialId}\u0000${session.credentialVersion}`;
72
+ const count = counts.get(key);
73
+ counts.set(key, count
74
+ ? { ...count, count: count.count + 1 }
75
+ : {
76
+ credentialId: session.credentialId,
77
+ version: session.credentialVersion,
78
+ count: 1,
79
+ });
80
+ }
81
+ }
82
+ return [...counts.values()].sort((leftArg, rightArg) => leftArg.version - rightArg.version
83
+ || leftArg.credentialId.localeCompare(rightArg.credentialId));
84
+ };
85
+ export class CoreMailServer {
86
+ config;
87
+ database;
88
+ storage;
89
+ transfers;
90
+ desiredState;
91
+ auth;
92
+ submissions;
93
+ inbound;
94
+ gateway;
95
+ now;
96
+ router = new plugins.typedrequest.TypedRouter();
97
+ typedServer;
98
+ preAuthSweepTimer = null;
99
+ constructor(config, database, storage, transfers, desiredState, auth, submissions, inbound, gateway, now = Date.now) {
100
+ this.config = config;
101
+ this.database = database;
102
+ this.storage = storage;
103
+ this.transfers = transfers;
104
+ this.desiredState = desiredState;
105
+ this.auth = auth;
106
+ this.submissions = submissions;
107
+ this.inbound = inbound;
108
+ this.gateway = gateway;
109
+ this.now = now;
110
+ this.registerHandlers();
111
+ this.typedServer = new plugins.typedserver.TypedServer({
112
+ port: config.port,
113
+ cors: false,
114
+ authorityValidation: 'strict',
115
+ connectionTimeout: 15_000,
116
+ headersTimeout: 10_000,
117
+ requestTimeout: 2 * 60_000,
118
+ websocketMaxPayloadBytes: plugins.serveZoneInterfaces.data.coreMailLimits.controlMessageBytes,
119
+ healthzEndpoint: false,
120
+ noCache: true,
121
+ compression: false,
122
+ surfaces: [{
123
+ name: 'coremail',
124
+ match: {
125
+ hostnames: config.hostnames,
126
+ pathPrefixes: ['/'],
127
+ websocketPathPrefixes: ['/socket'],
128
+ },
129
+ typedRequestPath: false,
130
+ websocketTypedRouter: this.router,
131
+ cors: false,
132
+ noCache: true,
133
+ includeBuiltinTypedHandlers: false,
134
+ websocketAdmission: (contextArg) => {
135
+ if (contextArg.path !== '/socket') {
136
+ return new Response('Not Found', { status: 404 });
137
+ }
138
+ contextArg.state[coreMailPreAuthDeadlineKey] = this.now() + 5_000;
139
+ return true;
140
+ },
141
+ httpHandler: async (contextArg) => {
142
+ const transferResponse = await this.transfers.handleHttp(contextArg);
143
+ if (transferResponse) {
144
+ return transferResponse;
145
+ }
146
+ if ((contextArg.method === 'GET' || contextArg.method === 'HEAD')
147
+ && contextArg.path === '/live') {
148
+ return new Response(contextArg.method === 'HEAD' ? null : JSON.stringify({ live: true }), {
149
+ status: 200,
150
+ headers: {
151
+ 'Content-Type': 'application/json',
152
+ 'Cache-Control': 'no-store',
153
+ },
154
+ });
155
+ }
156
+ if ((contextArg.method === 'GET' || contextArg.method === 'HEAD')
157
+ && contextArg.path === '/ready') {
158
+ const readiness = await this.getReadiness();
159
+ const ready = Object.values(readiness).every(Boolean);
160
+ return new Response(contextArg.method === 'HEAD' ? null : JSON.stringify(readiness), {
161
+ status: ready ? 200 : 503,
162
+ headers: {
163
+ 'Content-Type': 'application/json',
164
+ 'Cache-Control': 'no-store',
165
+ },
166
+ });
167
+ }
168
+ return null;
169
+ },
170
+ securityHeaders: {
171
+ xFrameOptions: 'DENY',
172
+ xContentTypeOptions: true,
173
+ referrerPolicy: 'no-referrer',
174
+ permissionsPolicy: {},
175
+ crossOriginOpenerPolicy: 'same-origin',
176
+ crossOriginResourcePolicy: 'same-origin',
177
+ },
178
+ }],
179
+ });
180
+ }
181
+ async start() {
182
+ await this.typedServer.start();
183
+ this.preAuthSweepTimer = setInterval(() => {
184
+ const now = this.now();
185
+ for (const peer of this.typedServer.smartServe.getWebSocketConnections()) {
186
+ const deadline = Number(peer.context.state[coreMailPreAuthDeadlineKey]);
187
+ if (!peer.data.has(coreMailSessionKey)
188
+ && (!Number.isSafeInteger(deadline) || deadline < now)) {
189
+ peer.terminate();
190
+ }
191
+ }
192
+ }, 250);
193
+ this.preAuthSweepTimer.unref?.();
194
+ }
195
+ async stop() {
196
+ if (this.preAuthSweepTimer) {
197
+ clearInterval(this.preAuthSweepTimer);
198
+ this.preAuthSweepTimer = null;
199
+ }
200
+ await this.typedServer.stop();
201
+ }
202
+ activeSessionCounts(bindingArg, configEpochArg) {
203
+ if (!this.typedServer.smartServe) {
204
+ return [];
205
+ }
206
+ return countCoreMailActiveSessions(this.typedServer.smartServe.getWebSocketConnections().map((peerArg) => peerArg.data.get(coreMailSessionKey)), bindingArg, configEpochArg);
207
+ }
208
+ async getReadiness() {
209
+ const [database, objectStorage, desiredState] = await Promise.all([
210
+ this.database.checkReadiness({ timeoutMs: 1_500 })
211
+ .then((resultArg) => resultArg.ready)
212
+ .catch(() => false),
213
+ this.storage.checkReadiness().catch(() => false),
214
+ this.desiredState.getActiveDesiredState().catch(() => null),
215
+ ]);
216
+ return {
217
+ live: true,
218
+ database,
219
+ objectStorage,
220
+ exactUpload: objectStorage,
221
+ exactPurge: objectStorage,
222
+ controlBootstrap: true,
223
+ gateway: Boolean(desiredState) && this.gateway.isReady(),
224
+ };
225
+ }
226
+ registerHandlers() {
227
+ this.addHandler('coreMailAuthenticateControl', async (requestArg, toolsArg) => {
228
+ const peer = asPeer(toolsArg);
229
+ const session = await this.auth.authenticateControl(peer, requestArg);
230
+ return {
231
+ authenticated: true,
232
+ credentialId: session.credentialId,
233
+ replica: { ...this.config.replica },
234
+ credentialVersion: session.credentialVersion,
235
+ };
236
+ });
237
+ this.addHandler('coreMailAuthenticateWorkload', async (requestArg, toolsArg) => {
238
+ const session = await this.auth.authenticateWorkload(asPeer(toolsArg), requestArg);
239
+ return {
240
+ authenticated: true,
241
+ credentialId: session.credentialId,
242
+ credentialVersion: session.credentialVersion,
243
+ bindingState: session.bindingState,
244
+ capabilities: [...session.capabilities],
245
+ allowedOperations: [...session.allowedOperations],
246
+ coreMailTransferOrigin: session.coreMailTransferOrigin,
247
+ };
248
+ });
249
+ this.addHandler('coreMailPrepareDesiredStateUpload', async (requestArg, toolsArg) => {
250
+ this.auth.requireControlSession(asPeer(toolsArg));
251
+ return await this.desiredState.prepare(requestArg);
252
+ });
253
+ this.addHandler('coreMailApplyDesiredState', async (requestArg, toolsArg) => {
254
+ this.auth.requireControlSession(asPeer(toolsArg));
255
+ return { status: await this.desiredState.apply(requestArg) };
256
+ });
257
+ this.addHandler('coreMailGetReconciliationStatus', async (requestArg, toolsArg) => {
258
+ this.auth.requireControlSession(asPeer(toolsArg));
259
+ return { status: await this.desiredState.getStatus(requestArg) };
260
+ });
261
+ this.addHandler('coreMailPrepareOutboundSubmission', async (requestArg, toolsArg) => {
262
+ const { session, binding } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailPrepareOutboundSubmission');
263
+ return await this.submissions.prepare(session, binding, requestArg);
264
+ });
265
+ this.addHandler('coreMailPrepareOutboundPartUpload', async (requestArg, toolsArg) => {
266
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailPrepareOutboundPartUpload');
267
+ return await this.submissions.preparePartUpload(session, requestArg);
268
+ });
269
+ this.addHandler('coreMailCompleteOutboundPartUpload', async (requestArg, toolsArg) => {
270
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailCompleteOutboundPartUpload');
271
+ return await this.submissions.completePartUpload(session, requestArg);
272
+ });
273
+ this.addHandler('coreMailFinalizeOutboundSubmission', async (requestArg, toolsArg) => {
274
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailFinalizeOutboundSubmission');
275
+ return await this.submissions.finalize(session, requestArg);
276
+ });
277
+ this.addHandler('coreMailGetOutboundSubmission', async (requestArg, toolsArg) => {
278
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailGetOutboundSubmission');
279
+ return await this.submissions.get(session, requestArg);
280
+ });
281
+ this.addHandler('coreMailListInboundDeliveries', async (requestArg, toolsArg) => {
282
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailListInboundDeliveries');
283
+ return await this.inbound.listDeliveries(session, requestArg);
284
+ });
285
+ this.addHandler('coreMailPrepareInboundFetch', async (requestArg, toolsArg) => {
286
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailPrepareInboundFetch');
287
+ return await this.inbound.prepareFetch(session, requestArg);
288
+ });
289
+ this.addHandler('coreMailCompleteInboundFetch', async (requestArg, toolsArg) => {
290
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailCompleteInboundFetch');
291
+ return await this.inbound.completeFetch(session, requestArg);
292
+ });
293
+ this.addHandler('coreMailAcknowledgeInboundDelivery', async (requestArg, toolsArg) => {
294
+ const { session } = await this.auth.requireWorkloadSession(asPeer(toolsArg), 'coreMailAcknowledgeInboundDelivery');
295
+ return await this.inbound.acknowledge(session, requestArg);
296
+ });
297
+ }
298
+ addHandler(methodArg, handlerArg) {
299
+ this.router.addTypedHandler(new plugins.typedrequest.TypedHandler(methodArg, async (requestArg, toolsArg) => {
300
+ try {
301
+ return await handlerArg(requestArg, toolsArg);
302
+ }
303
+ catch (error) {
304
+ throw privacySafeError(error);
305
+ }
306
+ }));
307
+ }
308
+ }
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0IsWUFBWSxFQUNaLDBCQUEwQixFQUMxQixrQkFBa0IsR0FDbkIsTUFBTSxtQkFBbUIsQ0FBQztBQWEzQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVFqRSxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLFFBQWlCLEVBQ3dCLEVBQUU7SUFDM0MsSUFBSSxJQUFJLEdBQWUsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksUUFBUSxZQUFZLDJCQUEyQixFQUFFLENBQUM7UUFDcEQsSUFBSSxHQUFHLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7U0FBTSxJQUFJLFFBQVEsWUFBWSw2QkFBNkIsRUFBRSxDQUFDO1FBQzdELElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO1NBQU0sSUFBSSxRQUFRLFlBQVksMEJBQTBCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztTQUFNLElBQUksUUFBUSxZQUFZLDBCQUEwQixFQUFFLENBQUM7UUFDMUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLEVBQUU7WUFDL0UsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixTQUFTLEVBQUUsSUFBSTtZQUNmLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVM7Z0JBQ3JDLENBQUMsQ0FBQyxFQUFFO2dCQUNKLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDaUIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7U0FBTSxJQUNMLFFBQVEsWUFBWSxLQUFLO1dBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztXQUNwQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDM0MsQ0FBQztRQUNELElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUM3QixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7U0FBTSxJQUNMLFFBQVEsWUFBWSxLQUFLO1dBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUMzQyxDQUFDO1FBQ0QsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7U0FBTSxJQUNMLFFBQVEsWUFBWSxLQUFLO1dBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUNyQyxDQUFDO1FBQ0QsSUFBSSxHQUFHLGdCQUFnQixDQUFDO1FBQ3hCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztTQUFNLElBQ0wsUUFBUSxZQUFZLEtBQUs7V0FDdEIsQ0FDRCxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7ZUFDckMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7ZUFDM0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQ3hDLEVBQ0QsQ0FBQztRQUNELElBQUksR0FBRyx3QkFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLEVBQUU7UUFDL0UsSUFBSTtRQUNKLFNBQVM7S0FDb0QsQ0FBQyxDQUFDO0FBQ25FLENBQUMsQ0FBQztBQUVGLE1BQU0sTUFBTSxHQUFHLENBQ2IsUUFBeUMsRUFDMUIsRUFBRTtJQUNqQixNQUFNLElBQUksR0FBRyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQWlDLENBQUM7SUFDcEUsSUFDRSxDQUFDLElBQUk7V0FDRixPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUTtXQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxHQUFHLENBQUM7V0FDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFVBQVU7V0FDaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFDdkMsQ0FBQztRQUNELE1BQU0sSUFBSSwyQkFBMkIsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLFdBQTJELEVBQzNELFVBQXlFLEVBQ3pFLGNBQXNCLEVBQzJDLEVBQUU7SUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBR25CLENBQUM7SUFDSixLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQ0UsT0FBTyxFQUFFLElBQUksS0FBSyxVQUFVO2VBQ3pCLE9BQU8sQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLFFBQVE7ZUFDeEMsT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsU0FBUztlQUMxQyxPQUFPLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxTQUFTO2VBQzFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssVUFBVSxDQUFDLFFBQVE7ZUFDL0MsT0FBTyxDQUFDLFdBQVcsS0FBSyxjQUFjLEVBQ3pDLENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxZQUFZLFNBQVMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDeEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLO2dCQUNuQixDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLENBQUMsQ0FBQztvQkFDRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0JBQ2xDLE9BQU8sRUFBRSxPQUFPLENBQUMsaUJBQWlCO29CQUNsQyxLQUFLLEVBQUUsQ0FBQztpQkFDVCxDQUFDLENBQUM7UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyRCxPQUFPLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPO1dBQy9CLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FDN0QsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxjQUFjO0lBUU47SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFoQkgsTUFBTSxHQUVsQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsV0FBVyxDQUFrQztJQUNyRCxpQkFBaUIsR0FBMEMsSUFBSSxDQUFDO0lBRXhFLFlBQ21CLE1BQXVCLEVBQ3ZCLFFBQXVDLEVBQ3ZDLE9BQXdCLEVBQ3hCLFNBQWtDLEVBQ2xDLFlBQXlDLEVBQ3pDLElBQWtCLEVBQ2xCLFdBQXNDLEVBQ3RDLE9BQStCLEVBQy9CLE9BQXdCLEVBQ3hCLE1BQW9CLElBQUksQ0FBQyxHQUFHO1FBVDVCLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLGFBQVEsR0FBUixRQUFRLENBQStCO1FBQ3ZDLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQXlCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUE2QjtRQUN6QyxTQUFJLEdBQUosSUFBSSxDQUFjO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUEyQjtRQUN0QyxZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQUMvQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUF5QjtRQUU3QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDckQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLElBQUksRUFBRSxLQUFLO1lBQ1gsbUJBQW1CLEVBQUUsUUFBUTtZQUM3QixpQkFBaUIsRUFBRSxNQUFNO1lBQ3pCLGNBQWMsRUFBRSxNQUFNO1lBQ3RCLGNBQWMsRUFBRSxDQUFDLEdBQUcsTUFBTTtZQUMxQix3QkFBd0IsRUFDdEIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CO1lBQ3JFLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsV0FBVyxFQUFFLEtBQUs7WUFDbEIsUUFBUSxFQUFFLENBQUM7b0JBQ1QsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLEtBQUssRUFBRTt3QkFDTCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7d0JBQzNCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQzt3QkFDbkIscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLENBQUM7cUJBQ25DO29CQUNELGdCQUFnQixFQUFFLEtBQUs7b0JBQ3ZCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNqQyxJQUFJLEVBQUUsS0FBSztvQkFDWCxPQUFPLEVBQUUsSUFBSTtvQkFDYiwyQkFBMkIsRUFBRSxLQUFLO29CQUNsQyxrQkFBa0IsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO3dCQUNqQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7NEJBQ2xDLE9BQU8sSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7d0JBQ3BELENBQUM7d0JBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7d0JBQ2xFLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsV0FBVyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTt3QkFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUNyRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7NEJBQ3JCLE9BQU8sZ0JBQWdCLENBQUM7d0JBQzFCLENBQUM7d0JBQ0QsSUFDRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDOytCQUMxRCxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFDOUIsQ0FBQzs0QkFDRCxPQUFPLElBQUksUUFBUSxDQUNqQixVQUFVLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ3BFO2dDQUNFLE1BQU0sRUFBRSxHQUFHO2dDQUNYLE9BQU8sRUFBRTtvQ0FDUCxjQUFjLEVBQUUsa0JBQWtCO29DQUNsQyxlQUFlLEVBQUUsVUFBVTtpQ0FDNUI7NkJBQ0YsQ0FDRixDQUFDO3dCQUNKLENBQUM7d0JBQ0QsSUFDRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDOytCQUMxRCxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFDL0IsQ0FBQzs0QkFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3RELE9BQU8sSUFBSSxRQUFRLENBQ2pCLFVBQVUsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQy9EO2dDQUNFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRztnQ0FDekIsT0FBTyxFQUFFO29DQUNQLGNBQWMsRUFBRSxrQkFBa0I7b0NBQ2xDLGVBQWUsRUFBRSxVQUFVO2lDQUM1Qjs2QkFDRixDQUNGLENBQUM7d0JBQ0osQ0FBQzt3QkFDRCxPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDO29CQUNELGVBQWUsRUFBRTt3QkFDZixhQUFhLEVBQUUsTUFBTTt3QkFDckIsbUJBQW1CLEVBQUUsSUFBSTt3QkFDekIsY0FBYyxFQUFFLGFBQWE7d0JBQzdCLGlCQUFpQixFQUFFLEVBQUU7d0JBQ3JCLHVCQUF1QixFQUFFLGFBQWE7d0JBQ3RDLHlCQUF5QixFQUFFLGFBQWE7cUJBQ3pDO2lCQUNGLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQztnQkFDekUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztnQkFDeEUsSUFDRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO3VCQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLEVBQ3RELENBQUM7b0JBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU0sbUJBQW1CLENBQ3hCLFVBQXlFLEVBQ3pFLGNBQXNCO1FBRXRCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sMkJBQTJCLENBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDcEUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQXlDLENBQzdFLEVBQ0QsVUFBVSxFQUNWLGNBQWMsQ0FDZixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztpQkFDL0MsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2lCQUNwQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRO1lBQ1IsYUFBYTtZQUNiLFdBQVcsRUFBRSxhQUFhO1lBQzFCLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtTQUN6RCxDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsVUFBVSxDQUViLDZCQUE2QixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEUsT0FBTztnQkFDTCxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNuQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO2FBQzdDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsOEJBQThCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ25GLE9BQU87Z0JBQ0wsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDbEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtnQkFDNUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2pELHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxzQkFBc0I7YUFDdkQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FFYixtQ0FBbUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEQsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FFYiwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUViLGlDQUFpQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsbUNBQW1DLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNwRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FDakUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUNoQixtQ0FBbUMsQ0FDcEMsQ0FBQztZQUNGLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FFYixtQ0FBbUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3BFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQ3hELE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFDaEIsbUNBQW1DLENBQ3BDLENBQUM7WUFDRixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUViLG9DQUFvQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDckUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FDeEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUNoQixvQ0FBb0MsQ0FDckMsQ0FBQztZQUNGLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsb0NBQW9DLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNyRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLG9DQUFvQyxDQUNyQyxDQUFDO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsK0JBQStCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNoRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLCtCQUErQixDQUNoQyxDQUFDO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsK0JBQStCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNoRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLCtCQUErQixDQUNoQyxDQUFDO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsNkJBQTZCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUM5RCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLDZCQUE2QixDQUM5QixDQUFDO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsOEJBQThCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMvRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLDhCQUE4QixDQUMvQixDQUFDO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBRWIsb0NBQW9DLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNyRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLG9DQUFvQyxDQUNyQyxDQUFDO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVLENBR2hCLFNBQTZCLEVBQzdCLFVBR2tDO1FBRWxDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQy9ELFNBQVMsRUFDVCxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIn0=
@@ -0,0 +1,32 @@
1
+ import * as plugins from './plugins.js';
2
+ type TCoreMailSha256 = plugins.serveZoneInterfaces.data.TCoreMailSha256;
3
+ export declare class CoreMailStorage {
4
+ readonly bucketName: string;
5
+ readonly smartBucket: plugins.smartbucket.SmartBucket;
6
+ bucket: plugins.smartbucket.Bucket;
7
+ private exactUploadCapability?;
8
+ private exactPurgeCapability?;
9
+ constructor(storageDescriptorArg: Record<string, unknown>, bucketName: string);
10
+ start(): Promise<void>;
11
+ checkReadiness(): Promise<boolean>;
12
+ stop(): Promise<void>;
13
+ purgeExact(objectKeyArg: string, signalArg?: AbortSignal): Promise<void>;
14
+ putExact(objectKeyArg: string, streamArg: ReadableStream<Uint8Array>, lengthBytesArg: number, sha256Arg: TCoreMailSha256, contentTypeArg: string, maximumBytesArg: number, signalArg?: AbortSignal): Promise<void>;
15
+ putBytesExact(objectKeyArg: string, bytesArg: Uint8Array, contentTypeArg: string, maximumBytesArg: number, signalArg?: AbortSignal): Promise<{
16
+ lengthBytes: number;
17
+ sha256: TCoreMailSha256;
18
+ }>;
19
+ getVerifiedStream(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number, signalArg?: AbortSignal): Promise<{
20
+ stream: ReadableStream<Uint8Array>;
21
+ completion: Promise<{
22
+ lengthBytes: number;
23
+ sha256: TCoreMailSha256;
24
+ }>;
25
+ cancel: (reasonArg?: unknown) => Promise<void>;
26
+ }>;
27
+ getVerifiedBytes(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number): Promise<Uint8Array>;
28
+ verifyObject(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number, signalArg?: AbortSignal): Promise<void>;
29
+ }
30
+ export declare const createSha256: (valueArg: Uint8Array | string) => TCoreMailSha256;
31
+ export declare const createOpaqueToken: () => string;
32
+ export {};