@serve.zone/interfaces 10.1.0 → 11.1.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.
@@ -0,0 +1,1299 @@
1
+ /** Operations carried by a short-lived, single-operation restore grant. */
2
+ export const isolatedRestoreGrantOperations = Object.freeze([
3
+ 'prepare',
4
+ 'write-object',
5
+ 'execute',
6
+ 'cleanup',
7
+ 'status',
8
+ ]);
9
+ /**
10
+ * Versioned limits shared by signers, relays, and Corestore.
11
+ *
12
+ * V1 uses an inline descriptor manifest inside a 1 MiB control request. Its
13
+ * 4,096 object slots reserve 256 entries for config, snapshots, keys, and
14
+ * index segments; the remaining 3,840 slots fit 1,920 default 8 MiB pack/index
15
+ * pairs. The 15 GiB total envelope is therefore reachable with the default
16
+ * ContainerArchive packing profile instead of advertising impossible capacity.
17
+ */
18
+ export const isolatedRestoreContractLimits = Object.freeze({
19
+ version: 1,
20
+ maximumControlJsonBytes: 1024 * 1024,
21
+ maximumRestoreGrantBytes: 64 * 1024,
22
+ maximumConfiguredStringBytes: 2048,
23
+ maximumPathBytes: 4096,
24
+ maximumResourceMappings: 256,
25
+ maximumArchiveObjects: 4096,
26
+ reservedArchiveMetadataObjects: 256,
27
+ defaultContainerArchivePackTargetBytes: 8 * 1024 * 1024,
28
+ maximumArchiveObjectBytes: 64 * 1024 * 1024,
29
+ maximumArchiveTotalBytes: 15 * 1024 * 1024 * 1024,
30
+ maximumWriteChunkBytes: 512 * 1024,
31
+ maximumWriteChunkBase64Characters: 699_052,
32
+ maximumObjectChunks: 4096,
33
+ });
34
+ /** ContainerArchive v1 paths that may be replicated into restore staging. */
35
+ export const isolatedRestoreRepositoryPathProfile = Object.freeze({
36
+ version: 1,
37
+ rootObject: 'config.json',
38
+ topLevelDirectories: Object.freeze([
39
+ 'packs',
40
+ 'snapshots',
41
+ 'index',
42
+ 'keys',
43
+ ]),
44
+ temporaryFilesAllowed: false,
45
+ ancestorConflictsAllowed: false,
46
+ });
47
+ export class IsolatedRestoreContractError extends Error {
48
+ constructor(reasonArg) {
49
+ super(`isolated restore contract error: ${reasonArg}`);
50
+ this.name = 'IsolatedRestoreContractError';
51
+ }
52
+ }
53
+ /** Cross-runtime rules for restore authority digests. */
54
+ export const isolatedRestoreCanonicalJsonRules = Object.freeze({
55
+ version: 1,
56
+ encoding: 'utf-8',
57
+ objectKeyOrdering: 'utf-16-code-unit-ascending',
58
+ arrayOrdering: 'preserved-dense',
59
+ unicodeNormalization: 'preserved',
60
+ numberEncoding: 'safe-integer-json-no-negative-zero',
61
+ digest: 'sha256-lowercase-hex',
62
+ });
63
+ const canonicalIdentifierPattern = /^[A-Za-z0-9][A-Za-z0-9._:@-]{0,255}$/;
64
+ const canonicalScopedIdPattern = /^[A-Za-z0-9][A-Za-z0-9_.:-]{0,191}$/;
65
+ const canonicalVolumeNamePattern = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
66
+ const canonicalResourceNamePattern = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
67
+ const canonicalDatabaseNamePattern = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
68
+ const canonicalBucketNamePattern = /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/;
69
+ const canonicalIpv4SegmentPattern = /^(?:0|[1-9][0-9]{0,2})$/;
70
+ const canonicalSha256Pattern = /^[a-f0-9]{64}$/;
71
+ const standardBase64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
72
+ const base64UrlAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
73
+ const fail = (reasonArg) => {
74
+ throw new IsolatedRestoreContractError(reasonArg);
75
+ };
76
+ const utf8ByteLength = (valueArg) => {
77
+ return new TextEncoder().encode(valueArg).byteLength;
78
+ };
79
+ /**
80
+ * Enforces the raw HTTP ingress limit before buffering or JSON parsing.
81
+ * Apply it to Content-Length and to the running byte count after every chunk.
82
+ */
83
+ export const assertIsolatedRestoreControlIngressByteLength = (byteLengthArg) => {
84
+ if (typeof byteLengthArg !== 'number' ||
85
+ !Number.isSafeInteger(byteLengthArg) ||
86
+ Object.is(byteLengthArg, -0) ||
87
+ byteLengthArg < 0 ||
88
+ byteLengthArg > isolatedRestoreContractLimits.maximumControlJsonBytes) {
89
+ return fail(`raw control ingress must contain between 0 and ${isolatedRestoreContractLimits.maximumControlJsonBytes} bytes`);
90
+ }
91
+ return byteLengthArg;
92
+ };
93
+ const deepFreeze = (valueArg, seenArg = new WeakSet()) => {
94
+ if (!valueArg || typeof valueArg !== 'object') {
95
+ return valueArg;
96
+ }
97
+ const object = valueArg;
98
+ if (ArrayBuffer.isView(object) || seenArg.has(object)) {
99
+ return valueArg;
100
+ }
101
+ seenArg.add(object);
102
+ for (const key of Reflect.ownKeys(object)) {
103
+ const descriptor = Object.getOwnPropertyDescriptor(object, key);
104
+ if (descriptor && Object.hasOwn(descriptor, 'value')) {
105
+ deepFreeze(descriptor.value, seenArg);
106
+ }
107
+ }
108
+ return Object.freeze(valueArg);
109
+ };
110
+ const verifiedIsolatedRestoreGrantCompacts = new WeakMap();
111
+ const verifiedIsolatedRestoreWriteBindings = new WeakSet();
112
+ const completedIsolatedRestoreObjects = new WeakSet();
113
+ const assertUnicodeScalarString = (valueArg, fieldNameArg) => {
114
+ for (let index = 0; index < valueArg.length; index++) {
115
+ const codeUnit = valueArg.charCodeAt(index);
116
+ if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
117
+ const followingCodeUnit = valueArg.charCodeAt(index + 1);
118
+ if (!Number.isInteger(followingCodeUnit) ||
119
+ followingCodeUnit < 0xdc00 ||
120
+ followingCodeUnit > 0xdfff) {
121
+ fail(`${fieldNameArg} must not contain an unpaired UTF-16 surrogate`);
122
+ }
123
+ index++;
124
+ continue;
125
+ }
126
+ if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {
127
+ fail(`${fieldNameArg} must not contain an unpaired UTF-16 surrogate`);
128
+ }
129
+ }
130
+ };
131
+ const readRecord = (valueArg, fieldNameArg) => {
132
+ if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
133
+ return fail(`${fieldNameArg} must be a plain object`);
134
+ }
135
+ const prototype = Object.getPrototypeOf(valueArg);
136
+ if (prototype !== Object.prototype && prototype !== null) {
137
+ return fail(`${fieldNameArg} must be a plain object`);
138
+ }
139
+ const record = valueArg;
140
+ const ownKeys = Reflect.ownKeys(record);
141
+ if (ownKeys.some((keyArg) => typeof keyArg !== 'string')) {
142
+ return fail(`${fieldNameArg} must not contain symbol keys`);
143
+ }
144
+ for (const key of ownKeys) {
145
+ const descriptor = Object.getOwnPropertyDescriptor(record, key);
146
+ if (!descriptor ||
147
+ !descriptor.enumerable ||
148
+ !Object.hasOwn(descriptor, 'value')) {
149
+ return fail(`${fieldNameArg} must contain enumerable data properties only`);
150
+ }
151
+ }
152
+ return record;
153
+ };
154
+ const readDenseArray = (valueArg, fieldNameArg, minimumLengthArg, maximumLengthArg) => {
155
+ if (!Array.isArray(valueArg) || Object.getPrototypeOf(valueArg) !== Array.prototype) {
156
+ return fail(`${fieldNameArg} must be a dense plain array`);
157
+ }
158
+ if (valueArg.length < minimumLengthArg ||
159
+ valueArg.length > maximumLengthArg) {
160
+ return fail(`${fieldNameArg} must contain between ${minimumLengthArg} and ${maximumLengthArg} entries`);
161
+ }
162
+ for (let index = 0; index < valueArg.length; index++) {
163
+ if (!Object.hasOwn(valueArg, index)) {
164
+ return fail(`${fieldNameArg} must not contain sparse entries`);
165
+ }
166
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, String(index));
167
+ if (!descriptor ||
168
+ !descriptor.enumerable ||
169
+ !Object.hasOwn(descriptor, 'value')) {
170
+ return fail(`${fieldNameArg} must contain enumerable data entries only`);
171
+ }
172
+ }
173
+ for (const key of Reflect.ownKeys(valueArg)) {
174
+ if (key === 'length') {
175
+ continue;
176
+ }
177
+ if (typeof key !== 'string' ||
178
+ !/^(?:0|[1-9][0-9]*)$/.test(key) ||
179
+ Number(key) >= valueArg.length) {
180
+ return fail(`${fieldNameArg} must not contain extra properties`);
181
+ }
182
+ }
183
+ return valueArg;
184
+ };
185
+ const assertExactKeys = (recordArg, expectedKeysArg, fieldNameArg) => {
186
+ const actualKeys = Object.keys(recordArg).sort();
187
+ const expectedKeys = [...expectedKeysArg].sort();
188
+ if (actualKeys.length !== expectedKeys.length ||
189
+ actualKeys.some((keyArg, indexArg) => keyArg !== expectedKeys[indexArg])) {
190
+ fail(`${fieldNameArg} does not match its exact versioned schema`);
191
+ }
192
+ };
193
+ const readString = (valueArg, fieldNameArg, maximumBytesArg) => {
194
+ if (typeof valueArg !== 'string' || valueArg.length === 0) {
195
+ return fail(`${fieldNameArg} must be a non-empty string`);
196
+ }
197
+ assertUnicodeScalarString(valueArg, fieldNameArg);
198
+ if (utf8ByteLength(valueArg) > maximumBytesArg) {
199
+ return fail(`${fieldNameArg} exceeds its UTF-8 byte limit`);
200
+ }
201
+ return valueArg;
202
+ };
203
+ const readConfiguredString = (valueArg, fieldNameArg) => {
204
+ const value = readString(valueArg, fieldNameArg, isolatedRestoreContractLimits.maximumConfiguredStringBytes);
205
+ if (value.trim() !== value ||
206
+ /\s/u.test(value) ||
207
+ /[\u0000-\u001f\u007f]/u.test(value)) {
208
+ return fail(`${fieldNameArg} must be a canonical string without whitespace`);
209
+ }
210
+ return value;
211
+ };
212
+ const readIdentifier = (valueArg, fieldNameArg) => {
213
+ if (typeof valueArg !== 'string' || !canonicalIdentifierPattern.test(valueArg)) {
214
+ return fail(`${fieldNameArg} must be a canonical identifier`);
215
+ }
216
+ return valueArg;
217
+ };
218
+ const readScopedId = (valueArg, fieldNameArg) => {
219
+ if (typeof valueArg !== 'string' || !canonicalScopedIdPattern.test(valueArg)) {
220
+ return fail(`${fieldNameArg} must be a canonical scoped identifier`);
221
+ }
222
+ return valueArg;
223
+ };
224
+ const readPatternName = (valueArg, fieldNameArg, patternArg, descriptionArg) => {
225
+ if (typeof valueArg !== 'string' || !patternArg.test(valueArg)) {
226
+ return fail(`${fieldNameArg} must be a canonical ${descriptionArg}`);
227
+ }
228
+ return valueArg;
229
+ };
230
+ const readVolumeName = (valueArg, fieldNameArg) => {
231
+ return readPatternName(valueArg, fieldNameArg, canonicalVolumeNamePattern, 'volume name');
232
+ };
233
+ const readResourceName = (valueArg, fieldNameArg) => {
234
+ return readPatternName(valueArg, fieldNameArg, canonicalResourceNamePattern, 'resource name');
235
+ };
236
+ const readDatabaseName = (valueArg, fieldNameArg) => {
237
+ return readPatternName(valueArg, fieldNameArg, canonicalDatabaseNamePattern, 'database name');
238
+ };
239
+ const readBucketName = (valueArg, fieldNameArg) => {
240
+ const value = readPatternName(valueArg, fieldNameArg, canonicalBucketNamePattern, 'bucket name');
241
+ const ipv4Segments = value.split('.');
242
+ const isIpv4Address = ipv4Segments.length === 4 &&
243
+ ipv4Segments.every((segmentArg) => canonicalIpv4SegmentPattern.test(segmentArg) &&
244
+ Number(segmentArg) <= 255);
245
+ if (value.includes('..') || isIpv4Address) {
246
+ return fail(`${fieldNameArg} must be a canonical bucket name`);
247
+ }
248
+ return value;
249
+ };
250
+ const readSha256 = (valueArg, fieldNameArg) => {
251
+ if (typeof valueArg !== 'string' || !canonicalSha256Pattern.test(valueArg)) {
252
+ return fail(`${fieldNameArg} must be a lowercase sha256 digest`);
253
+ }
254
+ return valueArg;
255
+ };
256
+ const readSafeInteger = (valueArg, fieldNameArg, minimumArg, maximumArg = Number.MAX_SAFE_INTEGER) => {
257
+ if (typeof valueArg !== 'number' ||
258
+ !Number.isSafeInteger(valueArg) ||
259
+ Object.is(valueArg, -0) ||
260
+ valueArg < minimumArg ||
261
+ valueArg > maximumArg) {
262
+ return fail(`${fieldNameArg} must be a safe integer between ${minimumArg} and ${maximumArg}`);
263
+ }
264
+ return valueArg;
265
+ };
266
+ const readMountPath = (valueArg, fieldNameArg) => {
267
+ const value = readString(valueArg, fieldNameArg, isolatedRestoreContractLimits.maximumPathBytes);
268
+ if (!value.startsWith('/') ||
269
+ value.includes('\\') ||
270
+ /[\u0000-\u001f\u007f]/u.test(value)) {
271
+ return fail(`${fieldNameArg} must be a canonical absolute POSIX path`);
272
+ }
273
+ if (value !== '/') {
274
+ const segments = value.slice(1).split('/');
275
+ if (segments.some((segmentArg) => segmentArg.length === 0 || segmentArg === '.' || segmentArg === '..')) {
276
+ return fail(`${fieldNameArg} must be a canonical absolute POSIX path`);
277
+ }
278
+ }
279
+ return value;
280
+ };
281
+ const readRepositoryPath = (valueArg, fieldNameArg) => {
282
+ const value = readString(valueArg, fieldNameArg, isolatedRestoreContractLimits.maximumPathBytes);
283
+ if (value.startsWith('/') ||
284
+ value.includes('\\') ||
285
+ /[\u0000-\u001f\u007f]/u.test(value)) {
286
+ return fail(`${fieldNameArg} is outside the supported repository path profile`);
287
+ }
288
+ if (value === 'config.json') {
289
+ return value;
290
+ }
291
+ let match = /^packs\/data\/([a-f0-9]{2})\/([a-f0-9]{32})\.(?:pack|idx)$/.exec(value);
292
+ if (match) {
293
+ if (match[1] !== match[2].slice(0, 2)) {
294
+ return fail(`${fieldNameArg} pack shard does not match its object id`);
295
+ }
296
+ return value;
297
+ }
298
+ match = /^packs\/parity\/([a-f0-9]{2})\/([a-f0-9]{32})(?:(?:\.(0|[1-9]|[12][0-9]|3[01]))?\.par|\.parx)$/.exec(value);
299
+ if (match) {
300
+ if (match[1] !== match[2].slice(0, 2)) {
301
+ return fail(`${fieldNameArg} parity shard does not match its object id`);
302
+ }
303
+ if (match[3] !== undefined && Number(match[3]) > 31) {
304
+ return fail(`${fieldNameArg} parity index is outside the supported range`);
305
+ }
306
+ return value;
307
+ }
308
+ if (/^snapshots\/[A-Za-z0-9][A-Za-z0-9_.:-]{0,191}\.json$/.test(value)) {
309
+ return value;
310
+ }
311
+ if (/^index\/[a-f0-9]{32}\.json$/.test(value)) {
312
+ return value;
313
+ }
314
+ if (/^keys\/[A-Za-z0-9][A-Za-z0-9_.:-]{0,191}\.key$/.test(value)) {
315
+ return value;
316
+ }
317
+ return fail(`${fieldNameArg} is outside the supported repository path profile`);
318
+ };
319
+ const assertCanonicalBase64 = (valueArg, fieldNameArg) => {
320
+ if (typeof valueArg !== 'string') {
321
+ return fail(`${fieldNameArg} must be canonical padded base64`);
322
+ }
323
+ if (valueArg.length >
324
+ isolatedRestoreContractLimits.maximumWriteChunkBase64Characters) {
325
+ return fail(`${fieldNameArg} exceeds the encoded chunk character limit`);
326
+ }
327
+ if (valueArg.length % 4 !== 0 ||
328
+ !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(valueArg)) {
329
+ return fail(`${fieldNameArg} must be canonical padded base64`);
330
+ }
331
+ if (valueArg.endsWith('==')) {
332
+ const sextet = standardBase64Alphabet.indexOf(valueArg[valueArg.length - 3]);
333
+ if (sextet < 0 || (sextet & 0x0f) !== 0) {
334
+ return fail(`${fieldNameArg} has non-zero base64 pad bits`);
335
+ }
336
+ }
337
+ else if (valueArg.endsWith('=')) {
338
+ const sextet = standardBase64Alphabet.indexOf(valueArg[valueArg.length - 2]);
339
+ if (sextet < 0 || (sextet & 0x03) !== 0) {
340
+ return fail(`${fieldNameArg} has non-zero base64 pad bits`);
341
+ }
342
+ }
343
+ return valueArg;
344
+ };
345
+ const decodeCanonicalBase64 = (valueArg, fieldNameArg) => {
346
+ const value = assertCanonicalBase64(valueArg, fieldNameArg);
347
+ const paddingLength = value.endsWith('==') ? 2 : value.endsWith('=') ? 1 : 0;
348
+ const result = new Uint8Array(value.length / 4 * 3 - paddingLength);
349
+ let outputOffset = 0;
350
+ for (let inputOffset = 0; inputOffset < value.length; inputOffset += 4) {
351
+ const first = standardBase64Alphabet.indexOf(value[inputOffset]);
352
+ const second = standardBase64Alphabet.indexOf(value[inputOffset + 1]);
353
+ const third = value[inputOffset + 2] === '='
354
+ ? 0
355
+ : standardBase64Alphabet.indexOf(value[inputOffset + 2]);
356
+ const fourth = value[inputOffset + 3] === '='
357
+ ? 0
358
+ : standardBase64Alphabet.indexOf(value[inputOffset + 3]);
359
+ const combined = (first << 18) | (second << 12) | (third << 6) | fourth;
360
+ if (outputOffset < result.length) {
361
+ result[outputOffset++] = combined >>> 16 & 0xff;
362
+ }
363
+ if (outputOffset < result.length) {
364
+ result[outputOffset++] = combined >>> 8 & 0xff;
365
+ }
366
+ if (outputOffset < result.length) {
367
+ result[outputOffset++] = combined & 0xff;
368
+ }
369
+ }
370
+ return result;
371
+ };
372
+ const assertCanonicalBase64UrlSegment = (valueArg, fieldNameArg) => {
373
+ if (valueArg.length === 0 ||
374
+ valueArg.length % 4 === 1 ||
375
+ !/^[A-Za-z0-9_-]+$/.test(valueArg)) {
376
+ fail(`${fieldNameArg} must be canonical unpadded base64url`);
377
+ }
378
+ const remainder = valueArg.length % 4;
379
+ const finalSextet = base64UrlAlphabet.indexOf(valueArg[valueArg.length - 1]);
380
+ if ((remainder === 2 && (finalSextet & 0x0f) !== 0) ||
381
+ (remainder === 3 && (finalSextet & 0x03) !== 0)) {
382
+ fail(`${fieldNameArg} has non-zero base64url pad bits`);
383
+ }
384
+ };
385
+ const readCompactRestoreGrant = (valueArg) => {
386
+ const value = readString(valueArg, 'restoreGrant', isolatedRestoreContractLimits.maximumRestoreGrantBytes);
387
+ const segments = value.split('.');
388
+ if (segments.length !== 3) {
389
+ return fail('restoreGrant must be a three-segment compact JWT');
390
+ }
391
+ segments.forEach((segmentArg, indexArg) => {
392
+ assertCanonicalBase64UrlSegment(segmentArg, `restoreGrant segment ${indexArg + 1}`);
393
+ });
394
+ return value;
395
+ };
396
+ const assertControlJsonLimit = (valueArg, fieldNameArg) => {
397
+ const json = JSON.stringify(valueArg);
398
+ if (typeof json !== 'string' ||
399
+ utf8ByteLength(json) > isolatedRestoreContractLimits.maximumControlJsonBytes) {
400
+ return fail(`${fieldNameArg} exceeds the ${isolatedRestoreContractLimits.maximumControlJsonBytes}-byte control JSON limit`);
401
+ }
402
+ return deepFreeze(valueArg);
403
+ };
404
+ const normalizeMapping = (mappingArg, indexArg) => {
405
+ const fieldName = `resourceMappings[${indexArg}]`;
406
+ const mapping = readRecord(mappingArg, fieldName);
407
+ assertExactKeys(mapping, ['id', 'type', 'source', 'target'], fieldName);
408
+ const id = readScopedId(mapping.id, `${fieldName}.id`);
409
+ if (mapping.type === 'volume') {
410
+ const source = readRecord(mapping.source, `${fieldName}.source`);
411
+ const target = readRecord(mapping.target, `${fieldName}.target`);
412
+ assertExactKeys(source, ['snapshotId', 'volumeName', 'mountPath'], `${fieldName}.source`);
413
+ assertExactKeys(target, ['volumeName', 'mountPath'], `${fieldName}.target`);
414
+ const sourceVolumeName = readVolumeName(source.volumeName, `${fieldName}.source.volumeName`);
415
+ const targetVolumeName = readVolumeName(target.volumeName, `${fieldName}.target.volumeName`);
416
+ if (sourceVolumeName === targetVolumeName) {
417
+ return fail(`${fieldName}.target.volumeName must differ from its source`);
418
+ }
419
+ return {
420
+ id,
421
+ type: 'volume',
422
+ source: {
423
+ snapshotId: readScopedId(source.snapshotId, `${fieldName}.source.snapshotId`),
424
+ volumeName: sourceVolumeName,
425
+ mountPath: readMountPath(source.mountPath, `${fieldName}.source.mountPath`),
426
+ },
427
+ target: {
428
+ volumeName: targetVolumeName,
429
+ mountPath: readMountPath(target.mountPath, `${fieldName}.target.mountPath`),
430
+ },
431
+ };
432
+ }
433
+ if (mapping.type === 'database') {
434
+ const source = readRecord(mapping.source, `${fieldName}.source`);
435
+ const target = readRecord(mapping.target, `${fieldName}.target`);
436
+ assertExactKeys(source, ['snapshotId', 'resourceName', 'databaseName'], `${fieldName}.source`);
437
+ assertExactKeys(target, ['resourceName', 'databaseName'], `${fieldName}.target`);
438
+ const sourceResourceName = readResourceName(source.resourceName, `${fieldName}.source.resourceName`);
439
+ const sourceDatabaseName = readDatabaseName(source.databaseName, `${fieldName}.source.databaseName`);
440
+ const targetResourceName = readResourceName(target.resourceName, `${fieldName}.target.resourceName`);
441
+ const targetDatabaseName = readDatabaseName(target.databaseName, `${fieldName}.target.databaseName`);
442
+ if (sourceResourceName === targetResourceName ||
443
+ sourceDatabaseName === targetDatabaseName) {
444
+ return fail(`${fieldName}.target database namespace must differ from its source`);
445
+ }
446
+ return {
447
+ id,
448
+ type: 'database',
449
+ source: {
450
+ snapshotId: readScopedId(source.snapshotId, `${fieldName}.source.snapshotId`),
451
+ resourceName: sourceResourceName,
452
+ databaseName: sourceDatabaseName,
453
+ },
454
+ target: {
455
+ resourceName: targetResourceName,
456
+ databaseName: targetDatabaseName,
457
+ },
458
+ };
459
+ }
460
+ if (mapping.type === 'objectstorage') {
461
+ const source = readRecord(mapping.source, `${fieldName}.source`);
462
+ const target = readRecord(mapping.target, `${fieldName}.target`);
463
+ assertExactKeys(source, ['snapshotId', 'resourceName', 'bucketName'], `${fieldName}.source`);
464
+ assertExactKeys(target, ['resourceName', 'bucketName'], `${fieldName}.target`);
465
+ const sourceResourceName = readResourceName(source.resourceName, `${fieldName}.source.resourceName`);
466
+ const sourceBucketName = readBucketName(source.bucketName, `${fieldName}.source.bucketName`);
467
+ const targetResourceName = readResourceName(target.resourceName, `${fieldName}.target.resourceName`);
468
+ const targetBucketName = readBucketName(target.bucketName, `${fieldName}.target.bucketName`);
469
+ if (sourceResourceName === targetResourceName ||
470
+ sourceBucketName === targetBucketName) {
471
+ return fail(`${fieldName}.target objectstorage namespace must differ from its source`);
472
+ }
473
+ return {
474
+ id,
475
+ type: 'objectstorage',
476
+ source: {
477
+ snapshotId: readScopedId(source.snapshotId, `${fieldName}.source.snapshotId`),
478
+ resourceName: sourceResourceName,
479
+ bucketName: sourceBucketName,
480
+ },
481
+ target: {
482
+ resourceName: targetResourceName,
483
+ bucketName: targetBucketName,
484
+ },
485
+ };
486
+ }
487
+ return fail(`${fieldName}.type is unsupported`);
488
+ };
489
+ export const normalizeIsolatedRestoreResourceMappings = (valueArg) => {
490
+ const entries = readDenseArray(valueArg, 'resourceMappings', 1, isolatedRestoreContractLimits.maximumResourceMappings);
491
+ const mappings = entries.map(normalizeMapping);
492
+ const mappingIds = new Set();
493
+ const sourceSnapshotIds = new Set();
494
+ const targetAuthorities = new Set();
495
+ const targetVolumeMountPaths = new Set();
496
+ for (const mapping of mappings) {
497
+ if (mappingIds.has(mapping.id)) {
498
+ return fail(`resourceMappings contains duplicate id ${mapping.id}`);
499
+ }
500
+ mappingIds.add(mapping.id);
501
+ if (sourceSnapshotIds.has(mapping.source.snapshotId)) {
502
+ return fail(`resourceMappings contains duplicate source snapshot ${mapping.source.snapshotId}`);
503
+ }
504
+ sourceSnapshotIds.add(mapping.source.snapshotId);
505
+ if (mapping.type === 'volume') {
506
+ if (targetVolumeMountPaths.has(mapping.target.mountPath)) {
507
+ return fail(`resourceMappings contains duplicate target volume mount path ${mapping.target.mountPath}`);
508
+ }
509
+ targetVolumeMountPaths.add(mapping.target.mountPath);
510
+ }
511
+ const targetAuthority = mapping.type === 'volume'
512
+ ? `volume:${mapping.target.volumeName}`
513
+ : mapping.type === 'database'
514
+ ? `database:${mapping.target.resourceName}:${mapping.target.databaseName}`
515
+ : `objectstorage:${mapping.target.resourceName}:${mapping.target.bucketName}`;
516
+ if (targetAuthorities.has(targetAuthority)) {
517
+ return fail(`resourceMappings contains duplicate target authority ${targetAuthority}`);
518
+ }
519
+ targetAuthorities.add(targetAuthority);
520
+ }
521
+ return deepFreeze(mappings);
522
+ };
523
+ export const normalizeIsolatedRestoreArchiveManifest = (valueArg) => {
524
+ const manifest = readRecord(valueArg, 'archiveManifest');
525
+ assertExactKeys(manifest, ['version', 'backupId', 'createdAt', 'objects', 'totalSize'], 'archiveManifest');
526
+ if (manifest.version !== 1) {
527
+ return fail('archiveManifest.version must be 1');
528
+ }
529
+ const objectEntries = readDenseArray(manifest.objects, 'archiveManifest.objects', 1, isolatedRestoreContractLimits.maximumArchiveObjects);
530
+ const paths = new Set();
531
+ let calculatedTotalSize = 0;
532
+ const objects = objectEntries.map((objectArg, indexArg) => {
533
+ const fieldName = `archiveManifest.objects[${indexArg}]`;
534
+ const object = readRecord(objectArg, fieldName);
535
+ assertExactKeys(object, ['path', 'size', 'sha256'], fieldName);
536
+ const path = readRepositoryPath(object.path, `${fieldName}.path`);
537
+ if (paths.has(path)) {
538
+ return fail(`archiveManifest.objects contains duplicate path ${path}`);
539
+ }
540
+ paths.add(path);
541
+ const size = readSafeInteger(object.size, `${fieldName}.size`, 0, isolatedRestoreContractLimits.maximumArchiveObjectBytes);
542
+ if (!Number.isSafeInteger(calculatedTotalSize + size) ||
543
+ calculatedTotalSize + size >
544
+ isolatedRestoreContractLimits.maximumArchiveTotalBytes) {
545
+ return fail('archiveManifest object sizes exceed the versioned total-size limit');
546
+ }
547
+ calculatedTotalSize += size;
548
+ return {
549
+ path,
550
+ size,
551
+ sha256: readSha256(object.sha256, `${fieldName}.sha256`),
552
+ };
553
+ });
554
+ const parityStylesByGroup = new Map();
555
+ for (const object of objects) {
556
+ const parityMatch = /^packs\/parity\/([a-f0-9]{2})\/([a-f0-9]{32})(?:\.([0-9]{1,2}))?\.par$/.exec(object.path);
557
+ if (!parityMatch) {
558
+ continue;
559
+ }
560
+ const group = `${parityMatch[1]}/${parityMatch[2]}`;
561
+ const style = parityMatch[3] === undefined ? 'unnumbered' : 'numbered';
562
+ const previousStyle = parityStylesByGroup.get(group);
563
+ if (previousStyle && previousStyle !== style) {
564
+ return fail(`archiveManifest parity group ${group} mixes numbered and unnumbered shards`);
565
+ }
566
+ parityStylesByGroup.set(group, style);
567
+ }
568
+ for (const path of paths) {
569
+ let slashIndex = path.indexOf('/');
570
+ while (slashIndex >= 0) {
571
+ const ancestor = path.slice(0, slashIndex);
572
+ if (paths.has(ancestor)) {
573
+ return fail(`archiveManifest path ${path} conflicts with object ancestor ${ancestor}`);
574
+ }
575
+ slashIndex = path.indexOf('/', slashIndex + 1);
576
+ }
577
+ }
578
+ const totalSize = readSafeInteger(manifest.totalSize, 'archiveManifest.totalSize', 0, isolatedRestoreContractLimits.maximumArchiveTotalBytes);
579
+ if (totalSize !== calculatedTotalSize) {
580
+ return fail('archiveManifest.totalSize must equal the sum of object sizes');
581
+ }
582
+ return deepFreeze({
583
+ version: 1,
584
+ backupId: readScopedId(manifest.backupId, 'archiveManifest.backupId'),
585
+ createdAt: readSafeInteger(manifest.createdAt, 'archiveManifest.createdAt', 0),
586
+ objects,
587
+ totalSize,
588
+ });
589
+ };
590
+ export const normalizeIsolatedRestoreGrantClaims = (valueArg) => {
591
+ const claims = readRecord(valueArg, 'restore grant claims');
592
+ assertExactKeys(claims, [
593
+ 'grantVersion',
594
+ 'iss',
595
+ 'aud',
596
+ 'sub',
597
+ 'jti',
598
+ 'authorizationId',
599
+ 'tenantId',
600
+ 'clusterId',
601
+ 'targetNodeName',
602
+ 'restoreId',
603
+ 'sourceBackupId',
604
+ 'sourceServiceId',
605
+ 'scratchNamespaceId',
606
+ 'stagingArchiveId',
607
+ 'operation',
608
+ 'resourceMappingsSha256',
609
+ 'archiveManifestSha256',
610
+ 'iat',
611
+ 'nbf',
612
+ 'exp',
613
+ ], 'restore grant claims');
614
+ if (claims.grantVersion !== 1) {
615
+ return fail('grantVersion must be 1');
616
+ }
617
+ if (typeof claims.operation !== 'string' ||
618
+ !isolatedRestoreGrantOperations.includes(claims.operation)) {
619
+ return fail('operation is unsupported');
620
+ }
621
+ const iat = readSafeInteger(claims.iat, 'iat', 1);
622
+ const nbf = readSafeInteger(claims.nbf, 'nbf', 1);
623
+ const exp = readSafeInteger(claims.exp, 'exp', 1);
624
+ if (exp <= iat || exp <= nbf) {
625
+ return fail('exp must be later than both iat and nbf');
626
+ }
627
+ const normalizedClaims = {
628
+ grantVersion: 1,
629
+ iss: readConfiguredString(claims.iss, 'iss'),
630
+ aud: readConfiguredString(claims.aud, 'aud'),
631
+ sub: readIdentifier(claims.sub, 'sub'),
632
+ jti: readIdentifier(claims.jti, 'jti'),
633
+ authorizationId: readIdentifier(claims.authorizationId, 'authorizationId'),
634
+ tenantId: readIdentifier(claims.tenantId, 'tenantId'),
635
+ clusterId: readIdentifier(claims.clusterId, 'clusterId'),
636
+ targetNodeName: readIdentifier(claims.targetNodeName, 'targetNodeName'),
637
+ restoreId: readScopedId(claims.restoreId, 'restoreId'),
638
+ sourceBackupId: readScopedId(claims.sourceBackupId, 'sourceBackupId'),
639
+ sourceServiceId: readScopedId(claims.sourceServiceId, 'sourceServiceId'),
640
+ scratchNamespaceId: readScopedId(claims.scratchNamespaceId, 'scratchNamespaceId'),
641
+ stagingArchiveId: readScopedId(claims.stagingArchiveId, 'stagingArchiveId'),
642
+ operation: claims.operation,
643
+ resourceMappingsSha256: readSha256(claims.resourceMappingsSha256, 'resourceMappingsSha256'),
644
+ archiveManifestSha256: readSha256(claims.archiveManifestSha256, 'archiveManifestSha256'),
645
+ iat,
646
+ nbf,
647
+ exp,
648
+ };
649
+ if (normalizedClaims.scratchNamespaceId === normalizedClaims.sourceServiceId) {
650
+ return fail('scratchNamespaceId must differ from sourceServiceId');
651
+ }
652
+ if (normalizedClaims.stagingArchiveId === normalizedClaims.sourceBackupId) {
653
+ return fail('stagingArchiveId must differ from sourceBackupId');
654
+ }
655
+ return deepFreeze(normalizedClaims);
656
+ };
657
+ const normalizeControlMutationRequest = (valueArg, fieldNameArg) => {
658
+ const request = readRecord(valueArg, fieldNameArg);
659
+ assertExactKeys(request, ['restoreGrant', 'expectedRevision'], fieldNameArg);
660
+ return assertControlJsonLimit({
661
+ restoreGrant: readCompactRestoreGrant(request.restoreGrant),
662
+ expectedRevision: readSafeInteger(request.expectedRevision, `${fieldNameArg}.expectedRevision`, 0),
663
+ }, fieldNameArg);
664
+ };
665
+ export const normalizeIsolatedRestoreControlPrepareRequest = (valueArg) => {
666
+ const request = readRecord(valueArg, 'prepare request');
667
+ assertExactKeys(request, ['restoreGrant', 'expectedRevision', 'resourceMappings', 'archiveManifest'], 'prepare request');
668
+ return assertControlJsonLimit({
669
+ restoreGrant: readCompactRestoreGrant(request.restoreGrant),
670
+ expectedRevision: readSafeInteger(request.expectedRevision, 'prepare request.expectedRevision', 0),
671
+ resourceMappings: normalizeIsolatedRestoreResourceMappings(request.resourceMappings),
672
+ archiveManifest: normalizeIsolatedRestoreArchiveManifest(request.archiveManifest),
673
+ }, 'prepare request');
674
+ };
675
+ export const normalizeIsolatedRestoreControlWriteRequest = (valueArg) => {
676
+ const request = readRecord(valueArg, 'write request');
677
+ assertExactKeys(request, [
678
+ 'restoreGrant',
679
+ 'expectedRevision',
680
+ 'path',
681
+ 'size',
682
+ 'sha256',
683
+ 'offset',
684
+ 'chunkSha256',
685
+ 'contentsBase64',
686
+ ], 'write request');
687
+ const size = readSafeInteger(request.size, 'write request.size', 0, isolatedRestoreContractLimits.maximumArchiveObjectBytes);
688
+ const offset = readSafeInteger(request.offset, 'write request.offset', 0, size);
689
+ const contentsBase64 = assertCanonicalBase64(request.contentsBase64, 'write request.contentsBase64');
690
+ const contents = decodeCanonicalBase64(contentsBase64, 'write request.contentsBase64');
691
+ if (contents.byteLength > isolatedRestoreContractLimits.maximumWriteChunkBytes) {
692
+ return fail('write request decoded chunk exceeds the versioned chunk limit');
693
+ }
694
+ if (size === 0) {
695
+ if (offset !== 0 || contents.byteLength !== 0) {
696
+ return fail('write request for an empty object must contain one empty chunk at offset 0');
697
+ }
698
+ }
699
+ else if (contents.byteLength === 0 ||
700
+ offset >= size ||
701
+ offset + contents.byteLength > size) {
702
+ return fail('write request chunk does not fit within the immutable object descriptor');
703
+ }
704
+ return assertControlJsonLimit({
705
+ restoreGrant: readCompactRestoreGrant(request.restoreGrant),
706
+ expectedRevision: readSafeInteger(request.expectedRevision, 'write request.expectedRevision', 0),
707
+ path: readRepositoryPath(request.path, 'write request.path'),
708
+ size,
709
+ sha256: readSha256(request.sha256, 'write request.sha256'),
710
+ offset,
711
+ chunkSha256: readSha256(request.chunkSha256, 'write request.chunkSha256'),
712
+ contentsBase64,
713
+ }, 'write request');
714
+ };
715
+ export const normalizeIsolatedRestoreControlExecuteRequest = (valueArg) => {
716
+ return normalizeControlMutationRequest(valueArg, 'execute request');
717
+ };
718
+ export const normalizeIsolatedRestoreControlCleanupRequest = (valueArg) => {
719
+ return normalizeControlMutationRequest(valueArg, 'cleanup request');
720
+ };
721
+ export const normalizeIsolatedRestoreControlStatusRequest = (valueArg) => {
722
+ const request = readRecord(valueArg, 'status request');
723
+ assertExactKeys(request, ['restoreGrant'], 'status request');
724
+ return assertControlJsonLimit({ restoreGrant: readCompactRestoreGrant(request.restoreGrant) }, 'status request');
725
+ };
726
+ const canonicalizeJson = (valueArg) => {
727
+ const ancestors = new Set();
728
+ const visit = (currentValueArg, fieldNameArg) => {
729
+ if (currentValueArg === null) {
730
+ return 'null';
731
+ }
732
+ if (typeof currentValueArg === 'boolean') {
733
+ return currentValueArg ? 'true' : 'false';
734
+ }
735
+ if (typeof currentValueArg === 'string') {
736
+ assertUnicodeScalarString(currentValueArg, fieldNameArg);
737
+ return JSON.stringify(currentValueArg);
738
+ }
739
+ if (typeof currentValueArg === 'number') {
740
+ if (!Number.isSafeInteger(currentValueArg) ||
741
+ Object.is(currentValueArg, -0)) {
742
+ return fail(`${fieldNameArg} must contain safe integers only`);
743
+ }
744
+ return String(currentValueArg);
745
+ }
746
+ if (typeof currentValueArg !== 'object') {
747
+ return fail(`${fieldNameArg} contains a non-JSON value`);
748
+ }
749
+ if (ancestors.has(currentValueArg)) {
750
+ return fail(`${fieldNameArg} contains a cycle`);
751
+ }
752
+ ancestors.add(currentValueArg);
753
+ try {
754
+ if (Array.isArray(currentValueArg)) {
755
+ return `[${currentValueArg
756
+ .map((entryArg, indexArg) => visit(entryArg, `${fieldNameArg}[${indexArg}]`))
757
+ .join(',')}]`;
758
+ }
759
+ const record = readRecord(currentValueArg, fieldNameArg);
760
+ const keys = Object.keys(record).sort((leftArg, rightArg) => {
761
+ return leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0;
762
+ });
763
+ return `{${keys
764
+ .map((keyArg) => {
765
+ assertUnicodeScalarString(keyArg, `${fieldNameArg} key`);
766
+ return `${JSON.stringify(keyArg)}:${visit(record[keyArg], `${fieldNameArg}.${keyArg}`)}`;
767
+ })
768
+ .join(',')}}`;
769
+ }
770
+ finally {
771
+ ancestors.delete(currentValueArg);
772
+ }
773
+ };
774
+ return visit(valueArg, 'canonical JSON input');
775
+ };
776
+ export const canonicalizeIsolatedRestoreResourceMappings = (valueArg) => {
777
+ return canonicalizeJson(normalizeIsolatedRestoreResourceMappings(valueArg));
778
+ };
779
+ export const canonicalizeIsolatedRestoreArchiveManifest = (valueArg) => {
780
+ return canonicalizeJson(normalizeIsolatedRestoreArchiveManifest(valueArg));
781
+ };
782
+ export const canonicalizeIsolatedRestoreGrantClaims = (valueArg) => {
783
+ return canonicalizeJson(normalizeIsolatedRestoreGrantClaims(valueArg));
784
+ };
785
+ export const normalizeIsolatedRestoreAuthorityProjection = (valueArg) => {
786
+ const authority = readRecord(valueArg, 'restore authority projection');
787
+ assertExactKeys(authority, [
788
+ 'version',
789
+ 'iss',
790
+ 'aud',
791
+ 'sub',
792
+ 'authorizationId',
793
+ 'tenantId',
794
+ 'clusterId',
795
+ 'targetNodeName',
796
+ 'restoreId',
797
+ 'sourceBackupId',
798
+ 'sourceServiceId',
799
+ 'scratchNamespaceId',
800
+ 'stagingArchiveId',
801
+ 'resourceMappingsSha256',
802
+ 'archiveManifestSha256',
803
+ ], 'restore authority projection');
804
+ if (authority.version !== 1) {
805
+ return fail('restore authority projection.version must be 1');
806
+ }
807
+ const normalized = {
808
+ version: 1,
809
+ iss: readConfiguredString(authority.iss, 'restore authority projection.iss'),
810
+ aud: readConfiguredString(authority.aud, 'restore authority projection.aud'),
811
+ sub: readIdentifier(authority.sub, 'restore authority projection.sub'),
812
+ authorizationId: readIdentifier(authority.authorizationId, 'restore authority projection.authorizationId'),
813
+ tenantId: readIdentifier(authority.tenantId, 'restore authority projection.tenantId'),
814
+ clusterId: readIdentifier(authority.clusterId, 'restore authority projection.clusterId'),
815
+ targetNodeName: readIdentifier(authority.targetNodeName, 'restore authority projection.targetNodeName'),
816
+ restoreId: readScopedId(authority.restoreId, 'restore authority projection.restoreId'),
817
+ sourceBackupId: readScopedId(authority.sourceBackupId, 'restore authority projection.sourceBackupId'),
818
+ sourceServiceId: readScopedId(authority.sourceServiceId, 'restore authority projection.sourceServiceId'),
819
+ scratchNamespaceId: readScopedId(authority.scratchNamespaceId, 'restore authority projection.scratchNamespaceId'),
820
+ stagingArchiveId: readScopedId(authority.stagingArchiveId, 'restore authority projection.stagingArchiveId'),
821
+ resourceMappingsSha256: readSha256(authority.resourceMappingsSha256, 'restore authority projection.resourceMappingsSha256'),
822
+ archiveManifestSha256: readSha256(authority.archiveManifestSha256, 'restore authority projection.archiveManifestSha256'),
823
+ };
824
+ if (normalized.scratchNamespaceId === normalized.sourceServiceId) {
825
+ return fail('restore authority projection scratchNamespaceId must differ from sourceServiceId');
826
+ }
827
+ if (normalized.stagingArchiveId === normalized.sourceBackupId) {
828
+ return fail('restore authority projection stagingArchiveId must differ from sourceBackupId');
829
+ }
830
+ return deepFreeze(normalized);
831
+ };
832
+ export const createIsolatedRestoreAuthorityProjection = (claimsArg) => {
833
+ const claims = normalizeIsolatedRestoreGrantClaims(claimsArg);
834
+ return normalizeIsolatedRestoreAuthorityProjection({
835
+ version: 1,
836
+ iss: claims.iss,
837
+ aud: claims.aud,
838
+ sub: claims.sub,
839
+ authorizationId: claims.authorizationId,
840
+ tenantId: claims.tenantId,
841
+ clusterId: claims.clusterId,
842
+ targetNodeName: claims.targetNodeName,
843
+ restoreId: claims.restoreId,
844
+ sourceBackupId: claims.sourceBackupId,
845
+ sourceServiceId: claims.sourceServiceId,
846
+ scratchNamespaceId: claims.scratchNamespaceId,
847
+ stagingArchiveId: claims.stagingArchiveId,
848
+ resourceMappingsSha256: claims.resourceMappingsSha256,
849
+ archiveManifestSha256: claims.archiveManifestSha256,
850
+ });
851
+ };
852
+ export const canonicalizeIsolatedRestoreAuthorityProjection = (valueArg) => {
853
+ return canonicalizeJson(normalizeIsolatedRestoreAuthorityProjection(valueArg));
854
+ };
855
+ const createSha256 = async (contentsArg) => {
856
+ const subtle = globalThis.crypto?.subtle;
857
+ if (!subtle) {
858
+ return fail('Web Crypto SHA-256 is unavailable in this runtime');
859
+ }
860
+ const digest = await subtle.digest('SHA-256', new Uint8Array(contentsArg));
861
+ return Array.from(new Uint8Array(digest), (byteArg) => byteArg.toString(16).padStart(2, '0')).join('');
862
+ };
863
+ const createCanonicalJsonSha256 = async (canonicalJsonArg) => {
864
+ return createSha256(new TextEncoder().encode(canonicalJsonArg));
865
+ };
866
+ export const createIsolatedRestoreBytesSha256 = async (contentsArg) => {
867
+ if (!(contentsArg instanceof Uint8Array)) {
868
+ return fail('contents must be a Uint8Array');
869
+ }
870
+ return createSha256(contentsArg);
871
+ };
872
+ export const createIsolatedRestoreResourceMappingsSha256 = async (valueArg) => {
873
+ return createCanonicalJsonSha256(canonicalizeIsolatedRestoreResourceMappings(valueArg));
874
+ };
875
+ export const createIsolatedRestoreArchiveManifestSha256 = async (valueArg) => {
876
+ return createCanonicalJsonSha256(canonicalizeIsolatedRestoreArchiveManifest(valueArg));
877
+ };
878
+ export const createIsolatedRestoreGrantClaimsSha256 = async (valueArg) => {
879
+ return createCanonicalJsonSha256(canonicalizeIsolatedRestoreGrantClaims(valueArg));
880
+ };
881
+ export const createIsolatedRestoreAuthoritySha256 = async (valueArg) => {
882
+ return createCanonicalJsonSha256(canonicalizeIsolatedRestoreAuthorityProjection(valueArg));
883
+ };
884
+ const requireVerifiedIsolatedRestoreGrant = (grantArg) => {
885
+ if (!grantArg ||
886
+ typeof grantArg !== 'object' ||
887
+ !verifiedIsolatedRestoreGrantCompacts.has(grantArg)) {
888
+ return fail('restore grant must be a runtime-branded result of verifyIsolatedRestoreGrant');
889
+ }
890
+ return grantArg;
891
+ };
892
+ /**
893
+ * Invokes the caller's cryptographic verifier for exactly `compact`, retains
894
+ * that bearer in module-private storage, and brands the immutable claims
895
+ * projection. Binding helpers reject claims supplied without this operation
896
+ * and reject any control body carrying another compact JWT.
897
+ */
898
+ export const verifyIsolatedRestoreGrant = async (compactArg, verifierArg) => {
899
+ const compact = readCompactRestoreGrant(compactArg);
900
+ if (typeof verifierArg !== 'function') {
901
+ return fail('restore grant verifier must be a function');
902
+ }
903
+ const claims = normalizeIsolatedRestoreGrantClaims(await verifierArg(compact));
904
+ const grant = deepFreeze({ claims });
905
+ verifiedIsolatedRestoreGrantCompacts.set(grant, compact);
906
+ return grant;
907
+ };
908
+ export const assertIsolatedRestoreGrantOperation = (grantArg, expectedOperationArg) => {
909
+ if (!isolatedRestoreGrantOperations.includes(expectedOperationArg)) {
910
+ return fail('expected operation is unsupported');
911
+ }
912
+ const grant = requireVerifiedIsolatedRestoreGrant(grantArg);
913
+ if (grant.claims.operation !== expectedOperationArg) {
914
+ return fail(`restore grant operation ${grant.claims.operation} does not authorize ${expectedOperationArg}`);
915
+ }
916
+ return grant.claims;
917
+ };
918
+ const assertControlRequestUsesVerifiedGrant = (grantArg, compactArg) => {
919
+ const grant = requireVerifiedIsolatedRestoreGrant(grantArg);
920
+ if (compactArg !== verifiedIsolatedRestoreGrantCompacts.get(grant)) {
921
+ fail('control request restoreGrant does not match the verified compact JWT');
922
+ }
923
+ };
924
+ const assertPlanRelationships = (claimsArg, mappingsArg, manifestArg) => {
925
+ if (manifestArg.backupId !== claimsArg.sourceBackupId) {
926
+ fail('archiveManifest.backupId does not match grant sourceBackupId');
927
+ }
928
+ const paths = new Set(manifestArg.objects.map((objectArg) => objectArg.path));
929
+ if (!paths.has('config.json')) {
930
+ fail('archiveManifest must contain config.json');
931
+ }
932
+ for (const mapping of mappingsArg) {
933
+ const requiredSnapshotPath = `snapshots/${mapping.source.snapshotId}.json`;
934
+ if (!paths.has(requiredSnapshotPath)) {
935
+ fail(`archiveManifest does not contain required object ${requiredSnapshotPath}`);
936
+ }
937
+ }
938
+ };
939
+ export const bindIsolatedRestoreGrantToPlan = async (grantArg, expectedOperationArg, resourceMappingsArg, archiveManifestArg) => {
940
+ const grant = requireVerifiedIsolatedRestoreGrant(grantArg);
941
+ const claims = assertIsolatedRestoreGrantOperation(grant, expectedOperationArg);
942
+ const resourceMappings = normalizeIsolatedRestoreResourceMappings(resourceMappingsArg);
943
+ const archiveManifest = normalizeIsolatedRestoreArchiveManifest(archiveManifestArg);
944
+ assertPlanRelationships(claims, resourceMappings, archiveManifest);
945
+ const [resourceMappingsSha256, archiveManifestSha256] = await Promise.all([
946
+ createIsolatedRestoreResourceMappingsSha256(resourceMappings),
947
+ createIsolatedRestoreArchiveManifestSha256(archiveManifest),
948
+ ]);
949
+ if (resourceMappingsSha256 !== claims.resourceMappingsSha256) {
950
+ return fail('resourceMappings digest does not match the restore grant');
951
+ }
952
+ if (archiveManifestSha256 !== claims.archiveManifestSha256) {
953
+ return fail('archiveManifest digest does not match the restore grant');
954
+ }
955
+ const authority = createIsolatedRestoreAuthorityProjection(claims);
956
+ const authoritySha256 = await createIsolatedRestoreAuthoritySha256(authority);
957
+ return deepFreeze({
958
+ authority,
959
+ authoritySha256,
960
+ claims,
961
+ resourceMappings,
962
+ archiveManifest,
963
+ });
964
+ };
965
+ export const bindIsolatedRestorePrepareRequestToGrant = async (grantArg, requestArg) => {
966
+ const grant = requireVerifiedIsolatedRestoreGrant(grantArg);
967
+ const normalizedRequest = normalizeIsolatedRestoreControlPrepareRequest(requestArg);
968
+ assertControlRequestUsesVerifiedGrant(grant, normalizedRequest.restoreGrant);
969
+ const plan = await bindIsolatedRestoreGrantToPlan(grant, 'prepare', normalizedRequest.resourceMappings, normalizedRequest.archiveManifest);
970
+ const request = {
971
+ expectedRevision: normalizedRequest.expectedRevision,
972
+ resourceMappings: plan.resourceMappings,
973
+ archiveManifest: plan.archiveManifest,
974
+ };
975
+ return deepFreeze({
976
+ authority: plan.authority,
977
+ authoritySha256: plan.authoritySha256,
978
+ claims: plan.claims,
979
+ request,
980
+ });
981
+ };
982
+ const bindSanitizedControlRequestToGrant = async (grantArg, expectedOperationArg, compactArg, requestArg, resourceMappingsArg, archiveManifestArg) => {
983
+ const grant = requireVerifiedIsolatedRestoreGrant(grantArg);
984
+ assertControlRequestUsesVerifiedGrant(grant, compactArg);
985
+ const plan = await bindIsolatedRestoreGrantToPlan(grant, expectedOperationArg, resourceMappingsArg, archiveManifestArg);
986
+ return deepFreeze({
987
+ authority: plan.authority,
988
+ authoritySha256: plan.authoritySha256,
989
+ claims: plan.claims,
990
+ request: requestArg,
991
+ plan,
992
+ });
993
+ };
994
+ export const bindIsolatedRestoreExecuteRequestToGrant = async (grantArg, requestArg, resourceMappingsArg, archiveManifestArg) => {
995
+ const normalizedRequest = normalizeIsolatedRestoreControlExecuteRequest(requestArg);
996
+ const request = {
997
+ expectedRevision: normalizedRequest.expectedRevision,
998
+ };
999
+ return bindSanitizedControlRequestToGrant(grantArg, 'execute', normalizedRequest.restoreGrant, request, resourceMappingsArg, archiveManifestArg);
1000
+ };
1001
+ export const bindIsolatedRestoreCleanupRequestToGrant = async (grantArg, requestArg, resourceMappingsArg, archiveManifestArg) => {
1002
+ const normalizedRequest = normalizeIsolatedRestoreControlCleanupRequest(requestArg);
1003
+ const request = {
1004
+ expectedRevision: normalizedRequest.expectedRevision,
1005
+ };
1006
+ return bindSanitizedControlRequestToGrant(grantArg, 'cleanup', normalizedRequest.restoreGrant, request, resourceMappingsArg, archiveManifestArg);
1007
+ };
1008
+ export const bindIsolatedRestoreStatusRequestToGrant = async (grantArg, requestArg, resourceMappingsArg, archiveManifestArg) => {
1009
+ const normalizedRequest = normalizeIsolatedRestoreControlStatusRequest(requestArg);
1010
+ const request = {};
1011
+ return bindSanitizedControlRequestToGrant(grantArg, 'status', normalizedRequest.restoreGrant, request, resourceMappingsArg, archiveManifestArg);
1012
+ };
1013
+ export const bindIsolatedRestoreWriteRequestToGrant = async (grantArg, requestArg, resourceMappingsArg, archiveManifestArg) => {
1014
+ const grant = requireVerifiedIsolatedRestoreGrant(grantArg);
1015
+ const request = normalizeIsolatedRestoreControlWriteRequest(requestArg);
1016
+ assertControlRequestUsesVerifiedGrant(grant, request.restoreGrant);
1017
+ const plan = await bindIsolatedRestoreGrantToPlan(grant, 'write-object', resourceMappingsArg, archiveManifestArg);
1018
+ const descriptor = plan.archiveManifest.objects.find((objectArg) => objectArg.path === request.path);
1019
+ if (!descriptor) {
1020
+ return fail(`write request path ${request.path} is absent from the immutable manifest`);
1021
+ }
1022
+ if (descriptor.size !== request.size || descriptor.sha256 !== request.sha256) {
1023
+ return fail(`write request descriptor for ${request.path} does not match the immutable manifest`);
1024
+ }
1025
+ const contents = decodeCanonicalBase64(request.contentsBase64, 'write request.contentsBase64');
1026
+ const actualChunkSha256 = await createIsolatedRestoreBytesSha256(contents);
1027
+ if (actualChunkSha256 !== request.chunkSha256) {
1028
+ return fail(`write request chunk checksum mismatch for ${request.path}`);
1029
+ }
1030
+ const sanitizedRequest = {
1031
+ expectedRevision: request.expectedRevision,
1032
+ path: request.path,
1033
+ size: request.size,
1034
+ sha256: request.sha256,
1035
+ offset: request.offset,
1036
+ chunkSha256: request.chunkSha256,
1037
+ contentsBase64: request.contentsBase64,
1038
+ };
1039
+ const bound = deepFreeze({
1040
+ authority: plan.authority,
1041
+ authoritySha256: plan.authoritySha256,
1042
+ claims: plan.claims,
1043
+ request: sanitizedRequest,
1044
+ descriptor,
1045
+ chunk: {
1046
+ contentsBase64: request.contentsBase64,
1047
+ decodedSize: contents.byteLength,
1048
+ sha256: actualChunkSha256,
1049
+ },
1050
+ endsAtObjectSize: request.offset + contents.byteLength === descriptor.size,
1051
+ });
1052
+ verifiedIsolatedRestoreWriteBindings.add(bound);
1053
+ return bound;
1054
+ };
1055
+ const requireBoundWriteRequest = (bindingArg) => {
1056
+ if (!bindingArg ||
1057
+ typeof bindingArg !== 'object' ||
1058
+ !verifiedIsolatedRestoreWriteBindings.has(bindingArg)) {
1059
+ return fail('write binding was not produced by bindIsolatedRestoreWriteRequestToGrant');
1060
+ }
1061
+ return bindingArg;
1062
+ };
1063
+ /** Returns a fresh caller-owned copy; verified bindings never expose mutable bytes. */
1064
+ export const decodeIsolatedRestoreBoundWriteChunk = (bindingArg) => {
1065
+ const binding = requireBoundWriteRequest(bindingArg);
1066
+ return decodeCanonicalBase64(binding.chunk.contentsBase64, 'verified write chunk.contentsBase64');
1067
+ };
1068
+ const createDurableChunkReceiptPayload = (receiptArg) => {
1069
+ return {
1070
+ version: 1,
1071
+ authority: receiptArg.authority,
1072
+ authoritySha256: receiptArg.authoritySha256,
1073
+ descriptor: receiptArg.descriptor,
1074
+ offset: receiptArg.offset,
1075
+ decodedSize: receiptArg.decodedSize,
1076
+ chunkSha256: receiptArg.chunkSha256,
1077
+ };
1078
+ };
1079
+ const createDurableChunkReceiptSha256 = async (payloadArg) => {
1080
+ return createCanonicalJsonSha256(canonicalizeJson(payloadArg));
1081
+ };
1082
+ export const normalizeIsolatedRestoreDurableChunkReceipt = (valueArg) => {
1083
+ const receipt = readRecord(valueArg, 'durable chunk receipt');
1084
+ assertExactKeys(receipt, [
1085
+ 'version',
1086
+ 'authority',
1087
+ 'authoritySha256',
1088
+ 'descriptor',
1089
+ 'offset',
1090
+ 'decodedSize',
1091
+ 'chunkSha256',
1092
+ 'receiptSha256',
1093
+ ], 'durable chunk receipt');
1094
+ if (receipt.version !== 1) {
1095
+ return fail('durable chunk receipt.version must be 1');
1096
+ }
1097
+ const authority = normalizeIsolatedRestoreAuthorityProjection(receipt.authority);
1098
+ const descriptorRecord = readRecord(receipt.descriptor, 'durable chunk receipt.descriptor');
1099
+ assertExactKeys(descriptorRecord, ['path', 'size', 'sha256'], 'durable chunk receipt.descriptor');
1100
+ const descriptor = deepFreeze({
1101
+ path: readRepositoryPath(descriptorRecord.path, 'durable chunk receipt.descriptor.path'),
1102
+ size: readSafeInteger(descriptorRecord.size, 'durable chunk receipt.descriptor.size', 0, isolatedRestoreContractLimits.maximumArchiveObjectBytes),
1103
+ sha256: readSha256(descriptorRecord.sha256, 'durable chunk receipt.descriptor.sha256'),
1104
+ });
1105
+ const offset = readSafeInteger(receipt.offset, 'durable chunk receipt.offset', 0, descriptor.size);
1106
+ const decodedSize = readSafeInteger(receipt.decodedSize, 'durable chunk receipt.decodedSize', 0, isolatedRestoreContractLimits.maximumWriteChunkBytes);
1107
+ if (descriptor.size === 0) {
1108
+ if (offset !== 0 || decodedSize !== 0) {
1109
+ return fail('durable chunk receipt for an empty object must describe one empty range at offset 0');
1110
+ }
1111
+ }
1112
+ else if (decodedSize === 0 ||
1113
+ offset >= descriptor.size ||
1114
+ offset + decodedSize > descriptor.size) {
1115
+ return fail('durable chunk receipt range does not fit its immutable descriptor');
1116
+ }
1117
+ return deepFreeze({
1118
+ version: 1,
1119
+ authority,
1120
+ authoritySha256: readSha256(receipt.authoritySha256, 'durable chunk receipt.authoritySha256'),
1121
+ descriptor,
1122
+ offset,
1123
+ decodedSize,
1124
+ chunkSha256: readSha256(receipt.chunkSha256, 'durable chunk receipt.chunkSha256'),
1125
+ receiptSha256: readSha256(receipt.receiptSha256, 'durable chunk receipt.receiptSha256'),
1126
+ });
1127
+ };
1128
+ /**
1129
+ * Rehydrates a trusted-store receipt and verifies both consistency digests.
1130
+ * This does not replace verification of the grant that originally produced it.
1131
+ */
1132
+ export const verifyIsolatedRestoreDurableChunkReceipt = async (valueArg) => {
1133
+ const receipt = normalizeIsolatedRestoreDurableChunkReceipt(valueArg);
1134
+ const authoritySha256 = await createIsolatedRestoreAuthoritySha256(receipt.authority);
1135
+ if (authoritySha256 !== receipt.authoritySha256) {
1136
+ return fail('durable chunk receipt authority checksum mismatch');
1137
+ }
1138
+ const receiptSha256 = await createDurableChunkReceiptSha256(createDurableChunkReceiptPayload(receipt));
1139
+ if (receiptSha256 !== receipt.receiptSha256) {
1140
+ return fail('durable chunk receipt checksum mismatch');
1141
+ }
1142
+ return receipt;
1143
+ };
1144
+ /**
1145
+ * Creates a bearer-free receipt only from a runtime-verified write binding.
1146
+ * Persist the result in authenticated/trusted Corestore state for recovery.
1147
+ */
1148
+ export const createIsolatedRestoreDurableChunkReceipt = async (bindingArg) => {
1149
+ const binding = requireBoundWriteRequest(bindingArg);
1150
+ const payload = {
1151
+ version: 1,
1152
+ authority: binding.authority,
1153
+ authoritySha256: binding.authoritySha256,
1154
+ descriptor: binding.descriptor,
1155
+ offset: binding.request.offset,
1156
+ decodedSize: binding.chunk.decodedSize,
1157
+ chunkSha256: binding.chunk.sha256,
1158
+ };
1159
+ const receiptSha256 = await createDurableChunkReceiptSha256(payload);
1160
+ return deepFreeze({ ...payload, receiptSha256 });
1161
+ };
1162
+ /**
1163
+ * Rehydrates ordered trusted-store receipts and verifies them against one
1164
+ * defensive snapshot of the complete staged file. Per-range and full-file
1165
+ * SHA-256 checks bind the resulting proof to authority, object, and receipt set.
1166
+ */
1167
+ export const verifyIsolatedRestoreDurableCompletedObject = async (receiptsArg, contentsArg) => {
1168
+ if (!(contentsArg instanceof Uint8Array)) {
1169
+ return fail('durable completed object contents must be a Uint8Array');
1170
+ }
1171
+ if (contentsArg.byteLength >
1172
+ isolatedRestoreContractLimits.maximumArchiveObjectBytes) {
1173
+ return fail(`durable completed object snapshot exceeds the ${isolatedRestoreContractLimits.maximumArchiveObjectBytes}-byte object limit`);
1174
+ }
1175
+ const receiptEntries = readDenseArray(receiptsArg, 'durable completed object receipts', 1, isolatedRestoreContractLimits.maximumObjectChunks);
1176
+ const contentsSnapshot = new Uint8Array(contentsArg);
1177
+ const first = await verifyIsolatedRestoreDurableChunkReceipt(receiptEntries[0]);
1178
+ if (first.descriptor.size === 0 && receiptEntries.length !== 1) {
1179
+ return fail('durable completed object for an empty descriptor must contain exactly one receipt');
1180
+ }
1181
+ const receipts = [first];
1182
+ for (let index = 1; index < receiptEntries.length; index++) {
1183
+ receipts.push(await verifyIsolatedRestoreDurableChunkReceipt(receiptEntries[index]));
1184
+ }
1185
+ const authority = first.authority;
1186
+ const authoritySha256 = first.authoritySha256;
1187
+ const authorityCanonicalJson = canonicalizeIsolatedRestoreAuthorityProjection(authority);
1188
+ const descriptor = first.descriptor;
1189
+ if (contentsSnapshot.byteLength !== descriptor.size) {
1190
+ return fail(`durable completed object snapshot contains ${contentsSnapshot.byteLength} of ${descriptor.size} bytes`);
1191
+ }
1192
+ let expectedOffset = 0;
1193
+ for (const receipt of receipts) {
1194
+ if (receipt.authoritySha256 !== authoritySha256 ||
1195
+ canonicalizeIsolatedRestoreAuthorityProjection(receipt.authority) !==
1196
+ authorityCanonicalJson) {
1197
+ return fail('durable completed object receipts do not share one stable authority');
1198
+ }
1199
+ if (receipt.descriptor.path !== descriptor.path ||
1200
+ receipt.descriptor.size !== descriptor.size ||
1201
+ receipt.descriptor.sha256 !== descriptor.sha256) {
1202
+ return fail('durable completed object receipts do not share one immutable descriptor');
1203
+ }
1204
+ if (receipt.offset !== expectedOffset) {
1205
+ return fail(`durable completed object receipts are not contiguous at offset ${expectedOffset}`);
1206
+ }
1207
+ const rangeEnd = receipt.offset + receipt.decodedSize;
1208
+ const rangeSha256 = await createIsolatedRestoreBytesSha256(contentsSnapshot.subarray(receipt.offset, rangeEnd));
1209
+ if (rangeSha256 !== receipt.chunkSha256) {
1210
+ return fail(`durable completed object chunk checksum mismatch at offset ${receipt.offset}`);
1211
+ }
1212
+ expectedOffset = rangeEnd;
1213
+ }
1214
+ if (expectedOffset !== descriptor.size) {
1215
+ return fail(`durable completed object receipts cover ${expectedOffset} of ${descriptor.size} bytes`);
1216
+ }
1217
+ const sha256 = await createIsolatedRestoreBytesSha256(contentsSnapshot);
1218
+ if (sha256 !== descriptor.sha256) {
1219
+ return fail(`durable completed object checksum mismatch for ${descriptor.path}`);
1220
+ }
1221
+ const receiptSetSha256 = await createCanonicalJsonSha256(canonicalizeJson(receipts));
1222
+ const proofPayload = {
1223
+ version: 1,
1224
+ authority,
1225
+ authoritySha256,
1226
+ descriptor,
1227
+ chunkCount: receipts.length,
1228
+ contiguousBytes: expectedOffset,
1229
+ sha256,
1230
+ receiptSetSha256,
1231
+ };
1232
+ const proofSha256 = await createCanonicalJsonSha256(canonicalizeJson(proofPayload));
1233
+ return deepFreeze({ ...proofPayload, proofSha256 });
1234
+ };
1235
+ /**
1236
+ * Process-local completion convenience for runtime-branded chunks. It does not
1237
+ * survive restart. Enterprise/Corestore workflows must persist durable chunk
1238
+ * receipts and call verifyIsolatedRestoreDurableCompletedObject after recovery.
1239
+ * Chunks must share one authority and descriptor, cover [0, size) contiguously,
1240
+ * and hash to the complete manifest descriptor.
1241
+ */
1242
+ export const bindIsolatedRestoreCompletedObject = async (bindingsArg) => {
1243
+ const entries = readDenseArray(bindingsArg, 'completed object chunks', 1, isolatedRestoreContractLimits.maximumObjectChunks);
1244
+ const first = requireBoundWriteRequest(entries[0]);
1245
+ const authority = first.authority;
1246
+ const authoritySha256 = first.authoritySha256;
1247
+ const authorityCanonicalJson = canonicalizeIsolatedRestoreAuthorityProjection(authority);
1248
+ const descriptor = first.descriptor;
1249
+ if (descriptor.size === 0 && entries.length !== 1) {
1250
+ return fail('completed object for an empty descriptor must contain exactly one chunk');
1251
+ }
1252
+ const completeContents = new Uint8Array(descriptor.size);
1253
+ let expectedOffset = 0;
1254
+ for (const entry of entries) {
1255
+ const binding = requireBoundWriteRequest(entry);
1256
+ if (binding.authoritySha256 !== authoritySha256 ||
1257
+ canonicalizeIsolatedRestoreAuthorityProjection(binding.authority) !==
1258
+ authorityCanonicalJson) {
1259
+ return fail('completed object chunks do not share one stable authority');
1260
+ }
1261
+ if (binding.descriptor.path !== descriptor.path ||
1262
+ binding.descriptor.size !== descriptor.size ||
1263
+ binding.descriptor.sha256 !== descriptor.sha256) {
1264
+ return fail('completed object chunks do not share one immutable descriptor');
1265
+ }
1266
+ if (binding.request.offset !== expectedOffset) {
1267
+ return fail(`completed object chunks are not contiguous at offset ${expectedOffset}`);
1268
+ }
1269
+ const contents = decodeIsolatedRestoreBoundWriteChunk(binding);
1270
+ completeContents.set(contents, expectedOffset);
1271
+ expectedOffset += contents.byteLength;
1272
+ }
1273
+ if (expectedOffset !== descriptor.size) {
1274
+ return fail(`completed object chunks cover ${expectedOffset} of ${descriptor.size} bytes`);
1275
+ }
1276
+ const sha256 = await createIsolatedRestoreBytesSha256(completeContents);
1277
+ if (sha256 !== descriptor.sha256) {
1278
+ return fail(`completed object checksum mismatch for ${descriptor.path}`);
1279
+ }
1280
+ const completed = deepFreeze({
1281
+ authority,
1282
+ authoritySha256,
1283
+ descriptor,
1284
+ chunkCount: entries.length,
1285
+ contiguousBytes: expectedOffset,
1286
+ sha256,
1287
+ });
1288
+ completedIsolatedRestoreObjects.add(completed);
1289
+ return completed;
1290
+ };
1291
+ export const assertIsolatedRestoreCompletedObject = (completedArg) => {
1292
+ if (!completedArg ||
1293
+ typeof completedArg !== 'object' ||
1294
+ !completedIsolatedRestoreObjects.has(completedArg)) {
1295
+ return fail('completed object must be produced by bindIsolatedRestoreCompletedObject');
1296
+ }
1297
+ return completedArg;
1298
+ };
1299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNvbGF0ZWRyZXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9pc29sYXRlZHJlc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDMUQsU0FBUztJQUNULGNBQWM7SUFDZCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7Q0FDQSxDQUFDLENBQUM7QUFLWjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDekQsT0FBTyxFQUFFLENBQVU7SUFDbkIsdUJBQXVCLEVBQUUsSUFBSSxHQUFHLElBQUk7SUFDcEMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDbkMsNEJBQTRCLEVBQUUsSUFBSTtJQUNsQyxnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLHVCQUF1QixFQUFFLEdBQUc7SUFDNUIscUJBQXFCLEVBQUUsSUFBSTtJQUMzQiw4QkFBOEIsRUFBRSxHQUFHO0lBQ25DLHNDQUFzQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUN2RCx5QkFBeUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7SUFDM0Msd0JBQXdCLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUNqRCxzQkFBc0IsRUFBRSxHQUFHLEdBQUcsSUFBSTtJQUNsQyxpQ0FBaUMsRUFBRSxPQUFPO0lBQzFDLG1CQUFtQixFQUFFLElBQUk7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEUsT0FBTyxFQUFFLENBQVU7SUFDbkIsVUFBVSxFQUFFLGFBQXNCO0lBQ2xDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxN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