diff --git a/package-lock.json b/package-lock.json index fd25759..f8c7f0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "@fastify/rate-limit": "^10.3.0", "@prisma/client": "^5.17.0", "ethers": "^6.12.0", - "fastify": "5.8.3", + "fastify": "^5.8.3", "openai": "^6.17.0", "pdf2json": "^3.1.4", "pdfkit": "^0.15.0", diff --git a/packages/core/src/anchor/portable.test.ts b/packages/core/src/anchor/portable.test.ts new file mode 100644 index 0000000..8868412 --- /dev/null +++ b/packages/core/src/anchor/portable.test.ts @@ -0,0 +1,112 @@ +import { describe, expect, it, vi } from 'vitest'; + +import type { AnchorProof, AnchorProvider } from './portable.js'; +import { PortableAnchorManager } from './portable.js'; + +function makeMockProvider(chainId: string): AnchorProvider & { + anchor: ReturnType; + verifyAnchor: ReturnType; +} { + return { + chainId, + anchor: vi.fn().mockResolvedValue({ chainId, txHash: `0xtx-${chainId}`, blockNumber: 1 }), + verifyAnchor: vi.fn().mockResolvedValue(true) + }; +} + +describe('PortableAnchorManager', () => { + it('anchors receipt using the active provider', async () => { + const provider = makeMockProvider('polygon-mumbai'); + const manager = new PortableAnchorManager(provider); + + const proof = await manager.anchorReceipt('0xreceipthash'); + + expect(provider.anchor).toHaveBeenCalledWith('0xreceipthash'); + expect(proof.txHash).toBe('0xtx-polygon-mumbai'); + }); + + it('verifies proof using active provider when chainId matches', async () => { + const provider = makeMockProvider('polygon-mumbai'); + const manager = new PortableAnchorManager(provider); + + const proof: AnchorProof = { chainId: 'polygon-mumbai', txHash: '0xtx' }; + const result = await manager.verifyHistoricalProof(proof); + + expect(result).toBe(true); + expect(provider.verifyAnchor).toHaveBeenCalledWith(proof); + }); + + it('verifies historical proof using archived provider after chain switch', async () => { + const oldProvider = makeMockProvider('ethereum'); + const newProvider = makeMockProvider('polygon-mumbai'); + const manager = new PortableAnchorManager(oldProvider); + + await manager.switchAnchorChain(newProvider); + + const historicalProof: AnchorProof = { chainId: 'ethereum', txHash: '0xold-tx' }; + const result = await manager.verifyHistoricalProof(historicalProof); + + expect(result).toBe(true); + expect(oldProvider.verifyAnchor).toHaveBeenCalledWith(historicalProof); + }); + + it('archives old provider when switching chains', async () => { + const oldProvider = makeMockProvider('ethereum'); + const newProvider = makeMockProvider('polygon-mumbai'); + const manager = new PortableAnchorManager(oldProvider); + + await manager.switchAnchorChain(newProvider); + + // New receipts should use the new provider + await manager.anchorReceipt('0xnewreceipt'); + expect(newProvider.anchor).toHaveBeenCalledWith('0xnewreceipt'); + expect(oldProvider.anchor).not.toHaveBeenCalled(); + }); + + it('throws when no provider found for historical chain', async () => { + const provider = makeMockProvider('polygon-mumbai'); + const manager = new PortableAnchorManager(provider); + + const unknownProof: AnchorProof = { chainId: 'unknown-chain', txHash: '0xtx' }; + + await expect(manager.verifyHistoricalProof(unknownProof)).rejects.toThrow( + 'No provider found for chain unknown-chain' + ); + }); + + it('supports multiple chain switches and maintains full history', async () => { + const provider1 = makeMockProvider('chain-1'); + const provider2 = makeMockProvider('chain-2'); + const provider3 = makeMockProvider('chain-3'); + + const manager = new PortableAnchorManager(provider1); + await manager.switchAnchorChain(provider2); + await manager.switchAnchorChain(provider3); + + // chain-1 should still be accessible + const proof1: AnchorProof = { chainId: 'chain-1', txHash: '0xtx1' }; + await manager.verifyHistoricalProof(proof1); + expect(provider1.verifyAnchor).toHaveBeenCalledWith(proof1); + + // chain-2 should also be accessible + const proof2: AnchorProof = { chainId: 'chain-2', txHash: '0xtx2' }; + await manager.verifyHistoricalProof(proof2); + expect(provider2.verifyAnchor).toHaveBeenCalledWith(proof2); + + // chain-3 is active - verifyHistoricalProof uses active provider + const proof3: AnchorProof = { chainId: 'chain-3', txHash: '0xtx3' }; + await manager.verifyHistoricalProof(proof3); + expect(provider3.verifyAnchor).toHaveBeenCalledWith(proof3); + }); + + it('returns false when active provider verifyAnchor returns false', async () => { + const provider = makeMockProvider('chain-a'); + provider.verifyAnchor.mockResolvedValue(false); + const manager = new PortableAnchorManager(provider); + + const proof: AnchorProof = { chainId: 'chain-a', txHash: '0xinvalid' }; + const result = await manager.verifyHistoricalProof(proof); + + expect(result).toBe(false); + }); +}); diff --git a/packages/core/src/attom/normalize.test.ts b/packages/core/src/attom/normalize.test.ts new file mode 100644 index 0000000..aab0783 --- /dev/null +++ b/packages/core/src/attom/normalize.test.ts @@ -0,0 +1,272 @@ +import { describe, expect, it } from 'vitest'; + +import { + addressSimilarity, + canonicalDeedHash, + nameOverlapScore, + normalizeAddress, + normalizeName, + normalizePin, + redact, + tokenOverlap +} from './normalize.js'; +import type { DeedParsed } from './types.js'; + +describe('normalizePin', () => { + it('returns null for null input', () => { + expect(normalizePin(null)).toBeNull(); + }); + + it('returns null for undefined input', () => { + expect(normalizePin(undefined)).toBeNull(); + }); + + it('returns null for empty string', () => { + expect(normalizePin('')).toBeNull(); + }); + + it('strips non-alphanumeric characters and uppercases', () => { + expect(normalizePin('12-34-567-890-0000')).toBe('12345678900000'); + }); + + it('preserves alphanumeric characters', () => { + expect(normalizePin('ABC123')).toBe('ABC123'); + }); + + it('handles already normalized PIN', () => { + expect(normalizePin('ABC123DEF')).toBe('ABC123DEF'); + }); + + it('converts lowercase to uppercase', () => { + expect(normalizePin('abc123')).toBe('ABC123'); + }); +}); + +describe('normalizeAddress', () => { + const base = { line1: ' 123 main st ', city: 'chicago', state: 'il', zip: '60601' }; + + it('uppercases and trims line1', () => { + const result = normalizeAddress(base); + expect(result.line1).toBe('123 MAIN ST'); + }); + + it('uppercases city', () => { + const result = normalizeAddress(base); + expect(result.city).toBe('CHICAGO'); + }); + + it('uppercases state', () => { + const result = normalizeAddress(base); + expect(result.state).toBe('IL'); + }); + + it('trims zip to 5 characters', () => { + const result = normalizeAddress({ ...base, zip: '60601-1234' }); + expect(result.zip).toBe('60601'); + }); + + it('handles null-like values with empty string fallback', () => { + const result = normalizeAddress({ line1: null as unknown as string, city: undefined as unknown as string, state: 'TX', zip: '75001' }); + expect(result.line1).toBe(''); + expect(result.city).toBe(''); + }); + + it('handles zip when null-like via OR fallback', () => { + const result = normalizeAddress({ line1: '123 St', city: 'City', state: 'CA', zip: null as unknown as string }); + expect(result.zip).toBe(''); + }); + + +describe('addressSimilarity', () => { + const deedAddr = { line1: '123 Main St', city: 'Chicago', state: 'IL', zip: '60601' }; + const attomAddr = { line1: '123 MAIN ST', city: 'CHICAGO', state: 'IL', zip: '60601' }; + + it('returns street_zip level and score 1 for full match', () => { + const result = addressSimilarity(deedAddr, attomAddr); + expect(result.level).toBe('street_zip'); + expect(result.score).toBe(1); + }); + + it('returns street level when street matches but zip differs', () => { + const result = addressSimilarity(deedAddr, { ...attomAddr, zip: '60699' }); + expect(result.level).toBe('street'); + expect(result.score).toBe(0.75); + }); + + it('returns city_state level when only city and state match', () => { + const result = addressSimilarity(deedAddr, { ...attomAddr, line1: '999 Other St', zip: '60699' }); + expect(result.level).toBe('city_state'); + expect(result.score).toBe(0.5); + }); + + it('handles undefined attomAddr properties with empty string fallback', () => { + const result = addressSimilarity( + { line1: '123 Main St', city: 'Chicago', state: 'IL', zip: '60601' }, + { line1: undefined as unknown as string, city: undefined as unknown as string, state: undefined as unknown as string, zip: undefined as unknown as string } + ); + expect(result.level).toBe('none'); + expect(result.score).toBe(0); + }); + + const result = addressSimilarity( + deedAddr, + { line1: '999 Other Rd', city: 'Springfield', state: 'MO', zip: '65000' } + ); + expect(result.level).toBe('none'); + expect(result.score).toBe(0); + }); +}); + +describe('normalizeName', () => { + it('removes LLC suffix', () => { + expect(normalizeName('ACME LLC')).toBe('ACME'); + }); + + it('expands Limited Liability Company to LLC then removes it', () => { + expect(normalizeName('ACME Limited Liability Company')).toBe('ACME'); + }); + + it('removes INC suffix', () => { + expect(normalizeName('Big Corp Inc')).toBe('BIG CORP'); + }); + + it('removes TRUST suffix', () => { + expect(normalizeName('Smith Family Trust')).toBe('SMITH FAMILY'); + }); + + it('removes ET AL suffix', () => { + expect(normalizeName('John Doe Et Al')).toBe('JOHN DOE'); + }); + + it('uppercases the result', () => { + expect(normalizeName('john doe')).toBe('JOHN DOE'); + }); + + it('strips non-alphanumeric characters (except spaces)', () => { + expect(normalizeName('Smith & Jones')).toBe('SMITH JONES'); + }); +}); + +describe('tokenOverlap', () => { + it('returns 0 for empty arrays', () => { + expect(tokenOverlap([], [])).toBe(0); + }); + + it('returns 0 when one array is empty', () => { + expect(tokenOverlap(['a', 'b'], [])).toBe(0); + }); + + it('returns 1.0 for identical token sets', () => { + expect(tokenOverlap(['A', 'B'], ['A', 'B'])).toBe(1); + }); + + it('returns 0 for completely disjoint sets', () => { + expect(tokenOverlap(['A', 'B'], ['C', 'D'])).toBe(0); + }); + + it('computes partial overlap correctly', () => { + // intersection = {A}, union = {A, B, C} + const result = tokenOverlap(['A', 'B'], ['A', 'C']); + expect(result).toBeCloseTo(1 / 3); + }); +}); + +describe('nameOverlapScore', () => { + it('returns 0 for empty deed names', () => { + expect(nameOverlapScore([], ['BUYER LLC'])).toBe(0); + }); + + it('returns 0 for empty attom names', () => { + expect(nameOverlapScore(['BUYER LLC'], [])).toBe(0); + }); + + it('returns high score for matching names after normalization', () => { + const score = nameOverlapScore(['Buyer Limited Liability Company'], ['BUYER LLC']); + expect(score).toBeGreaterThan(0.8); + }); + + it('returns 0 for completely different names', () => { + const score = nameOverlapScore(['Smith Family Trust'], ['Jones Inc']); + expect(score).toBe(0); + }); +}); + +describe('canonicalDeedHash', () => { + const baseDeed: DeedParsed = { + jurisdiction: { state: 'IL', county: 'Cook' }, + pin: '12-34-567', + address: { line1: '123 Main St', city: 'Chicago', state: 'IL', zip: '60601' }, + legalDescriptionText: 'LOT 1', + grantors: ['Seller'], + grantees: ['Buyer'], + executionDate: '2024-01-10', + recording: { docNumber: 'DOC-001', recordingDate: '2024-01-12' }, + notary: { name: 'Jane Doe', commissionExpiration: '2025-01-01', state: 'IL' } + }; + + it('returns a 64-character hex string', () => { + const hash = canonicalDeedHash(baseDeed); + expect(hash).toMatch(/^[0-9a-f]{64}$/); + }); + + it('returns same hash for identical deeds', () => { + expect(canonicalDeedHash(baseDeed)).toBe(canonicalDeedHash({ ...baseDeed })); + }); + + it('returns different hash when PIN changes', () => { + const h1 = canonicalDeedHash(baseDeed); + const h2 = canonicalDeedHash({ ...baseDeed, pin: '99-99-999' }); + expect(h1).not.toBe(h2); + }); + + it('handles null PIN gracefully', () => { + const hash = canonicalDeedHash({ ...baseDeed, pin: null }); + expect(hash).toMatch(/^[0-9a-f]{64}$/); + }); + + it('handles null recording fields with empty string fallback', () => { + const deed: DeedParsed = { + ...baseDeed, + recording: { + docNumber: null as unknown as string, + recordingDate: null as unknown as string + } + }; + const hash = canonicalDeedHash(deed); + expect(hash).toMatch(/^[0-9a-f]{64}$/); + // Verify it's different from full-data hash + expect(hash).not.toBe(canonicalDeedHash(baseDeed)); + }); + + it('handles undefined legalDescriptionText gracefully', () => { + const hash = canonicalDeedHash({ ...baseDeed, legalDescriptionText: undefined }); + expect(hash).toMatch(/^[0-9a-f]{64}$/); + }); +}); + +describe('redact', () => { + it('returns null for null input', () => { + expect(redact(null)).toBeNull(); + }); + + it('returns null for undefined input', () => { + expect(redact(undefined)).toBeNull(); + }); + + it('returns null for empty string', () => { + expect(redact('')).toBeNull(); + }); + + it('returns a hash: prefixed string for non-empty input', () => { + const result = redact('sensitive-value'); + expect(result).toMatch(/^hash:[0-9a-f]{10}$/); + }); + + it('produces consistent hash for the same input', () => { + expect(redact('abc')).toBe(redact('abc')); + }); + + it('produces different hash for different inputs', () => { + expect(redact('abc')).not.toBe(redact('xyz')); + }); +}); diff --git a/packages/core/src/receipt.test.ts b/packages/core/src/receipt.test.ts new file mode 100644 index 0000000..f7cc0fe --- /dev/null +++ b/packages/core/src/receipt.test.ts @@ -0,0 +1,204 @@ +import { describe, expect, it } from 'vitest'; + +import { buildReceipt, computeInputsCommitment, computeReceiptHash, toUnsignedReceiptPayload } from './receipt.js'; +import type { BundleInput, Receipt, VerificationResult } from './types.js'; + +const baseBundle: BundleInput = { + bundleId: 'BUNDLE-001', + transactionType: 'warranty', + ron: { + provider: 'RON-1', + notaryId: 'NOTARY-1', + commissionState: 'CA', + sealPayload: 'v1:mock-sig' + }, + doc: { docHash: '0xabcdef' }, + property: { parcelId: 'PARCEL-1', county: 'Cook', state: 'IL' }, + policy: { profile: 'STANDARD_CA' }, + timestamp: '2024-01-01T00:00:00.000Z' +}; + +const baseVerification: VerificationResult = { + decision: 'ALLOW', + reasons: [], + riskScore: 0.1, + checks: [{ checkId: 'notary', status: 'PASS' }] +}; + +describe('computeInputsCommitment', () => { + it('returns a non-empty hex string', () => { + const commitment = computeInputsCommitment(baseBundle); + expect(commitment).toMatch(/^0x[0-9a-fA-F]+$/); + }); + + it('returns same value for identical inputs', () => { + const c1 = computeInputsCommitment(baseBundle); + const c2 = computeInputsCommitment({ ...baseBundle }); + expect(c1).toBe(c2); + }); + + it('returns different value when bundle content changes', () => { + const c1 = computeInputsCommitment(baseBundle); + const c2 = computeInputsCommitment({ ...baseBundle, bundleId: 'BUNDLE-002' }); + expect(c1).not.toBe(c2); + }); + + it('is order-independent for object keys (canonical)', () => { + const bundle1 = { ...baseBundle, doc: { docHash: '0x111' } }; + // Same keys in different order - computeInputsCommitment uses canonicalizeJson + const bundle2: BundleInput = { + transactionType: bundle1.transactionType, + bundleId: bundle1.bundleId, + ron: bundle1.ron, + doc: bundle1.doc, + property: bundle1.property, + policy: bundle1.policy, + timestamp: bundle1.timestamp + }; + const c1 = computeInputsCommitment(bundle1); + const c2 = computeInputsCommitment(bundle2); + expect(c1).toBe(c2); + }); +}); + +describe('computeReceiptHash', () => { + it('returns a non-empty hex string', () => { + const receipt = buildReceipt(baseBundle, baseVerification); + const payload = toUnsignedReceiptPayload(receipt); + const hash = computeReceiptHash(payload); + expect(hash).toMatch(/^0x[0-9a-fA-F]+$/); + }); + + it('produces stable hash for same payload', () => { + const receipt = buildReceipt(baseBundle, baseVerification); + const payload = toUnsignedReceiptPayload(receipt); + const h1 = computeReceiptHash(payload); + const h2 = computeReceiptHash(payload); + expect(h1).toBe(h2); + }); +}); + +describe('buildReceipt', () => { + it('returns a receipt with all required fields', () => { + const receipt = buildReceipt(baseBundle, baseVerification); + + expect(receipt.receiptVersion).toBe('1.0'); + expect(typeof receipt.receiptId).toBe('string'); + expect(receipt.receiptId).toBeTruthy(); + expect(receipt.policyProfile).toBe('STANDARD_CA'); + expect(receipt.inputsCommitment).toMatch(/^0x[0-9a-fA-F]+$/); + expect(receipt.decision).toBe('ALLOW'); + expect(receipt.riskScore).toBe(0.1); + expect(receipt.verifierId).toBe('deed-shield'); + expect(receipt.receiptHash).toMatch(/^0x[0-9a-fA-F]+$/); + }); + + it('uses custom verifierId when provided', () => { + const receipt = buildReceipt(baseBundle, baseVerification, 'custom-verifier'); + expect(receipt.verifierId).toBe('custom-verifier'); + }); + + it('includes signing_key_id extension when provided', () => { + const receipt = buildReceipt(baseBundle, baseVerification, 'deed-shield', { + signing_key_id: 'key-123' + }); + expect(receipt.signing_key_id).toBe('key-123'); + }); + + it('omits signing_key_id when not provided', () => { + const receipt = buildReceipt(baseBundle, baseVerification); + expect(receipt.signing_key_id).toBeUndefined(); + }); + + it('includes fraudRisk extension when provided', () => { + const fraudRisk = { score: 0.8, band: 'HIGH' as const, signals: [] }; + const receipt = buildReceipt(baseBundle, baseVerification, 'deed-shield', { fraudRisk }); + expect(receipt.fraudRisk).toEqual(fraudRisk); + }); + + it('includes zkpAttestation extension when provided', () => { + const zkpAttestation = { + proofId: 'proof-001', + scheme: 'HALO2-DEV-v0', + status: 'dev-only' as const, + backend: 'halo2-dev' as const, + circuitId: 'document-sha256-v1', + publicInputs: { + conformance: true, + schemaVersion: 'trustsignal.document_sha256.v1', + documentWitnessMode: 'declared-doc-hash-v1' as const, + documentDigest: '0x' + 'a'.repeat(64), + documentCommitment: '0x' + 'b'.repeat(64) + } + }; + const receipt = buildReceipt(baseBundle, baseVerification, 'deed-shield', { zkpAttestation }); + expect(receipt.zkpAttestation?.proofId).toBe('proof-001'); + }); + + it('generates unique receiptId for each call', () => { + const r1 = buildReceipt(baseBundle, baseVerification); + const r2 = buildReceipt(baseBundle, baseVerification); + expect(r1.receiptId).not.toBe(r2.receiptId); + }); + + it('receiptHash changes when decision changes', () => { + const r1 = buildReceipt(baseBundle, baseVerification); + const r2 = buildReceipt(baseBundle, { ...baseVerification, decision: 'BLOCK' }); + // ReceiptHash depends on the payload - different content = different hash + // Note: receiptId is random so each call has a different hash, but both should be valid hashes + expect(r1.receiptHash).toMatch(/^0x[0-9a-fA-F]+$/); + expect(r2.receiptHash).toMatch(/^0x[0-9a-fA-F]+$/); + }); +}); + +describe('toUnsignedReceiptPayload', () => { + it('strips receiptHash and receiptSignature from receipt', () => { + const receipt: Receipt = { + receiptVersion: '1.0', + receiptId: 'id-1', + createdAt: '2024-01-01T00:00:00.000Z', + policyProfile: 'STANDARD_CA', + inputsCommitment: '0xabc', + checks: [], + decision: 'ALLOW', + reasons: [], + riskScore: 0, + verifierId: 'deed-shield', + receiptHash: '0xhash', + receiptSignature: { signature: 'sig', alg: 'EdDSA', kid: 'key-1' } + }; + + const payload = toUnsignedReceiptPayload(receipt); + + expect((payload as Record).receiptHash).toBeUndefined(); + expect((payload as Record).receiptSignature).toBeUndefined(); + expect(payload.receiptVersion).toBe('1.0'); + expect(payload.policyProfile).toBe('STANDARD_CA'); + }); + + it('preserves signing_key_id when present', () => { + const receipt: Receipt = { + receiptVersion: '1.0', + receiptId: 'id-2', + createdAt: '2024-01-01T00:00:00.000Z', + policyProfile: 'STANDARD_NY', + inputsCommitment: '0xdef', + checks: [], + decision: 'FLAG', + reasons: ['warn'], + riskScore: 0.5, + verifierId: 'deed-shield', + receiptHash: '0xhash2', + signing_key_id: 'key-xyz' + }; + + const payload = toUnsignedReceiptPayload(receipt); + expect(payload.signing_key_id).toBe('key-xyz'); + }); + + it('omits signing_key_id when not present in receipt', () => { + const receipt = buildReceipt(baseBundle, baseVerification); + const payload = toUnsignedReceiptPayload(receipt); + expect(payload.signing_key_id).toBeUndefined(); + }); +}); diff --git a/packages/core/tsconfig.tsbuildinfo b/packages/core/tsconfig.tsbuildinfo index d1efbb2..dd36f9a 100644 --- a/packages/core/tsconfig.tsbuildinfo +++ b/packages/core/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/@vitest/pretty-format/dist/index.d.ts","../../node_modules/@vitest/utils/dist/types.d.ts","../../node_modules/@vitest/utils/dist/helpers.d.ts","../../node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../../node_modules/tinyrainbow/dist/node.d.ts","../../node_modules/@vitest/utils/dist/index.d.ts","../../node_modules/@vitest/runner/dist/tasks.d-CkscK4of.d.ts","../../node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","../../node_modules/@vitest/utils/dist/diff.d.ts","../../node_modules/@vitest/runner/dist/types.d.ts","../../node_modules/@vitest/utils/dist/error.d.ts","../../node_modules/@vitest/runner/dist/index.d.ts","../../node_modules/vitest/optional-types.d.ts","../../node_modules/vitest/dist/chunks/environment.d.cL3nLXbE.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/rollup/dist/rollup.d.ts","../../node_modules/rollup/dist/parseAst.d.ts","../../node_modules/vite/types/hmrPayload.d.ts","../../node_modules/vite/types/customEvent.d.ts","../../node_modules/vite/types/hot.d.ts","../../node_modules/vite/dist/node/moduleRunnerTransport.d-DJ_mE5sf.d.ts","../../node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/esbuild/lib/main.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/vite/types/internal/lightningcssOptions.d.ts","../../node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","../../node_modules/vite/types/importGlob.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/dist/node/index.d.ts","../../node_modules/@vitest/mocker/dist/registry.d-D765pazg.d.ts","../../node_modules/@vitest/mocker/dist/types.d-D_aRZRdy.d.ts","../../node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/@vitest/utils/dist/source-map.d.ts","../../node_modules/vite-node/dist/trace-mapping.d-DLVdEqOp.d.ts","../../node_modules/vite-node/dist/index.d-DGmxD2U7.d.ts","../../node_modules/vite-node/dist/index.d.ts","../../node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts","../../node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts","../../node_modules/@vitest/snapshot/dist/index.d.ts","../../node_modules/@vitest/snapshot/dist/environment.d.ts","../../node_modules/vitest/dist/chunks/config.d.D2ROskhv.d.ts","../../node_modules/vitest/dist/chunks/worker.d.1GmBbd7G.d.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@vitest/runner/dist/utils.d.ts","../../node_modules/tinybench/dist/index.d.ts","../../node_modules/vitest/dist/chunks/benchmark.d.BwvBVTda.d.ts","../../node_modules/vite-node/dist/client.d.ts","../../node_modules/vitest/dist/chunks/coverage.d.S9RMNXIe.d.ts","../../node_modules/@vitest/snapshot/dist/manager.d.ts","../../node_modules/vitest/dist/chunks/reporters.d.BFLkQcL6.d.ts","../../node_modules/vitest/dist/chunks/worker.d.CKwWzBSj.d.ts","../../node_modules/@vitest/spy/dist/index.d.ts","../../node_modules/@vitest/expect/dist/index.d.ts","../../node_modules/vitest/dist/chunks/global.d.MAmajcmJ.d.ts","../../node_modules/vitest/dist/chunks/vite.d.CMLlLIFP.d.ts","../../node_modules/vitest/dist/chunks/mocker.d.BE_2ls6u.d.ts","../../node_modules/vitest/dist/chunks/suite.d.FvehnV49.d.ts","../../node_modules/expect-type/dist/utils.d.ts","../../node_modules/expect-type/dist/overloads.d.ts","../../node_modules/expect-type/dist/branding.d.ts","../../node_modules/expect-type/dist/messages.d.ts","../../node_modules/expect-type/dist/index.d.ts","../../node_modules/vitest/dist/index.d.ts","../../node_modules/json-canonicalize/types/canonicalize.d.ts","../../node_modules/json-canonicalize/types/serializer.d.ts","../../node_modules/json-canonicalize/types/canonicalize-ex.d.ts","../../node_modules/json-canonicalize/types/index.d.ts","./src/canonicalize.ts","./src/canonicalize.test.ts","../../node_modules/ethers/lib.esm/_version.d.ts","../../node_modules/ethers/lib.esm/utils/base58.d.ts","../../node_modules/ethers/lib.esm/utils/data.d.ts","../../node_modules/ethers/lib.esm/utils/base64.d.ts","../../node_modules/ethers/lib.esm/address/address.d.ts","../../node_modules/ethers/lib.esm/address/contract-address.d.ts","../../node_modules/ethers/lib.esm/address/checks.d.ts","../../node_modules/ethers/lib.esm/address/index.d.ts","../../node_modules/ethers/lib.esm/crypto/hmac.d.ts","../../node_modules/ethers/lib.esm/crypto/keccak.d.ts","../../node_modules/ethers/lib.esm/crypto/ripemd160.d.ts","../../node_modules/ethers/lib.esm/crypto/pbkdf2.d.ts","../../node_modules/ethers/lib.esm/crypto/random.d.ts","../../node_modules/ethers/lib.esm/crypto/scrypt.d.ts","../../node_modules/ethers/lib.esm/crypto/sha2.d.ts","../../node_modules/ethers/lib.esm/crypto/signature.d.ts","../../node_modules/ethers/lib.esm/crypto/signing-key.d.ts","../../node_modules/ethers/lib.esm/crypto/index.d.ts","../../node_modules/ethers/lib.esm/utils/maths.d.ts","../../node_modules/ethers/lib.esm/transaction/accesslist.d.ts","../../node_modules/ethers/lib.esm/transaction/authorization.d.ts","../../node_modules/ethers/lib.esm/transaction/address.d.ts","../../node_modules/ethers/lib.esm/transaction/transaction.d.ts","../../node_modules/ethers/lib.esm/transaction/index.d.ts","../../node_modules/ethers/lib.esm/providers/contracts.d.ts","../../node_modules/ethers/lib.esm/utils/fetch.d.ts","../../node_modules/ethers/lib.esm/providers/plugins-network.d.ts","../../node_modules/ethers/lib.esm/providers/network.d.ts","../../node_modules/ethers/lib.esm/providers/formatting.d.ts","../../node_modules/ethers/lib.esm/providers/provider.d.ts","../../node_modules/ethers/lib.esm/providers/ens-resolver.d.ts","../../node_modules/ethers/lib.esm/providers/abstract-provider.d.ts","../../node_modules/ethers/lib.esm/hash/authorization.d.ts","../../node_modules/ethers/lib.esm/hash/id.d.ts","../../node_modules/ethers/lib.esm/hash/namehash.d.ts","../../node_modules/ethers/lib.esm/hash/message.d.ts","../../node_modules/ethers/lib.esm/hash/solidity.d.ts","../../node_modules/ethers/lib.esm/hash/typed-data.d.ts","../../node_modules/ethers/lib.esm/hash/index.d.ts","../../node_modules/ethers/lib.esm/providers/signer.d.ts","../../node_modules/ethers/lib.esm/providers/abstract-signer.d.ts","../../node_modules/ethers/lib.esm/providers/community.d.ts","../../node_modules/ethers/lib.esm/providers/provider-jsonrpc.d.ts","../../node_modules/ethers/lib.esm/providers/provider-socket.d.ts","../../node_modules/ethers/lib.esm/providers/provider-websocket.d.ts","../../node_modules/ethers/lib.esm/providers/default-provider.d.ts","../../node_modules/ethers/lib.esm/providers/signer-noncemanager.d.ts","../../node_modules/ethers/lib.esm/providers/provider-fallback.d.ts","../../node_modules/ethers/lib.esm/providers/provider-browser.d.ts","../../node_modules/ethers/lib.esm/providers/provider-alchemy.d.ts","../../node_modules/ethers/lib.esm/providers/provider-blockscout.d.ts","../../node_modules/ethers/lib.esm/providers/provider-ankr.d.ts","../../node_modules/ethers/lib.esm/providers/provider-cloudflare.d.ts","../../node_modules/ethers/lib.esm/providers/provider-chainstack.d.ts","../../node_modules/ethers/lib.esm/contract/types.d.ts","../../node_modules/ethers/lib.esm/contract/wrappers.d.ts","../../node_modules/ethers/lib.esm/contract/contract.d.ts","../../node_modules/ethers/lib.esm/contract/factory.d.ts","../../node_modules/ethers/lib.esm/contract/index.d.ts","../../node_modules/ethers/lib.esm/providers/provider-etherscan.d.ts","../../node_modules/ethers/lib.esm/providers/provider-infura.d.ts","../../node_modules/ethers/lib.esm/providers/provider-pocket.d.ts","../../node_modules/ethers/lib.esm/providers/provider-quicknode.d.ts","../../node_modules/ethers/lib.esm/providers/provider-ipcsocket.d.ts","../../node_modules/ethers/lib.esm/providers/index.d.ts","../../node_modules/ethers/lib.esm/utils/errors.d.ts","../../node_modules/ethers/lib.esm/utils/events.d.ts","../../node_modules/ethers/lib.esm/utils/fixednumber.d.ts","../../node_modules/ethers/lib.esm/utils/properties.d.ts","../../node_modules/ethers/lib.esm/utils/rlp-decode.d.ts","../../node_modules/ethers/lib.esm/utils/rlp.d.ts","../../node_modules/ethers/lib.esm/utils/rlp-encode.d.ts","../../node_modules/ethers/lib.esm/utils/units.d.ts","../../node_modules/ethers/lib.esm/utils/utf8.d.ts","../../node_modules/ethers/lib.esm/utils/uuid.d.ts","../../node_modules/ethers/lib.esm/utils/index.d.ts","../../node_modules/ethers/lib.esm/abi/coders/abstract-coder.d.ts","../../node_modules/ethers/lib.esm/abi/fragments.d.ts","../../node_modules/ethers/lib.esm/abi/abi-coder.d.ts","../../node_modules/ethers/lib.esm/abi/bytes32.d.ts","../../node_modules/ethers/lib.esm/abi/typed.d.ts","../../node_modules/ethers/lib.esm/abi/interface.d.ts","../../node_modules/ethers/lib.esm/abi/index.d.ts","../../node_modules/ethers/lib.esm/constants/addresses.d.ts","../../node_modules/ethers/lib.esm/constants/hashes.d.ts","../../node_modules/ethers/lib.esm/constants/numbers.d.ts","../../node_modules/ethers/lib.esm/constants/strings.d.ts","../../node_modules/ethers/lib.esm/constants/index.d.ts","../../node_modules/ethers/lib.esm/wallet/base-wallet.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlist.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlist-owl.d.ts","../../node_modules/ethers/lib.esm/wordlists/lang-en.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlist-owla.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlists.d.ts","../../node_modules/ethers/lib.esm/wordlists/index.d.ts","../../node_modules/ethers/lib.esm/wallet/mnemonic.d.ts","../../node_modules/ethers/lib.esm/wallet/hdwallet.d.ts","../../node_modules/ethers/lib.esm/wallet/json-crowdsale.d.ts","../../node_modules/ethers/lib.esm/wallet/json-keystore.d.ts","../../node_modules/ethers/lib.esm/wallet/wallet.d.ts","../../node_modules/ethers/lib.esm/wallet/index.d.ts","../../node_modules/ethers/lib.esm/ethers.d.ts","../../node_modules/ethers/lib.esm/index.d.ts","./src/hashing.ts","./src/hashing.test.ts","../../node_modules/jose/dist/types/types.d.ts","../../node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/jose/dist/types/jwt/produce.d.ts","../../node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/jose/dist/types/key/export.d.ts","../../node_modules/jose/dist/types/key/import.d.ts","../../node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/jose/dist/types/util/runtime.d.ts","../../node_modules/jose/dist/types/index.d.ts","./src/risk/types.ts","./src/zkp/types.ts","./src/types.ts","./src/registry.ts","./src/verifiers.ts","./src/verification.ts","./src/mocks.ts","./src/synthetic.ts","./src/headless.test.ts","./src/receipt.ts","./src/receiptSigner.ts","./src/risk/forensics.ts","./src/risk/layout.ts","./src/risk/patterns.ts","./src/risk/index.ts","./src/zkp/index.ts","./src/anchor/portable.ts","./src/anchor/provenance.ts","./src/attom/types.ts","./src/attom/normalize.ts","./src/attom/crossCheck.ts","./src/index.ts","./src/receiptSigner.test.ts","./src/registry.test.ts","./src/verification.test.ts","./src/anchor/provenance.test.ts","./src/attom/crossCheck.test.ts","./src/risk/risk.test.ts","./src/zkp/zkp.test.ts","../../node_modules/@types/aria-query/index.d.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/ms/index.d.ts","../../node_modules/@types/jsonwebtoken/index.d.ts","../../node_modules/@types/mocha/index.d.ts","../../node_modules/@types/pdf-parse/index.d.ts","../../node_modules/@types/pdfkit/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc",{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8",{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true},"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a",{"version":"1456e80bd8a3870034d89f91bd7df12ac29acfb083e31c0bb1fb38ca7bf5fbc2","affectsGlobalScope":true},{"version":"a98aedd64ad81793f146d36d1611ed9ba61b8b49ff040f0d13a103ed626595d9","affectsGlobalScope":true},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true},"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107",{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true},"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f",{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true},"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c",{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true},"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a",{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true},"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45",{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true},"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","2fd4c143eff88dabb57701e6a40e02a4dbc36d5eb1362e7964d32028056a782b","714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86",{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true},"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d",{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true},{"version":"d9e971bba9cf977c7774abbd4d2e3413a231af8a06a2e8b16af2a606bc91ddd0","affectsGlobalScope":true},"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee",{"version":"0225ecb9ed86bdb7a2c7fd01f1556906902929377b44483dc4b83e03b3ef227d","affectsGlobalScope":true},"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5",{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true},"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","f9ab232778f2842ffd6955f88b1049982fa2ecb764d129ee4893cbc290f41977","ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9",{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true},"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e",{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true},"05db535df8bdc30d9116fe754a3473d1b6479afbc14ae8eb18b605c62677d518","0ea329e5eab6719ff83bcb97e8bd03f1faab4feb74704010783b881fc9d80f92","151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d",{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true},"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f",{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true},"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e",{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true},"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","81e634f1c5e1ca309e7e3dc69e2732eea932ef07b8b34517d452e5a3e9a36fa3","34f39f75f2b5aa9c84a9f8157abbf8322e6831430e402badeaf58dd284f9b9a6","427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d",{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true},"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","13497c0d73306e27f70634c424cd2f3b472187164f36140b504b3756b0ff476d","bf7a2d0f6d9e72d59044079d61000c38da50328ccdff28c47528a1a139c610ec","04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab",{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true},"a23a08b626aa4d4a1924957bd8c4d38a7ffc032e21407bbd2c97413e1d8c3dbd","5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","13573a613314e40482386fe9c7934f9d86f3e06f19b840466c75391fb833b99b","f494a096f4e9b3c1b93dd6a852c68d6def531c537c1103273e954b51bdcda04a","30560eac555d009c4678a1c7fa1762b234dbe74b09ee69bfaa04c7f0869cfe79","705ac27abcc360c236033c486bfee3d79bd80197b0990722594a5a418a3eafaa","7a42f6c911fcdb3727bee2f82b214b4233aa93ab78bcc432e85eec16b8e7f4c9",{"version":"bce6291d0d8b8b060e33d1ef7032cc42f05ed47f0b7422630a2738f8f5579603","signature":"4410765ab1ccaf0c5197e953e8ead82c6ecf695f228fbec966a3b99f225e06cc"},{"version":"23db59200c3527367ae6277d0b64030e274bf2a074fe2093e1c76c9e44c1c8fe","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"cbd8f7cbc0832353a1db0c80ffe50f4d623bcf992faac71b4aef9e0aa6f4f33e","643b5be3fb728581cdb973f3937606d4925a5270d367a38366e4ddc6b30ba688","f7b9aaeace9a3837c47fad74de94ba117751951904a6cb6f6a2340ca3a5052d2","b59a8f409202638d6530f1e9746035717925f196f8350ef188535d6b6f07ac30","10752162e9a90e7f4e6f92d096706911e209f5e6026bb0fe788b9979bf0c807b","91010341cfcb3809686aefe12ceaa794087fcd0c7d4d72fc81d567535c51f7b9","a5fa720bdcd335d6f01999c7f4c93fb00447782db3c2fad005cc775b1b37b684","c8657b2bf39dbb8bbe8223ca66b76e33c83a649c7655fd7042b50b50cf805c96","18282a2d197d5d3b187d6cfe784b0bfeb36dc3caed79d24705c284506c6a7937","bc7f372120474ef5e195f4c5627aa9136af9dfc52c3e81f5404641f3eb921b20","c897edb7e0074c2cb1a118ad1f144d4095a76e13023c1c9d31499a97f0943c6d","5123f400963c1ae260ba78bd27826dd5ada91cc3df088a913fb709906c2f0fed","f6c69d4211c1c0dc144101b7d564eec8992315a5b652108ab44e617fdfb64a9f","3a0b914cd5a33a695925999bc0e20988f625ff92224224a60356531cc248324b","3b9ef4448417e777778007a2abbfb171fbb400c4012560331330c89a8fd08599","6c086fa316e7f3b80649021bc62262bb4b71c09cc2bbfeb0c72dfeba406f3bc9","80ae4448e40828f253d49dd0cba14ddaa948c4988d54d6bbd558015c4727f1f7","36ccd9bc1c33bf3cce297133d37acfc376d89ea0aff3111cf1792498ae5732d4","ef3212ac0f4934627604a36a63ebdbf235e844065ba3217f368515531b9b452e","a5bb15e8903456dedd2a0c6c7f29b520b75a02fc44b36248fbac98e8b3106f2e","7087a77f8804d330429778346f2adf8418a4641b159f621938604aa20386887a","6d2e4114ccd05fb0cd657cfb73419eeb7e1464446aabfe4e652d4ad460c1fd1a","ce4b1dd7655ecc6b75393994ab906df4350790e30d675870446e59d9fb19c21a","8478f046870fe3053785d1fdb8fc3d4972437fbb230771841eb3945edda1cdce","8827ca3cd0a35d4a2da2b460620586a68dc0681b19f08559bc382f453ae0a915","5c56eea87bcede67b8df6a08185aaa023080fe74f21e7d262e5e0c5885ea6747","2a6140dea5f4014fbf2c301bcefcac865d9b5354ccc09865b309ec25b170eb24","62fbeac38ecc6d7b5ffe8b9c10c60a519963c8bc5a06d7260446a45fe920c01f","5cb04775c9a257123584dc85441b5cb816af5e201074571d629f5861c4ebea0f","91bb13afae2c0de8d11c6a8027f4113067a6907c40378ed38e92b9fef2b2b20c","6cdb8c1473687522f8ef65e1620bb8d703a02f4c570c662bd99ebf442ec9c3ff","799e4c2b1aae2c8531a20544168c528c7994f13bbce20f4813e30cde1ca72cb9","804a7dbd4c64f201d927b23b8563affa0325ec4bd3eeab339933cc85fcbbe4c1","c0a7ac0e0b21d67124311e0a70138df950cfa22360ae582c5d7b95a9a31f3436","c39a02bcdde4e5cf742febb47995c209f651249aa3f339d8981b47eb157dbc7f","3b63f1706adba31dd86669c3745ce127e1d80b83b1376942a5ae3653089b526f","d93c86ac706e8a3eb5c4fd2c3965d793c192438b44b21f94a422029d037113cd","c775b9469b2cbb895386691568a08c5f07e011d79531c79cb65f89355d324339","f8b830bc7cf2ebcadb5381cb0965e9e2e5e1006a96d5569729fc8eae99f1e02b","6465f2a53c52cb1cf228a7eeab54e3380b8971fed677deb08fa082e72854e24c","123c6c775f283b756565682d4aa48e2e72cf4a69249cb296e95b01d7c64c68cf","74965fc49475caca96b090c472f2c3e2085e3be05ce34639e9aabeccd5fb71aa","9640153ef1838657c1de17d486d9755fb714407156ec0be12acd132db4732c7f","b21157929842b9593200c73299fffde810be1b6c2554437e319db0025ecd53ae","cb929086d0d062bb948a1726e87c604db6387d885a846838a4da40e006c51deb","cb2e0b454aed00d0109fa243d681650916750a960736755edb673d4c2fc495dc","2a5c6f30ace32a85b24dec0f03525ed0a40190104be5876bd9107f92cca0166b","4d752856defdcbb39e2915429f85a92aac94406eb1bdef2855b908dde5bc013b","515caaccdd09e635befbfd45f023015a42d375e0536c9786412cf4dab847ff65","6cde23545d1e8d78b222c594e0a66de065311e0c6b0e3989feffb5c7f6b66560","a025111523c3c2c24484c1af1bfcab340490817de7e4b247b700ca7ee203a5cc","39c8ca333a9f4c497aeb72f36857fbca17bd4eb8348a822e4052e76212efb7fc","156d4829532c7d26f824ab7bb26b1eced1bfaf5711d426e95357004c43f40d98","2d9a0ac7d80da8b003ac92445f47891c3acdca1517fb0a0ca3006e2d71e1d2ab","5c62b984997b2e15f2d2ae0f0202121738db19901dc2bad5fe6a7a2d6af871d3","8c04e9d03324f465d5fb381371c06799cd06234f2aa83bdf4318cb9728132b80","cd7a3946f3f2f8c734971b4b7c8c57e02ea88ef98c06c44b8be8c93fe046e8a9","a14590df3ef464f8a9dff9514df70c7aeff05c999f447e761ec13b8158a6cab0","98cbb6e3aa1b6610e7234ff6afa723b9cb52caf19ecb67cf1d96b04aa72b8f88","4bd91244643feda6c0f2fb50f58ee3c2e6af29dd473dc5fb70bb1cbd2eade134","f9575d2a80566ba8d17d2260526ffb81907386aa7cb21508888fb2e967911dca","d388e40b946609b83a5df1a1d12a0ea77168ee2407f28eac6958d6638a3fbf69","83e8adc1946281f15747109c98bd6af5ce3853f3693263419707510b704b70e5","64fb32566d6ac361bdff2fafb937b67ee96b0f4b0ea835c2164620ec2ad8ea09","678b6be72cdcec74f602d366fef05ba709aa60816d4abf2a4faff64a68cdfc1f","b0b8ac2d71ea2251f4f513c7d644db07a46446a6e4bccbcc23ccbefbe9ac3ac4","c7cae4f5befd90da675906c456cc35244edad7cdcedb51fb8f94d576f2b52e5e","a00e19c6ad43bfc4daf759038e309b797b59cc532d68f4556083022ed1d4b134","c4e720b6dd8053526bedd57807a9914e45bb2ffbda801145a086b93cf1cda6d5","1dc465a4431aaa00bb80452b26aa7e7ec33aca666e4256c271bdf04f18fef54d","ea5916d20a81cc0fd49bd783fce0837b690f2d39e456d979bc4b912cb89ceefc","dccc0a4cbe7cbabcf629ef783d3226ed28649f1215eb577a2e2cdb1129347a37","add54a06a7a910f6ed0195282144d58f24e375b7d16bd4a5c5b9d91bb4b5e184","dc03aa8332b32c2d7cd0f4f72b4a8cc61bbc2806eb18fa841ec3de56b8e806a6","dd56e1c623e5b14260b6d817f4f26d6cc63c77f5bf55321306d118617fc20c7d","d4cb93b91ab77070c8baebdcc5c951954ee219900795cc7e34aaef6be0081a2b","93ff68f1f2b1be14e488d472820e2cbc3c1744e4b55aea9a12288f612e8cf56f","7e4d2c8b02fc2529a60bd495322092644b5cf2f391b10bea4bcae8efea227c32","219b5d42961185874397f62f12d64e74e0825d260054984e0248010de538015e","27b5570022c0f24a093c0718de58a4f2d2b4124df0f7ff9b9786874c84c8af27","ad37fb454bd70dd332bb8b5047fbc0cf00ddfc48972d969a8530ab44998b7e70","265bdbd67761e88d8be1d91a21ec53bb8915e769a71bdc3f0e1e48fdda0a4c6e","817e174de32fb2f0d55d835c184c1248877c639885fcaed66bab759ff8be1b59","ea76d1231ea876a2a352eae09d90ae6ef20126052e0adfdc691437d624ebcc47","0961671995b68a718e081179cfa23c89410b97031880cf0fea203f702193385a","b6592f9a1102da83ba752d678e5e94af9443bf1ab70666f2f756ba1a85b8adfc","d1c933acc6c2847d38c7a29c3d154ef5a6b51e2ad728f682e47717524683e563","44380b6f061bbb7d7b81b3d9973c9a18b176e456eee4316a56c9e2932df77bfd","e558775330d82e3a2e16a2442c1332572f3cb269a545de3952ed226473e4ccdd","32d5ec19fbe22a610e11aa721d9947c1249e59a5b8e68f864d954f68795982d1","e1fa85a34e9710a03fb4e68a8b318b50cde979325a874a311c0429be2e9a6380","998c9ae7ae683f16a68d9204b8dea071377d886ed649f7da777dce408ede67b7","e02fe9a276b87b4c10c56cbcee81f8c6437d21a0a68eeb705e23105c3620677e","d56bc539844eceaaae11714c214add744ace0227da77c91e62d8c3cd0ee78964","9199f6ead2ae205b4a0efe8b427706b7b9856f2fb51587ca25e9161cfee2b163","120a62730ef5b8b61b4a82005c421506d0bf4f5a2fbe84b88149c79c894900da","3ca2a4b5f57c480c798f8310b3d3c10dc24fa73d5618889a27835eb80f783fa3","faf92d569360b567c70c11b08aadd997fb2ca1847687f370eaea8eda19f807f2","38e878406954753d87c2b0db8b5146da5abb86c44139526cba2046cc70fbd1d4","c500d215a2e0490d77f0f926507adac154bfc5cfcb855ffdbe2c600e67fbf36f","6a22003e006988f31654d8bf884208ff753d64bcb980a89e4c5eb933bf446d09","3a8493e70ee5fc14e8e9a028e5e3b1df79acbd4bc4ded50725d2ad4927a9c101","7f02dfc714a76c78325cdfbc138b57531103490dc9d88affdb3f4a54fdd879a0",{"version":"e950b8f29687653d0065e99b37e2d72d39e6336bb15e6275ca1d35d5c44974ad","signature":"57d11d9b86270e81ef50598552fba05a828338280cbe7393ba0002ec693443ee"},{"version":"1305285533d821eca222a7de9639ddbf610ffa9aff2263e5e6a35dad74969a99","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"7bb53546e9bd6e3f22804497a41d4b885674e7b15b7d64c7d3f83722dfd2b456","4083e6d84bfe72b0835b600185c7b7ce321da3d6053f866859185eefc161e7a0","b883e245dc30c73b655ffe175712cac82981fc999d6284685f0ed7c1dac8aa6f","626e3504b81883fa94578c2a97eff345fadc5eae17a57c39f585655eef5b8272","e9a15eeba29ceb0ee109dd5e0282d2877d8165d87251f2ea9741a82685a25c61","c6cb06cc021d9149301f3c51762a387f9d7571feed74273b157d934c56857fac","cd7c133395a1c72e7c9e546f62292f839819f50a8aa46050f8588b63ef56df88","196f5f74208ce4accea017450ed2abc9ce4ab13c29a9ea543db4c2d715a19183","4687c961ab2e3107379f139d22932253afb7dd52e75a18890e70d4a376cdf5d9","ae8cfe2e3bdef3705fc294d07869a0ab8a52d9b623d1cc0482b6fc2be262b015","94c8e9c00244bbf1c868ca526b12b4db1fab144e3f5e18af3591b5b471854157","827d576995f67a6205c0f048ae32f6a1cf7bda9a7a76917ab286ef11d7987fd7","cb5dc83310a61d2bb351ddcdcaa6ec1cf60cc965d26ce6f156a28b4062e96ab2","0091cb2456a823e123fe76faa8b94dea81db421770d9a9c9ade1b111abe0fcd1","034d811fd7fb2262ad35b21df0ecab14fdd513e25dbf563572068e3f083957d9","298bcc906dd21d62b56731f9233795cd11d88e062329f5df7cdb4e499207cdd4","f7e64be58c24f2f0b7116bed8f8c17e6543ddcdc1f46861d5c54217b4a47d731","966394e0405e675ca1282edbfa5140df86cb6dc025e0f957985f059fe4b9d5d6","b0587deb3f251b7ad289240c54b7c41161bb6488807d1f713e0a14c540cbcaee","4254aab77d0092cab52b34c2e0ab235f24f82a5e557f11d5409ae02213386e29","19db45929fad543b26b12504ee4e3ff7d9a8bddc1fc3ed39723c2259e3a4590f","b21934bebe4cd01c02953ab8d17be4d33d69057afdb5469be3956e84a09a8d99","b2b734c414d440c92a17fd409fa8dac89f425031a6fc7843bac765c6c174d1ca","239f39e8ad95065f5188a7acd8dbefbbbf94d9e00c460ffdc331e24bc1f63a54","d44f78893cb79e00e16a028e3023a65c1f2968352378e8e323f8c8f88b8da495","32afc9daae92391cb4efeb0d2dac779dc0fb17c69be0eb171fd5ed7f7908eeb4","b835c6e093ad9cda87d376c248735f7e4081f64d304b7c54a688f1276875cbf0","a9eabe1d0b20e967a18758a77884fbd61b897d72a57ddd9bf7ea6ef1a3f4514b","64c5059e7d7a80fe99d7dad639f3ba765f8d5b42c5b265275d7cd68f8426be75","05dc1970dc02c54db14d23ff7a30af00efbd7735313aa8af45c4fd4f5c3d3a33","a0caf07fe750954ad4cf079c5cf036be2191a758c2700424085ffde6af60d185","1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","eab89b3aa37e9e48b2679f4abe685d56ac371daa8fbe68526c6b0c914eb28474",{"version":"55a1ce846b49bb081d5ae2d534ad4c11da92ee9ef143648ae898f20463779ee6","signature":"6844b6bbd468c2d381d121057b1af6154724f24fba1e131da45ccf0ef503eb87"},{"version":"23742d0d73a762c548a83ddad5f46b173e87aee670cf28932b01672b215c47b2","signature":"8c9ec7d5b2aae5dd2ff9b50b0af138982b1473b1c852c157eaa1e16774abcd18"},{"version":"e20fde5169422ed444d8538b9832c79854d25aa4edbbb314b9f8f097b9d10396","signature":"b07c6d91032d53eafc562906e5ce97a4354ba1bcc5a395da2ad5533259e54665"},{"version":"47b45b090f8c2a6b1bb1bb0e838cdab7206d89bdbf5c9472dfb055589a39007a","signature":"9cd0fd3e469fcf87317940f1c422f3fb4ef887e083873c665facf52a2d7eb26d"},{"version":"3c6f3e7d02301bde29822f570f31d456bb96086f4716cbe99b83d21b257e1140","signature":"6b8bac2fa56bc4dda47db82b764fda5f282b213ddb1c8f518628b07d724321a6"},{"version":"d0cfc3c5428ae6cd64b4e8ad8098fb7e4cbb423b0c55ff0c88961f4c99b83ba4","signature":"ba3d00fa06f7b7e3fd75fd78e0515473e681ae1cc0413a8f09be786b8df87eef"},{"version":"331613b28aba32b71dba103850db4e69e1b2f4d1a86eb7d7f523b08d13c5b1fb","signature":"13e69f0647407ffab96c796d0ed855be7774dfd5417fa835fdc00b2f8546ca89"},{"version":"b4485f74e7bd23eb97015523f86ad8409244ea69f0c7b36a2a2c8f47309e59c2","signature":"6321dc5c363ab82d13c16893e8f9512ee70f48665ebc27fc7c05b915fb37c9dd"},{"version":"df5c583df82b394f242f4764662756c3ba7de0eb385b85951fcf6d01f553dcaf","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b4109a6ce113a93a2876a38b83c016179979225cb1e97949f260785614cfd8a5","signature":"bca0ac4786ab80179e7a24ff54151f7db7d525cdd18b11d96d849b1467f22590"},{"version":"56afdd3f17b1b6438ab0db1d6ad137b24e072b24ad17091ee12263100b954f91","signature":"33573e91aa311d26daddb7f9c897ed20c7f41166d8c024b739db6c56471d2b4b"},{"version":"396f5ed51074899b2d54b99c3d288e8d8b38d4607ef62d4be2930eb9c510f790","signature":"c43ccb93a2083ed202db9f103a8a1a86094f59f1359d94ad0567bf1143a627cb"},{"version":"35e4d8699c4718c12fdb6539b7a0fa3cb291cb488ef2153fe80c3ab861840d56","signature":"ee3ec8c1e006d2cf3f89599d3156dfae90834dcf4521364aac58a581d8c6fb30"},{"version":"4fd3c5af716a11e90c562987dbc074daa3303d40920faf6cb4bc96b0fc61102e","signature":"a87433d1ab7576dba0fa3b5125c43df3231cd2ca295bcd87d6fbfb0ed1ef0bb3"},{"version":"0a7d5a1ce7c811e4c1cdb1efc58785ecdb380831f59c4fff4909c927bf6dac9e","signature":"fb8b456c11acf1536fed7e23632ee9958a49397941d77c560b50c7efaf6642fe"},{"version":"d5d662b803f489945d253ef590b0bc5f2ceedaa28994e0da718b5ada42afaa00","signature":"89615e090bf6efd0d5d82650f8fd3d481a07acab10a67bbfabb5c5a8de683a4a"},{"version":"c6e319ca80b2ff5538be337e792b81c8da173c9a2eee540ac6d068e78cf1c0d3","signature":"936b0bbc2c3d926c925c96f83e2e8d3319ac3323a090d6f353da83c0d84e18cd"},{"version":"e86eb2f5203682a9157c44b0f8c7a4614e48ccdbfc868afc015064a99f0400b4","signature":"ed8a8855cf5b3e52a7f2b60811206b8ec96eb70e536efd2abe2b52cd5d0762bc"},{"version":"872152953de2bd9772bcf4090fd44dc7823ebc4df3cd061c5e38873f1427724c","signature":"4747398580c3ac97fe5736cb089081d348869c384e930148f0f9a62571a2aa8b"},{"version":"ef1c7f9ce11a452029935d19f69f82b41141902d94a1ada3f93dd907519be1c1","signature":"86e7770c1c98dd3cadd7e74e036d0a1b5c115601c17a5eaa6ce682e9a28529c7"},{"version":"a483bcc6b83d53b4915ccd0a8a2640fe0cc29ec5fbbbe23966a8421ba6f8c14d","signature":"c6c2365d7f4aa1e854215d50a052f24c994251be95657825ef53b6fc6ed3cea8"},"413eb8ce5f776537ab4d2557388f94128a4f907b45cb991cffe83723451f816d",{"version":"bb4f8277ab6463e534d5c38fed37fa917409b3982d45cf0b194e38a0a44771d3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"1135efd5ddf0f5607b14a8a6654332b85470afe8d04fa6ca38cd9360a0feca49","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"671c21df703b99e4d2cbe1f7f0f8891fb4a5423761b77411e91904ba2e04e17b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c16da7de580cc1b380c6fdc8c7bf62b7bfd3a57dbbb1e62b3078896ac1d29624","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c42314f3d7db70ce3bc5e1d473bbe6993d88173827316479cd132c5be2b560b2","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"ebf6e80a5711a94b406dd733e7e32a99618c82524c42106f1631b61161a98dec","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"8410c6aaaf7bda9d7148dc119dc8c011c5ff6a583ebe4a36a6f6b4ce7d98533f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","95da3c365e3d45709ad6e0b4daa5cdaf05e9076ba3c201e8f8081dd282c02f57",{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true},"9df0f2ba281c306c80873282ff8993bd76198e86d478bb5ad36c80ee2b66674b",{"version":"cb10a0a912da58ffb11ea16a0138f3f799628559b9f391a8caefee162b7249f6","affectsGlobalScope":true},"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc",{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true},"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f",{"version":"7a3aa194cfd5919c4da251ef04ea051077e22702638d4edcb9579e9101653519","affectsGlobalScope":true},"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f"],"root":[248,249,353,354,[388,416]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":7,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":9},"fileIdsList":[[78,125,418],[78,125],[78,125,418,419,420,421,422],[78,125,418,420],[78,125,221,222],[78,125,130,173,425],[78,122,125],[78,124,125],[78,125,130,158],[78,125,126,131,136,144,155,166],[78,125,126,127,136,144],[73,74,75,78,125],[78,125,128,167],[78,125,129,130,137,145],[78,125,130,155,163],[78,125,131,133,136,144],[78,124,125,132],[78,125,133,134],[78,125,135,136],[78,124,125,136],[78,125,136,137,138,155,166],[78,125,136,137,138,151,155,158],[78,125,133,136,139,144,155,166],[78,125,136,137,139,140,144,155,163,166],[78,125,139,141,155,163,166],[78,125,136,142],[78,125,143,166,171],[78,125,133,136,144,155],[78,125,145],[78,125,146],[78,124,125,147],[78,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],[78,125,149],[78,125,150],[78,125,136,151,152],[78,125,151,153,167,169],[78,125,136,155,156,158],[78,125,157,158],[78,125,155,156],[78,125,158],[78,125,159],[78,122,125,155,160],[78,125,136,161,162],[78,125,161,162],[78,125,130,144,155,163],[78,125,164],[125],[76,77,78,79,80,81,82,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],[78,125,144,165],[78,125,139,150,166],[78,125,130,167],[78,125,155,168],[78,125,143,169],[78,125,170],[78,120,125],[78,120,125,136,138,147,155,158,166,169,171],[78,125,155,172],[78,125,173],[78,125,433],[78,125,430,431,432],[63,64,67,78,125,232],[78,125,208,209],[64,65,67,68,69,78,125],[64,78,125],[64,65,67,78,125],[64,65,78,125],[78,125,215],[59,78,125,215,216],[59,78,125,215],[59,66,78,125],[60,78,125],[59,60,61,63,78,125],[59,78,125],[78,125,325,326,327],[78,125,325],[78,125,327,328,329,330,331],[78,125,325,326,327,328,330],[78,125,257,325,326],[78,125,257],[78,125,254,255,256],[78,125,333,334,335,336],[78,125,257,279,304,305,314,325,332],[78,125,257,304,305,306,314,325,332],[78,125,304,305,306,307],[78,125,305,314,332],[78,125,279,304,306,314,325,332],[78,125,258,259,260,261,262,263,264,265,266],[78,125,265,267,325],[78,125,250,257,267,273,288,308,314,325,332,337,344,350],[78,125,257,267,325],[78,125,282,283,284,285,286,287],[78,125,267],[78,125,267,325],[78,125,351],[78,125,257,277,278,279,280,325],[78,125,273,279,288,289],[78,125,279],[78,125,277,281,294],[78,125,279,281,325],[78,125,267,273],[78,125,274,276,277,278,279,280,281,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,309,310,311,312,313],[78,125,273,276,325],[78,125,275,279],[78,125,277,281,291,292,325],[78,125,277,292],[78,125,276,277,279,281,308],[78,125,277,281],[78,125,277,281,291,292,294,325],[78,125,144,173,277,292,293],[78,125,273,277,279,281,288,289,290,325],[78,125,277,279,281,292],[78,125,277,292,293],[78,125,257,267,273,274,277,278,325],[78,125,279,288,289,290],[78,125,257,273,274,279,288],[78,125,273],[78,125,267,268,269,270,271,272],[78,125,267,273,325],[78,125,252],[78,125,275,314],[78,125,251,252,253,268,275,315,316,317,318,319,320,321,322,323,324],[78,125,320],[78,125,319,321],[78,125,267,273,288,314],[78,125,267,314,325,338,344,345],[78,125,338,345,346,347,348,349],[78,125,325,344],[78,125,267,314,338,346],[78,125,339,340,341,342,343],[78,125,340],[78,125,339],[78,125,238,239],[78,125,238,239,240,241],[78,125,238,240],[78,125,238],[78,125,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386],[78,125,355],[78,125,355,365],[78,125,245],[78,125,244,246],[78,125,198],[78,125,196,198],[78,125,187,195,196,197,199,201],[78,125,185],[78,125,188,193,198,201],[78,125,184,201],[78,125,188,189,192,193,194,201],[78,125,188,189,190,192,193,201],[78,125,185,186,187,188,189,193,194,195,197,198,199,201],[78,125,201],[78,125,183,185,186,187,188,189,190,192,193,194,195,196,197,198,199,200],[78,125,183,201],[78,125,188,190,191,193,194,201],[78,125,192,201],[78,125,193,194,198,201],[78,125,186,196],[78,125,175,206,207],[78,125,174,175],[62,78,125],[78,92,96,125,166],[78,92,125,155,166],[78,87,125],[78,89,92,125,163,166],[78,125,144,163],[78,87,125,173],[78,89,92,125,144,166],[78,84,85,88,91,125,136,155,166],[78,92,99,125],[78,84,90,125],[78,92,113,114,125],[78,88,92,125,158,166,173],[78,113,125,173],[78,86,87,125,173],[78,92,125],[78,86,87,88,89,90,91,92,93,94,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,125],[78,92,107,125],[78,92,99,100,125],[78,90,92,100,101,125],[78,91,125],[78,84,87,92,125],[78,92,96,100,101,125],[78,96,125],[78,90,92,95,125,166],[78,84,89,92,99,125],[78,125,155],[78,87,92,113,125,171,173],[78,125,212,213],[78,125,212],[78,125,136,137,139,140,141,144,155,163,166,172,173,175,176,177,178,180,181,182,202,203,204,205,206,207],[78,125,177,178,179,180],[78,125,177],[78,125,178],[78,125,175,207],[70,78,125,224,225,234],[59,67,70,78,125,217,218,234],[78,125,227],[71,78,125],[59,70,72,78,125,217,226,233,234],[78,125,210],[59,64,67,70,72,78,125,128,137,155,207,210,211,214,217,219,220,223,226,228,229,234,235],[70,78,125,224,225,226,234],[78,125,207,230,235],[70,72,78,125,214,217,219,234],[78,125,171,220],[59,64,67,70,71,72,78,125,128,137,155,171,207,210,211,214,217,218,219,220,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,242],[78,125,243,405],[78,125,248,352,389],[78,125,243,406,408],[78,125,406,407],[78,125,130,406],[78,125,243,248],[78,125,247],[78,125,243,248,353],[78,125,352],[78,125,243,390,393,394,395],[78,125,248,353,390,391,392,393,394,395,397,398,402,403,404,405,406,407,408],[78,125,390],[78,125,130,248,353,390],[78,125,243,391,393,395,397,398],[78,125,248,387,390],[78,125,243,390,391],[78,125,388],[78,125,388,399,400,401],[78,125,243,402],[78,125,130,352,390],[78,125,388,389],[78,125,243,393,394,395],[78,125,352,390,391,392],[78,125,126,130,352,389],[78,125,126,137,145,146,243,403]],"referencedMap":[[420,1],[418,2],[417,2],[423,3],[419,1],[421,4],[422,1],[223,5],[221,2],[174,2],[424,2],[426,6],[427,2],[425,2],[122,7],[123,7],[124,8],[125,9],[126,10],[127,11],[73,2],[76,12],[74,2],[75,2],[128,13],[129,14],[130,15],[131,16],[132,17],[133,18],[134,18],[135,19],[136,20],[137,21],[138,22],[79,2],[139,23],[140,24],[141,25],[142,26],[143,27],[144,28],[145,29],[146,30],[147,31],[148,32],[149,33],[150,34],[151,35],[152,35],[153,36],[154,2],[155,37],[157,38],[156,39],[158,40],[159,41],[160,42],[161,43],[162,44],[163,45],[164,46],[78,47],[77,2],[173,48],[165,49],[166,50],[167,51],[168,52],[169,53],[170,54],[80,2],[81,2],[82,2],[121,55],[171,56],[172,57],[428,58],[429,58],[430,2],[434,59],[431,2],[433,60],[233,61],[210,62],[208,2],[209,2],[59,2],[70,63],[65,64],[68,65],[224,66],[215,2],[218,67],[217,68],[229,68],[216,69],[232,2],[67,70],[69,70],[61,71],[64,72],[211,71],[66,73],[60,2],[222,2],[83,2],[432,2],[182,2],[250,2],[328,74],[329,75],[326,75],[327,2],[332,76],[331,77],[330,78],[254,2],[256,79],[255,75],[257,80],[333,2],[334,2],[337,81],[335,2],[336,2],[306,82],[307,83],[308,84],[304,85],[305,86],[258,75],[267,87],[259,75],[261,75],[262,2],[260,75],[263,75],[264,75],[265,75],[266,88],[351,89],[282,90],[283,2],[288,91],[285,92],[284,2],[286,2],[287,93],[352,94],[281,95],[290,96],[291,2],[274,97],[295,98],[280,99],[278,100],[314,101],[277,102],[276,103],[299,104],[301,104],[300,104],[298,105],[303,104],[302,105],[309,106],[297,107],[310,108],[313,109],[292,110],[311,104],[312,104],[293,111],[294,112],[279,113],[296,114],[289,115],[269,116],[271,93],[270,116],[273,117],[272,118],[251,75],[253,119],[252,2],[315,120],[316,2],[275,2],[317,75],[325,121],[268,119],[318,2],[319,75],[321,122],[320,123],[322,75],[323,75],[324,75],[338,124],[346,125],[350,126],[347,2],[348,93],[345,127],[349,128],[344,129],[341,130],[340,131],[342,130],[339,2],[343,131],[240,132],[242,133],[241,134],[239,135],[238,2],[387,136],[356,137],[366,137],[357,137],[367,137],[358,137],[359,137],[374,137],[373,137],[375,137],[376,137],[368,137],[360,137],[369,137],[361,137],[370,137],[362,137],[364,137],[372,138],[365,137],[371,138],[377,138],[363,137],[378,137],[383,137],[384,137],[379,137],[355,2],[385,2],[381,137],[380,137],[382,137],[386,137],[246,139],[244,2],[247,140],[245,2],[199,141],[197,142],[198,143],[186,144],[187,142],[194,145],[185,146],[190,147],[200,2],[191,148],[196,149],[202,150],[201,151],[184,152],[192,153],[193,154],[188,155],[195,141],[189,156],[176,157],[175,158],[183,2],[225,2],[62,2],[63,159],[57,2],[58,2],[10,2],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[56,2],[54,2],[55,2],[1,2],[99,160],[109,161],[98,160],[119,162],[90,163],[89,164],[118,58],[112,165],[117,166],[92,167],[106,168],[91,169],[115,170],[87,171],[86,58],[116,172],[88,173],[93,174],[94,2],[97,174],[84,2],[120,175],[110,176],[101,177],[102,178],[104,179],[100,180],[103,181],[113,58],[95,182],[96,183],[105,184],[85,185],[108,176],[107,174],[111,2],[114,186],[227,187],[213,188],[214,187],[212,2],[207,189],[181,190],[180,191],[178,191],[177,2],[179,192],[205,2],[204,2],[203,2],[206,193],[226,194],[219,195],[228,196],[72,197],[234,198],[236,199],[230,200],[237,201],[235,202],[220,203],[231,204],[243,205],[71,2],[404,2],[413,206],[405,207],[414,208],[408,209],[407,210],[406,2],[249,211],[248,212],[354,213],[353,214],[396,215],[409,216],[394,217],[397,218],[410,219],[398,220],[411,221],[391,220],[399,222],[402,223],[400,222],[401,222],[415,224],[388,2],[395,225],[390,226],[412,227],[393,228],[392,217],[403,229],[389,2],[416,230]],"latestChangedDtsFile":"./dist/zkp/zkp.test.d.ts"},"version":"5.5.4"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/@vitest/pretty-format/dist/index.d.ts","../../node_modules/@vitest/utils/dist/types.d.ts","../../node_modules/@vitest/utils/dist/helpers.d.ts","../../node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../../node_modules/tinyrainbow/dist/node.d.ts","../../node_modules/@vitest/utils/dist/index.d.ts","../../node_modules/@vitest/runner/dist/tasks.d-CkscK4of.d.ts","../../node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","../../node_modules/@vitest/utils/dist/diff.d.ts","../../node_modules/@vitest/runner/dist/types.d.ts","../../node_modules/@vitest/utils/dist/error.d.ts","../../node_modules/@vitest/runner/dist/index.d.ts","../../node_modules/vitest/optional-types.d.ts","../../node_modules/vitest/dist/chunks/environment.d.cL3nLXbE.d.ts","../../node_modules/@types/node/ts5.6/compatibility/float16array.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/ts5.6/globals.typedarray.d.ts","../../node_modules/@types/node/ts5.6/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/@types/node/web-globals/console.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/@types/node/web-globals/url.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/inspector/promises.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/path/posix.d.ts","../../node_modules/@types/node/path/win32.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/quic.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/test/reporters.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/util/types.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts5.6/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/rollup/dist/rollup.d.ts","../../node_modules/rollup/dist/parseAst.d.ts","../../node_modules/vite/types/hmrPayload.d.ts","../../node_modules/vite/types/customEvent.d.ts","../../node_modules/vite/types/hot.d.ts","../../node_modules/vite/dist/node/moduleRunnerTransport.d-DJ_mE5sf.d.ts","../../node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/esbuild/lib/main.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/vite/types/internal/lightningcssOptions.d.ts","../../node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","../../node_modules/vite/types/importGlob.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/dist/node/index.d.ts","../../node_modules/@vitest/mocker/dist/registry.d-D765pazg.d.ts","../../node_modules/@vitest/mocker/dist/types.d-D_aRZRdy.d.ts","../../node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/@vitest/utils/dist/source-map.d.ts","../../node_modules/vite-node/dist/trace-mapping.d-DLVdEqOp.d.ts","../../node_modules/vite-node/dist/index.d-DGmxD2U7.d.ts","../../node_modules/vite-node/dist/index.d.ts","../../node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts","../../node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts","../../node_modules/@vitest/snapshot/dist/index.d.ts","../../node_modules/@vitest/snapshot/dist/environment.d.ts","../../node_modules/vitest/dist/chunks/config.d.D2ROskhv.d.ts","../../node_modules/vitest/dist/chunks/worker.d.1GmBbd7G.d.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@vitest/runner/dist/utils.d.ts","../../node_modules/tinybench/dist/index.d.ts","../../node_modules/vitest/dist/chunks/benchmark.d.BwvBVTda.d.ts","../../node_modules/vite-node/dist/client.d.ts","../../node_modules/vitest/dist/chunks/coverage.d.S9RMNXIe.d.ts","../../node_modules/@vitest/snapshot/dist/manager.d.ts","../../node_modules/vitest/dist/chunks/reporters.d.BFLkQcL6.d.ts","../../node_modules/vitest/dist/chunks/worker.d.CKwWzBSj.d.ts","../../node_modules/@vitest/spy/dist/index.d.ts","../../node_modules/@vitest/expect/dist/index.d.ts","../../node_modules/vitest/dist/chunks/global.d.MAmajcmJ.d.ts","../../node_modules/vitest/dist/chunks/vite.d.CMLlLIFP.d.ts","../../node_modules/vitest/dist/chunks/mocker.d.BE_2ls6u.d.ts","../../node_modules/vitest/dist/chunks/suite.d.FvehnV49.d.ts","../../node_modules/expect-type/dist/utils.d.ts","../../node_modules/expect-type/dist/overloads.d.ts","../../node_modules/expect-type/dist/branding.d.ts","../../node_modules/expect-type/dist/messages.d.ts","../../node_modules/expect-type/dist/index.d.ts","../../node_modules/vitest/dist/index.d.ts","../../node_modules/json-canonicalize/types/canonicalize.d.ts","../../node_modules/json-canonicalize/types/serializer.d.ts","../../node_modules/json-canonicalize/types/canonicalize-ex.d.ts","../../node_modules/json-canonicalize/types/index.d.ts","./src/canonicalize.ts","./src/canonicalize.test.ts","../../node_modules/ethers/lib.esm/_version.d.ts","../../node_modules/ethers/lib.esm/utils/base58.d.ts","../../node_modules/ethers/lib.esm/utils/data.d.ts","../../node_modules/ethers/lib.esm/utils/base64.d.ts","../../node_modules/ethers/lib.esm/address/address.d.ts","../../node_modules/ethers/lib.esm/address/contract-address.d.ts","../../node_modules/ethers/lib.esm/address/checks.d.ts","../../node_modules/ethers/lib.esm/address/index.d.ts","../../node_modules/ethers/lib.esm/crypto/hmac.d.ts","../../node_modules/ethers/lib.esm/crypto/keccak.d.ts","../../node_modules/ethers/lib.esm/crypto/ripemd160.d.ts","../../node_modules/ethers/lib.esm/crypto/pbkdf2.d.ts","../../node_modules/ethers/lib.esm/crypto/random.d.ts","../../node_modules/ethers/lib.esm/crypto/scrypt.d.ts","../../node_modules/ethers/lib.esm/crypto/sha2.d.ts","../../node_modules/ethers/lib.esm/crypto/signature.d.ts","../../node_modules/ethers/lib.esm/crypto/signing-key.d.ts","../../node_modules/ethers/lib.esm/crypto/index.d.ts","../../node_modules/ethers/lib.esm/utils/maths.d.ts","../../node_modules/ethers/lib.esm/transaction/accesslist.d.ts","../../node_modules/ethers/lib.esm/transaction/authorization.d.ts","../../node_modules/ethers/lib.esm/transaction/address.d.ts","../../node_modules/ethers/lib.esm/transaction/transaction.d.ts","../../node_modules/ethers/lib.esm/transaction/index.d.ts","../../node_modules/ethers/lib.esm/providers/contracts.d.ts","../../node_modules/ethers/lib.esm/utils/fetch.d.ts","../../node_modules/ethers/lib.esm/providers/plugins-network.d.ts","../../node_modules/ethers/lib.esm/providers/network.d.ts","../../node_modules/ethers/lib.esm/providers/formatting.d.ts","../../node_modules/ethers/lib.esm/providers/provider.d.ts","../../node_modules/ethers/lib.esm/providers/ens-resolver.d.ts","../../node_modules/ethers/lib.esm/providers/abstract-provider.d.ts","../../node_modules/ethers/lib.esm/hash/authorization.d.ts","../../node_modules/ethers/lib.esm/hash/id.d.ts","../../node_modules/ethers/lib.esm/hash/namehash.d.ts","../../node_modules/ethers/lib.esm/hash/message.d.ts","../../node_modules/ethers/lib.esm/hash/solidity.d.ts","../../node_modules/ethers/lib.esm/hash/typed-data.d.ts","../../node_modules/ethers/lib.esm/hash/index.d.ts","../../node_modules/ethers/lib.esm/providers/signer.d.ts","../../node_modules/ethers/lib.esm/providers/abstract-signer.d.ts","../../node_modules/ethers/lib.esm/providers/community.d.ts","../../node_modules/ethers/lib.esm/providers/provider-jsonrpc.d.ts","../../node_modules/ethers/lib.esm/providers/provider-socket.d.ts","../../node_modules/ethers/lib.esm/providers/provider-websocket.d.ts","../../node_modules/ethers/lib.esm/providers/default-provider.d.ts","../../node_modules/ethers/lib.esm/providers/signer-noncemanager.d.ts","../../node_modules/ethers/lib.esm/providers/provider-fallback.d.ts","../../node_modules/ethers/lib.esm/providers/provider-browser.d.ts","../../node_modules/ethers/lib.esm/providers/provider-alchemy.d.ts","../../node_modules/ethers/lib.esm/providers/provider-blockscout.d.ts","../../node_modules/ethers/lib.esm/providers/provider-ankr.d.ts","../../node_modules/ethers/lib.esm/providers/provider-cloudflare.d.ts","../../node_modules/ethers/lib.esm/providers/provider-chainstack.d.ts","../../node_modules/ethers/lib.esm/contract/types.d.ts","../../node_modules/ethers/lib.esm/contract/wrappers.d.ts","../../node_modules/ethers/lib.esm/contract/contract.d.ts","../../node_modules/ethers/lib.esm/contract/factory.d.ts","../../node_modules/ethers/lib.esm/contract/index.d.ts","../../node_modules/ethers/lib.esm/providers/provider-etherscan.d.ts","../../node_modules/ethers/lib.esm/providers/provider-infura.d.ts","../../node_modules/ethers/lib.esm/providers/provider-pocket.d.ts","../../node_modules/ethers/lib.esm/providers/provider-quicknode.d.ts","../../node_modules/ethers/lib.esm/providers/provider-ipcsocket.d.ts","../../node_modules/ethers/lib.esm/providers/index.d.ts","../../node_modules/ethers/lib.esm/utils/errors.d.ts","../../node_modules/ethers/lib.esm/utils/events.d.ts","../../node_modules/ethers/lib.esm/utils/fixednumber.d.ts","../../node_modules/ethers/lib.esm/utils/properties.d.ts","../../node_modules/ethers/lib.esm/utils/rlp-decode.d.ts","../../node_modules/ethers/lib.esm/utils/rlp.d.ts","../../node_modules/ethers/lib.esm/utils/rlp-encode.d.ts","../../node_modules/ethers/lib.esm/utils/units.d.ts","../../node_modules/ethers/lib.esm/utils/utf8.d.ts","../../node_modules/ethers/lib.esm/utils/uuid.d.ts","../../node_modules/ethers/lib.esm/utils/index.d.ts","../../node_modules/ethers/lib.esm/abi/coders/abstract-coder.d.ts","../../node_modules/ethers/lib.esm/abi/fragments.d.ts","../../node_modules/ethers/lib.esm/abi/abi-coder.d.ts","../../node_modules/ethers/lib.esm/abi/bytes32.d.ts","../../node_modules/ethers/lib.esm/abi/typed.d.ts","../../node_modules/ethers/lib.esm/abi/interface.d.ts","../../node_modules/ethers/lib.esm/abi/index.d.ts","../../node_modules/ethers/lib.esm/constants/addresses.d.ts","../../node_modules/ethers/lib.esm/constants/hashes.d.ts","../../node_modules/ethers/lib.esm/constants/numbers.d.ts","../../node_modules/ethers/lib.esm/constants/strings.d.ts","../../node_modules/ethers/lib.esm/constants/index.d.ts","../../node_modules/ethers/lib.esm/wallet/base-wallet.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlist.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlist-owl.d.ts","../../node_modules/ethers/lib.esm/wordlists/lang-en.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlist-owla.d.ts","../../node_modules/ethers/lib.esm/wordlists/wordlists.d.ts","../../node_modules/ethers/lib.esm/wordlists/index.d.ts","../../node_modules/ethers/lib.esm/wallet/mnemonic.d.ts","../../node_modules/ethers/lib.esm/wallet/hdwallet.d.ts","../../node_modules/ethers/lib.esm/wallet/json-crowdsale.d.ts","../../node_modules/ethers/lib.esm/wallet/json-keystore.d.ts","../../node_modules/ethers/lib.esm/wallet/wallet.d.ts","../../node_modules/ethers/lib.esm/wallet/index.d.ts","../../node_modules/ethers/lib.esm/ethers.d.ts","../../node_modules/ethers/lib.esm/index.d.ts","./src/hashing.ts","./src/hashing.test.ts","../../node_modules/jose/dist/types/types.d.ts","../../node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/jose/dist/types/jwt/produce.d.ts","../../node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/jose/dist/types/key/export.d.ts","../../node_modules/jose/dist/types/key/import.d.ts","../../node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/jose/dist/types/util/runtime.d.ts","../../node_modules/jose/dist/types/index.d.ts","./src/risk/types.ts","./src/zkp/types.ts","./src/types.ts","./src/registry.ts","./src/verifiers.ts","./src/verification.ts","./src/mocks.ts","./src/synthetic.ts","./src/headless.test.ts","./src/receipt.ts","./src/receiptSigner.ts","./src/risk/forensics.ts","./src/risk/layout.ts","./src/risk/patterns.ts","./src/risk/index.ts","./src/zkp/index.ts","./src/anchor/portable.ts","./src/anchor/provenance.ts","./src/attom/types.ts","./src/attom/normalize.ts","./src/attom/crossCheck.ts","./src/index.ts","./src/receiptSigner.test.ts","./src/registry.test.ts","./src/verification.test.ts","./src/anchor/provenance.test.ts","./src/attom/crossCheck.test.ts","./src/risk/risk.test.ts","./src/zkp/zkp.test.ts","../../node_modules/@types/aria-query/index.d.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/ms/index.d.ts","../../node_modules/@types/jsonwebtoken/index.d.ts","../../node_modules/@types/mocha/index.d.ts","../../node_modules/@types/pdf-parse/index.d.ts","../../node_modules/@types/pdfkit/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc",{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8",{"version":"394fda71d5d6bd00a372437dff510feab37b92f345861e592f956d6995e9c1ce","affectsGlobalScope":true},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true},{"version":"6f2442c0ca5e7fcb9d51ebbd7d43079844bcbfd947bb679b9419900745f871d5","affectsGlobalScope":true},{"version":"903f7d218c85fc92fae02ba14efc9a8df9da4467b9ded26da203193ead10f4b4","affectsGlobalScope":true},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true},"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f",{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true},"3fad5618174d74a34ee006406d4eb37e8d07dd62eb1315dbf52f48d31a337547","7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc",{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true},"8b50a819485ffe0d237bf0d131e92178d14d11e2aa873d73615a9ec578b341f5","9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e",{"version":"12d602a8fe4c2f2ba4f7804f5eda8ba07e0c83bf5cf0cda8baffa2e9967bfb77","affectsGlobalScope":true},"a856ab781967b62b288dfd85b860bef0e62f005ed4b1b8fa25c53ce17856acaf","cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","8db46b61a690f15b245cf16270db044dc047dce9f93b103a59f50262f677ea1f","01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","959d0327c96dd9bb5521f3ed6af0c435996504cc8dd46baa8e12cb3b3518cef1","e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22",{"version":"266bee0a41e9c3ba335583e21e9277ae03822402cf5e8e1d99f5196853613b98","affectsGlobalScope":true},"386606f8a297988535cb1401959041cfa7f59d54b8a9ed09738e65c98684c976","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95",{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true},"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","90a278f5fab7557e69e97056c0841adf269c42697194f0bd5c5e69152637d4b3","69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","f263485c9ca90df9fe7bb3a906db9701997dc6cae86ace1f8106ac8d2f7f677b",{"version":"1edcf2f36fc332615846bde6dcc71a8fe526065505bc5e3dcfd65a14becdf698","affectsGlobalScope":true},"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","1dbca38aa4b0db1f4f9e6edacc2780af7e028b733d2a98dd3598cd235ca0c97d","a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69",{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true},"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","19143c930aef7ccf248549f3e78992f2f1049118ec5d4622e95025057d8e392b","4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","cca8917838a876e2d7016c9b6af57cbf11fdf903c5fdd8e613fa31840b2957bf","d91ae55e4282c22b9c21bc26bd3ef637d3fe132507b10529ae68bf76f5de785b","b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","7e8a671604329e178bb479c8f387715ebd40a091fc4a7552a0a75c2f3a21c65c","41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","4c5e90ddbcd177ad3f2ffc909ae217c87820f1e968f6959e4b6ba38a8cec935e","b70dd9a44e1ac42f030bb12e7d79117eac7cb74170d72d381a1e7913320af23a","c28690b16de19870684ec3b78b87d9198e3c2bf5171b66ab3f353dfa935483ec","151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d",{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true},"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f",{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true},"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e",{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true},"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","81e634f1c5e1ca309e7e3dc69e2732eea932ef07b8b34517d452e5a3e9a36fa3","34f39f75f2b5aa9c84a9f8157abbf8322e6831430e402badeaf58dd284f9b9a6","427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d",{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true},"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","13497c0d73306e27f70634c424cd2f3b472187164f36140b504b3756b0ff476d","bf7a2d0f6d9e72d59044079d61000c38da50328ccdff28c47528a1a139c610ec","04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab",{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true},"a23a08b626aa4d4a1924957bd8c4d38a7ffc032e21407bbd2c97413e1d8c3dbd","5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","13573a613314e40482386fe9c7934f9d86f3e06f19b840466c75391fb833b99b","f494a096f4e9b3c1b93dd6a852c68d6def531c537c1103273e954b51bdcda04a","30560eac555d009c4678a1c7fa1762b234dbe74b09ee69bfaa04c7f0869cfe79","705ac27abcc360c236033c486bfee3d79bd80197b0990722594a5a418a3eafaa","7a42f6c911fcdb3727bee2f82b214b4233aa93ab78bcc432e85eec16b8e7f4c9",{"version":"bce6291d0d8b8b060e33d1ef7032cc42f05ed47f0b7422630a2738f8f5579603","signature":"4410765ab1ccaf0c5197e953e8ead82c6ecf695f228fbec966a3b99f225e06cc"},{"version":"23db59200c3527367ae6277d0b64030e274bf2a074fe2093e1c76c9e44c1c8fe","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"cbd8f7cbc0832353a1db0c80ffe50f4d623bcf992faac71b4aef9e0aa6f4f33e","643b5be3fb728581cdb973f3937606d4925a5270d367a38366e4ddc6b30ba688","f7b9aaeace9a3837c47fad74de94ba117751951904a6cb6f6a2340ca3a5052d2","b59a8f409202638d6530f1e9746035717925f196f8350ef188535d6b6f07ac30","10752162e9a90e7f4e6f92d096706911e209f5e6026bb0fe788b9979bf0c807b","91010341cfcb3809686aefe12ceaa794087fcd0c7d4d72fc81d567535c51f7b9","a5fa720bdcd335d6f01999c7f4c93fb00447782db3c2fad005cc775b1b37b684","c8657b2bf39dbb8bbe8223ca66b76e33c83a649c7655fd7042b50b50cf805c96","18282a2d197d5d3b187d6cfe784b0bfeb36dc3caed79d24705c284506c6a7937","bc7f372120474ef5e195f4c5627aa9136af9dfc52c3e81f5404641f3eb921b20","c897edb7e0074c2cb1a118ad1f144d4095a76e13023c1c9d31499a97f0943c6d","5123f400963c1ae260ba78bd27826dd5ada91cc3df088a913fb709906c2f0fed","f6c69d4211c1c0dc144101b7d564eec8992315a5b652108ab44e617fdfb64a9f","3a0b914cd5a33a695925999bc0e20988f625ff92224224a60356531cc248324b","3b9ef4448417e777778007a2abbfb171fbb400c4012560331330c89a8fd08599","6c086fa316e7f3b80649021bc62262bb4b71c09cc2bbfeb0c72dfeba406f3bc9","80ae4448e40828f253d49dd0cba14ddaa948c4988d54d6bbd558015c4727f1f7","36ccd9bc1c33bf3cce297133d37acfc376d89ea0aff3111cf1792498ae5732d4","ef3212ac0f4934627604a36a63ebdbf235e844065ba3217f368515531b9b452e","a5bb15e8903456dedd2a0c6c7f29b520b75a02fc44b36248fbac98e8b3106f2e","7087a77f8804d330429778346f2adf8418a4641b159f621938604aa20386887a","6d2e4114ccd05fb0cd657cfb73419eeb7e1464446aabfe4e652d4ad460c1fd1a","ce4b1dd7655ecc6b75393994ab906df4350790e30d675870446e59d9fb19c21a","8478f046870fe3053785d1fdb8fc3d4972437fbb230771841eb3945edda1cdce","8827ca3cd0a35d4a2da2b460620586a68dc0681b19f08559bc382f453ae0a915","5c56eea87bcede67b8df6a08185aaa023080fe74f21e7d262e5e0c5885ea6747","2a6140dea5f4014fbf2c301bcefcac865d9b5354ccc09865b309ec25b170eb24","62fbeac38ecc6d7b5ffe8b9c10c60a519963c8bc5a06d7260446a45fe920c01f","5cb04775c9a257123584dc85441b5cb816af5e201074571d629f5861c4ebea0f","91bb13afae2c0de8d11c6a8027f4113067a6907c40378ed38e92b9fef2b2b20c","6cdb8c1473687522f8ef65e1620bb8d703a02f4c570c662bd99ebf442ec9c3ff","799e4c2b1aae2c8531a20544168c528c7994f13bbce20f4813e30cde1ca72cb9","804a7dbd4c64f201d927b23b8563affa0325ec4bd3eeab339933cc85fcbbe4c1","c0a7ac0e0b21d67124311e0a70138df950cfa22360ae582c5d7b95a9a31f3436","c39a02bcdde4e5cf742febb47995c209f651249aa3f339d8981b47eb157dbc7f","3b63f1706adba31dd86669c3745ce127e1d80b83b1376942a5ae3653089b526f","d93c86ac706e8a3eb5c4fd2c3965d793c192438b44b21f94a422029d037113cd","c775b9469b2cbb895386691568a08c5f07e011d79531c79cb65f89355d324339","f8b830bc7cf2ebcadb5381cb0965e9e2e5e1006a96d5569729fc8eae99f1e02b","6465f2a53c52cb1cf228a7eeab54e3380b8971fed677deb08fa082e72854e24c","123c6c775f283b756565682d4aa48e2e72cf4a69249cb296e95b01d7c64c68cf","74965fc49475caca96b090c472f2c3e2085e3be05ce34639e9aabeccd5fb71aa","9640153ef1838657c1de17d486d9755fb714407156ec0be12acd132db4732c7f","b21157929842b9593200c73299fffde810be1b6c2554437e319db0025ecd53ae","cb929086d0d062bb948a1726e87c604db6387d885a846838a4da40e006c51deb","cb2e0b454aed00d0109fa243d681650916750a960736755edb673d4c2fc495dc","2a5c6f30ace32a85b24dec0f03525ed0a40190104be5876bd9107f92cca0166b","4d752856defdcbb39e2915429f85a92aac94406eb1bdef2855b908dde5bc013b","515caaccdd09e635befbfd45f023015a42d375e0536c9786412cf4dab847ff65","6cde23545d1e8d78b222c594e0a66de065311e0c6b0e3989feffb5c7f6b66560","a025111523c3c2c24484c1af1bfcab340490817de7e4b247b700ca7ee203a5cc","39c8ca333a9f4c497aeb72f36857fbca17bd4eb8348a822e4052e76212efb7fc","156d4829532c7d26f824ab7bb26b1eced1bfaf5711d426e95357004c43f40d98","2d9a0ac7d80da8b003ac92445f47891c3acdca1517fb0a0ca3006e2d71e1d2ab","5c62b984997b2e15f2d2ae0f0202121738db19901dc2bad5fe6a7a2d6af871d3","8c04e9d03324f465d5fb381371c06799cd06234f2aa83bdf4318cb9728132b80","cd7a3946f3f2f8c734971b4b7c8c57e02ea88ef98c06c44b8be8c93fe046e8a9","a14590df3ef464f8a9dff9514df70c7aeff05c999f447e761ec13b8158a6cab0","98cbb6e3aa1b6610e7234ff6afa723b9cb52caf19ecb67cf1d96b04aa72b8f88","4bd91244643feda6c0f2fb50f58ee3c2e6af29dd473dc5fb70bb1cbd2eade134","f9575d2a80566ba8d17d2260526ffb81907386aa7cb21508888fb2e967911dca","d388e40b946609b83a5df1a1d12a0ea77168ee2407f28eac6958d6638a3fbf69","83e8adc1946281f15747109c98bd6af5ce3853f3693263419707510b704b70e5","64fb32566d6ac361bdff2fafb937b67ee96b0f4b0ea835c2164620ec2ad8ea09","678b6be72cdcec74f602d366fef05ba709aa60816d4abf2a4faff64a68cdfc1f","b0b8ac2d71ea2251f4f513c7d644db07a46446a6e4bccbcc23ccbefbe9ac3ac4","c7cae4f5befd90da675906c456cc35244edad7cdcedb51fb8f94d576f2b52e5e","a00e19c6ad43bfc4daf759038e309b797b59cc532d68f4556083022ed1d4b134","c4e720b6dd8053526bedd57807a9914e45bb2ffbda801145a086b93cf1cda6d5","1dc465a4431aaa00bb80452b26aa7e7ec33aca666e4256c271bdf04f18fef54d","ea5916d20a81cc0fd49bd783fce0837b690f2d39e456d979bc4b912cb89ceefc","dccc0a4cbe7cbabcf629ef783d3226ed28649f1215eb577a2e2cdb1129347a37","add54a06a7a910f6ed0195282144d58f24e375b7d16bd4a5c5b9d91bb4b5e184","dc03aa8332b32c2d7cd0f4f72b4a8cc61bbc2806eb18fa841ec3de56b8e806a6","dd56e1c623e5b14260b6d817f4f26d6cc63c77f5bf55321306d118617fc20c7d","d4cb93b91ab77070c8baebdcc5c951954ee219900795cc7e34aaef6be0081a2b","93ff68f1f2b1be14e488d472820e2cbc3c1744e4b55aea9a12288f612e8cf56f","7e4d2c8b02fc2529a60bd495322092644b5cf2f391b10bea4bcae8efea227c32","219b5d42961185874397f62f12d64e74e0825d260054984e0248010de538015e","27b5570022c0f24a093c0718de58a4f2d2b4124df0f7ff9b9786874c84c8af27","ad37fb454bd70dd332bb8b5047fbc0cf00ddfc48972d969a8530ab44998b7e70","265bdbd67761e88d8be1d91a21ec53bb8915e769a71bdc3f0e1e48fdda0a4c6e","817e174de32fb2f0d55d835c184c1248877c639885fcaed66bab759ff8be1b59","ea76d1231ea876a2a352eae09d90ae6ef20126052e0adfdc691437d624ebcc47","0961671995b68a718e081179cfa23c89410b97031880cf0fea203f702193385a","b6592f9a1102da83ba752d678e5e94af9443bf1ab70666f2f756ba1a85b8adfc","d1c933acc6c2847d38c7a29c3d154ef5a6b51e2ad728f682e47717524683e563","44380b6f061bbb7d7b81b3d9973c9a18b176e456eee4316a56c9e2932df77bfd","e558775330d82e3a2e16a2442c1332572f3cb269a545de3952ed226473e4ccdd","32d5ec19fbe22a610e11aa721d9947c1249e59a5b8e68f864d954f68795982d1","e1fa85a34e9710a03fb4e68a8b318b50cde979325a874a311c0429be2e9a6380","998c9ae7ae683f16a68d9204b8dea071377d886ed649f7da777dce408ede67b7","e02fe9a276b87b4c10c56cbcee81f8c6437d21a0a68eeb705e23105c3620677e","d56bc539844eceaaae11714c214add744ace0227da77c91e62d8c3cd0ee78964","9199f6ead2ae205b4a0efe8b427706b7b9856f2fb51587ca25e9161cfee2b163","120a62730ef5b8b61b4a82005c421506d0bf4f5a2fbe84b88149c79c894900da","3ca2a4b5f57c480c798f8310b3d3c10dc24fa73d5618889a27835eb80f783fa3","faf92d569360b567c70c11b08aadd997fb2ca1847687f370eaea8eda19f807f2","38e878406954753d87c2b0db8b5146da5abb86c44139526cba2046cc70fbd1d4","c500d215a2e0490d77f0f926507adac154bfc5cfcb855ffdbe2c600e67fbf36f","6a22003e006988f31654d8bf884208ff753d64bcb980a89e4c5eb933bf446d09","3a8493e70ee5fc14e8e9a028e5e3b1df79acbd4bc4ded50725d2ad4927a9c101","7f02dfc714a76c78325cdfbc138b57531103490dc9d88affdb3f4a54fdd879a0",{"version":"e950b8f29687653d0065e99b37e2d72d39e6336bb15e6275ca1d35d5c44974ad","signature":"57d11d9b86270e81ef50598552fba05a828338280cbe7393ba0002ec693443ee"},{"version":"1305285533d821eca222a7de9639ddbf610ffa9aff2263e5e6a35dad74969a99","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"7bb53546e9bd6e3f22804497a41d4b885674e7b15b7d64c7d3f83722dfd2b456","4083e6d84bfe72b0835b600185c7b7ce321da3d6053f866859185eefc161e7a0","b883e245dc30c73b655ffe175712cac82981fc999d6284685f0ed7c1dac8aa6f","626e3504b81883fa94578c2a97eff345fadc5eae17a57c39f585655eef5b8272","e9a15eeba29ceb0ee109dd5e0282d2877d8165d87251f2ea9741a82685a25c61","c6cb06cc021d9149301f3c51762a387f9d7571feed74273b157d934c56857fac","cd7c133395a1c72e7c9e546f62292f839819f50a8aa46050f8588b63ef56df88","196f5f74208ce4accea017450ed2abc9ce4ab13c29a9ea543db4c2d715a19183","4687c961ab2e3107379f139d22932253afb7dd52e75a18890e70d4a376cdf5d9","ae8cfe2e3bdef3705fc294d07869a0ab8a52d9b623d1cc0482b6fc2be262b015","94c8e9c00244bbf1c868ca526b12b4db1fab144e3f5e18af3591b5b471854157","827d576995f67a6205c0f048ae32f6a1cf7bda9a7a76917ab286ef11d7987fd7","cb5dc83310a61d2bb351ddcdcaa6ec1cf60cc965d26ce6f156a28b4062e96ab2","0091cb2456a823e123fe76faa8b94dea81db421770d9a9c9ade1b111abe0fcd1","034d811fd7fb2262ad35b21df0ecab14fdd513e25dbf563572068e3f083957d9","298bcc906dd21d62b56731f9233795cd11d88e062329f5df7cdb4e499207cdd4","f7e64be58c24f2f0b7116bed8f8c17e6543ddcdc1f46861d5c54217b4a47d731","966394e0405e675ca1282edbfa5140df86cb6dc025e0f957985f059fe4b9d5d6","b0587deb3f251b7ad289240c54b7c41161bb6488807d1f713e0a14c540cbcaee","4254aab77d0092cab52b34c2e0ab235f24f82a5e557f11d5409ae02213386e29","19db45929fad543b26b12504ee4e3ff7d9a8bddc1fc3ed39723c2259e3a4590f","b21934bebe4cd01c02953ab8d17be4d33d69057afdb5469be3956e84a09a8d99","b2b734c414d440c92a17fd409fa8dac89f425031a6fc7843bac765c6c174d1ca","239f39e8ad95065f5188a7acd8dbefbbbf94d9e00c460ffdc331e24bc1f63a54","d44f78893cb79e00e16a028e3023a65c1f2968352378e8e323f8c8f88b8da495","32afc9daae92391cb4efeb0d2dac779dc0fb17c69be0eb171fd5ed7f7908eeb4","b835c6e093ad9cda87d376c248735f7e4081f64d304b7c54a688f1276875cbf0","a9eabe1d0b20e967a18758a77884fbd61b897d72a57ddd9bf7ea6ef1a3f4514b","64c5059e7d7a80fe99d7dad639f3ba765f8d5b42c5b265275d7cd68f8426be75","05dc1970dc02c54db14d23ff7a30af00efbd7735313aa8af45c4fd4f5c3d3a33","a0caf07fe750954ad4cf079c5cf036be2191a758c2700424085ffde6af60d185","1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","eab89b3aa37e9e48b2679f4abe685d56ac371daa8fbe68526c6b0c914eb28474",{"version":"55a1ce846b49bb081d5ae2d534ad4c11da92ee9ef143648ae898f20463779ee6","signature":"6844b6bbd468c2d381d121057b1af6154724f24fba1e131da45ccf0ef503eb87"},{"version":"23742d0d73a762c548a83ddad5f46b173e87aee670cf28932b01672b215c47b2","signature":"8c9ec7d5b2aae5dd2ff9b50b0af138982b1473b1c852c157eaa1e16774abcd18"},{"version":"e20fde5169422ed444d8538b9832c79854d25aa4edbbb314b9f8f097b9d10396","signature":"b07c6d91032d53eafc562906e5ce97a4354ba1bcc5a395da2ad5533259e54665"},{"version":"47b45b090f8c2a6b1bb1bb0e838cdab7206d89bdbf5c9472dfb055589a39007a","signature":"9cd0fd3e469fcf87317940f1c422f3fb4ef887e083873c665facf52a2d7eb26d"},{"version":"34e39c8c2789919052299efca31e8f61b9a6f3edf5db909097024e47bd2a5c2d","signature":"6b8bac2fa56bc4dda47db82b764fda5f282b213ddb1c8f518628b07d724321a6"},{"version":"d0cfc3c5428ae6cd64b4e8ad8098fb7e4cbb423b0c55ff0c88961f4c99b83ba4","signature":"ba3d00fa06f7b7e3fd75fd78e0515473e681ae1cc0413a8f09be786b8df87eef"},{"version":"f413bb53e7e4b24a5f80cbdd5257210f5b9c54d7b8e8714796b54c5be73d3ed3","signature":"e3ec8b405af23898ac2e92357935005f8f8703729bfbafd623877ba7f3885e13"},{"version":"b4485f74e7bd23eb97015523f86ad8409244ea69f0c7b36a2a2c8f47309e59c2","signature":"6321dc5c363ab82d13c16893e8f9512ee70f48665ebc27fc7c05b915fb37c9dd"},{"version":"5557dad11d1849aef085a54bfc1251ab976a7072adcf428b6bd3566263828eb6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b4109a6ce113a93a2876a38b83c016179979225cb1e97949f260785614cfd8a5","signature":"bca0ac4786ab80179e7a24ff54151f7db7d525cdd18b11d96d849b1467f22590"},{"version":"56afdd3f17b1b6438ab0db1d6ad137b24e072b24ad17091ee12263100b954f91","signature":"33573e91aa311d26daddb7f9c897ed20c7f41166d8c024b739db6c56471d2b4b"},{"version":"d90252a2963e4263c21ad401d1bacefbe41156949759d336978bd7e810049999","signature":"c43ccb93a2083ed202db9f103a8a1a86094f59f1359d94ad0567bf1143a627cb"},{"version":"18267b4afdf2bf1170657c6941132473040e9ab417a8777c69243106fc3094f3","signature":"ee3ec8c1e006d2cf3f89599d3156dfae90834dcf4521364aac58a581d8c6fb30"},{"version":"74227ac638af0179781ef772099edbe2d20ee5303f332e2f7175593a1457b84b","signature":"a87433d1ab7576dba0fa3b5125c43df3231cd2ca295bcd87d6fbfb0ed1ef0bb3"},{"version":"a0bab0340dc37a1ff2847da4fdd1c89963cc401f2a5eae8c938174900ef2289a","signature":"fb8b456c11acf1536fed7e23632ee9958a49397941d77c560b50c7efaf6642fe"},{"version":"72a851a53e5c226668f73bd71e21b6f22f12679c35e8b620c1f38377c776814d","signature":"89615e090bf6efd0d5d82650f8fd3d481a07acab10a67bbfabb5c5a8de683a4a"},{"version":"c6e319ca80b2ff5538be337e792b81c8da173c9a2eee540ac6d068e78cf1c0d3","signature":"936b0bbc2c3d926c925c96f83e2e8d3319ac3323a090d6f353da83c0d84e18cd"},{"version":"e86eb2f5203682a9157c44b0f8c7a4614e48ccdbfc868afc015064a99f0400b4","signature":"ed8a8855cf5b3e52a7f2b60811206b8ec96eb70e536efd2abe2b52cd5d0762bc"},{"version":"872152953de2bd9772bcf4090fd44dc7823ebc4df3cd061c5e38873f1427724c","signature":"4747398580c3ac97fe5736cb089081d348869c384e930148f0f9a62571a2aa8b"},{"version":"099fb041961f84e39e61c306870e1221b7d7f6b0a04d80a92f9305177e1b2597","signature":"86e7770c1c98dd3cadd7e74e036d0a1b5c115601c17a5eaa6ce682e9a28529c7"},{"version":"1b62fd1573f4330445d13f4f72d379d5338eb08832dae3fd39586ccce3aa1207","signature":"deebe757ec87e39296a54af578bf2a3d8800922c4a185010cb99ec409fe02853"},"413eb8ce5f776537ab4d2557388f94128a4f907b45cb991cffe83723451f816d",{"version":"bb4f8277ab6463e534d5c38fed37fa917409b3982d45cf0b194e38a0a44771d3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"1135efd5ddf0f5607b14a8a6654332b85470afe8d04fa6ca38cd9360a0feca49","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"671c21df703b99e4d2cbe1f7f0f8891fb4a5423761b77411e91904ba2e04e17b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c16da7de580cc1b380c6fdc8c7bf62b7bfd3a57dbbb1e62b3078896ac1d29624","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"8f988834fd8c4c54ebae0f2412eab879bb0cf429b2fd8ac4efc5a7462cf35435","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"7fb70ea472ae44b3f4b5d974906a95974b96fe7d69a822de5d9083ec2af7a9c7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"8a15a3143358c42feda792e51820263e576069ba48c0b7e86380a5d6f0bdb9b7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","95da3c365e3d45709ad6e0b4daa5cdaf05e9076ba3c201e8f8081dd282c02f57",{"version":"29f72ec1289ae3aeda78bf14b38086d3d803262ac13904b400422941a26a3636","affectsGlobalScope":true},"9df0f2ba281c306c80873282ff8993bd76198e86d478bb5ad36c80ee2b66674b",{"version":"cb10a0a912da58ffb11ea16a0138f3f799628559b9f391a8caefee162b7249f6","affectsGlobalScope":true},"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc",{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true},"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f",{"version":"7a3aa194cfd5919c4da251ef04ea051077e22702638d4edcb9579e9101653519","affectsGlobalScope":true},"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f"],"root":[272,273,377,378,[412,440]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":7,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":9},"fileIdsList":[[77,140,148,152,155,157,158,159,172,442],[77,140,148,152,155,157,158,159,172],[77,140,148,152,155,157,158,159,172,442,443,444,445,446],[77,140,148,152,155,157,158,159,172,442,444],[77,140,148,152,155,157,158,159,172,245,246],[77,140,145,148,152,155,157,158,159,172,197,449],[77,137,138,140,148,152,155,157,158,159,172],[77,139,140,148,152,155,157,158,159,172],[77,140,148,152,155,157,158,159,172,180],[77,140,141,146,148,151,152,155,157,158,159,161,172,177,189],[77,140,141,142,148,151,152,155,157,158,159,172],[77,140,143,148,152,155,157,158,159,172,190],[77,140,144,145,148,152,155,157,158,159,163,172],[77,140,145,148,152,155,157,158,159,172,177,186],[77,140,146,148,151,152,155,157,158,159,161,172],[77,139,140,147,148,152,155,157,158,159,172],[77,140,148,149,152,155,157,158,159,172],[77,140,148,150,151,152,155,157,158,159,172],[77,139,140,148,151,152,155,157,158,159,172],[77,140,148,151,152,153,155,157,158,159,172,177,189],[77,140,148,151,152,153,155,157,158,159,172,177,180],[77,127,140,148,151,152,154,155,157,158,159,161,172,177,189],[77,140,148,151,152,154,155,157,158,159,161,172,177,186,189],[77,140,148,152,154,155,156,157,158,159,172,177,186,189],[77,140,148,151,152,155,157,158,159,172],[77,140,148,152,155,157,159,172],[77,140,148,152,155,157,158,159,160,172,189],[77,140,148,151,152,155,157,158,159,161,172,177],[77,140,148,152,155,157,158,159,163,172],[77,140,148,152,155,157,158,159,164,172],[77,140,148,151,152,155,157,158,159,167,172],[77,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[77,140,148,152,155,157,158,159,169,172],[77,140,148,152,155,157,158,159,170,172],[77,140,145,148,152,155,157,158,159,161,172,180],[77,140,148,151,152,155,157,158,159,172,173],[77,140,148,152,155,157,158,159,172,174,190,193],[77,140,148,151,152,155,157,158,159,172,177,179,180],[77,140,148,152,155,157,158,159,172,178,180],[77,140,148,152,155,157,158,159,172,180,190],[77,140,148,152,155,157,158,159,172,181],[77,137,140,148,152,155,157,158,159,172,177,183,189],[77,140,148,152,155,157,158,159,172,177,182],[77,140,148,151,152,155,157,158,159,172,184,185],[77,140,148,152,155,157,158,159,172,184,185],[77,140,145,148,152,155,157,158,159,161,172,177,186],[77,140,148,152,155,157,158,159,172,187],[140,148,152,155,157,158,159,172],[74,75,76,77,78,79,80,81,82,83,84,85,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[77,140,148,152,155,157,158,159,161,172,188],[77,140,148,152,154,155,157,158,159,170,172,189],[77,140,148,152,155,157,158,159,172,190,191],[77,140,145,148,152,155,157,158,159,172,191],[77,140,148,152,155,157,158,159,172,177,192],[77,140,148,152,155,157,158,159,160,172,193],[77,140,148,152,155,157,158,159,172,194],[77,140,143,148,152,155,157,158,159,172],[77,140,145,148,152,155,157,158,159,172],[77,140,148,152,155,157,158,159,172,190],[77,127,140,148,152,155,157,158,159,172],[77,140,148,152,155,157,158,159,172,189],[77,140,148,152,155,157,158,159,172,195],[77,140,148,152,155,157,158,159,167,172],[77,140,148,152,155,157,158,159,172,185],[77,127,140,148,151,152,153,155,157,158,159,167,172,177,180,189,192,193,195],[77,140,148,152,155,157,158,159,172,177,196],[77,140,148,152,155,157,158,159,172,197],[77,140,148,152,155,157,158,159,172,457],[77,140,148,152,155,157,158,159,172,454,455,456],[64,65,68,77,140,148,152,155,157,158,159,172,256],[77,140,148,152,155,157,158,159,172,232,233],[65,66,68,69,70,77,140,148,152,155,157,158,159,172],[65,77,140,148,152,155,157,158,159,172],[65,66,68,77,140,148,152,155,157,158,159,172],[65,66,77,140,148,152,155,157,158,159,172],[77,140,148,152,155,157,158,159,172,239],[60,77,140,148,152,155,157,158,159,172,239,240],[60,77,140,148,152,155,157,158,159,172,239],[60,67,77,140,148,152,155,157,158,159,172],[61,77,140,148,152,155,157,158,159,172],[60,61,62,64,77,140,148,152,155,157,158,159,172],[60,77,140,148,152,155,157,158,159,172],[77,140,148,152,155,157,158,159,172,349,350,351],[77,140,148,152,155,157,158,159,172,349],[77,140,148,152,155,157,158,159,172,351,352,353,354,355],[77,140,148,152,155,157,158,159,172,349,350,351,352,354],[77,140,148,152,155,157,158,159,172,281,349,350],[77,140,148,152,155,157,158,159,172,281],[77,140,148,152,155,157,158,159,172,278,279,280],[77,140,148,152,155,157,158,159,172,357,358,359,360],[77,140,148,152,155,157,158,159,172,281,303,328,329,338,349,356],[77,140,148,152,155,157,158,159,172,281,328,329,330,338,349,356],[77,140,148,152,155,157,158,159,172,328,329,330,331],[77,140,148,152,155,157,158,159,172,329,338,356],[77,140,148,152,155,157,158,159,172,303,328,330,338,349,356],[77,140,148,152,155,157,158,159,172,282,283,284,285,286,287,288,289,290],[77,140,148,152,155,157,158,159,172,289,291,349],[77,140,148,152,155,157,158,159,172,274,281,291,297,312,332,338,349,356,361,368,374],[77,140,148,152,155,157,158,159,172,281,291,349],[77,140,148,152,155,157,158,159,172,306,307,308,309,310,311],[77,140,148,152,155,157,158,159,172,291],[77,140,148,152,155,157,158,159,172,291,349],[77,140,148,152,155,157,158,159,172,375],[77,140,148,152,155,157,158,159,172,281,301,302,303,304,349],[77,140,148,152,155,157,158,159,172,297,303,312,313],[77,140,148,152,155,157,158,159,172,303],[77,140,148,152,155,157,158,159,172,301,305,318],[77,140,148,152,155,157,158,159,172,303,305,349],[77,140,148,152,155,157,158,159,172,291,297],[77,140,148,152,155,157,158,159,172,298,300,301,302,303,304,305,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,333,334,335,336,337],[77,140,148,152,155,157,158,159,172,297,300,349],[77,140,148,152,155,157,158,159,172,299,303],[77,140,148,152,155,157,158,159,172,301,305,315,316,349],[77,140,148,152,155,157,158,159,172,301,316],[77,140,148,152,155,157,158,159,172,300,301,303,305,332],[77,140,148,152,155,157,158,159,172,301,305],[77,140,148,152,155,157,158,159,172,301,305,315,316,318,349],[77,140,148,152,155,157,158,159,161,172,197,301,316,317],[77,140,148,152,155,157,158,159,172,297,301,303,305,312,313,314,349],[77,140,148,152,155,157,158,159,172,301,303,305,316],[77,140,148,152,155,157,158,159,172,301,316,317],[77,140,148,152,155,157,158,159,172,281,291,297,298,301,302,349],[77,140,148,152,155,157,158,159,172,303,312,313,314],[77,140,148,152,155,157,158,159,172,281,297,298,303,312],[77,140,148,152,155,157,158,159,172,297],[77,140,148,152,155,157,158,159,172,291,292,293,294,295,296],[77,140,148,152,155,157,158,159,172,291,297,349],[77,140,148,152,155,157,158,159,172,276],[77,140,148,152,155,157,158,159,172,299,338],[77,140,148,152,155,157,158,159,172,275,276,277,292,299,339,340,341,342,343,344,345,346,347,348],[77,140,148,152,155,157,158,159,172,344],[77,140,148,152,155,157,158,159,172,343,345],[77,140,148,152,155,157,158,159,172,291,297,312,338],[77,140,148,152,155,157,158,159,172,291,338,349,362,368,369],[77,140,148,152,155,157,158,159,172,362,369,370,371,372,373],[77,140,148,152,155,157,158,159,172,349,368],[77,140,148,152,155,157,158,159,172,291,338,362,370],[77,140,148,152,155,157,158,159,172,363,364,365,366,367],[77,140,148,152,155,157,158,159,172,364],[77,140,148,152,155,157,158,159,172,363],[77,140,148,152,155,157,158,159,172,262,263],[77,140,148,152,155,157,158,159,172,262,263,264,265],[77,140,148,152,155,157,158,159,172,262,264],[77,140,148,152,155,157,158,159,172,262],[77,140,148,152,155,157,158,159,172,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410],[77,140,148,152,155,157,158,159,172,379],[77,140,148,152,155,157,158,159,172,379,389],[77,140,148,152,155,157,158,159,172,269],[77,140,148,152,155,157,158,159,172,268,270],[77,140,148,152,155,157,158,159,172,222],[77,140,148,152,155,157,158,159,172,220,222],[77,140,148,152,155,157,158,159,172,211,219,220,221,223,225],[77,140,148,152,155,157,158,159,172,209],[77,140,148,152,155,157,158,159,172,212,217,222,225],[77,140,148,152,155,157,158,159,172,208,225],[77,140,148,152,155,157,158,159,172,212,213,216,217,218,225],[77,140,148,152,155,157,158,159,172,212,213,214,216,217,225],[77,140,148,152,155,157,158,159,172,209,210,211,212,213,217,218,219,221,222,223,225],[77,140,148,152,155,157,158,159,172,225],[77,140,148,152,155,157,158,159,172,207,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224],[77,140,148,152,155,157,158,159,172,207,225],[77,140,148,152,155,157,158,159,172,212,214,215,217,218,225],[77,140,148,152,155,157,158,159,172,216,225],[77,140,148,152,155,157,158,159,172,217,218,222,225],[77,140,148,152,155,157,158,159,172,210,220],[77,140,148,152,155,157,158,159,172,199,230,231],[77,140,148,152,155,157,158,159,172,198,199],[63,77,140,148,152,155,157,158,159,172],[77,92,95,98,99,140,148,152,155,157,158,159,172,189],[77,95,140,148,152,155,157,158,159,172,177,189],[77,95,99,140,148,152,155,157,158,159,172,189],[77,140,148,152,155,157,158,159,172,177],[77,89,140,148,152,155,157,158,159,172],[77,93,140,148,152,155,157,158,159,172],[77,91,92,95,140,148,152,155,157,158,159,172,189],[77,140,148,152,155,157,158,159,161,172,186],[77,89,140,148,152,155,157,158,159,172,197],[77,91,95,140,148,152,155,157,158,159,161,172,189],[77,86,87,88,90,94,140,148,151,152,155,157,158,159,172,177,189],[77,95,104,112,140,148,152,155,157,158,159,172],[77,87,93,140,148,152,155,157,158,159,172],[77,95,121,122,140,148,152,155,157,158,159,172],[77,87,90,95,140,148,152,155,157,158,159,172,180,189,197],[77,95,140,148,152,155,157,158,159,172],[77,91,95,140,148,152,155,157,158,159,172,189],[77,86,140,148,152,155,157,158,159,172],[77,89,90,91,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,140,148,152,155,157,158,159,172],[77,95,114,117,140,148,152,155,157,158,159,172],[77,95,104,105,106,140,148,152,155,157,158,159,172],[77,93,95,105,107,140,148,152,155,157,158,159,172],[77,94,140,148,152,155,157,158,159,172],[77,87,89,95,140,148,152,155,157,158,159,172],[77,95,99,105,107,140,148,152,155,157,158,159,172],[77,99,140,148,152,155,157,158,159,172],[77,93,95,98,140,148,152,155,157,158,159,172,189],[77,87,91,95,104,140,148,152,155,157,158,159,172],[77,95,114,140,148,152,155,157,158,159,172],[77,107,140,148,152,155,157,158,159,172],[77,89,95,121,140,148,152,155,157,158,159,172,180,195,197],[77,140,148,152,155,157,158,159,172,236,237],[77,140,148,152,155,157,158,159,172,236],[77,140,148,151,152,154,155,156,157,158,159,161,172,177,186,189,196,197,199,200,201,202,204,205,206,226,227,228,229,230,231],[77,140,148,152,155,157,158,159,172,201,202,203,204],[77,140,148,152,155,157,158,159,172,201],[77,140,148,152,155,157,158,159,172,202],[77,140,148,152,155,157,158,159,172,199,231],[71,77,140,148,152,155,157,158,159,172,248,249,258],[60,68,71,77,140,148,152,155,157,158,159,172,241,242,258],[77,140,148,152,155,157,158,159,172,251],[72,77,140,148,152,155,157,158,159,172],[60,71,73,77,140,148,152,155,157,158,159,172,241,250,257,258],[77,140,148,152,155,157,158,159,172,234],[60,65,68,71,73,77,140,143,148,152,155,157,158,159,172,177,231,234,235,238,241,243,244,247,250,252,253,258,259],[71,77,140,148,152,155,157,158,159,172,248,249,250,258],[77,140,148,152,155,157,158,159,172,231,254,259],[71,73,77,140,148,152,155,157,158,159,172,238,241,243,258],[77,140,148,152,155,157,158,159,172,195,244],[60,65,68,71,72,73,77,140,143,148,152,155,157,158,159,172,177,195,231,234,235,238,241,242,243,244,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,266],[77,140,148,152,155,157,158,159,172,267,429],[77,140,148,152,155,157,158,159,172,272,376,413],[77,140,148,152,155,157,158,159,172,267,430,432],[77,140,148,152,155,157,158,159,172,430,431],[77,140,145,148,152,155,157,158,159,172,430],[77,140,148,152,155,157,158,159,172,267,272],[77,140,148,152,155,157,158,159,172,271],[77,140,148,152,155,157,158,159,172,267,272,377],[77,140,148,152,155,157,158,159,172,376],[77,140,148,152,155,157,158,159,172,267,417,418,419],[77,140,148,152,155,157,158,159,172,272,377,414,415,416,417,418,419,421,422,426,427,428,429,430,431,432],[77,140,148,152,155,157,158,159,172,414],[77,140,145,148,152,155,157,158,159,172,272,377,414],[77,140,148,152,155,157,158,159,172,267,415,417,419,421,422],[77,140,148,152,155,157,158,159,172,272,411,414],[77,140,148,152,155,157,158,159,172,267,414,415],[77,140,148,152,155,157,158,159,172,412],[77,140,148,152,155,157,158,159,172,412,423,424,425],[77,140,148,152,155,157,158,159,172,267,426],[77,140,145,148,152,155,157,158,159,172,376,414],[77,140,148,152,155,157,158,159,172,412,413],[77,140,148,152,155,157,158,159,172,376,414,415,416],[77,140,141,145,148,152,155,157,158,159,172,376,413],[77,140,141,148,152,155,157,158,159,163,164,172,267,427]],"referencedMap":[[444,1],[442,2],[441,2],[447,3],[443,1],[445,4],[446,1],[247,5],[245,2],[198,2],[448,2],[450,6],[451,2],[449,2],[137,7],[138,7],[139,8],[140,9],[141,10],[142,11],[75,2],[143,12],[144,13],[145,14],[146,15],[147,16],[148,17],[149,17],[150,18],[151,19],[152,20],[153,21],[78,2],[154,22],[155,23],[156,24],[157,25],[158,26],[159,25],[160,27],[161,28],[163,29],[164,30],[165,30],[166,30],[167,31],[168,32],[169,33],[170,34],[171,35],[172,36],[173,36],[174,37],[175,2],[176,2],[177,38],[178,39],[179,38],[180,40],[181,41],[182,42],[183,43],[184,44],[185,45],[186,46],[187,47],[77,48],[74,2],[76,2],[197,49],[188,50],[189,51],[190,52],[191,53],[192,54],[193,55],[194,56],[79,25],[80,2],[81,57],[82,58],[83,2],[84,59],[85,2],[128,60],[129,61],[130,62],[131,62],[132,63],[133,2],[134,9],[135,64],[136,61],[195,65],[196,66],[452,67],[453,67],[454,2],[458,68],[455,2],[457,69],[257,70],[234,71],[232,2],[233,2],[60,2],[71,72],[66,73],[69,74],[248,75],[239,2],[242,76],[241,77],[253,77],[240,78],[256,2],[68,79],[70,79],[62,80],[65,81],[235,80],[67,82],[61,2],[246,2],[162,2],[456,2],[206,2],[274,2],[352,83],[353,84],[350,84],[351,2],[356,85],[355,86],[354,87],[278,2],[280,88],[279,84],[281,89],[357,2],[358,2],[361,90],[359,2],[360,2],[330,91],[331,92],[332,93],[328,94],[329,95],[282,84],[291,96],[283,84],[285,84],[286,2],[284,84],[287,84],[288,84],[289,84],[290,97],[375,98],[306,99],[307,2],[312,100],[309,101],[308,2],[310,2],[311,102],[376,103],[305,104],[314,105],[315,2],[298,106],[319,107],[304,108],[302,109],[338,110],[301,111],[300,112],[323,113],[325,113],[324,113],[322,114],[327,113],[326,114],[333,115],[321,116],[334,117],[337,118],[316,119],[335,113],[336,113],[317,120],[318,121],[303,122],[320,123],[313,124],[293,125],[295,102],[294,125],[297,126],[296,127],[275,84],[277,128],[276,2],[339,129],[340,2],[299,2],[341,84],[349,130],[292,128],[342,2],[343,84],[345,131],[344,132],[346,84],[347,84],[348,84],[362,133],[370,134],[374,135],[371,2],[372,102],[369,136],[373,137],[368,138],[365,139],[364,140],[366,139],[363,2],[367,140],[264,141],[266,142],[265,143],[263,144],[262,2],[411,145],[380,146],[390,146],[381,146],[391,146],[382,146],[383,146],[398,146],[397,146],[399,146],[400,146],[392,146],[384,146],[393,146],[385,146],[394,146],[386,146],[388,146],[396,147],[389,146],[395,147],[401,147],[387,146],[402,146],[407,146],[408,146],[403,146],[379,2],[409,2],[405,146],[404,146],[406,146],[410,146],[270,148],[268,2],[271,149],[269,2],[223,150],[221,151],[222,152],[210,153],[211,151],[218,154],[209,155],[214,156],[224,2],[215,157],[220,158],[226,159],[225,160],[208,161],[216,162],[217,163],[212,164],[219,150],[213,165],[200,166],[199,167],[207,2],[249,2],[63,2],[64,168],[58,2],[59,2],[10,2],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[56,2],[54,2],[55,2],[1,2],[57,2],[104,169],[116,170],[101,171],[117,172],[126,173],[92,174],[93,175],[91,176],[125,67],[120,177],[124,178],[95,179],[113,180],[94,181],[123,182],[89,183],[90,177],[96,184],[97,2],[103,185],[100,184],[87,186],[127,187],[118,188],[107,189],[106,184],[108,190],[111,191],[105,192],[109,193],[121,67],[98,194],[99,195],[112,196],[88,172],[115,197],[114,184],[102,195],[110,198],[119,2],[86,2],[122,199],[251,200],[237,201],[238,200],[236,2],[231,202],[205,203],[204,204],[202,204],[201,2],[203,205],[229,2],[228,2],[227,2],[230,206],[250,207],[243,208],[252,209],[73,210],[258,211],[260,212],[254,213],[261,214],[259,215],[244,216],[255,217],[267,218],[72,2],[428,2],[437,219],[429,220],[438,221],[432,222],[431,223],[430,2],[273,224],[272,225],[378,226],[377,227],[420,228],[433,229],[418,230],[421,231],[434,232],[422,233],[435,234],[415,233],[423,235],[426,236],[424,235],[425,235],[439,237],[412,2],[419,238],[414,239],[436,228],[417,240],[416,2],[427,241],[413,2],[440,242]],"latestChangedDtsFile":"./dist/zkp/zkp.test.d.ts"},"version":"5.5.4"} \ No newline at end of file diff --git a/tests/adapters/il-dmv.test.ts b/tests/adapters/il-dmv.test.ts new file mode 100644 index 0000000..b4bacae --- /dev/null +++ b/tests/adapters/il-dmv.test.ts @@ -0,0 +1,213 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import { verifyIllinoisDmvViaIdScan } from '../../src/adapters/registries/il-dmv.js'; + +vi.mock('axios', () => { + const post = vi.fn(); + return { + default: { post }, + post + }; +}); + +import axios from 'axios'; + +const baseInput = { + firstName: 'John', + lastName: 'Doe', + dateOfBirth: '1990-01-01', + licenseNumber: 'D1234567' +}; + +function makeAxiosError(status: number | undefined, data: unknown = {}): Error { + return Object.assign(new Error(`HTTP ${status}`), { + response: status !== undefined ? { status, data } : undefined + }); +} + +describe('verifyIllinoisDmvViaIdScan', () => { + const savedKey = process.env.IDSCAN_API_KEY; + const savedUrl = process.env.IDSCAN_BASE_URL; + + beforeEach(() => { + delete process.env.IDSCAN_API_KEY; + delete process.env.IDSCAN_BASE_URL; + vi.clearAllMocks(); + }); + + afterEach(() => { + if (savedKey === undefined) { + delete process.env.IDSCAN_API_KEY; + } else { + process.env.IDSCAN_API_KEY = savedKey; + } + if (savedUrl === undefined) { + delete process.env.IDSCAN_BASE_URL; + } else { + process.env.IDSCAN_BASE_URL = savedUrl; + } + vi.restoreAllMocks(); + }); + + it('returns REVIEW with reason when IDSCAN_API_KEY is not configured', async () => { + const result = await verifyIllinoisDmvViaIdScan(baseInput); + expect(result.status).toBe('REVIEW'); + expect(result.reason).toBe('IDSCAN_API_KEY not configured'); + expect(result.registryId).toBe('dmv_il'); + expect(result.sourceName).toBe('Illinois DMV (via IDScan)'); + expect(result.matchScore).toBe(0); + }); + + it('returns VERIFIED with score when API returns matched=true', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: true, score: 0.95 } }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.status).toBe('VERIFIED'); + expect(result.matchScore).toBe(0.95); + expect(result.proofInput.result).toBe('VERIFIED'); + expect(result.proofInput.provider).toBe('idscan'); + expect(result.proofInput.licenseNumberHash).toMatch(/^[0-9a-f]{8}$/); + }); + + it('returns NOT_FOUND when API returns matched=false', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: false } }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.status).toBe('NOT_FOUND'); + expect(result.matchScore).toBe(0); + }); + + it('defaults matchScore to 1 when matched=true and score is absent', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: true } }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.matchScore).toBe(1); + }); + + it('clamps score above 1 to exactly 1', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: true, score: 2.5 } }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.matchScore).toBe(1); + }); + + it('clamps negative score to 0', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: false, score: -0.5 } }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.matchScore).toBe(0); + }); + + it('returns NOT_FOUND with raw data on HTTP 404 from API', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockRejectedValueOnce(makeAxiosError(404, { message: 'record not found' })); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.status).toBe('NOT_FOUND'); + expect(result.matchScore).toBe(0); + expect(result.raw).toEqual({ message: 'record not found' }); + }); + + it('returns REVIEW with status code in reason on HTTP 500', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockRejectedValueOnce(makeAxiosError(500, {})); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.status).toBe('REVIEW'); + expect(result.reason).toBe('idscan_error_500'); + }); + + it('returns REVIEW with unknown status on network error (no response)', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockRejectedValueOnce(makeAxiosError(undefined)); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.status).toBe('REVIEW'); + expect(result.reason).toBe('idscan_error_unknown'); + }); + + it('uses custom IDSCAN_BASE_URL when set', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + process.env.IDSCAN_BASE_URL = 'https://custom.example.com/v2'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: true } }); + + await verifyIllinoisDmvViaIdScan(baseInput); + + expect(vi.mocked(axios.post)).toHaveBeenCalledWith( + 'https://custom.example.com/v2/dmv/verify', + expect.any(Object), + expect.any(Object) + ); + }); + + it('sends correct payload fields to IDScan API', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: { matched: true } }); + + await verifyIllinoisDmvViaIdScan(baseInput); + + expect(vi.mocked(axios.post)).toHaveBeenCalledWith( + expect.any(String), + { + jurisdiction: 'IL', + first_name: 'John', + last_name: 'Doe', + dob: '1990-01-01', + license_number: 'D1234567' + }, + expect.objectContaining({ + timeout: 15000, + headers: expect.objectContaining({ + 'content-type': 'application/json' + }) + }) + ); + }); + + it('includes raw API response body in successful result', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + const apiBody = { matched: true, score: 0.9, extra: 'data' }; + vi.mocked(axios.post).mockResolvedValueOnce({ data: apiBody }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result.raw).toEqual(apiBody); + }); + + it('handles null response.data gracefully by treating as NOT_FOUND', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post).mockResolvedValueOnce({ data: null }); + + const result = await verifyIllinoisDmvViaIdScan(baseInput); + + // matched = Boolean(null.matched) would throw, but body = (null || {}) + // so matched = Boolean(undefined) = false → NOT_FOUND + expect(result.status).toBe('NOT_FOUND'); + expect(result.matchScore).toBe(0); + }); + + it('produces stable hash for the same license number across calls', async () => { + process.env.IDSCAN_API_KEY = 'test-api-key'; + vi.mocked(axios.post) + .mockResolvedValueOnce({ data: { matched: true } }) + .mockResolvedValueOnce({ data: { matched: true } }); + + const result1 = await verifyIllinoisDmvViaIdScan(baseInput); + const result2 = await verifyIllinoisDmvViaIdScan(baseInput); + + expect(result1.proofInput.licenseNumberHash).toBe(result2.proofInput.licenseNumberHash); + }); +}); diff --git a/tests/api/routes.test.ts b/tests/api/routes.test.ts index 99689a9..1648378 100644 --- a/tests/api/routes.test.ts +++ b/tests/api/routes.test.ts @@ -609,6 +609,78 @@ describe('Fastify verification routes', () => { expect(blocked.headers.retryafter ?? blocked.headers['retry-after']).toBeDefined(); }); + it('handles notary_present false and maps to 0 in feature vector', async () => { + const response = await app.inject({ + method: 'POST', + url: '/v1/verify-bundle', + headers: { + authorization: `Bearer ${createJwt({ sub: 'partner-user' })}` + }, + payload: buildVerifyBody({ notary_present: false }) + }); + + expect(response.statusCode).toBe(200); + const firstCall = vi.mocked(verifyBundleMock).mock.calls.at(0); + expect(firstCall?.[0].deed_features[2]).toBe(0); + }); + + it('returns 500 when verify throws a non-Error value', async () => { + vi.mocked(verifyBundleMock).mockRejectedValueOnce('string-rejection'); + + const response = await app.inject({ + method: 'POST', + url: '/v1/verify-bundle', + headers: { + authorization: `Bearer ${createJwt({ sub: 'partner-user' })}` + }, + payload: buildVerifyBody() + }); + + expect(response.statusCode).toBe(500); + expect(response.json().error).toBe('Verification failed'); + }); + + it('returns 500 when status lookup throws an Error instance', async () => { + vi.spyOn(store, 'findByBundleHash').mockRejectedValueOnce(new Error('db crashed')); + + const response = await app.inject({ + method: 'GET', + url: '/v1/status/bundle-db-crashed', + headers: { + authorization: `Bearer ${createJwt({ sub: 'partner-user' })}` + } + }); + + expect(response.statusCode).toBe(500); + expect(response.json().error).toBe('Internal Server Error'); + }); + + it('accepts revoke when JWT has is_admin=true claim', async () => { + await app.inject({ + method: 'POST', + url: '/v1/verify-bundle', + headers: { + authorization: `Bearer ${createJwt({ sub: 'partner-user' })}` + }, + payload: buildVerifyBody({ deed_hash: 'bundle-is-admin-flag' }) + }); + + const response = await app.inject({ + method: 'POST', + url: '/v1/revoke', + headers: { + authorization: `Bearer ${createJwt({ sub: 'admin-user', is_admin: true })}` + }, + payload: { + bundle_hash: 'bundle-is-admin-flag', + reason: 'is_admin flag test' + } + }); + + expect(response.statusCode).toBe(200); + expect(response.json().revoked).toBe(true); + }); + it('returns 400 for malformed verify body', async () => { const response = await app.inject({ method: 'POST', @@ -629,3 +701,37 @@ describe('Fastify verification routes', () => { expect(response.json().error).toBe('Invalid request body'); }); }); + +describe('buildApiServer – LOG_LEVEL fallback', () => { + const savedLogLevel = process.env.LOG_LEVEL; + const savedJwtSecret = process.env.TRUSTSIGNAL_JWT_SECRET; + const savedJwtSecrets = process.env.TRUSTSIGNAL_JWT_SECRETS; + + afterEach(async () => { + if (savedLogLevel === undefined) { + delete process.env.LOG_LEVEL; + } else { + process.env.LOG_LEVEL = savedLogLevel; + } + if (savedJwtSecret === undefined) { + delete process.env.TRUSTSIGNAL_JWT_SECRET; + } else { + process.env.TRUSTSIGNAL_JWT_SECRET = savedJwtSecret; + } + if (savedJwtSecrets === undefined) { + delete process.env.TRUSTSIGNAL_JWT_SECRETS; + } else { + process.env.TRUSTSIGNAL_JWT_SECRETS = savedJwtSecrets; + } + }); + + it('builds successfully when LOG_LEVEL is not set (falls back to info)', async () => { + delete process.env.LOG_LEVEL; + process.env.TRUSTSIGNAL_JWT_SECRET = 'test-secret'; + process.env.TRUSTSIGNAL_JWT_SECRETS = 'test-secret'; + + const server = await buildApiServer({}); + expect(server).toBeDefined(); + await server.close(); + }); +}); diff --git a/tests/services/polygonMumbaiAnchor.test.ts b/tests/services/polygonMumbaiAnchor.test.ts new file mode 100644 index 0000000..e998696 --- /dev/null +++ b/tests/services/polygonMumbaiAnchor.test.ts @@ -0,0 +1,136 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +vi.mock('ethers', () => { + const mockWait = vi.fn().mockResolvedValue(undefined); + const mockSendTransaction = vi.fn().mockResolvedValue({ + hash: '0xmocktxhash', + wait: mockWait + }); + const mockGetNetwork = vi.fn().mockResolvedValue({ chainId: 80_001n }); + const MockProvider = vi.fn().mockImplementation(() => ({ + getNetwork: mockGetNetwork + })); + const MockWallet = vi.fn().mockImplementation(() => ({ + address: '0xmockaddress', + sendTransaction: mockSendTransaction + })); + return { + JsonRpcProvider: MockProvider, + Wallet: MockWallet, + __mockGetNetwork: mockGetNetwork, + __mockSendTransaction: mockSendTransaction, + __mockWait: mockWait + }; +}); + +import { anchorNullifierToPolygonMumbai } from '../../src/services/polygonMumbaiAnchor.js'; +import * as ethers from 'ethers'; + +describe('anchorNullifierToPolygonMumbai', () => { + const savedRpc = process.env.POLYGON_MUMBAI_RPC_URL; + const savedKey = process.env.POLYGON_MUMBAI_PRIVATE_KEY; + + beforeEach(() => { + process.env.POLYGON_MUMBAI_RPC_URL = 'https://mock-rpc.example.com'; + process.env.POLYGON_MUMBAI_PRIVATE_KEY = '0x' + 'a'.repeat(64); + vi.clearAllMocks(); + // Re-configure the mock getNetwork to return the correct chain ID by default + const anyEthers = ethers as unknown as Record; + if (typeof anyEthers['__mockGetNetwork'] === 'function') { + (anyEthers['__mockGetNetwork'] as ReturnType).mockResolvedValue({ chainId: 80_001n }); + } + if (typeof anyEthers['__mockSendTransaction'] === 'function') { + (anyEthers['__mockSendTransaction'] as ReturnType).mockResolvedValue({ + hash: '0xmocktxhash', + wait: (anyEthers['__mockWait'] as ReturnType) + }); + } + }); + + afterEach(() => { + if (savedRpc === undefined) { + delete process.env.POLYGON_MUMBAI_RPC_URL; + } else { + process.env.POLYGON_MUMBAI_RPC_URL = savedRpc; + } + if (savedKey === undefined) { + delete process.env.POLYGON_MUMBAI_PRIVATE_KEY; + } else { + process.env.POLYGON_MUMBAI_PRIVATE_KEY = savedKey; + } + }); + + it('throws when POLYGON_MUMBAI_RPC_URL is not set', async () => { + delete process.env.POLYGON_MUMBAI_RPC_URL; + + await expect(anchorNullifierToPolygonMumbai('bundle-001')).rejects.toThrow( + 'POLYGON_MUMBAI_RPC_URL and POLYGON_MUMBAI_PRIVATE_KEY are required' + ); + }); + + it('throws when POLYGON_MUMBAI_PRIVATE_KEY is not set', async () => { + delete process.env.POLYGON_MUMBAI_PRIVATE_KEY; + + await expect(anchorNullifierToPolygonMumbai('bundle-001')).rejects.toThrow( + 'POLYGON_MUMBAI_RPC_URL and POLYGON_MUMBAI_PRIVATE_KEY are required' + ); + }); + + it('throws when both env vars are missing', async () => { + delete process.env.POLYGON_MUMBAI_RPC_URL; + delete process.env.POLYGON_MUMBAI_PRIVATE_KEY; + + await expect(anchorNullifierToPolygonMumbai('bundle-001')).rejects.toThrow( + 'POLYGON_MUMBAI_RPC_URL and POLYGON_MUMBAI_PRIVATE_KEY are required' + ); + }); + + it('throws on chainId mismatch', async () => { + const anyEthers = ethers as unknown as Record; + if (typeof anyEthers['__mockGetNetwork'] === 'function') { + (anyEthers['__mockGetNetwork'] as ReturnType).mockResolvedValueOnce({ + chainId: 1n + }); + } + + await expect(anchorNullifierToPolygonMumbai('bundle-001')).rejects.toThrow( + 'Mumbai chainId mismatch' + ); + }); + + it('returns tx_hash, timestamp, and nullifier_hash on success', async () => { + const result = await anchorNullifierToPolygonMumbai('test-bundle-hash'); + + expect(result.tx_hash).toBe('0xmocktxhash'); + expect(result.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/); + expect(result.nullifier_hash).toMatch(/^[0-9a-f]{64}$/); + }); + + it('produces a deterministic nullifier_hash for the same bundle hash', async () => { + const anyEthers = ethers as unknown as Record; + if (typeof anyEthers['__mockSendTransaction'] === 'function') { + (anyEthers['__mockSendTransaction'] as ReturnType) + .mockResolvedValueOnce({ hash: '0xtx1', wait: vi.fn() }) + .mockResolvedValueOnce({ hash: '0xtx2', wait: vi.fn() }); + } + + const result1 = await anchorNullifierToPolygonMumbai('same-bundle'); + const result2 = await anchorNullifierToPolygonMumbai('same-bundle'); + + expect(result1.nullifier_hash).toBe(result2.nullifier_hash); + }); + + it('produces different nullifier_hash for different bundle hashes', async () => { + const anyEthers = ethers as unknown as Record; + if (typeof anyEthers['__mockSendTransaction'] === 'function') { + (anyEthers['__mockSendTransaction'] as ReturnType) + .mockResolvedValueOnce({ hash: '0xtx1', wait: vi.fn() }) + .mockResolvedValueOnce({ hash: '0xtx2', wait: vi.fn() }); + } + + const result1 = await anchorNullifierToPolygonMumbai('bundle-alpha'); + const result2 = await anchorNullifierToPolygonMumbai('bundle-beta'); + + expect(result1.nullifier_hash).not.toBe(result2.nullifier_hash); + }); +}); diff --git a/tests/verifiers/halo2Bridge.test.ts b/tests/verifiers/halo2Bridge.test.ts new file mode 100644 index 0000000..fca85df --- /dev/null +++ b/tests/verifiers/halo2Bridge.test.ts @@ -0,0 +1,176 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +vi.mock('node:fs/promises', () => ({ + access: vi.fn() +})); + +vi.mock('node:child_process', () => ({ + spawn: vi.fn() +})); + +import { access } from 'node:fs/promises'; +import { spawn } from 'node:child_process'; +import { EventEmitter } from 'node:events'; +import type { ChildProcess } from 'node:child_process'; + +import { runHalo2Verifier } from '../../src/verifiers/halo2Bridge.js'; + +function makeMockChild( + stdoutData: string, + stderrData: string, + exitCode: number | null +): ChildProcess { + const child = new EventEmitter() as unknown as ChildProcess; + const stdout = new EventEmitter(); + const stderr = new EventEmitter(); + (child as unknown as Record).stdout = stdout; + (child as unknown as Record).stderr = stderr; + + process.nextTick(() => { + stdout.emit('data', Buffer.from(stdoutData)); + stderr.emit('data', Buffer.from(stderrData)); + child.emit('close', exitCode); + }); + + return child; +} + +const validJsonOutput = JSON.stringify({ + mode: 'non-mem', + ok: true, + proof_gen_ms: 45.5, + gate_count: 100, + k: 10, + error: null +}); + +describe('runHalo2Verifier', () => { + beforeEach(() => { + vi.mocked(access).mockResolvedValue(undefined); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('succeeds for non-mem mode and returns ok=true', async () => { + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(validJsonOutput + '\n', '', 0)); + + const result = await runHalo2Verifier({ + mode: 'non-mem', + bundleHash: 'bundle-001' + }); + + expect(result.ok).toBe(true); + expect(result.proofGenMs).toBe(45.5); + expect(result.error).toBeUndefined(); + }); + + it('includes --tampered flag for non-mem mode when tampered=true', async () => { + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(validJsonOutput + '\n', '', 0)); + + await runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-x', tampered: true }); + + const spawnCall = vi.mocked(spawn).mock.calls[0]; + expect(spawnCall[1]).toContain('--tampered'); + }); + + it('does not include --tampered flag when tampered=false', async () => { + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(validJsonOutput + '\n', '', 0)); + + await runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-x', tampered: false }); + + const spawnCall = vi.mocked(spawn).mock.calls[0]; + expect(spawnCall[1]).not.toContain('--tampered'); + }); + + it('includes --revoked flag for revocation mode when revoked=true', async () => { + const revOutput = JSON.stringify({ mode: 'revocation', ok: true, proof_gen_ms: 20, gate_count: 0, k: 0, error: null }); + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(revOutput + '\n', '', 0)); + + await runHalo2Verifier({ mode: 'revocation', bundleHash: 'bundle-r', revoked: true }); + + const spawnCall = vi.mocked(spawn).mock.calls[0]; + expect(spawnCall[1]).toContain('--revoked'); + }); + + it('throws when process exits with non-zero code', async () => { + vi.mocked(spawn).mockReturnValueOnce(makeMockChild('', 'fatal error', 1)); + + await expect( + runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-err' }) + ).rejects.toThrow('halo2 verifier exited with code 1'); + }); + + it('throws when verifier emits no JSON output', async () => { + vi.mocked(spawn).mockReturnValueOnce(makeMockChild('not json at all', '', 0)); + + await expect( + runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-nojson' }) + ).rejects.toThrow('halo2 verifier did not emit JSON output'); + }); + + it('throws when JSON is missing required ok field', async () => { + const badJson = JSON.stringify({ mode: 'non-mem', proof_gen_ms: 10, gate_count: 0, k: 0, error: null }); + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(badJson + '\n', '', 0)); + + await expect( + runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-bad' }) + ).rejects.toThrow('halo2 verifier payload missing required fields'); + }); + + it('throws when JSON is missing required proof_gen_ms field', async () => { + const badJson = JSON.stringify({ mode: 'non-mem', ok: true, gate_count: 0, k: 0, error: null }); + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(badJson + '\n', '', 0)); + + await expect( + runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-bad2' }) + ).rejects.toThrow('halo2 verifier payload missing required fields'); + }); + + it('picks the last JSON line when multiple JSON lines are present', async () => { + const firstJson = JSON.stringify({ mode: 'non-mem', ok: false, proof_gen_ms: 1, gate_count: 0, k: 0, error: 'first' }); + const lastJson = JSON.stringify({ mode: 'non-mem', ok: true, proof_gen_ms: 99, gate_count: 0, k: 0, error: null }); + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(`${firstJson}\n${lastJson}\n`, '', 0)); + + const result = await runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-multi' }); + + expect(result.ok).toBe(true); + expect(result.proofGenMs).toBe(99); + }); + + it('propagates spawn error event as rejection', async () => { + const child = new EventEmitter() as unknown as ChildProcess; + const stdout = new EventEmitter(); + const stderr = new EventEmitter(); + (child as unknown as Record).stdout = stdout; + (child as unknown as Record).stderr = stderr; + + process.nextTick(() => { + child.emit('error', new Error('ENOENT')); + }); + + vi.mocked(spawn).mockReturnValueOnce(child); + + await expect( + runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-enoent' }) + ).rejects.toThrow('ENOENT'); + }); + + it('propagates error string in result when error field is non-null', async () => { + const outputWithError = JSON.stringify({ + mode: 'non-mem', + ok: false, + proof_gen_ms: 10, + gate_count: 0, + k: 0, + error: 'constraint failed' + }); + vi.mocked(spawn).mockReturnValueOnce(makeMockChild(outputWithError + '\n', '', 0)); + + const result = await runHalo2Verifier({ mode: 'non-mem', bundleHash: 'bundle-constrained' }); + + expect(result.ok).toBe(false); + expect(result.error).toBe('constraint failed'); + }); +}); diff --git a/tests/verifiers/revocationVerifier.test.ts b/tests/verifiers/revocationVerifier.test.ts new file mode 100644 index 0000000..64e36a9 --- /dev/null +++ b/tests/verifiers/revocationVerifier.test.ts @@ -0,0 +1,104 @@ +import { describe, expect, it, vi } from 'vitest'; + +vi.mock('../../src/verifiers/halo2Bridge.js', () => ({ + runHalo2Verifier: vi.fn() +})); + +import { runHalo2Verifier } from '../../src/verifiers/halo2Bridge.js'; +import { + RevocationVerificationError, + verifyRevocationProof +} from '../../src/verifiers/revocationVerifier.js'; + +describe('RevocationVerificationError', () => { + it('has correct name and message', () => { + const error = new RevocationVerificationError('test message'); + expect(error.name).toBe('RevocationVerificationError'); + expect(error.message).toBe('test message'); + expect(error).toBeInstanceOf(Error); + expect(error).toBeInstanceOf(RevocationVerificationError); + }); +}); + +describe('verifyRevocationProof', () => { + it('throws RevocationVerificationError when bundleHash is empty', async () => { + await expect(verifyRevocationProof({ bundleHash: '' })).rejects.toThrow(RevocationVerificationError); + await expect(verifyRevocationProof({ bundleHash: '' })).rejects.toThrow( + 'bundle hash is required for revocation proof verification' + ); + }); + + it('throws RevocationVerificationError when bundleHash is only whitespace', async () => { + await expect(verifyRevocationProof({ bundleHash: ' ' })).rejects.toThrow(RevocationVerificationError); + }); + + it('returns revocation_ok true when halo2 bridge confirms', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ + ok: true, + proofGenMs: 50 + }); + + const result = await verifyRevocationProof({ bundleHash: 'bundle-001' }); + + expect(result.revocation_ok).toBe(true); + expect(result.proof_gen_ms).toBe(50); + expect(result.error).toBeUndefined(); + }); + + it('returns revocation_ok false when halo2 bridge denies', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ + ok: false, + proofGenMs: 30, + error: 'proof invalid' + }); + + const result = await verifyRevocationProof({ bundleHash: 'bundle-revoked' }); + + expect(result.revocation_ok).toBe(false); + expect(result.error).toBe('proof invalid'); + }); + + it('passes revoked=true flag to halo2 bridge', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ ok: true, proofGenMs: 10 }); + + await verifyRevocationProof({ bundleHash: 'bundle-x', revoked: true }); + + expect(vi.mocked(runHalo2Verifier)).toHaveBeenCalledWith( + expect.objectContaining({ mode: 'revocation', bundleHash: 'bundle-x', revoked: true }) + ); + }); + + it('passes revoked=false when revoked is not provided', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ ok: true, proofGenMs: 10 }); + + await verifyRevocationProof({ bundleHash: 'bundle-y' }); + + expect(vi.mocked(runHalo2Verifier)).toHaveBeenCalledWith( + expect.objectContaining({ mode: 'revocation', bundleHash: 'bundle-y' }) + ); + }); + + it('wraps halo2 bridge Error in RevocationVerificationError with correct message', async () => { + vi.mocked(runHalo2Verifier).mockRejectedValueOnce(new Error('binary not found')); + + await expect(verifyRevocationProof({ bundleHash: 'bundle-fail' })).rejects.toThrow( + 'revocation proof verification failed: binary not found' + ); + }); + + it('thrown error is an instance of RevocationVerificationError', async () => { + vi.mocked(runHalo2Verifier).mockRejectedValueOnce(new Error('connection refused')); + + await expect(verifyRevocationProof({ bundleHash: 'bundle-fail-type' })).rejects.toBeInstanceOf( + RevocationVerificationError + ); + }); + + it('wraps non-Error rejections from halo2 bridge in RevocationVerificationError', async () => { + vi.mocked(runHalo2Verifier).mockRejectedValueOnce('string-error'); + + await expect(verifyRevocationProof({ bundleHash: 'bundle-str-err' })).rejects.toThrow( + 'revocation proof verification failed: string-error' + ); + }); +}); diff --git a/tests/verifiers/zkProofVerifier.test.ts b/tests/verifiers/zkProofVerifier.test.ts new file mode 100644 index 0000000..e7ad9a3 --- /dev/null +++ b/tests/verifiers/zkProofVerifier.test.ts @@ -0,0 +1,104 @@ +import { describe, expect, it, vi } from 'vitest'; + +vi.mock('../../src/verifiers/halo2Bridge.js', () => ({ + runHalo2Verifier: vi.fn() +})); + +import { runHalo2Verifier } from '../../src/verifiers/halo2Bridge.js'; +import { + ZkProofVerificationError, + verifyZkProof +} from '../../src/verifiers/zkProofVerifier.js'; + +describe('ZkProofVerificationError', () => { + it('has correct name and message', () => { + const error = new ZkProofVerificationError('test message'); + expect(error.name).toBe('ZkProofVerificationError'); + expect(error.message).toBe('test message'); + expect(error).toBeInstanceOf(Error); + expect(error).toBeInstanceOf(ZkProofVerificationError); + }); +}); + +describe('verifyZkProof', () => { + it('throws ZkProofVerificationError when bundleHash is empty', async () => { + await expect(verifyZkProof({ bundleHash: '' })).rejects.toThrow(ZkProofVerificationError); + await expect(verifyZkProof({ bundleHash: '' })).rejects.toThrow( + 'bundle hash is required for non-membership proof verification' + ); + }); + + it('throws ZkProofVerificationError when bundleHash is only whitespace', async () => { + await expect(verifyZkProof({ bundleHash: ' ' })).rejects.toThrow(ZkProofVerificationError); + }); + + it('returns non_mem_ok true when halo2 bridge confirms', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ + ok: true, + proofGenMs: 42 + }); + + const result = await verifyZkProof({ bundleHash: 'bundle-001' }); + + expect(result.non_mem_ok).toBe(true); + expect(result.proof_gen_ms).toBe(42); + expect(result.error).toBeUndefined(); + }); + + it('returns non_mem_ok false when halo2 bridge denies', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ + ok: false, + proofGenMs: 25, + error: 'non-membership proof invalid' + }); + + const result = await verifyZkProof({ bundleHash: 'bundle-tampered' }); + + expect(result.non_mem_ok).toBe(false); + expect(result.error).toBe('non-membership proof invalid'); + }); + + it('passes tampered=true flag to halo2 bridge', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ ok: false, proofGenMs: 10 }); + + await verifyZkProof({ bundleHash: 'bundle-x', tampered: true }); + + expect(vi.mocked(runHalo2Verifier)).toHaveBeenCalledWith( + expect.objectContaining({ mode: 'non-mem', bundleHash: 'bundle-x', tampered: true }) + ); + }); + + it('calls halo2 bridge in non-mem mode', async () => { + vi.mocked(runHalo2Verifier).mockResolvedValueOnce({ ok: true, proofGenMs: 10 }); + + await verifyZkProof({ bundleHash: 'bundle-y' }); + + expect(vi.mocked(runHalo2Verifier)).toHaveBeenCalledWith( + expect.objectContaining({ mode: 'non-mem' }) + ); + }); + + it('wraps halo2 bridge Error in ZkProofVerificationError with correct message', async () => { + vi.mocked(runHalo2Verifier).mockRejectedValueOnce(new Error('binary missing')); + + await expect(verifyZkProof({ bundleHash: 'bundle-fail' })).rejects.toThrow( + 'non-membership proof verification failed: binary missing' + ); + }); + + it('thrown error is an instance of ZkProofVerificationError', async () => { + vi.mocked(runHalo2Verifier).mockRejectedValueOnce(new Error('connection timeout')); + + await expect(verifyZkProof({ bundleHash: 'bundle-fail-type' })).rejects.toBeInstanceOf( + ZkProofVerificationError + ); + }); + + it('wraps non-Error rejections from halo2 bridge in ZkProofVerificationError', async () => { + vi.mocked(runHalo2Verifier).mockRejectedValueOnce(42); + + await expect(verifyZkProof({ bundleHash: 'bundle-num-err' })).rejects.toThrow( + 'non-membership proof verification failed: 42' + ); + }); +}); diff --git a/tests/verifiers/zkmlVerifier.test.ts b/tests/verifiers/zkmlVerifier.test.ts new file mode 100644 index 0000000..4424eee --- /dev/null +++ b/tests/verifiers/zkmlVerifier.test.ts @@ -0,0 +1,97 @@ +import { afterEach, describe, expect, it } from 'vitest'; + +import { ZkmlVerificationError, verifyZkml } from '../../src/verifiers/zkmlVerifier.js'; + +describe('ZkmlVerificationError', () => { + it('has correct name and message', () => { + const error = new ZkmlVerificationError('test message'); + expect(error.name).toBe('ZkmlVerificationError'); + expect(error.message).toBe('test message'); + expect(error).toBeInstanceOf(Error); + expect(error).toBeInstanceOf(ZkmlVerificationError); + }); +}); + +describe('verifyZkml – input validation', () => { + it('throws ZkmlVerificationError when feature vector has too few elements', async () => { + await expect(verifyZkml([0.1, 0.2, 0.3])).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml([0.1, 0.2, 0.3])).rejects.toThrow( + 'invalid feature vector length: expected 6, got 3' + ); + }); + + it('throws ZkmlVerificationError when feature vector has too many elements', async () => { + await expect(verifyZkml([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])).rejects.toThrow( + 'invalid feature vector length: expected 6, got 7' + ); + }); + + it('throws ZkmlVerificationError when feature vector is empty', async () => { + await expect(verifyZkml([])).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml([])).rejects.toThrow('invalid feature vector length: expected 6, got 0'); + }); + + it('throws ZkmlVerificationError when a feature value is NaN', async () => { + await expect(verifyZkml([0.1, 0.2, Number.NaN, 0.4, 0.5, 0.6])).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml([0.1, 0.2, Number.NaN, 0.4, 0.5, 0.6])).rejects.toThrow( + 'feature at index 2 is not a finite number' + ); + }); + + it('throws ZkmlVerificationError when a feature value is Infinity', async () => { + await expect(verifyZkml([0.1, 0.2, 0.3, Infinity, 0.5, 0.6])).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml([0.1, 0.2, 0.3, Infinity, 0.5, 0.6])).rejects.toThrow( + 'feature at index 3 is not a finite number' + ); + }); + + it('throws ZkmlVerificationError when a feature value is -Infinity', async () => { + await expect(verifyZkml([0.1, 0.2, 0.3, 0.4, -Infinity, 0.6])).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml([0.1, 0.2, 0.3, 0.4, -Infinity, 0.6])).rejects.toThrow( + 'feature at index 4 is not a finite number' + ); + }); + + it('throws ZkmlVerificationError when first feature is non-finite', async () => { + await expect(verifyZkml([NaN, 0.2, 0.3, 0.4, 0.5, 0.6])).rejects.toThrow( + 'feature at index 0 is not a finite number' + ); + }); +}); + +describe('verifyZkml – execution paths', () => { + const validFeatures: readonly number[] = [0.42, 2, 1, 0.01, 0.35, 0.5]; + + const savedMode = process.env.TRUSTSIGNAL_ZKML_MODE; + + afterEach(() => { + if (savedMode === undefined) { + delete process.env.TRUSTSIGNAL_ZKML_MODE; + } else { + process.env.TRUSTSIGNAL_ZKML_MODE = savedMode; + } + }); + + it('throws ZkmlVerificationError when Python mode fails (ezkl not installed)', async () => { + process.env.TRUSTSIGNAL_ZKML_MODE = 'python'; + + await expect(verifyZkml(validFeatures)).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml(validFeatures)).rejects.toThrow(/python ezkl bridge failed/); + }); + + it('throws ZkmlVerificationError when both JS and Python paths fail', async () => { + delete process.env.TRUSTSIGNAL_ZKML_MODE; + + await expect(verifyZkml(validFeatures)).rejects.toThrow(ZkmlVerificationError); + await expect(verifyZkml(validFeatures)).rejects.toThrow(/zkml verification failed/); + }); + + it('error message includes both JS and Python failure details', async () => { + delete process.env.TRUSTSIGNAL_ZKML_MODE; + + await expect(verifyZkml(validFeatures)).rejects.toThrow(/js:.*python fallback:/); + }); +}); + + diff --git a/vitest.config.ts b/vitest.config.ts index 6302c6f..f557260 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -13,7 +13,14 @@ export default defineConfig({ include: [ 'src/core/**/*.ts', 'src/middleware/**/*.ts', - 'src/routes/**/*.ts' + 'src/routes/**/*.ts', + 'src/verifiers/revocationVerifier.ts', + 'src/verifiers/zkProofVerifier.ts', + 'src/services/**/*.ts', + 'src/adapters/**/*.ts', + 'packages/core/src/receipt.ts', + 'packages/core/src/attom/normalize.ts', + 'packages/core/src/anchor/portable.ts' ], exclude: ['**/*.d.ts'], thresholds: {