@paradym/wallet-sdk 0.0.0-alpha-20251007105217 → 0.0.0-alpha-20251007110446
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +22 -22
- package/dist/index.d.ts +12 -12
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["saltStoreBaseOptions: KeychainOptions","walletKeyStoreBaseOptions: KeychainOptions","walletKey","context","WalletJsonStoreProvider: React.FC<Props>","attributePaths: string[][]","recordMetadata: OpenId4VcCredentialMetadata | null","attributeGroups: Array<[string, unknown]>","value","issuerDisplay: Partial<CredentialIssuerDisplay>","credentialDisplay: Partial<CredentialDisplay>","credentialDisplay: Partial<CredentialDisplay>","credentialMetadata: CredentialMetadata","issuerDisplay: Partial<CredentialIssuerDisplay>","credentialDisplay: Partial<CredentialDisplay>","b","v","Subscription","timeout","Subscriber","ConsumerObserver","SafeSubscriber","Observable","observable","Symbol_observable","OperatorSubscriber","err","Action","timeout","AsyncAction","Scheduler","AsyncScheduler","Symbol_observable","Symbol_iterator","Symbol_observable","config","config","first","addRecord","updateRecord","removeRecord","MdocRecordProvider: React.FC<PropsWithChildren<Props>>","addRecord","updateRecord","removeRecord","SdJwtVcRecordProvider: React.FC<PropsWithChildren<Props>>","addRecord","updateRecord","removeRecord","W3cCredentialRecordProvider: React.FC<PropsWithChildren<Props>>","didMethod: 'key' | 'jwk' | undefined","verificationMethodId: string","credentialSets: NonNullable<DcqlQueryResult['credential_sets']>","entries: FormattedSubmissionEntry[]","disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']","parsedPath: Array<{\n scope: string\n operation: string\n expression: { type: string; value: string; [key: string]: unknown }\n }>","simplified: Array<string | null>","disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']","trustedEntities: TrustedEntity[]","organizationName: string | undefined","logoUri: string | undefined","trustedEntities: TrustedEntity[]","organizationName: string | undefined","logoUri: string | undefined","uri: string | undefined","entityId: string | undefined","formattedSubmission: FormattedSubmission","resolvedAuthorizationRequest: OpenId4VciResolvedAuthorizationRequest | undefined","OpenId4VciAuthorizationFlow","flowType: 'issue' | 'verify' | 'connect'","connectionId: string | undefined","observable: Observable<CredentialStateChangedEvent | ProofStateChangedEvent> | undefined","observable","connectionRecord: ConnectionRecord | undefined","outOfBandRecord: OutOfBandRecord","ConnectionProvider: React.FC<PropsWithChildren<Props>>","useCredentials","useCredentialById","CredentialExchangeProvider: React.FC<PropsWithChildren<Props>>","ProofExchangeProvider: React.FC<PropsWithChildren<Props>>","connection","children","getAssetByID","Platform","ExponentConstants","ExpoUpdates","CodedError","Constants","Platform","name","Platform","AssetUris.getFilename","AssetUris.getFileExtension","moduleId","resolveAssetSource","ImageAssets.isImageType","ImageAssets.getImageInfoAsync","credentials: DcqlCredentialsForRequest","Image","width: number","height: number","asset: ExpoAsset.Asset","logger","name","useCredentialById","formatInput: { indy?: AnonCredsSelectedCredentials; anoncreds?: AnonCredsSelectedCredentials } | undefined","selectedAttributes: Record<string, AnonCredsRequestedAttributeMatch>","selectedPredicates: Record<string, AnonCredsRequestedPredicateMatch>","match","decode","queryString","filter","timeout"],"sources":["../src/error/biometrics.ts","../src/error.ts","../src/logger.ts","../src/secure/error/KeychainError.ts","../src/secure/error/WalletUnlockError.ts","../src/secure/kdf.ts","../src/secure/keychain.ts","../src/secure/secure-wallet-key/walletKeySaltStore.ts","../src/secure/secure-wallet-key/walletKeyStore.ts","../src/secure/secure-wallet-key/secureWalletKey.ts","../src/secure/secure-wallet-key/SecureUnlockProvider.tsx","../src/agent.ts","../src/providers/WalletJsonStoreProvider.tsx","../src/utils/date.ts","../src/display/strings.ts","../src/display/common.ts","../src/storage/walletJsonStore.ts","../src/storage/activities.ts","../src/hooks/useActivities.tsx","../src/hooks/useActivityById.tsx","../src/metadata/credentials.ts","../src/utils/jwkThumbprint.ts","../src/display/mdl.ts","../src/display/docTypeOfVct.ts","../src/utils/image.ts","../src/display/mapAttributes.ts","../src/utils/url.ts","../src/display/openid4vc.ts","../src/display/mdoc.ts","../src/display/sdJwt.ts","../src/display/w3c.ts","../src/display/credential.ts","../../../node_modules/tslib/tslib.es6.mjs","../../../node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../node_modules/rxjs/dist/esm5/internal/config.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../node_modules/rxjs/dist/esm5/internal/NotificationFactories.js","../../../node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../node_modules/rxjs/dist/esm5/internal/Observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../node_modules/rxjs/dist/esm5/internal/observable/empty.js","../../../node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../node_modules/rxjs/dist/esm5/internal/util/EmptyError.js","../../../node_modules/rxjs/dist/esm5/internal/firstValueFrom.js","../../../node_modules/rxjs/dist/esm5/internal/util/isDate.js","../../../node_modules/rxjs/dist/esm5/internal/operators/timeout.js","../../../node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../node_modules/rxjs/dist/esm5/internal/operators/defaultIfEmpty.js","../../../node_modules/rxjs/dist/esm5/internal/operators/take.js","../../../node_modules/rxjs/dist/esm5/internal/operators/throwIfEmpty.js","../../../node_modules/rxjs/dist/esm5/internal/operators/first.js","../src/utils/records.ts","../src/providers/MdocProvider.tsx","../src/providers/SdJwtVcProvider.tsx","../src/providers/W3cCredentialsProvider.tsx","../src/hooks/useCredentials.tsx","../src/hooks/useCredentialByCategory.tsx","../src/hooks/useCredentialById.tsx","../src/openid4vc/credentialBindingResolver.ts","../src/openid4vc/func/getCredentialDisplay.ts","../src/format/dcqlRequest.ts","../src/format/presentationExchangeRequest.ts","../src/trust/handlers/did.ts","../src/trust/handlers/x509.ts","../src/trust/handlers/eudiRpAuthentication.ts","../src/trust/handlers/openIdFederation.ts","../src/trust/trustMechanism.ts","../src/openid4vc/getCredentialsForProofRequest.ts","../src/utils/encoding.ts","../src/invitation/resolver.ts","../src/providers/ConnectionProvider.tsx","../src/providers/CredentialExchangeProvider.tsx","../src/providers/ProofExchangeProvider.tsx","../src/hooks/usePreFetchInboxDisplayMetadata.tsx","../src/providers/ExchangeRecordDisplayMetadataProvider.tsx","../src/providers/AgentProvider.tsx","../src/hooks/useDidCommConnectionActions.tsx","../../../node_modules/@react-native/assets-registry/registry.js","../../../node_modules/expo-modules-core/index.js","../../../node_modules/expo-asset/build/AssetSourceResolver.js","../../../node_modules/expo-constants/build/Constants.types.js","../../../node_modules/expo-constants/build/ExponentConstants.js","../../../node_modules/expo-constants/build/Constants.js","../../../node_modules/expo-asset/build/AssetUris.js","../../../node_modules/expo-asset/build/PlatformUtils.js","../../../node_modules/expo-asset/build/AssetSources.js","../../../node_modules/expo-asset/build/ExpoAsset.js","../../../node_modules/expo-asset/build/ImageAssets.js","../../../node_modules/expo-asset/build/LocalAssets.js","../../../node_modules/expo-asset/build/resolveAssetSource.js","../../../node_modules/expo-asset/build/Asset.js","../src/storage/credentials.ts","../src/openid4vc/batch.ts","../src/openid4vc/transaction.ts","../src/invitation/shareProof.ts","../src/openid4vc/dcApi.ts","../src/didcomm/mediation.ts","../src/hooks/useDidCommMessagePickup.tsx","../src/hooks/useDidCommMediatorSetup.tsx","../src/hooks/useParadym.tsx","../src/hooks/useDidCommCredentialActions.tsx","../src/hooks/useDidCommPresentationActions.tsx","../src/hooks/useDidcommAgent.tsx","../src/hooks/useOpenId4VcAgent.tsx","../src/hooks/useCredentialRecords.tsx","../src/hooks/useCredentialRecordById.tsx","../../../node_modules/strict-uri-encode/index.js","../../../node_modules/decode-uri-component/index.js","../../../node_modules/split-on-first/index.js","../../../node_modules/filter-obj/index.js","../../../node_modules/query-string/index.js","../src/format/submission.ts","../src/invitation/fetch.ts","../src/invitation/parser.ts","../src/openid4vc/func/retrieveCredentials.ts","../src/openid4vc/func/acquireCredentialsAuth.ts","../src/openid4vc/func/acquireCredentialsAuthPresentationDuringIssuance.ts","../src/openid4vc/func/acquireCredentialsPreAuth.ts","../src/openid4vc/func/acquireCredentialsPreAuthWithTransactionCode.ts","../src/openid4vc/func/acquireCredentials.ts","../src/openid4vc/func/completeCredentialRetrieval.ts","../src/ParadymWalletSdk.tsx"],"sourcesContent":["const androidErrorCodes = (codes: number[]) => codes.map((code) => `code: ${code},`)\n\nexport const cancelMessages = [\n // From @animo-id/expo-secure-environment\n 'authentication canceled',\n\n // From react-native-keychain\n // https://github.com/oblador/react-native-keychain/issues/609\n // iOS\n 'user canceled the operation',\n\n // Android\n // These error codes probably means the user cancelled\n // https://developer.android.com/reference/androidx/biometric/BiometricPrompt#constants_1\n ...androidErrorCodes([10, 13, -1, 16, 3, 2, 8]),\n]\n\nexport const notEnabledMessages = [\n // From @animo-id/expo-secure-environment\n 'biometry is not available for this app',\n\n // From react-native-keychain\n // iOS\n 'the user name or passphrase you entered is not correct.',\n\n // Android\n // These error codes probably means biometry is not enabled\n // https://developer.android.com/reference/androidx/biometric/BiometricPrompt#constants_1\n ...androidErrorCodes([12, 1, 7, 9, 11, 14, 4, 15]),\n // Happens when no fingerprints are configured\n 'at least one biometric must be enrolled to create keys requiring user authentication for every use',\n]\n","import { cancelMessages, notEnabledMessages } from './error/biometrics'\n\nexport class ParadymWalletSdkError extends Error {\n constructor(message: string = new.target.name) {\n super(message)\n }\n}\n\nexport class ParadymWalletMustBeDidCommAgentError extends ParadymWalletSdkError {}\nexport class ParadymWalletMustBeOpenId4VcAgentError extends ParadymWalletSdkError {}\nexport class ParadymWalletMustBeInitializedError extends ParadymWalletSdkError {}\n\nexport class ParadymWalletUnsupportedCredentialRecordTypeError extends ParadymWalletSdkError {}\n\nexport class ParadymWalletNoMediatorDidProvidedError extends ParadymWalletSdkError {}\n\nexport class ParadymWalletInvitationError extends ParadymWalletSdkError {}\nexport class ParadymWalletInvitationReceiveError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationMultipleRequestsError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationNotRecognizedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationParseError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationRetrievalError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationDidcommHandlerMustBeDefinedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationAlreadyUsedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationDidcommUnsupportedProtocolError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationOpenIdCredentialHandlerMustBeDefinedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationOpenIdAuthorizationRequestHandlerMustBeDefinedError extends ParadymWalletInvitationError {}\n\nexport class ParadymWalletNoRequestToResolveError extends ParadymWalletInvitationError {}\n\nexport class ParadymWalletInvalidTrustMechnismError extends ParadymWalletSdkError {}\n\n// biome-ignore lint/complexity/noStaticOnlyClass:\nexport class ParadymWalletBiometricAuthenticationError extends ParadymWalletSdkError {\n public static tryParseFromError(error: unknown): ParadymWalletBiometricAuthenticationError | null {\n if (ParadymWalletBiometricAuthenticationCancelledError.isBiometricAuthenticationCancelledError(error)) {\n return new ParadymWalletBiometricAuthenticationError()\n }\n\n if (ParadymWalletBiometricAuthenticationNotEnabledError.isBiometricAuthenticationNotEnabledError(error)) {\n return new ParadymWalletBiometricAuthenticationError()\n }\n\n return null\n }\n}\n\n// biome-ignore lint/complexity/noStaticOnlyClass:\nexport class ParadymWalletBiometricAuthenticationCancelledError extends ParadymWalletBiometricAuthenticationError {\n public static isBiometricAuthenticationCancelledError(error: unknown) {\n return error instanceof Error && cancelMessages.some((m) => error.message.toLowerCase().includes(m))\n }\n}\n\n// biome-ignore lint/complexity/noStaticOnlyClass:\nexport class ParadymWalletBiometricAuthenticationNotEnabledError extends ParadymWalletBiometricAuthenticationError {\n public static isBiometricAuthenticationNotEnabledError(error: unknown) {\n return error instanceof Error && notEnabledMessages.some((m) => error.message.toLowerCase().includes(m))\n }\n}\n","import { ConsoleLogger, LogLevel } from '@credo-ts/core'\n\nexport { LogLevel }\n\ntype LogData = Record<string, unknown>\ntype LogMessage = { level: LogLevel; message: string; data?: LogData }\n\nexport class ParadymWalletSdkLogger extends ConsoleLogger {\n private loggedMessages: LogMessage[] = []\n private loggedMessagesLimit = 0\n\n public trackLoggedMessages(messageLimit = 1000) {\n this.loggedMessagesLimit = messageLimit\n }\n\n public resetLoggedMessages() {\n this.loggedMessages = []\n }\n\n public stopLoggedMessagesTracking() {\n this.loggedMessagesLimit = 0\n this.loggedMessages = []\n }\n\n public get loggedMessageContents() {\n return JSON.stringify(this.loggedMessages)\n }\n\n private addToLoggedMessages(level: LogLevel, message: string, data?: LogData) {\n if (this.loggedMessagesLimit === 0) return\n if (this.loggedMessages.length >= this.loggedMessagesLimit) this.loggedMessages.shift()\n this.loggedMessages.push({\n level,\n message,\n data,\n })\n }\n\n public fatal(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.fatal, message, data)\n super.fatal(message, data)\n }\n public error(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.error, message, data)\n super.error(message, data)\n }\n public warn(message: string, data?: LogData): void {\n if (message.includes('module is experimental')) return\n this.addToLoggedMessages(LogLevel.warn, message, data)\n super.warn(message, data)\n }\n public info(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.info, message, data)\n super.info(message, data)\n }\n public debug(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.debug, message, data)\n super.debug(message, data)\n }\n public trace(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.trace, message, data)\n super.trace(message, data)\n }\n}\n\nexport const logger = (logLevel: LogLevel = LogLevel.warn) => new ParadymWalletSdkLogger(logLevel)\n","export class KeychainError extends Error {\n public readonly reason: 'userCancelled' | 'unknown'\n\n public constructor(message: string, options: ErrorOptions & { reason?: 'userCancelled' | 'unknown' } = {}) {\n super(message, options)\n this.reason = options.reason ?? 'unknown'\n }\n}\n","export class WalletUnlockError extends Error {}\n","import argon2 from 'react-native-argon2'\n\n/**\n * Derive a hash from pin and salt. (which can be used to seed a key)\n *\n * Configuration based on recommended parameters defined in RFC 9106\n * @see https://www.rfc-editor.org/rfc/rfc9106.html#name-parameter-choice\n *\n * returns a hex-encoded derived hash\n *\n */\nconst derive = async (pin: string, salt: string): Promise<string> => {\n // Takes about 1.5 second on iPhone 14 Pro\n // TODO: Need to test on Android/different devices as well\n const { rawHash } = await argon2(pin, salt, {\n hashLength: 32,\n mode: 'argon2id',\n parallelism: 4,\n iterations: 8,\n memory: 64 * 1024,\n })\n\n return rawHash\n}\n\n/**\n * Generate 32 byte key crypto getRandomValues.\n *\n * @see https://github.com/LinusU/react-native-get-random-values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\n */\nconst generateSalt = () => crypto.getRandomValues(new Uint8Array(32)).join('')\n\n/**\n * Derive key from pin and salt.\n *\n * Configuration based on recommended parameters defined in RFC 9106\n * @see https://www.rfc-editor.org/rfc/rfc9106.html#name-parameter-choice\n */\nexport const kdf = { derive, generateSalt }\n","import { ParadymWalletBiometricAuthenticationError } from '@paradym/wallet-sdk/error'\nimport * as Keychain from 'react-native-keychain'\nimport { KeychainError } from './error/KeychainError'\n\nexport type KeychainOptions = Omit<Keychain.Options, 'service'>\n\n/**\n * Store the value with id in the keychain.\n *\n * @throws {KeychainError} if an unexpected error occurs\n */\nexport async function storeKeychainItem(id: string, value: string, options: KeychainOptions): Promise<void> {\n const result = await Keychain.setGenericPassword(id, value, {\n ...options,\n service: id,\n }).catch((error) => {\n throw (\n ParadymWalletBiometricAuthenticationError.tryParseFromError(error) ??\n new KeychainError(`Error storing value for id '${id}' in keychain`, {\n cause: error,\n })\n )\n })\n\n if (!result) {\n throw new KeychainError(`Error storing value for id '${id}' in keychain`)\n }\n}\n\n/**\n * Retrieve a value by id from the keychain\n *\n * @returns {string | null} the value or null if it doesn't exist\n * @throws {KeychainError} if an unexpected error occurs\n * @throws {BiometricAuthenticationError} if biometric authentication failed\n */\nexport async function getKeychainItemById(id: string, options: KeychainOptions): Promise<string | null> {\n const result = await Keychain.getGenericPassword({\n ...options,\n service: id,\n }).catch((error) => {\n throw (\n ParadymWalletBiometricAuthenticationError.tryParseFromError(error) ??\n new KeychainError(`Error retrieving value with id '${id}' from keychain`, {\n cause: error,\n reason: 'unknown',\n })\n )\n })\n\n if (!result) {\n return null\n }\n\n return result.password\n}\n\n/**\n * Remove a value by id from the keychain\n *\n * @returns {boolean} Whether the keychain item was removed\n * @throws {KeychainError} if an unexpected error occurs\n */\nexport async function removeKeychainItemById(id: string, options: KeychainOptions): Promise<boolean> {\n const result = await Keychain.resetGenericPassword({\n ...options,\n service: id,\n }).catch((error) => {\n throw new KeychainError(`Error removing value with id '${id}' from keychain`, {\n cause: error,\n })\n })\n\n return result\n}\n","import * as Keychain from 'react-native-keychain'\nimport { kdf } from '../kdf'\nimport { type KeychainOptions, getKeychainItemById, removeKeychainItemById, storeKeychainItem } from '../keychain'\n\nconst saltStoreBaseOptions: KeychainOptions = {\n /* Salt can be accessed on this device */\n accessible: Keychain.ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n}\n\nconst SALT_ID = (version: number) => `PARADYM_WALLET_SALT_${version}`\n\n/**\n * Store the salt in the keychain.\n *\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function storeSalt(salt: string, version: number): Promise<void> {\n const saltId = SALT_ID(version)\n\n await storeKeychainItem(saltId, salt, saltStoreBaseOptions)\n}\n\n/**\n * Retrieve the salt from the keychain.\n *\n * @returns {string | null} the salt or null if it doesn't exist\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function getSalt(version: number): Promise<string | null> {\n const saltId = SALT_ID(version)\n\n // TODO: should probably throw error if not found\n const salt = await getKeychainItemById(saltId, saltStoreBaseOptions)\n\n return salt\n}\n\n/*\n * Generate and store a salt. Optionally returning the existing one if it exists\n */\nasync function createAndStoreSalt(returnExisting: boolean, version: number) {\n if (returnExisting) {\n const existingSalt = await getSalt(version)\n if (existingSalt) return existingSalt\n }\n\n const salt = kdf.generateSalt()\n await storeSalt(salt, version)\n\n return salt\n}\n\nasync function removeSalt(version: number) {\n const saltId = SALT_ID(version)\n return await removeKeychainItemById(saltId, saltStoreBaseOptions)\n}\n\nexport const walletKeySaltStore = {\n getSalt,\n storeSalt,\n createAndStoreSalt,\n removeSalt,\n}\n","import { Platform } from 'react-native'\nimport * as Keychain from 'react-native-keychain'\nimport { type KeychainOptions, getKeychainItemById, removeKeychainItemById, storeKeychainItem } from '../keychain'\n\nconst walletKeyStoreBaseOptions: KeychainOptions = {\n /* Only allow the current set of enrolled biometrics to access the wallet key */\n accessControl: Keychain.ACCESS_CONTROL.BIOMETRY_CURRENT_SET,\n\n // TODO: might want to use WHEN_UNLOCKED_THIS_DEVICE_ONLY, to allow devices without a passcode (as we have our own passcode and extra biometrics check)\n // Not sure how it works if you have no passcode, but you do have biometrics (i think that is not possible?)\n /* Only allow access to the wallet key on the device is was created on, is unlocked, and has a passcode set */\n accessible: Keychain.ACCESSIBLE.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY,\n\n // TODO: internationalization\n authenticationPrompt: {\n title: 'Unlock wallet',\n description: 'Access to your wallet is locked behind a biometric verification.',\n },\n\n /* Android Only. Ensure wallet key is protected by hardware. Wil results in error if hardware is not available. Hardware is either StrongBox or TEE */\n securityLevel: Keychain.SECURITY_LEVEL.SECURE_HARDWARE,\n\n /* Android Only. Ensure wallet key is protected using RSA storage type, this is the only storage type supporting biometrics. */\n storage: Keychain.STORAGE_TYPE.RSA,\n\n /* Ensure wallet key is protected by biometrics. It is not possible to fallback to the device passcode if the biometric authentication failed. */\n authenticationType: Keychain.AUTHENTICATION_TYPE.BIOMETRICS,\n}\n\nconst WALLET_KEY_ID = (version: number) => `PARADYM_WALLET_KEY_${version}`\n\n/**\n * Returns whether biometry backed wallet key can be used. Can be called before trying to access\n * or store the wallet key in the keychain.\n */\nasync function canUseBiometryBackedWalletKey(): Promise<boolean> {\n if (Platform.OS === 'android') {\n /**\n * `setUserAuthenticationParameters` is only available on Android API 30+, and is needed to ensure\n * the key can only be accessed using biometry. React Native Keychain will fallback to allowing keys\n * to be accessed by the device passcode. For this reason we only allow biometry to be used on devices\n * running Android API 30 or higher.\n */\n if (Platform.Version < 30) {\n return false\n }\n\n /**\n * Android Only API. We only allow hardware secured key storage for unlocking with biometrics\n */\n const securityLevel = await Keychain.getSecurityLevel(walletKeyStoreBaseOptions)\n if (!securityLevel || securityLevel !== Keychain.SECURITY_LEVEL.SECURE_HARDWARE) {\n return false\n }\n }\n\n if (Platform.OS === 'ios') {\n /**\n * Checks whether the key can be authenticated using only biometrics (no passcode fallback)\n */\n const canUseAuthentication = await Keychain.canImplyAuthentication(walletKeyStoreBaseOptions)\n if (!canUseAuthentication) return false\n }\n\n const supportedBiometryType = await Keychain.getSupportedBiometryType(walletKeyStoreBaseOptions)\n\n /**\n * We only support biometrics secured storage of the wallet key\n */\n return supportedBiometryType !== null\n}\n\n/**\n * Store the wallet key in hardware backed, biometric protected storage.\n *\n * Will use Secure Enclave on iOS and StrongBox/TEE on Android. If biometrics is not enabled/available,\n * or when hardware backed storage.\n *\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function storeWalletKey(walletKey: string, version: number): Promise<void> {\n const walletKeyId = WALLET_KEY_ID(version)\n await storeKeychainItem(walletKeyId, walletKey, walletKeyStoreBaseOptions)\n}\n\n/**\n * Retrieve the wallet key from hardware backed, biometric protected storage.\n *\n * @returns {string | null} the wallet key or null if it doesn't exist\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function getWalletKeyUsingBiometrics(version: number): Promise<string | null> {\n const walletKeyId = WALLET_KEY_ID(version)\n return await getKeychainItemById(walletKeyId, walletKeyStoreBaseOptions)\n}\n\n/**\n * Delete the wallet key from hardware backed, biometric protected storage.\n *\n * @returns {boolean} whether the wallet key was removed (false if the wallet key wasn't stored)\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function removeWalletKey(version: number): Promise<boolean> {\n const walletKeyId = WALLET_KEY_ID(version)\n return await removeKeychainItemById(walletKeyId, walletKeyStoreBaseOptions)\n}\n\nexport const walletKeyStore = {\n removeWalletKey,\n getWalletKeyUsingBiometrics,\n storeWalletKey,\n canUseBiometryBackedWalletKey,\n}\n","import { TypedArrayEncoder } from '@credo-ts/core'\nimport { askar } from '@openwallet-foundation/askar-react-native'\nimport { MMKV, useMMKVNumber } from 'react-native-mmkv'\nimport { WalletUnlockError } from '../error/WalletUnlockError'\nimport { kdf } from '../kdf'\nimport { walletKeySaltStore } from './walletKeySaltStore'\nimport { walletKeyStore } from './walletKeyStore'\n\nconst mmkv = new MMKV()\n\nasync function getWalletKeyUsingPin(pin: string, version: number) {\n const salt = await walletKeySaltStore.getSalt(version)\n if (!salt) {\n throw new WalletUnlockError('Error unlocking wallet. No salt configured')\n }\n\n const walletKeySeed = await kdf.derive(pin, salt)\n\n // The wallet key needs to be a xchaca key, so we use the derived key based on pin and salt as\n // the seed for the actual key\n const walletKey = askar.storeGenerateRawKey({ seed: TypedArrayEncoder.fromString(walletKeySeed) })\n\n return walletKey\n}\n\nexport function useWalletKeyVersion() {\n return useMMKVNumber('walletKeyVersion', mmkv)\n}\n\nexport function getWalletKeyVersion() {\n return mmkv.getNumber('walletKeyVersion') ?? 1\n}\n\nexport function setWalletKeyVersion(version: number) {\n mmkv.set('walletKeyVersion', version)\n}\n\nexport const secureWalletKey = {\n getWalletKeyUsingPin,\n ...walletKeyStore,\n ...walletKeySaltStore,\n\n getWalletKeyVersion,\n setWalletKeyVersion,\n}\n","import { WalletInvalidKeyError } from '@credo-ts/core'\nimport { ParadymWalletSdk, type SetupParadymWalletSdkOptions } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { type PropsWithChildren, createContext, useContext, useEffect, useState } from 'react'\nimport { KeychainError } from '../error/KeychainError'\nimport { secureWalletKey } from './secureWalletKey'\n\ntype UnlockOptions = {\n /**\n *\n * When setting up the agent for the first time, the app might want to prompt the biometrics to make sure\n * the user has access\n *\n * This should be set on the unlock call during the onboarding of the user, but not during authentication afterwards\n *\n */\n enableBiometrics: boolean\n}\n\nexport type SecureUnlockState = 'initializing' | 'not-configured' | 'acquired-wallet-key' | 'locked' | 'unlocked'\n\nexport type UnlockMethod = 'pin' | 'biometrics'\n\nexport type SecureUnlockReturnInitializing = {\n state: 'initializing'\n}\n\nexport type SecureUnlockReturnNotConfigured = {\n state: 'not-configured'\n setPin: (pin: string) => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturnWalletKeyAcquired = {\n state: 'acquired-wallet-key'\n unlockMethod: UnlockMethod\n unlock: (options?: UnlockOptions) => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturnLocked = {\n state: 'locked'\n canTryUnlockingUsingBiometrics: boolean\n isUnlocking: boolean\n tryUnlockingUsingBiometrics: () => Promise<void>\n unlockUsingPin: (pin: string) => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturnUnlocked = {\n state: 'unlocked'\n paradym: ParadymWalletSdk\n unlockMethod: UnlockMethod\n lock: () => Promise<void>\n reset: () => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturn =\n | SecureUnlockReturnInitializing\n | SecureUnlockReturnNotConfigured\n | SecureUnlockReturnWalletKeyAcquired\n | SecureUnlockReturnLocked\n | SecureUnlockReturnUnlocked\n\nconst SecureUnlockContext = createContext<SecureUnlockReturn>({\n state: 'initializing',\n})\n\nexport function useSecureUnlock(): SecureUnlockReturn {\n const value = useContext(SecureUnlockContext)\n if (!value) {\n throw new Error('useSecureUnlock must be wrapped in a <SecureUnlockProvider />')\n }\n\n return value\n}\n\nexport function SecureUnlockProvider({\n children,\n configuration,\n}: PropsWithChildren<{ configuration: SetupParadymWalletSdkOptions }>) {\n const secureUnlockState = _useSecureUnlockState(configuration)\n\n return <SecureUnlockContext.Provider value={secureUnlockState}>{children}</SecureUnlockContext.Provider>\n}\n\nfunction _useSecureUnlockState(configuration: SetupParadymWalletSdkOptions): SecureUnlockReturn {\n const [state, setState] = useState<SecureUnlockState>('initializing')\n const [canTryUnlockingUsingBiometrics, setCanTryUnlockingUsingBiometrics] = useState<boolean>(true)\n const [canUseBiometrics, setCanUseBiometrics] = useState<boolean>()\n const [biometricsUnlockAttempts, setBiometricsUnlockAttempts] = useState(0)\n const [unlockMethod, setUnlockMethod] = useState<UnlockMethod>()\n const [isUnlocking, setIsUnlocking] = useState(false)\n const [paradym, setParadym] = useState<ParadymWalletSdk>()\n const [walletKey, setWalletKey] = useState<string>()\n\n useQuery({\n queryFn: async () => {\n const salt = await secureWalletKey.getSalt(secureWalletKey.getWalletKeyVersion())\n // TODO: is salt the best way to test this?\n\n // We have two params. If e.g. unlocking using biometrics failed, we will\n // set setCanTryUnlockingUsingBiometrics to false, but `setCanUseBiometrics`\n // will still be true (so we can store it)\n const cub = await secureWalletKey.canUseBiometryBackedWalletKey()\n setCanUseBiometrics(cub)\n setCanTryUnlockingUsingBiometrics(cub)\n\n setState(salt ? 'locked' : 'not-configured')\n return salt\n },\n queryKey: ['wallet_unlock_salt'],\n enabled: state === 'initializing',\n })\n\n useEffect(() => {\n console.log('secure unlock state: ', state)\n }, [state])\n\n const reinitialize = () => {\n setState('initializing')\n setCanTryUnlockingUsingBiometrics(true)\n setBiometricsUnlockAttempts(0)\n setUnlockMethod(undefined)\n setCanUseBiometrics(undefined)\n setIsUnlocking(false)\n }\n\n if (state === 'not-configured') {\n return {\n state,\n reinitialize,\n setPin: async (pin) => {\n await secureWalletKey.createAndStoreSalt(true, secureWalletKey.getWalletKeyVersion())\n const walletKey = await secureWalletKey.getWalletKeyUsingPin(pin, secureWalletKey.getWalletKeyVersion())\n\n setWalletKey(walletKey)\n setUnlockMethod('pin')\n setState('acquired-wallet-key')\n },\n }\n }\n\n if (state === 'acquired-wallet-key') {\n if (!walletKey || !unlockMethod) {\n throw new Error('Missing walletKey or unlockMethod')\n }\n\n return {\n state,\n unlockMethod,\n reinitialize,\n unlock: async (options) => {\n try {\n const walletKeyVersion = secureWalletKey.getWalletKeyVersion()\n // TODO: need extra option to know whether user wants to use biometrics?\n // TODO: do we need to check whether already stored?\n if (canUseBiometrics && options?.enableBiometrics) {\n await secureWalletKey.storeWalletKey(walletKey, walletKeyVersion)\n await secureWalletKey.getWalletKeyUsingBiometrics(secureWalletKey.getWalletKeyVersion())\n }\n\n const id = `easypid-wallet-${walletKeyVersion}`\n const key = walletKey\n\n // TODO: let the user provide an id? Or should we create one by default\n const pws = new ParadymWalletSdk({\n ...configuration,\n id,\n key,\n })\n pws.initialize().then((result) => {\n if (result.success) {\n setState('unlocked')\n setParadym(pws)\n } else {\n console.error(result.message)\n throw Error(result.message)\n }\n })\n } catch (error) {\n if (error instanceof WalletInvalidKeyError) {\n if (unlockMethod === 'biometrics') {\n setCanTryUnlockingUsingBiometrics(false)\n }\n\n setState('locked')\n setWalletKey(undefined)\n setUnlockMethod(undefined)\n }\n throw error\n }\n },\n }\n }\n\n if (state === 'locked') {\n return {\n state,\n isUnlocking,\n canTryUnlockingUsingBiometrics,\n reinitialize,\n tryUnlockingUsingBiometrics: async () => {\n // TODO: need to somehow inform user that the unlocking went wrong\n if (!canTryUnlockingUsingBiometrics) return\n\n setIsUnlocking(true)\n setBiometricsUnlockAttempts((attempts) => attempts + 1)\n try {\n const walletKey = await secureWalletKey.getWalletKeyUsingBiometrics(secureWalletKey.getWalletKeyVersion())\n if (walletKey) {\n setWalletKey(walletKey)\n setUnlockMethod('biometrics')\n setState('acquired-wallet-key')\n }\n } catch (error) {\n // If use cancelled we won't allow trying using biometrics again\n if (error instanceof KeychainError && error.reason === 'userCancelled') {\n setCanTryUnlockingUsingBiometrics(false)\n }\n // If other error, we will allow up to three attempts\n else if (biometricsUnlockAttempts > 3) {\n setCanTryUnlockingUsingBiometrics(false)\n }\n } finally {\n setIsUnlocking(false)\n }\n },\n unlockUsingPin: async (pin: string) => {\n setIsUnlocking(true)\n try {\n const walletKey = await secureWalletKey.getWalletKeyUsingPin(pin, secureWalletKey.getWalletKeyVersion())\n\n setWalletKey(walletKey)\n setUnlockMethod('pin')\n setState('acquired-wallet-key')\n } finally {\n setIsUnlocking(false)\n }\n },\n }\n }\n\n if (state === 'unlocked') {\n if (!unlockMethod || !paradym) {\n throw new Error(`unlockMethod (${!!unlockMethod}) or paradym (${!!paradym})`)\n }\n\n return {\n state,\n unlockMethod,\n paradym,\n reset: paradym.reset,\n reinitialize,\n lock: async () => {\n await paradym.shutdown()\n setParadym(undefined)\n setState('locked')\n setUnlockMethod(undefined)\n },\n }\n }\n\n return {\n state,\n }\n}\n","import {\n AnonCredsCredentialFormatService,\n AnonCredsModule,\n AnonCredsProofFormatService,\n LegacyIndyCredentialFormatService,\n LegacyIndyProofFormatService,\n V1CredentialProtocol,\n V1ProofProtocol,\n} from '@credo-ts/anoncreds'\nimport { AskarModule } from '@credo-ts/askar'\nimport { CheqdAnonCredsRegistry, CheqdModule, CheqdModuleConfig } from '@credo-ts/cheqd'\nimport { Agent, DidsModule, KeyDerivationMethod, X509Module, type X509ModuleConfigOptions } from '@credo-ts/core'\nimport {\n AutoAcceptCredential,\n AutoAcceptProof,\n ConnectionsModule,\n CredentialsModule,\n DidCommModule,\n DiscoverFeaturesModule,\n HttpOutboundTransport,\n MediationRecipientModule,\n MessagePickupModule,\n OutOfBandModule,\n ProofsModule,\n V2CredentialProtocol,\n V2ProofProtocol,\n WsOutboundTransport,\n} from '@credo-ts/didcomm'\nimport { OpenId4VcHolderModule } from '@credo-ts/openid4vc'\nimport { agentDependencies } from '@credo-ts/react-native'\nimport { anoncreds } from '@hyperledger/anoncreds-react-native'\nimport { askar } from '@openwallet-foundation/askar-react-native'\nimport { DidWebAnonCredsRegistry } from 'credo-ts-didweb-anoncreds'\nimport { ParadymWalletMustBeDidCommAgentError, ParadymWalletMustBeOpenId4VcAgentError } from './error'\nimport { type LogLevel, logger } from './logger'\nimport { secureWalletKey } from './secure'\n\nexport type SetupAgentOptions = {\n /**\n *\n * Unique identifier of your wallet storage\n *\n */\n id?: string\n\n /**\n *\n * Key that will be used to securely open your wallet\n *\n * @security\n * This property must dealt with in great care, such as receiving it from a biometrics check\n *\n */\n key: string\n\n /**\n *\n * Configuration regarding logging with the Paradym Wallet SDK\n *\n */\n logging?: {\n /**\n *\n * Loglevel to be used. Set to `trace` to log everything and `off` for nothing\n *\n */\n level: LogLevel\n\n /**\n *\n * Whether to trace the logs. Later, this can be exported\n *\n * exporting the logs can be done with the following:\n *\n * ```typescript\n * const { paradym } = useParadym('unlocked')\n * const logs = paradym.logger.loggedMessageContents\n * ```\n *\n */\n trace?: boolean\n\n /**\n *\n * Number of logs to be traced.\n *\n */\n traceLimit?: number\n }\n\n /**\n *\n * Configuration for when OpenId4Vc is used\n *\n * @note by default, openid4vc is configured on the agent\n *\n * @note to disable openid4vc, pass in `false`\n *\n */\n openId4VcConfiguration?: ({} & X509ModuleConfigOptions) | false\n\n /**\n *\n * Configuration for when DidComm is used\n *\n * @note by default, DIDComm is *not* configured on the agent\n *\n * @note to disable didcomm explicitly, pass in `false`\n *\n */\n didcommConfiguration?:\n | {\n /**\n *\n * Label used for DIDComm connections to convey who you are to the other agent\n *\n */\n label: string\n }\n | false\n}\n\n/**\n *\n * Function that sets up everything needed for the functionality required in a wallet.\n *\n */\nexport const setupAgent = (options: SetupAgentOptions) => {\n const openId4VcConfiguration = options.openId4VcConfiguration ?? {}\n\n const didcommConfiguration = options.didcommConfiguration ?? false\n\n const modules = {\n askar: new AskarModule({\n askar,\n }),\n\n ...(openId4VcConfiguration ? getOpenid4VcModules(openId4VcConfiguration) : {}),\n ...(didcommConfiguration ? getDidCommModules(didcommConfiguration) : {}),\n }\n\n const walletKeyVersion = secureWalletKey.getWalletKeyVersion()\n\n const paradymWalletSdkLogger = options.logging ? logger(options.logging.level) : undefined\n\n if (options.logging?.trace) {\n paradymWalletSdkLogger?.trackLoggedMessages(options.logging.traceLimit)\n }\n\n const agent = new Agent({\n config: {\n label: didcommConfiguration ? didcommConfiguration.label : '',\n walletConfig: {\n id: `${options.id ?? 'paradym-wallet'}-${walletKeyVersion}`,\n key: options.key,\n keyDerivationMethod: KeyDerivationMethod.Raw,\n },\n logger: paradymWalletSdkLogger,\n },\n dependencies: agentDependencies,\n modules,\n })\n\n if (didcommConfiguration) {\n const didcommAgent = agent as DidCommAgent\n didcommAgent.modules.didcomm.registerOutboundTransport(new HttpOutboundTransport())\n didcommAgent.modules.didcomm.registerOutboundTransport(new WsOutboundTransport())\n }\n\n return agent\n}\n\nconst getOpenid4VcModules = (openId4VcConfiguration: Exclude<SetupAgentOptions['openId4VcConfiguration'], false>) => ({\n openId4VcHolder: new OpenId4VcHolderModule(),\n x509: new X509Module({\n trustedCertificates: openId4VcConfiguration?.trustedCertificates as undefined | [string, ...string[]],\n getTrustedCertificatesForVerification: openId4VcConfiguration?.getTrustedCertificatesForVerification,\n }),\n})\n\n// TODO: configure, or allow the user, to configure these modules\nconst getDidCommModules = (_didcommConfiguration: Exclude<SetupAgentOptions['didcommConfiguration'], false>) => ({\n connections: new ConnectionsModule(),\n messagePickup: new MessagePickupModule(),\n discovery: new DiscoverFeaturesModule(),\n dids: new DidsModule(),\n outOfBand: new OutOfBandModule(),\n didcomm: new DidCommModule(),\n mediationRecipient: new MediationRecipientModule(),\n credentials: new CredentialsModule({\n autoAcceptCredentials: AutoAcceptCredential.ContentApproved,\n credentialProtocols: [\n new V1CredentialProtocol({\n indyCredentialFormat: new LegacyIndyCredentialFormatService(),\n }),\n new V2CredentialProtocol({\n credentialFormats: [new LegacyIndyCredentialFormatService(), new AnonCredsCredentialFormatService()],\n }),\n ],\n }),\n proofs: new ProofsModule({\n autoAcceptProofs: AutoAcceptProof.ContentApproved,\n proofProtocols: [\n new V1ProofProtocol({\n indyProofFormat: new LegacyIndyProofFormatService(),\n }),\n new V2ProofProtocol({\n proofFormats: [new LegacyIndyProofFormatService(), new AnonCredsProofFormatService()],\n }),\n ],\n }),\n anoncreds: new AnonCredsModule({\n registries: [new CheqdAnonCredsRegistry(), new DidWebAnonCredsRegistry()],\n anoncreds,\n }),\n cheqd: new CheqdModule(\n new CheqdModuleConfig({\n networks: [\n {\n network: 'testnet',\n },\n {\n network: 'mainnet',\n },\n ],\n })\n ),\n})\n\nexport type BaseAgent = Agent\nexport type DidCommAgent = Agent<ReturnType<typeof getDidCommModules>>\nexport type OpenId4VcAgent = Agent<ReturnType<typeof getOpenid4VcModules>>\nexport type FullAgent = DidCommAgent & OpenId4VcAgent\n\nexport const isDidcommAgent = (agent: DidCommAgent | OpenId4VcAgent): boolean => 'didcomm' in agent.modules\nexport const assertDidcommAgent = (agent: DidCommAgent | OpenId4VcAgent): DidCommAgent => {\n if (!isDidcommAgent(agent)) {\n throw new ParadymWalletMustBeDidCommAgentError()\n }\n\n return agent as DidCommAgent\n}\n\nexport const isOpenId4VcAgent = (agent: DidCommAgent | OpenId4VcAgent): boolean => 'openId4VcHolder' in agent.modules\nexport const assertOpenId4VcAgent = (agent: DidCommAgent | OpenId4VcAgent): OpenId4VcAgent => {\n if (!isOpenId4VcAgent(agent)) {\n throw new ParadymWalletMustBeOpenId4VcAgentError()\n }\n\n return agent as OpenId4VcAgent\n}\n","import {\n type Agent,\n type RecordDeletedEvent,\n type RecordSavedEvent,\n type RecordUpdatedEvent,\n RepositoryEventTypes,\n} from '@credo-ts/core'\nimport type { GenericRecord } from '@credo-ts/core/build/modules/generic-records/repository/GenericRecord'\nimport { createContext, useContext, useEffect, useState } from 'react'\n\ntype WalletJsonStoreState = {\n jsonRecords: GenericRecord[]\n isLoading: boolean\n}\n\nconst WalletJsonStoreContext = createContext<WalletJsonStoreState | undefined>(undefined)\n\nexport const useWalletJsonRecord = <T,>(id: string): { isLoading: boolean; record: T | undefined } => {\n const context = useContext(WalletJsonStoreContext)\n if (!context) {\n throw new Error('useWalletJsonRecord must be used within a WalletJsonStoreProvider')\n }\n\n const record = context.jsonRecords.find((r) => r.id === id)\n return {\n isLoading: context.isLoading,\n record: record?.content as T | undefined,\n }\n}\n\ninterface Props {\n agent: Agent\n children: React.ReactNode\n recordIds: string[]\n}\n\nexport const WalletJsonStoreProvider: React.FC<Props> = ({ agent, children, recordIds }) => {\n const [state, setState] = useState<WalletJsonStoreState>({\n jsonRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n const fetchRecords = async () => {\n const records = await Promise.all(recordIds.map((id) => agent.genericRecords.findById(id)))\n const validRecords = records.filter((record): record is GenericRecord => record !== null)\n setState({ jsonRecords: validRecords, isLoading: false })\n }\n void fetchRecords()\n }, [agent, recordIds])\n\n useEffect(() => {\n if (!state.isLoading) {\n const updateEvent = (event: RecordUpdatedEvent<GenericRecord>) => {\n if (recordIds.includes(event.payload.record.id)) {\n setState((prevState) => ({\n ...prevState,\n jsonRecords: prevState.jsonRecords.map((r) =>\n r.id === event.payload.record.id ? event.payload.record : r\n ),\n }))\n }\n }\n\n const addEvent = (event: RecordSavedEvent<GenericRecord>) => {\n if (recordIds.includes(event.payload.record.id)) {\n setState((prevState) => ({\n ...prevState,\n jsonRecords: [...prevState.jsonRecords, event.payload.record],\n }))\n }\n }\n\n const removeEvent = (event: RecordDeletedEvent<GenericRecord>) => {\n if (recordIds.includes(event.payload.record.id)) {\n setState((prevState) => ({\n ...prevState,\n jsonRecords: prevState.jsonRecords.filter((r) => r.id !== event.payload.record.id),\n }))\n }\n }\n\n agent.events.on<RecordUpdatedEvent<GenericRecord>>(RepositoryEventTypes.RecordUpdated, updateEvent)\n agent.events.on<RecordSavedEvent<GenericRecord>>(RepositoryEventTypes.RecordSaved, addEvent)\n agent.events.on<RecordDeletedEvent<GenericRecord>>(RepositoryEventTypes.RecordDeleted, removeEvent)\n\n return () => {\n agent.events.off(RepositoryEventTypes.RecordUpdated, updateEvent)\n agent.events.off(RepositoryEventTypes.RecordSaved, addEvent)\n agent.events.off(RepositoryEventTypes.RecordDeleted, removeEvent)\n }\n }\n }, [state.isLoading, agent, recordIds])\n\n return <WalletJsonStoreContext.Provider value={state}>{children}</WalletJsonStoreContext.Provider>\n}\n","export function isDateString(value: string) {\n // We do the length check first to avoid unnecesary regex\n return value.length === 'yyyy-mm-dd'.length && value.match(/^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$/)\n}\n\nexport function formatDate(input: string | Date, options?: { includeTime?: boolean }): string {\n const date = input instanceof Date ? input : new Date(input)\n\n const hasTime = date.getUTCHours() !== 0 || date.getUTCMinutes() !== 0\n const includeTime = options?.includeTime ?? hasTime\n\n const timeOptions = includeTime\n ? ({\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h24',\n } as const)\n : {}\n\n return date.toLocaleString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n ...timeOptions,\n })\n}\n","export function sanitizeString(\n str: string,\n { startWithCapitalLetter = true }: { startWithCapitalLetter?: boolean } = {}\n) {\n const result = str.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace('_', ' ')\n let words = result.split(' ')\n words = words.map((word, index) => {\n if (startWithCapitalLetter && (index === 0 || word.toUpperCase() === word)) {\n return word.charAt(0).toUpperCase() + word.slice(1)\n }\n return word.charAt(0).toLowerCase() + word.slice(1)\n })\n return words.join(' ')\n}\n","import { ClaimFormat } from '@credo-ts/core'\nimport type { FormattedSubmissionEntrySatisfiedCredential } from '../format/submission'\nimport { formatDate } from '../utils/date'\nimport type { CredentialDisplay, CredentialMetadata } from './credential'\nimport { sanitizeString } from './strings'\n\nexport function findDisplay<Display extends { locale?: string; lang?: string }>(\n display?: Display[]\n): Display | undefined {\n if (!display) return undefined\n\n let item = display.find((d) => d.locale?.startsWith('en-') || d.lang?.startsWith('en-'))\n if (!item) item = display.find((d) => !d.locale && !d.lang)\n if (!item) item = display[0]\n\n return item\n}\n\nexport function getDisclosedAttributePathArrays(\n payload: object,\n maxDepth: number | undefined = undefined,\n prefix: string[] = []\n): string[][] {\n let attributePaths: string[][] = []\n\n for (const [key, value] of Object.entries(payload)) {\n if (!value) continue\n\n // TODO: handle arrays\n const newPath = [...prefix, key]\n if (value && typeof value === 'object' && maxDepth !== 0) {\n // If the value is a nested object, recurse\n attributePaths = [\n ...attributePaths,\n ...getDisclosedAttributePathArrays(value, maxDepth !== undefined ? maxDepth - 1 : undefined, newPath),\n ]\n } else {\n // If the value is a primitive or maxDepth is reached, add the key to the list\n attributePaths.push(newPath)\n }\n }\n\n return attributePaths\n}\n\nexport function getDisclosedAttributeNamesForDisplay(credential: FormattedSubmissionEntrySatisfiedCredential) {\n // FIXME: this implementation in still too naive\n // TODO: use the credential claim metadata (sd-jwt / oid4vc) to get labels for attribute paths\n // TODO: we miss e.g. showing age_equal_or_over.21 as Age Over 21, but with the display metadata\n // from bdr we can at least show it as: Age verification. If there is a key for a nested path we can\n // also decide to include it\n\n // For mdoc we remove the namespaces\n if (credential.credential.claimFormat === ClaimFormat.MsoMdoc) {\n return Array.from(new Set(credential.disclosed.paths.map((path) => sanitizeString(path[1]))))\n }\n\n // Otherwise we take the top-level keys\n return Array.from(\n new Set(\n credential.disclosed.paths\n .filter((path): path is [string] => typeof path[0] === 'string')\n .map((path) => sanitizeString(path[0]))\n )\n )\n}\n\nexport function getUnsatisfiedAttributePathsForDisplay(paths: Array<string | number | null>[]) {\n const nonRenderedPaths = ['iss', 'vct']\n return Array.from(\n new Set(\n paths\n .filter(\n (path): path is [string] =>\n typeof path[0] === 'string' && !path.some((p) => nonRenderedPaths.includes(p as string))\n )\n .map((path) => sanitizeString(path[0]))\n )\n )\n}\nexport function getCredentialDisplayWithDefaults(credentialDisplay?: Partial<CredentialDisplay>): CredentialDisplay {\n return {\n ...credentialDisplay,\n name: credentialDisplay?.name ?? 'Credential',\n issuer: {\n ...credentialDisplay?.issuer,\n name: credentialDisplay?.issuer?.name ?? 'Unknown',\n },\n }\n}\nexport function metadataForDisplay(metadata: CredentialMetadata) {\n const { type, holder, issuedAt, issuer, validFrom, validUntil } = metadata\n\n return {\n type,\n issuer,\n holder,\n issuedAt: issuedAt ? formatDate(new Date(issuedAt)) : undefined,\n validFrom: validFrom ? formatDate(new Date(validFrom)) : undefined,\n validUntil: validUntil ? formatDate(new Date(validUntil)) : undefined,\n }\n}\n","import type { Agent } from '@credo-ts/core'\nimport { GenericRecord } from '@credo-ts/core/build/modules/generic-records/repository/GenericRecord'\n\nconst store = async (agent: Agent, id: string, value: Record<string, unknown>) => {\n const record = new GenericRecord({ id, content: value })\n await agent.genericRecords.save(record)\n}\n\nconst update = async (agent: Agent, id: string, value: Record<string, unknown>) => {\n const record = new GenericRecord({ id, content: value })\n await agent.genericRecords.update(record)\n}\n\nconst getById = async <T>(agent: Agent, id: string): Promise<T | undefined> => {\n const record = await agent.genericRecords.findById(id)\n\n if (!record) {\n return undefined\n }\n\n return record.content as T\n}\n\nexport const walletJsonStore = {\n store,\n getById,\n update,\n}\n\nexport function getWalletJsonStore<Content extends Record<string, unknown>>(recordId: string) {\n return {\n recordId,\n store: async (agent: Agent, content: Content) => walletJsonStore.store(agent, recordId, content),\n update: async (agent: Agent, content: Content) => walletJsonStore.update(agent, recordId, content),\n get: async (agent: Agent) => walletJsonStore.getById<Content>(agent, recordId),\n }\n}\n","import { utils } from '@credo-ts/core'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { BaseAgent } from '../agent'\nimport { getDisclosedAttributeNamesForDisplay, getUnsatisfiedAttributePathsForDisplay } from '../display/common'\nimport type { DisplayImage } from '../display/credential'\nimport type { FormattedSubmission } from '../format/submission'\nimport type { CredentialId } from '../hooks/useCredentialById'\nimport type { CredentialsForProofRequest } from '../openid4vc/getCredentialsForProofRequest'\nimport type { FormattedTransactionData } from '../openid4vc/transaction'\nimport { getWalletJsonStore } from './walletJsonStore'\n\nexport type ActivityType = 'shared' | 'received' | 'signed'\nexport type ActivityStatus = 'success' | 'failed' | 'stopped'\nexport type SharingFailureReason = 'missing_credentials' | 'unknown'\n\ninterface BaseActivity {\n id: string\n type: ActivityType\n status: ActivityStatus\n date: string\n entity: {\n // FIXME: we need to avoid id collisions. So we should\n // add a prefix probably. So\n // didcomm-connection:\n //\n // entity id can either be: did or https url or connection id\n id?: string\n host?: string\n name?: string\n logo?: DisplayImage\n backgroundColor?: string\n }\n}\n\nexport interface PresentationActivityCredentialNotFound {\n attributeNames: string[]\n name?: string\n}\n\nexport interface PresentationActivityCredential {\n id: CredentialId\n name?: string\n attributeNames: string[]\n attributes: Record<string, unknown>\n metadata: Record<string, unknown>\n}\n\nexport interface PresentationActivity extends BaseActivity {\n type: 'shared'\n request: {\n credentials: Array<PresentationActivityCredential | PresentationActivityCredentialNotFound>\n name?: string\n purpose?: string\n failureReason?: SharingFailureReason\n }\n}\n\nexport interface IssuanceActivity extends BaseActivity {\n type: 'received'\n credentialIds: CredentialId[]\n}\n\nexport interface SignedActivity extends Omit<PresentationActivity, 'type'> {\n type: 'signed'\n transaction: FormattedTransactionData\n}\n\nexport type Activity = PresentationActivity | IssuanceActivity | SignedActivity\n\nexport type ActivityRecord = {\n activities: Activity[]\n}\n\nconst internalActivityStorage = getWalletJsonStore<ActivityRecord>('EASYPID_ACTIVITY_RECORD')\n// const internalActivityStorage = getWalletJsonStore<ActivityRecord>('PARADYM_WALLET_SDK_ACTIVITY_RECORD')\nexport const activityStorage = {\n recordId: internalActivityStorage.recordId,\n addActivity: async (agent: BaseAgent, activity: Activity) => {\n // get activity and then add this activity\n const record = await internalActivityStorage.get(agent)\n if (!record) {\n await internalActivityStorage.store(agent, {\n activities: [activity],\n })\n } else {\n record.activities.push(activity)\n await internalActivityStorage.update(agent, record)\n }\n },\n}\n\nexport const addReceivedActivity = async (\n paradym: ParadymWalletSdk,\n input: {\n entityId?: string\n name: string\n host?: string\n logo?: DisplayImage\n backgroundColor?: string\n credentialIds: CredentialId[]\n }\n) => {\n await activityStorage.addActivity(paradym.agent, {\n id: utils.uuid(),\n date: new Date().toISOString(),\n type: 'received',\n status: 'success',\n entity: {\n id: input.entityId,\n name: input.name,\n host: input.host,\n logo: input.logo,\n backgroundColor: input.backgroundColor,\n },\n credentialIds: input.credentialIds,\n })\n}\n\nexport const addSharedOrSignedActivity = async (\n paradym: ParadymWalletSdk,\n input: Omit<PresentationActivity, 'type' | 'date' | 'id'> | Omit<SignedActivity, 'type' | 'date' | 'id'>\n) => {\n if ('transaction' in input && input.transaction) {\n await activityStorage.addActivity(paradym.agent, {\n ...input,\n id: utils.uuid(),\n date: new Date().toISOString(),\n type: 'signed',\n })\n } else {\n await activityStorage.addActivity(paradym.agent, {\n ...input,\n id: utils.uuid(),\n date: new Date().toISOString(),\n type: 'shared',\n })\n }\n}\n\nexport function addSharedActivityForCredentialsForRequest(\n paradym: ParadymWalletSdk,\n credentialsForRequest: Pick<CredentialsForProofRequest, 'formattedSubmission'> & {\n verifier: Omit<CredentialsForProofRequest['verifier'], 'entityId'> & { entityId?: string }\n },\n status: ActivityStatus,\n transaction?: FormattedTransactionData\n) {\n return addSharedOrSignedActivity(paradym, {\n status,\n entity: {\n id: credentialsForRequest.verifier.entityId,\n host: credentialsForRequest.verifier.hostName,\n name: credentialsForRequest?.verifier.name,\n logo: credentialsForRequest.verifier.logo,\n },\n request: {\n name: credentialsForRequest.formattedSubmission.name,\n purpose: credentialsForRequest.formattedSubmission.purpose,\n credentials: getDisclosedCredentialForSubmission(credentialsForRequest.formattedSubmission),\n failureReason:\n status === 'failed'\n ? !credentialsForRequest.formattedSubmission.areAllSatisfied\n ? 'missing_credentials'\n : 'unknown'\n : undefined,\n },\n transaction,\n })\n}\n\nexport function addSharedActivityForSubmission(\n paradym: ParadymWalletSdk,\n submission: FormattedSubmission,\n verifier: {\n id: string\n name?: string\n logo?: DisplayImage\n },\n status: ActivityStatus\n) {\n return addSharedOrSignedActivity(paradym, {\n status,\n entity: {\n id: verifier.id,\n name: verifier.name,\n logo: verifier.logo,\n },\n request: {\n name: submission.name,\n purpose: submission.purpose,\n credentials: getDisclosedCredentialForSubmission(submission),\n failureReason:\n status === 'failed' ? (!submission.areAllSatisfied ? 'missing_credentials' : 'unknown') : undefined,\n },\n })\n}\n\nexport function getDisclosedCredentialForSubmission(\n formattedSubmission: FormattedSubmission\n): Array<PresentationActivityCredentialNotFound | PresentationActivityCredential> {\n return formattedSubmission.entries.map((entry) => {\n if (!entry.isSatisfied) {\n return {\n name: entry.name,\n attributeNames: getUnsatisfiedAttributePathsForDisplay(entry.requestedAttributePaths),\n } satisfies PresentationActivityCredentialNotFound\n }\n\n // TODO: once we support selection we should update [0] to the selected credential\n const credential = entry.credentials[0]\n\n return {\n id: credential.credential.id,\n attributeNames: getDisclosedAttributeNamesForDisplay(credential),\n attributes: credential.disclosed.attributes,\n metadata: credential.disclosed.metadata as unknown as Record<string, unknown>,\n } satisfies PresentationActivityCredential\n })\n}\n","import { useMemo } from 'react'\nimport { useWalletJsonRecord } from '../providers/WalletJsonStoreProvider'\nimport { type ActivityRecord, activityStorage } from '../storage/activities'\n\nexport const useActivities = ({ filters }: { filters?: { entityId?: string } } = {}) => {\n const { record, isLoading } = useWalletJsonRecord<ActivityRecord>(activityStorage.recordId)\n\n const activities = useMemo(() => {\n if (!record?.activities) return []\n\n return [...record.activities]\n .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())\n .filter((activity) => !filters?.entityId || activity.entity.id === filters?.entityId)\n }, [record?.activities, filters?.entityId])\n\n return {\n activities,\n isLoading,\n }\n}\n","import { useMemo } from 'react'\nimport { useActivities } from './useActivities'\n\nexport const useActivityById = (id: string) => {\n const { isLoading, activities } = useActivities()\n\n return {\n isLoading,\n activity: useMemo(() => activities.find((c) => c.id === id), [activities, id]),\n }\n}\n","import type { JwaSignatureAlgorithm, JwkJson, MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'\nimport type { CredentialExchangeRecord, ProofExchangeRecord } from '@credo-ts/didcomm'\nimport type {\n OpenId4VciCredentialConfigurationSupported,\n OpenId4VciCredentialConfigurationSupportedWithFormats,\n OpenId4VciCredentialIssuerMetadataDisplay,\n} from '@credo-ts/openid4vc'\n\nexport interface DidCommCredentialExchangeDisplayMetadata {\n issuerName?: string\n issuerLogoUri?: string\n credentialName?: string\n}\n\nexport interface DidCommProofExchangeDisplayMetadata {\n verifierName?: string\n verifierLogoUri?: string\n proofName?: string\n}\n\nexport interface BatchCredentialMetadata {\n /**\n * Additional credentials that can be used for presentation\n */\n additionalCredentials: Array<string> | Array<Record<string, unknown>>\n}\n\nexport interface RefreshCredentialMetadata {\n refreshToken: string\n dpop?: { alg: JwaSignatureAlgorithm; jwk: JwkJson }\n}\n\nexport type CredentialDisplayClaims =\n | (OpenId4VciCredentialConfigurationSupportedWithFormats & {\n format: 'vc+sd-jwt'\n })['claims']\n | (OpenId4VciCredentialConfigurationSupportedWithFormats & {\n format: 'dc+sd-jwt'\n })['claims']\n\nexport interface OpenId4VcCredentialMetadata {\n credential: {\n display?: OpenId4VciCredentialConfigurationSupported['display']\n claims?: CredentialDisplayClaims\n order?: OpenId4VciCredentialConfigurationSupportedWithFormats['order']\n }\n issuer: {\n display?: OpenId4VciCredentialIssuerMetadataDisplay[]\n id: string\n }\n}\n\nexport interface BatchCredentialMetadata {\n /**\n * Additional credentials that can be used for presentation\n */\n additionalCredentials: Array<string> | Array<Record<string, unknown>>\n}\n\nexport interface CredentialCategoryMetadata {\n /**\n *\n */\n credentialCategory: 'DE-PID' | (string & {})\n\n /**\n * Whether this instance of the canonical records should be displayed by default\n */\n displayPriority?: boolean\n\n /**\n * @default true\n */\n canDeleteCredential?: boolean\n\n // TODO: we can also store here the key binding requirements, and whether we need to sign\n // locally or remotely (so we can show PIN)\n}\n\nconst openId4VcCredentialMetadataKey = '_paradym/openId4VcCredentialMetadata'\nconst batchCredentialMetadataKey = '_paradym/batchCredentialMetadata'\nconst credentialCategoryMetadataKey = '_paradym/credentialCategoryMetadata'\nconst refreshCredentialMetadataKey = '_paradym/refreshCredentialMetadata'\nconst didCommCredentialExchangeDisplayMetadataKey = '_paradym/credentialDisplayMetadata'\nconst didCommProofExchangeDisplayMetadataKey = '_paradym/proofDisplayMetadata'\n\nexport function setOpenId4VcCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: OpenId4VcCredentialMetadata\n) {\n credentialRecord.metadata.set(openId4VcCredentialMetadataKey, metadata)\n}\n\nexport function extractOpenId4VcCredentialMetadata(\n credentialMetadata: OpenId4VciCredentialConfigurationSupportedWithFormats,\n serverMetadata: { display?: OpenId4VciCredentialIssuerMetadataDisplay[]; id: string }\n): OpenId4VcCredentialMetadata {\n return {\n credential: {\n display: credentialMetadata.display,\n order: credentialMetadata.order,\n claims: credentialMetadata.claims ? (credentialMetadata.claims as CredentialDisplayClaims) : undefined,\n },\n issuer: {\n display: serverMetadata.display,\n id: serverMetadata.id,\n },\n }\n}\n\nexport function getBatchCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): BatchCredentialMetadata | null {\n return credentialRecord.metadata.get(batchCredentialMetadataKey)\n}\n\nexport function getCredentialCategoryMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): CredentialCategoryMetadata | null {\n return credentialRecord.metadata.get(credentialCategoryMetadataKey)\n}\n\nexport function getRefreshCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): RefreshCredentialMetadata | null {\n return credentialRecord.metadata.get(refreshCredentialMetadataKey)\n}\n\nexport function setRefreshCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: RefreshCredentialMetadata\n) {\n credentialRecord.metadata.set(refreshCredentialMetadataKey, metadata)\n}\n\nexport function getOpenId4VcCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): OpenId4VcCredentialMetadata | null {\n const recordMetadata: OpenId4VcCredentialMetadata | null =\n credentialRecord.metadata.get(openId4VcCredentialMetadataKey)\n\n if (!recordMetadata) return null\n\n return {\n issuer: {\n ...recordMetadata.issuer,\n display: recordMetadata.issuer.display?.map(({ logo, ...displayRest }) => ({\n ...displayRest,\n // We need to map the url values to uri\n logo: logo ? { ...logo, uri: logo.uri ?? (logo.url as string) } : undefined,\n })),\n },\n credential: {\n ...recordMetadata.credential,\n display: recordMetadata.credential.display?.map(({ background_image, logo, ...displayRest }) => ({\n ...displayRest,\n // We need to map the url values to uri\n background_image: background_image\n ? { ...background_image, uri: background_image.uri ?? (background_image.url as string) }\n : undefined,\n // We need to map the url values to uri\n logo: logo ? { ...logo, uri: logo.uri ?? (logo.url as string) } : undefined,\n })),\n },\n }\n}\n\nexport function setBatchCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: BatchCredentialMetadata\n) {\n credentialRecord.metadata.set(batchCredentialMetadataKey, metadata)\n}\n\n/**\n * Gets the display metadata for the credential exchange from the given CredentialExchangeRecord.\n */\nexport function getDidCommCredentialExchangeDisplayMetadata(\n credentialExchangeRecord: CredentialExchangeRecord\n): DidCommCredentialExchangeDisplayMetadata | null {\n return credentialExchangeRecord.metadata.get(didCommCredentialExchangeDisplayMetadataKey)\n}\n\n/**\n * Sets the display metadata for the credential exchange on the given CredentialExchangeRecord.\n *\n * NOTE: this does not save the record.\n */\nexport function setDidCommCredentialExchangeMetadata(\n credentialExchangeRecord: CredentialExchangeRecord,\n metadata: DidCommCredentialExchangeDisplayMetadata\n) {\n credentialExchangeRecord.metadata.set(didCommCredentialExchangeDisplayMetadataKey, metadata)\n}\n\n/**\n * Gets the display metadata for the proof exchange from the given ProofExchangeRecord.\n */\nexport function getDidCommProofExchangeDisplayMetadata(\n proofExchangeRecord: ProofExchangeRecord\n): DidCommProofExchangeDisplayMetadata | null {\n return proofExchangeRecord.metadata.get(didCommProofExchangeDisplayMetadataKey)\n}\n\n/**\n * Sets the display metadata for the proof exchange on the given ProofExchangeRecord.\n *\n * NOTE: this does not save the record.\n */\nexport function setDidCommProofExchangeMetadata(\n proofExchangeRecord: ProofExchangeRecord,\n metadata: DidCommProofExchangeDisplayMetadata\n) {\n proofExchangeRecord.metadata.set(didCommProofExchangeDisplayMetadataKey, metadata)\n}\n\nexport function openIdCredentialMetadataFromDidCommCredentialExchangeMetadata(\n credentialExchangeRecord: CredentialExchangeRecord,\n didcommMetadata: DidCommCredentialExchangeDisplayMetadata\n): OpenId4VcCredentialMetadata {\n return {\n credential: {\n display: didcommMetadata.credentialName\n ? [\n {\n name: didcommMetadata?.credentialName,\n },\n ]\n : undefined,\n },\n issuer: {\n id: credentialExchangeRecord.connectionId ?? credentialExchangeRecord.id,\n display: didcommMetadata.issuerName\n ? [\n {\n name: didcommMetadata?.issuerName,\n logo: didcommMetadata.issuerLogoUri\n ? {\n uri: didcommMetadata.issuerLogoUri,\n }\n : undefined,\n },\n ]\n : undefined,\n },\n }\n}\n\nexport function setCredentialCategoryMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: CredentialCategoryMetadata\n) {\n credentialRecord.metadata.set(credentialCategoryMetadataKey, metadata)\n}\n","import { Hasher, type JwkJson, TypedArrayEncoder } from '@credo-ts/core'\n\nexport function safeCalculateJwkThumbprint(jwk: JwkJson): string | undefined {\n try {\n const thumbprint = TypedArrayEncoder.toBase64URL(\n Hasher.hash(\n JSON.stringify({ k: jwk.k, e: jwk.e, crv: jwk.crv, kty: jwk.kty, n: jwk.n, x: jwk.x, y: jwk.y }),\n 'sha-256'\n )\n )\n return `urn:ietf:params:oauth:jwk-thumbprint:sha-256:${thumbprint}`\n } catch (e) {\n return undefined\n }\n}\n","import { sanitizeString } from './strings'\n\ntype DrivingPrivilege = {\n codes: string[]\n expiry_date: string\n issue_date: string\n vehicle_category_code: string\n}\n\ntype MdlAttributes = {\n birth_date: string\n document_number: string\n driving_privileges: Array<DrivingPrivilege>\n expiry_date: string\n family_name: string\n given_name: string\n issue_date: string\n issuing_authority: string\n issuing_country: string\n portrait: string\n un_distinguishing_sign: string\n\n // There can be multiple and random age_over_XX attributes\n [key: string]: unknown\n}\n\nconst attributeNameMapping = {\n family_name: 'Family name',\n given_name: 'Given name',\n birth_date: 'Birth date',\n document_number: 'Document number',\n portrait: 'Portrait',\n un_distinguishing_sign: 'UN sign',\n issuing_authority: 'Issuing authority',\n issuing_country: 'Issuing country',\n expiry_date: 'Expiry date',\n issue_date: 'Issue date',\n driving_privileges: 'Driving privileges',\n codes: 'Codes',\n code: 'Code',\n vehicle_category_code: 'Vehicle category code',\n} as Record<string, string>\n\nconst mapMdlAttributeName = (key: string) => {\n return attributeNameMapping[key] ?? sanitizeString(key)\n}\n\nexport function getMdlAttributesForDisplay(attributes: Partial<MdlAttributes>) {\n const attributeGroups: Array<[string, unknown]> = []\n\n const { driving_privileges, ...remainingAttributes } = attributes\n\n const ageOverEntries = Object.entries(remainingAttributes).filter(([key]) => key.startsWith('age_over_'))\n\n const remainingWithoutAgeEntries = Object.fromEntries(\n Object.entries(remainingAttributes).filter(([key]) => !key.startsWith('age_over_'))\n )\n\n if (driving_privileges) {\n attributeGroups.push([\n 'Driving privileges',\n Object.fromEntries(Object.entries(driving_privileges).map(([key, value]) => [mapMdlAttributeName(key), value])),\n ])\n }\n\n if (ageOverEntries.length > 0) {\n attributeGroups.push(['Age over', Object.fromEntries(ageOverEntries)])\n }\n\n return Object.fromEntries([\n ...Object.entries(remainingWithoutAgeEntries).map(([key, value]) => [mapMdlAttributeName(key), value]),\n ...attributeGroups,\n ])\n}\n","import { getMdlAttributesForDisplay } from './mdl'\n\nconst docTypeOrVctDisplay = {\n 'https://example.eudi.ec.europa.eu/mdl/1': (attributes: Record<string, unknown>) => {\n return getMdlAttributesForDisplay(attributes)\n },\n\n 'org.iso.18013.5.1.mDL': (attributes: Record<string, unknown>) => {\n return getMdlAttributesForDisplay(attributes)\n },\n}\n\nexport const getAttributesForDocTypeOrVct = ({\n type,\n attributes,\n}: {\n type: string\n attributes: Record<string, unknown>\n}) => docTypeOrVctDisplay[type as keyof typeof docTypeOrVctDisplay]?.(attributes)\n","export function detectImageMimeType(data: Uint8Array): 'image/jpeg' | 'image/jp2' | null {\n // Check if array is too short to contain magic numbers\n if (data.length < 12) {\n return null\n }\n\n // JPEG starts with FF D8 FF\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return 'image/jpeg'\n }\n\n // JPEG2000 has two possible signatures:\n // 1) 00 00 00 0C 6A 50 20 20 0D 0A 87 0A\n // 2) FF 4F FF 51\n\n // Check first signature\n if (\n data[0] === 0x00 &&\n data[1] === 0x00 &&\n data[2] === 0x00 &&\n data[3] === 0x0c &&\n data[4] === 0x6a && // 'j'\n data[5] === 0x50 && // 'P'\n data[6] === 0x20 &&\n data[7] === 0x20 &&\n data[8] === 0x0d &&\n data[9] === 0x0a &&\n data[10] === 0x87 &&\n data[11] === 0x0a\n ) {\n return 'image/jp2'\n }\n\n // Check second signature\n if (data[0] === 0xff && data[1] === 0x4f && data[2] === 0xff && data[3] === 0x51) {\n return 'image/jp2'\n }\n\n return null\n}\n","import { DateOnly, TypedArrayEncoder } from '@credo-ts/core'\nimport { formatDate, isDateString } from '../utils/date'\nimport { detectImageMimeType } from '../utils/image'\n\ntype MappedAttributesReturnType =\n | string\n | number\n | boolean\n | { [key: string]: MappedAttributesReturnType }\n | null\n | undefined\n | Array<MappedAttributesReturnType>\n\nexport function recursivelyMapMdocAttributes(value: unknown): MappedAttributesReturnType {\n if (value instanceof Uint8Array) {\n const imageMimeType = detectImageMimeType(value)\n if (imageMimeType) {\n return `data:${imageMimeType};base64,${TypedArrayEncoder.toBase64(value)}`\n }\n\n // TODO: what to do with a buffer that is not an image?\n return TypedArrayEncoder.toUtf8String(value)\n }\n if (value === null || value === undefined || typeof value === 'number' || typeof value === 'boolean') return value\n\n if (value instanceof Date || value instanceof DateOnly || (typeof value === 'string' && isDateString(value))) {\n return formatDate(value instanceof DateOnly ? value.toISOString() : value)\n }\n if (typeof value === 'string') return value\n if (value instanceof Map) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)])\n )\n }\n if (Array.isArray(value)) return value.map(recursivelyMapMdocAttributes)\n\n return Object.fromEntries(Object.entries(value).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)]))\n}\n","const urlRegex = /^(.*:)\\/\\/([A-Za-z0-9-.]+)(:[0-9]+)?(.*)$/\n\nexport function getHostNameFromUrl(url: string) {\n const parts = urlRegex.exec(url)\n return parts ? parts[2] : undefined\n}\n","import type { OpenId4VcCredentialMetadata } from '../metadata/credentials'\nimport { getHostNameFromUrl } from '../utils/url'\nimport { findDisplay } from './common'\nimport type { CredentialDisplay, CredentialIssuerDisplay } from './credential'\n\nexport function getOpenId4VcIssuerDisplay(\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null\n): CredentialIssuerDisplay {\n const issuerDisplay: Partial<CredentialIssuerDisplay> = {}\n\n // Try to extract from openid metadata first\n if (openId4VcMetadata) {\n const openidIssuerDisplay = findDisplay(openId4VcMetadata.issuer.display)\n\n if (openidIssuerDisplay) {\n issuerDisplay.name = openidIssuerDisplay.name\n\n if (openidIssuerDisplay.logo) {\n issuerDisplay.logo = {\n url: openidIssuerDisplay.logo?.uri,\n altText: openidIssuerDisplay.logo?.alt_text,\n }\n }\n }\n\n // If the credentialDisplay contains a logo, and the issuerDisplay does not, use the logo from the credentialDisplay\n const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)\n if (openidCredentialDisplay && !issuerDisplay.logo && openidCredentialDisplay.logo) {\n issuerDisplay.logo = {\n url: openidCredentialDisplay.logo?.uri,\n altText: openidCredentialDisplay.logo?.alt_text,\n }\n }\n }\n\n // Last fallback: use issuer id from openid4vc\n if (!issuerDisplay.name && openId4VcMetadata?.issuer.id) {\n issuerDisplay.name = getHostNameFromUrl(openId4VcMetadata.issuer.id)\n }\n\n if (openId4VcMetadata?.issuer.id) {\n issuerDisplay.domain = getHostNameFromUrl(openId4VcMetadata.issuer.id)\n }\n\n return {\n ...issuerDisplay,\n name: issuerDisplay.name ?? 'Unknown',\n }\n}\n\nexport function getOpenId4VcCredentialDisplay(openId4VcMetadata: OpenId4VcCredentialMetadata) {\n const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)\n\n const credentialDisplay: Omit<CredentialDisplay, 'name'> & { name?: string } = {\n name: openidCredentialDisplay?.name,\n description: openidCredentialDisplay?.description,\n textColor: openidCredentialDisplay?.text_color,\n backgroundColor: openidCredentialDisplay?.background_color,\n backgroundImage: openidCredentialDisplay?.background_image\n ? {\n url: openidCredentialDisplay.background_image.uri,\n }\n : undefined,\n issuer: getOpenId4VcIssuerDisplay(openId4VcMetadata),\n }\n\n // NOTE: logo is used in issuer display (not sure if that's right though)\n\n return credentialDisplay\n}\n","import { ClaimFormat, type Mdoc, type MdocNameSpaces, type MdocRecord, getJwkFromKey } from '@credo-ts/core'\nimport {\n type CredentialCategoryMetadata,\n type OpenId4VcCredentialMetadata,\n getOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { safeCalculateJwkThumbprint } from '../utils/jwkThumbprint'\nimport type { CredentialDisplay, CredentialForDisplay, CredentialForDisplayId, CredentialMetadata } from './credential'\nimport { getAttributesForDocTypeOrVct } from './docTypeOfVct'\nimport { recursivelyMapMdocAttributes } from './mapAttributes'\nimport { getOpenId4VcCredentialDisplay, getOpenId4VcIssuerDisplay } from './openid4vc'\n\nexport function getDisplayInformationForMdocCredential(\n credentialRecord: MdocRecord,\n credentialForDisplayId: CredentialForDisplayId,\n hasRefreshToken: boolean,\n credentialCategoryMetadata: CredentialCategoryMetadata | null\n): CredentialForDisplay {\n const mdocInstance = credentialRecord.credential\n\n const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)\n const credentialDisplay = getMdocCredentialDisplay(mdocInstance, openId4VcMetadata)\n const issuerDisplay = getOpenId4VcIssuerDisplay(openId4VcMetadata)\n const { attributes, metadata } = getAttributesAndMetadataForMdocPayload(\n mdocInstance.issuerSignedNamespaces,\n mdocInstance\n )\n const customAttributesForDisplay =\n getAttributesForDocTypeOrVct({\n type: mdocInstance.docType,\n attributes,\n }) ?? attributes\n\n return {\n id: credentialForDisplayId,\n createdAt: credentialRecord.createdAt,\n display: {\n ...credentialDisplay,\n issuer: issuerDisplay,\n },\n attributes: customAttributesForDisplay,\n rawAttributes: attributes,\n metadata,\n claimFormat: ClaimFormat.MsoMdoc,\n record: credentialRecord,\n category: credentialCategoryMetadata ?? undefined,\n hasRefreshToken,\n }\n}\n\nfunction getMdocCredentialDisplay(mdoc: Mdoc, openId4VcMetadata: OpenId4VcCredentialMetadata | null) {\n let credentialDisplay: Partial<CredentialDisplay> = {}\n\n if (openId4VcMetadata) {\n credentialDisplay = getOpenId4VcCredentialDisplay(openId4VcMetadata)\n }\n\n return {\n ...credentialDisplay,\n // If there's no name for the credential, we extract it from the doctype\n name: credentialDisplay.name ?? mdoc.docType,\n }\n}\n\nexport function getAttributesAndMetadataForMdocPayload(namespaces: MdocNameSpaces, mdocInstance: Mdoc) {\n const attributes: CredentialForDisplay['attributes'] = Object.fromEntries(\n Object.values(namespaces).flatMap((v) => {\n return Object.entries(v).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)])\n })\n )\n\n // FIXME: Date should be fixed in Mdoc library\n // The problem is that mdocInstance.validityInfo.validFrom and validUntil are already Date objects that contain NaN, not just NaN values.\n // When you call toISOString() on a Date containing NaN, it will throw an error.\n const mdocMetadata: CredentialMetadata = {\n type: mdocInstance.docType,\n holder: mdocInstance.deviceKey\n ? safeCalculateJwkThumbprint(getJwkFromKey(mdocInstance.deviceKey).toJson())\n : undefined,\n issuedAt: mdocInstance.validityInfo.signed.toISOString(),\n validFrom:\n mdocInstance.validityInfo.validFrom instanceof Date &&\n !Number.isNaN(mdocInstance.validityInfo.validFrom.getTime())\n ? mdocInstance.validityInfo.validFrom.toISOString()\n : undefined,\n validUntil:\n mdocInstance.validityInfo.validUntil instanceof Date &&\n !Number.isNaN(mdocInstance.validityInfo.validUntil.getTime())\n ? mdocInstance.validityInfo.validUntil.toISOString()\n : undefined,\n }\n\n return {\n attributes,\n metadata: mdocMetadata,\n }\n}\n","import { ClaimFormat, type JwkJson, type SdJwtVcRecord, type SdJwtVcTypeMetadata } from '@credo-ts/core'\nimport {\n type CredentialCategoryMetadata,\n type OpenId4VcCredentialMetadata,\n getOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { safeCalculateJwkThumbprint } from '../utils/jwkThumbprint'\nimport { findDisplay } from './common'\nimport type { CredentialDisplay, CredentialForDisplay, CredentialForDisplayId, CredentialMetadata } from './credential'\nimport { getAttributesForDocTypeOrVct } from './docTypeOfVct'\nimport { recursivelyMapMdocAttributes } from './mapAttributes'\nimport { getOpenId4VcCredentialDisplay, getOpenId4VcIssuerDisplay } from './openid4vc'\nimport { sanitizeString } from './strings'\n\nexport function getDisplayInformationForSdJwtCredential(\n credentialRecord: SdJwtVcRecord,\n credentialForDisplayId: CredentialForDisplayId,\n hasRefreshToken: boolean,\n credentialCategoryMetadata: CredentialCategoryMetadata | null\n): CredentialForDisplay {\n const sdJwtVc = credentialRecord.credential\n\n const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)\n const sdJwtTypeMetadata = credentialRecord.typeMetadata\n const issuerDisplay = getOpenId4VcIssuerDisplay(openId4VcMetadata)\n\n const credentialDisplay = getSdJwtCredentialDisplay(sdJwtVc.prettyClaims, openId4VcMetadata, sdJwtTypeMetadata)\n const { attributes, metadata } = getAttributesAndMetadataForSdJwtPayload(sdJwtVc.prettyClaims)\n\n // FIXME: For now, we map attributes to our custom attributes for PID and MDL\n // We should add support for attributes from Type Metadata and OID4VC Metadata\n\n // Order of precedence should be:\n // 1. Custom attributes for PID and MDL using category\n // 2. Attributes from SD JWT Type Metadata\n // 3. Attributes from OID4VC Metadata\n\n const customAttributesForDisplay =\n getAttributesForDocTypeOrVct({\n type: sdJwtVc.payload.vct as string,\n attributes,\n }) ?? attributes\n\n return {\n id: credentialForDisplayId,\n createdAt: credentialRecord.createdAt,\n display: {\n ...credentialDisplay,\n issuer: issuerDisplay,\n },\n attributes: customAttributesForDisplay,\n rawAttributes: attributes,\n metadata,\n claimFormat: ClaimFormat.SdJwtVc,\n record: credentialRecord,\n category: credentialCategoryMetadata ?? undefined,\n hasRefreshToken,\n }\n}\n\nfunction getSdJwtTypeMetadataCredentialDisplay(\n sdJwtTypeMetadata: SdJwtVcTypeMetadata\n): Omit<CredentialDisplay, 'issuer' | 'name'> & { name?: string } {\n const typeMetadataDisplay = findDisplay(sdJwtTypeMetadata.display)\n\n // TODO: support SVG rendering method\n\n const credentialDisplay = {\n name: typeMetadataDisplay?.name,\n description: typeMetadataDisplay?.description,\n textColor: typeMetadataDisplay?.rendering?.simple?.text_color,\n backgroundColor: typeMetadataDisplay?.rendering?.simple?.background_color,\n backgroundImage: typeMetadataDisplay?.rendering?.simple?.logo\n ? {\n url: typeMetadataDisplay?.rendering?.simple?.logo.uri,\n altText: typeMetadataDisplay?.rendering?.simple?.logo.alt_text,\n }\n : undefined,\n }\n\n return credentialDisplay\n}\n\nfunction getSdJwtCredentialDisplay(\n credentialPayload: Record<string, unknown>,\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null,\n typeMetadata?: SdJwtVcTypeMetadata | null\n) {\n let credentialDisplay: Partial<CredentialDisplay> = {}\n\n // TODO: should we combine them? I think not really needed if you have one of them\n // Type metadata takes precendence.\n if (typeMetadata) {\n credentialDisplay = getSdJwtTypeMetadataCredentialDisplay(typeMetadata)\n } else if (openId4VcMetadata) {\n credentialDisplay = getOpenId4VcCredentialDisplay(openId4VcMetadata)\n }\n\n // If there's no name for the credential, we extract it from the last type\n // and sanitize it. This is not optimal. But provides at least something.\n if (!credentialDisplay.name && typeof credentialPayload.vct === 'string') {\n credentialDisplay.name = sanitizeString(credentialPayload.vct)\n }\n\n return {\n ...credentialDisplay,\n // Last fallback, if there's really no name for the credential, we use a generic name\n // TODO: use on-device AI to determine a name for the credential based on the credential data\n name: credentialDisplay.name ?? 'Credential',\n }\n}\n\nexport function getAttributesAndMetadataForSdJwtPayload(sdJwtVcPayload: Record<string, unknown>) {\n type SdJwtVcPayload = {\n iss: string\n cnf: Record<string, unknown>\n vct: string\n iat?: number\n nbf?: number\n exp?: number\n [key: string]: unknown\n }\n const { _sd_alg, _sd_hash, iss, vct, cnf, iat, exp, nbf, status, ...visibleProperties } =\n sdJwtVcPayload as SdJwtVcPayload\n\n const holder = cnf ? (cnf.kid ?? cnf.jwk ? safeCalculateJwkThumbprint(cnf.jwk as JwkJson) : undefined) : undefined\n const credentialMetadata: CredentialMetadata = {\n type: vct,\n issuer: iss,\n holder,\n issuedAt: iat ? new Date(iat * 1000).toISOString() : undefined,\n validUntil: exp ? new Date(exp * 1000).toISOString() : undefined,\n validFrom: nbf ? new Date(nbf * 1000).toISOString() : undefined,\n status,\n }\n\n return {\n attributes: Object.fromEntries(\n Object.entries(visibleProperties).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)])\n ),\n metadata: credentialMetadata,\n }\n}\n","import { ClaimFormat, JsonTransformer, type SingleOrArray, type W3cCredentialRecord } from '@credo-ts/core'\nimport {\n type CredentialCategoryMetadata,\n type OpenId4VcCredentialMetadata,\n getOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { getHostNameFromUrl } from '../utils/url'\nimport { findDisplay } from './common'\nimport type {\n CredentialDisplay,\n CredentialForDisplay,\n CredentialForDisplayId,\n CredentialIssuerDisplay,\n} from './credential'\nimport { getOpenId4VcCredentialDisplay } from './openid4vc'\nimport { sanitizeString } from './strings'\n\nexport type W3cIssuerJson = {\n id: string\n}\n\nexport type W3cCredentialSubjectJson = {\n id?: string\n [key: string]: unknown\n}\n\nexport type W3cCredentialJson = {\n type: Array<string>\n issuer: W3cIssuerJson\n issuanceDate: string\n expiryDate?: string\n credentialSubject: W3cCredentialSubjectJson | W3cCredentialSubjectJson[]\n}\n\nexport type JffW3cCredentialJson = W3cCredentialJson & {\n name?: string\n description?: string\n credentialBranding?: {\n backgroundColor?: string\n }\n\n issuer:\n | string\n | (W3cIssuerJson & {\n name?: string\n iconUrl?: string\n logoUrl?: string\n image?: string | { id?: string; type?: 'Image' }\n })\n}\n\nexport function getDisplayInformationForW3cCredential(\n credentialRecord: W3cCredentialRecord,\n credentialForDisplayId: CredentialForDisplayId,\n hasRefreshToken: boolean,\n credentialCategoryMetadata: CredentialCategoryMetadata | null\n): CredentialForDisplay {\n const credential = JsonTransformer.toJSON(\n credentialRecord.credential.claimFormat === ClaimFormat.JwtVc\n ? credentialRecord.credential.credential\n : credentialRecord.credential.toJson()\n ) as W3cCredentialJson\n\n // TODO why is this casted to `any`?\n // biome-ignore lint/suspicious/noExplicitAny:\n const proof = (credential as any).proof as SingleOrArray<{\n type: string\n cryptosuite?: string\n verificationMethod?: string\n }>\n const firstProof = Array.isArray(proof) ? proof[0] : proof\n const isAnonCreds = firstProof.cryptosuite === 'anoncreds-2023'\n\n let type = credentialRecord.credential.type[credentialRecord.credential.type.length - 1]\n if (isAnonCreds) {\n type = firstProof.verificationMethod ?? type\n }\n\n const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)\n const issuerDisplay = getW3cIssuerDisplay(credential, openId4VcMetadata)\n const credentialDisplay = getW3cCredentialDisplay(credential, openId4VcMetadata)\n\n // FIXME: support credential with multiple subjects\n const credentialAttributes = Array.isArray(credential.credentialSubject)\n ? credential.credentialSubject[0] ?? {}\n : credential.credentialSubject\n\n return {\n id: credentialForDisplayId,\n createdAt: credentialRecord.createdAt,\n display: {\n ...credentialDisplay,\n issuer: issuerDisplay,\n },\n attributes: credentialAttributes,\n rawAttributes: credentialAttributes,\n metadata: {\n holder: credentialRecord.credential.credentialSubjectIds[0],\n issuer: credentialRecord.credential.issuerId,\n type,\n issuedAt: new Date(credentialRecord.credential.issuanceDate).toISOString(),\n validUntil: credentialRecord.credential.expirationDate\n ? new Date(credentialRecord.credential.expirationDate).toISOString()\n : undefined,\n validFrom: new Date(credentialRecord.credential.issuanceDate).toISOString(),\n },\n claimFormat: credentialRecord.credential.claimFormat,\n record: credentialRecord,\n category: credentialCategoryMetadata ?? undefined,\n hasRefreshToken,\n }\n}\n\nfunction getW3cIssuerDisplay(\n credential: W3cCredentialJson,\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null\n): CredentialIssuerDisplay {\n const issuerDisplay: Partial<CredentialIssuerDisplay> = {}\n\n // Try to extract from openid metadata first\n if (openId4VcMetadata) {\n const openidIssuerDisplay = findDisplay(openId4VcMetadata.issuer.display)\n\n if (openidIssuerDisplay) {\n issuerDisplay.name = openidIssuerDisplay.name\n\n if (openidIssuerDisplay.logo) {\n issuerDisplay.logo = {\n url: openidIssuerDisplay.logo?.uri,\n altText: openidIssuerDisplay.logo?.alt_text,\n }\n }\n }\n\n // If the credentialDisplay contains a logo, and the issuerDisplay does not, use the logo from the credentialDisplay\n const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)\n if (openidCredentialDisplay && !issuerDisplay.logo && openidCredentialDisplay.logo) {\n issuerDisplay.logo = {\n url: openidCredentialDisplay.logo?.uri,\n altText: openidCredentialDisplay.logo?.alt_text,\n }\n }\n }\n\n // If openid metadata is not available, try to extract display metadata from the credential based on JFF metadata\n const jffCredential = credential as JffW3cCredentialJson\n const issuerJson = typeof jffCredential.issuer === 'string' ? undefined : jffCredential.issuer\n\n // Issuer Display from JFF\n if (!issuerDisplay.logo || !issuerDisplay.logo.url) {\n if (issuerJson?.logoUrl) {\n issuerDisplay.logo = {\n url: issuerJson?.logoUrl,\n }\n } else if (issuerJson?.image) {\n issuerDisplay.logo = {\n url: typeof issuerJson.image === 'string' ? issuerJson.image : issuerJson.image.id,\n }\n }\n }\n\n // Issuer name from JFF\n if (!issuerDisplay.name) {\n issuerDisplay.name = issuerJson?.name\n }\n\n // Last fallback: use issuer id from openid4vc\n if (!issuerDisplay.name && openId4VcMetadata?.issuer.id) {\n issuerDisplay.name = getHostNameFromUrl(openId4VcMetadata.issuer.id)\n }\n\n return {\n ...issuerDisplay,\n name: issuerDisplay.name ?? 'Unknown',\n }\n}\n\nfunction getW3cCredentialDisplay(\n credential: W3cCredentialJson,\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null\n) {\n let credentialDisplay: Partial<CredentialDisplay> = {}\n\n if (openId4VcMetadata) {\n credentialDisplay = getOpenId4VcCredentialDisplay(openId4VcMetadata)\n }\n\n // If openid metadata is not available, try to extract display metadata from the credential based on JFF metadata\n const jffCredential = credential as JffW3cCredentialJson\n\n if (!credentialDisplay.name) {\n credentialDisplay.name = jffCredential.name\n }\n\n // If there's no name for the credential, we extract it from the last type\n // and sanitize it. This is not optimal. But provides at least something.\n if (!credentialDisplay.name && jffCredential.type.length > 1) {\n const lastType = jffCredential.type[jffCredential.type.length - 1]\n if (lastType && !lastType.startsWith('http')) {\n credentialDisplay.name = sanitizeString(lastType)\n }\n }\n\n // Use background color from the JFF credential if not provided by the OID4VCI metadata\n if (!credentialDisplay.backgroundColor && jffCredential.credentialBranding?.backgroundColor) {\n credentialDisplay.backgroundColor = jffCredential.credentialBranding.backgroundColor\n }\n\n return {\n ...credentialDisplay,\n issuer: getW3cIssuerDisplay(credential, openId4VcMetadata),\n // Last fallback, if there's really no name for the credential, we use a generic name\n // TODO: use on-device AI to determine a name for the credential based on the credential data\n name: credentialDisplay.name ?? 'Credential',\n }\n}\n","import { type ClaimFormat, MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'\nimport { ParadymWalletUnsupportedCredentialRecordTypeError } from '../error'\nimport {\n type CredentialCategoryMetadata,\n getCredentialCategoryMetadata,\n getRefreshCredentialMetadata,\n} from '../metadata/credentials'\nimport { getDisplayInformationForMdocCredential } from './mdoc'\nimport { getDisplayInformationForSdJwtCredential } from './sdJwt'\nimport { getDisplayInformationForW3cCredential } from './w3c'\n\nexport type CredentialForDisplayId = `w3c-credential-${string}` | `sd-jwt-vc-${string}` | `mdoc-${string}`\n\nexport interface DisplayImage {\n url?: string\n altText?: string\n}\n\nexport interface CredentialDisplay {\n name: string\n locale?: string\n description?: string\n textColor?: string\n backgroundColor?: string\n backgroundImage?: DisplayImage\n issuer: CredentialIssuerDisplay\n}\n\nexport interface CredentialIssuerDisplay {\n name: string\n domain?: string\n locale?: string\n logo?: DisplayImage\n}\n\nexport interface CredentialMetadata {\n /**\n * vct (sd-jwt) or doctype (mdoc) or last type entry (w3c)\n */\n type: string\n\n /**\n * issuer identifier. did or https url\n */\n issuer?: string\n\n /**\n * Holder identifier. did or jwk thubmprint\n */\n holder?: string\n\n validUntil?: string\n validFrom?: string\n issuedAt?: string\n\n hasRefreshToken?: boolean\n\n // TODO: define and render\n status?: unknown\n}\n\nexport interface CredentialForDisplay {\n id: CredentialForDisplayId\n createdAt: Date\n display: CredentialDisplay\n attributes: Record<string, unknown>\n rawAttributes: Record<string, unknown>\n metadata: CredentialMetadata\n claimFormat: ClaimFormat.SdJwtVc | ClaimFormat.MsoMdoc | ClaimFormat.JwtVc | ClaimFormat.LdpVc\n record: W3cCredentialRecord | MdocRecord | SdJwtVcRecord\n\n category?: CredentialCategoryMetadata\n hasRefreshToken: boolean\n}\n\nexport function getCredentialForDisplayId(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): CredentialForDisplayId {\n if (credentialRecord instanceof SdJwtVcRecord) {\n return `sd-jwt-vc-${credentialRecord.id}`\n }\n if (credentialRecord instanceof W3cCredentialRecord) {\n return `w3c-credential-${credentialRecord.id}`\n }\n if (credentialRecord instanceof MdocRecord) {\n return `mdoc-${credentialRecord.id}`\n }\n\n throw new ParadymWalletUnsupportedCredentialRecordTypeError()\n}\n\nexport function getCredentialForDisplay(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): CredentialForDisplay {\n const credentialCategoryMetadata = getCredentialCategoryMetadata(credentialRecord)\n const credentialForDisplayId = getCredentialForDisplayId(credentialRecord)\n const hasRefreshToken = getRefreshCredentialMetadata(credentialRecord) !== null\n\n if (credentialRecord instanceof SdJwtVcRecord) {\n return getDisplayInformationForSdJwtCredential(\n credentialRecord,\n credentialForDisplayId,\n hasRefreshToken,\n credentialCategoryMetadata\n )\n }\n if (credentialRecord instanceof MdocRecord) {\n return getDisplayInformationForMdocCredential(\n credentialRecord,\n credentialForDisplayId,\n hasRefreshToken,\n credentialCategoryMetadata\n )\n }\n if (credentialRecord instanceof W3cCredentialRecord) {\n return getDisplayInformationForW3cCredential(\n credentialRecord,\n credentialForDisplayId,\n hasRefreshToken,\n credentialCategoryMetadata\n )\n }\n\n throw new ParadymWalletUnsupportedCredentialRecordTypeError()\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export function isFunction(value) {\n return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","export function createErrorClass(createImpl) {\n var _super = function (instance) {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n var ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n return function UnsubscriptionErrorImpl(errors) {\n _super(this);\n this.message = errors\n ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n ')\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function arrRemove(arr, item) {\n if (arr) {\n var index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n function Subscription(initialTeardown) {\n this.initialTeardown = initialTeardown;\n this.closed = false;\n this._parentage = null;\n this._finalizers = null;\n }\n Subscription.prototype.unsubscribe = function () {\n var e_1, _a, e_2, _b;\n var errors;\n if (!this.closed) {\n this.closed = true;\n var _parentage = this._parentage;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n try {\n for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n var parent_1 = _parentage_1_1.value;\n parent_1.remove(this);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n _parentage.remove(this);\n }\n }\n var initialFinalizer = this.initialTeardown;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n }\n catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n var _finalizers = this._finalizers;\n if (_finalizers) {\n this._finalizers = null;\n try {\n for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n var finalizer = _finalizers_1_1.value;\n try {\n execFinalizer(finalizer);\n }\n catch (err) {\n errors = errors !== null && errors !== void 0 ? errors : [];\n if (err instanceof UnsubscriptionError) {\n errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n };\n Subscription.prototype.add = function (teardown) {\n var _a;\n if (teardown && teardown !== this) {\n if (this.closed) {\n execFinalizer(teardown);\n }\n else {\n if (teardown instanceof Subscription) {\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n }\n }\n };\n Subscription.prototype._hasParent = function (parent) {\n var _parentage = this._parentage;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n };\n Subscription.prototype._addParent = function (parent) {\n var _parentage = this._parentage;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n };\n Subscription.prototype._removeParent = function (parent) {\n var _parentage = this._parentage;\n if (_parentage === parent) {\n this._parentage = null;\n }\n else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n };\n Subscription.prototype.remove = function (teardown) {\n var _finalizers = this._finalizers;\n _finalizers && arrRemove(_finalizers, teardown);\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n };\n Subscription.EMPTY = (function () {\n var empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n return (value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n if (isFunction(finalizer)) {\n finalizer();\n }\n else {\n finalizer.unsubscribe();\n }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n setTimeout: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = timeoutProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearTimeout: function (handle) {\n var delegate = timeoutProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n timeoutProvider.setTimeout(function () {\n var onUnhandledError = config.onUnhandledError;\n if (onUnhandledError) {\n onUnhandledError(err);\n }\n else {\n throw err;\n }\n });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","export var COMPLETE_NOTIFICATION = (function () { return createNotification('C', undefined, undefined); })();\nexport function errorNotification(error) {\n return createNotification('E', undefined, error);\n}\nexport function nextNotification(value) {\n return createNotification('N', value, undefined);\n}\nexport function createNotification(kind, value, error) {\n return {\n kind: kind,\n value: value,\n error: error,\n };\n}\n//# sourceMappingURL=NotificationFactories.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n var isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n }\n else {\n cb();\n }\n}\nexport function captureError(err) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n//# sourceMappingURL=errorContext.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n function Subscriber(destination) {\n var _this = _super.call(this) || this;\n _this.isStopped = false;\n if (destination) {\n _this.destination = destination;\n if (isSubscription(destination)) {\n destination.add(_this);\n }\n }\n else {\n _this.destination = EMPTY_OBSERVER;\n }\n return _this;\n }\n Subscriber.create = function (next, error, complete) {\n return new SafeSubscriber(next, error, complete);\n };\n Subscriber.prototype.next = function (value) {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n }\n else {\n this._next(value);\n }\n };\n Subscriber.prototype.error = function (err) {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n }\n else {\n this.isStopped = true;\n this._error(err);\n }\n };\n Subscriber.prototype.complete = function () {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n }\n else {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (!this.closed) {\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n this.destination = null;\n }\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n try {\n this.destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n };\n Subscriber.prototype._complete = function () {\n try {\n this.destination.complete();\n }\n finally {\n this.unsubscribe();\n }\n };\n return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n function ConsumerObserver(partialObserver) {\n this.partialObserver = partialObserver;\n }\n ConsumerObserver.prototype.next = function (value) {\n var partialObserver = this.partialObserver;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n ConsumerObserver.prototype.error = function (err) {\n var partialObserver = this.partialObserver;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n else {\n handleUnhandledError(err);\n }\n };\n ConsumerObserver.prototype.complete = function () {\n var partialObserver = this.partialObserver;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(observerOrNext, error, complete) {\n var _this = _super.call(this) || this;\n var partialObserver;\n if (isFunction(observerOrNext) || !observerOrNext) {\n partialObserver = {\n next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n error: error !== null && error !== void 0 ? error : undefined,\n complete: complete !== null && complete !== void 0 ? complete : undefined,\n };\n }\n else {\n var context_1;\n if (_this && config.useDeprecatedNextContext) {\n context_1 = Object.create(observerOrNext);\n context_1.unsubscribe = function () { return _this.unsubscribe(); };\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context_1),\n error: observerOrNext.error && bind(observerOrNext.error, context_1),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n };\n }\n else {\n partialObserver = observerOrNext;\n }\n }\n _this.destination = new ConsumerObserver(partialObserver);\n return _this;\n }\n return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n }\n else {\n reportUnhandledError(error);\n }\n}\nfunction defaultErrorHandler(err) {\n throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n var onStoppedNotification = config.onStoppedNotification;\n onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n return x;\n}\n//# sourceMappingURL=identity.js.map","import { identity } from './identity';\nexport function pipe() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n if (fns.length === 0) {\n return identity;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return function piped(input) {\n return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n };\n}\n//# sourceMappingURL=pipe.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n function Observable(subscribe) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var _this = this;\n var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n errorContext(function () {\n var _a = _this, operator = _a.operator, source = _a.source;\n subscriber.add(operator\n ?\n operator.call(subscriber, source)\n : source\n ?\n _this._subscribe(subscriber)\n :\n _this._trySubscribe(subscriber));\n });\n return subscriber;\n };\n Observable.prototype._trySubscribe = function (sink) {\n try {\n return this._subscribe(sink);\n }\n catch (err) {\n sink.error(err);\n }\n };\n Observable.prototype.forEach = function (next, promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n _this.subscribe(subscriber);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n var _a;\n return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n };\n Observable.prototype[Symbol_observable] = function () {\n return this;\n };\n Observable.prototype.pipe = function () {\n var operations = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n operations[_i] = arguments[_i];\n }\n return pipeFromArray(operations)(this);\n };\n Observable.prototype.toPromise = function (promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n };\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n var _a;\n return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n return function (source) {\n if (hasLift(source)) {\n return source.lift(function (liftedSource) {\n try {\n return init(liftedSource, this);\n }\n catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n//# sourceMappingURL=lift.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n __extends(OperatorSubscriber, _super);\n function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n var _this = _super.call(this, destination) || this;\n _this.onFinalize = onFinalize;\n _this.shouldUnsubscribe = shouldUnsubscribe;\n _this._next = onNext\n ? function (value) {\n try {\n onNext(value);\n }\n catch (err) {\n destination.error(err);\n }\n }\n : _super.prototype._next;\n _this._error = onError\n ? function (err) {\n try {\n onError(err);\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._error;\n _this._complete = onComplete\n ? function () {\n try {\n onComplete();\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._complete;\n return _this;\n }\n OperatorSubscriber.prototype.unsubscribe = function () {\n var _a;\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n var closed_1 = this.closed;\n _super.prototype.unsubscribe.call(this);\n !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n }\n };\n return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","export var dateTimestampProvider = {\n now: function () {\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n return _super.call(this) || this;\n }\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n setInterval: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = intervalProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearInterval: function (handle) {\n var delegate = intervalProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n var _this = _super.call(this, scheduler, work) || this;\n _this.scheduler = scheduler;\n _this.work = work;\n _this.pending = false;\n return _this;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n var _a;\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n this.state = state;\n var id = this.id;\n var scheduler = this.scheduler;\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.pending = true;\n this.delay = delay;\n this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n if (delay === void 0) { delay = 0; }\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n return undefined;\n };\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, _delay) {\n var errored = false;\n var errorValue;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype.unsubscribe = function () {\n if (!this.closed) {\n var _a = this, id = _a.id, scheduler = _a.scheduler;\n var actions = scheduler.actions;\n this.work = this.state = this.scheduler = null;\n this.pending = false;\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n this.delay = null;\n _super.prototype.unsubscribe.call(this);\n }\n };\n return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n function Scheduler(schedulerActionCtor, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.schedulerActionCtor = schedulerActionCtor;\n this.now = now;\n }\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n };\n Scheduler.now = dateTimestampProvider.now;\n return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n var _this = _super.call(this, SchedulerAction, now) || this;\n _this.actions = [];\n _this._active = false;\n return _this;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this._active) {\n actions.push(action);\n return;\n }\n var error;\n this._active = true;\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()));\n this._active = false;\n if (error) {\n while ((action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { Observable } from '../Observable';\nexport var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });\nexport function empty(scheduler) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator';\n }\n return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n var reader, _a, value, done;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n reader = readableStream.getReader();\n _b.label = 1;\n case 1:\n _b.trys.push([1, , 9, 10]);\n _b.label = 2;\n case 2:\n if (!true) return [3, 8];\n return [4, __await(reader.read())];\n case 3:\n _a = _b.sent(), value = _a.value, done = _a.done;\n if (!done) return [3, 5];\n return [4, __await(void 0)];\n case 4: return [2, _b.sent()];\n case 5: return [4, __await(value)];\n case 6: return [4, _b.sent()];\n case 7:\n _b.sent();\n return [3, 2];\n case 8: return [3, 10];\n case 9:\n reader.releaseLock();\n return [7];\n case 10: return [2];\n }\n });\n });\n}\nexport function isReadableStreamLike(obj) {\n return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n if (input instanceof Observable) {\n return input;\n }\n if (input != null) {\n if (isInteropObservable(input)) {\n return fromInteropObservable(input);\n }\n if (isArrayLike(input)) {\n return fromArrayLike(input);\n }\n if (isPromise(input)) {\n return fromPromise(input);\n }\n if (isAsyncIterable(input)) {\n return fromAsyncIterable(input);\n }\n if (isIterable(input)) {\n return fromIterable(input);\n }\n if (isReadableStreamLike(input)) {\n return fromReadableStreamLike(input);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n return new Observable(function (subscriber) {\n var obs = obj[Symbol_observable]();\n if (isFunction(obs.subscribe)) {\n return obs.subscribe(subscriber);\n }\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n });\n}\nexport function fromArrayLike(array) {\n return new Observable(function (subscriber) {\n for (var i = 0; i < array.length && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n });\n}\nexport function fromPromise(promise) {\n return new Observable(function (subscriber) {\n promise\n .then(function (value) {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) { return subscriber.error(err); })\n .then(null, reportUnhandledError);\n });\n}\nexport function fromIterable(iterable) {\n return new Observable(function (subscriber) {\n var e_1, _a;\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var value = iterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriber.complete();\n });\n}\nexport function fromAsyncIterable(asyncIterable) {\n return new Observable(function (subscriber) {\n process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n });\n}\nexport function fromReadableStreamLike(readableStream) {\n return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n var asyncIterable_1, asyncIterable_1_1;\n var e_2, _a;\n return __awaiter(this, void 0, void 0, function () {\n var value, e_2_1;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 5, 6, 11]);\n asyncIterable_1 = __asyncValues(asyncIterable);\n _b.label = 1;\n case 1: return [4, asyncIterable_1.next()];\n case 2:\n if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n value = asyncIterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return [2];\n }\n _b.label = 3;\n case 3: return [3, 1];\n case 4: return [3, 11];\n case 5:\n e_2_1 = _b.sent();\n e_2 = { error: e_2_1 };\n return [3, 11];\n case 6:\n _b.trys.push([6, , 9, 10]);\n if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n return [4, _a.call(asyncIterable_1)];\n case 7:\n _b.sent();\n _b.label = 8;\n case 8: return [3, 10];\n case 9:\n if (e_2) throw e_2.error;\n return [7];\n case 10: return [7];\n case 11:\n subscriber.complete();\n return [2];\n }\n });\n });\n}\n//# sourceMappingURL=innerFrom.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n if (delay === void 0) { delay = 0; }\n if (repeat === void 0) { repeat = false; }\n var scheduleSubscription = scheduler.schedule(function () {\n work();\n if (repeat) {\n parentSubscription.add(this.schedule(null, delay));\n }\n else {\n this.unsubscribe();\n }\n }, delay);\n parentSubscription.add(scheduleSubscription);\n if (!repeat) {\n return scheduleSubscription;\n }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { createErrorClass } from './createErrorClass';\nexport var EmptyError = createErrorClass(function (_super) {\n return function EmptyErrorImpl() {\n _super(this);\n this.name = 'EmptyError';\n this.message = 'no elements in sequence';\n };\n});\n//# sourceMappingURL=EmptyError.js.map","import { EmptyError } from './util/EmptyError';\nimport { SafeSubscriber } from './Subscriber';\nexport function firstValueFrom(source, config) {\n var hasConfig = typeof config === 'object';\n return new Promise(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n resolve(value);\n subscriber.unsubscribe();\n },\n error: reject,\n complete: function () {\n if (hasConfig) {\n resolve(config.defaultValue);\n }\n else {\n reject(new EmptyError());\n }\n },\n });\n source.subscribe(subscriber);\n });\n}\n//# sourceMappingURL=firstValueFrom.js.map","export function isValidDate(value) {\n return value instanceof Date && !isNaN(value);\n}\n//# sourceMappingURL=isDate.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { isValidDate } from '../util/isDate';\nimport { operate } from '../util/lift';\nimport { innerFrom } from '../observable/innerFrom';\nimport { createErrorClass } from '../util/createErrorClass';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { executeSchedule } from '../util/executeSchedule';\nexport var TimeoutError = createErrorClass(function (_super) {\n return function TimeoutErrorImpl(info) {\n if (info === void 0) { info = null; }\n _super(this);\n this.message = 'Timeout has occurred';\n this.name = 'TimeoutError';\n this.info = info;\n };\n});\nexport function timeout(config, schedulerArg) {\n var _a = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;\n if (first == null && each == null) {\n throw new TypeError('No timeout provided.');\n }\n return operate(function (source, subscriber) {\n var originalSourceSubscription;\n var timerSubscription;\n var lastValue = null;\n var seen = 0;\n var startTimer = function (delay) {\n timerSubscription = executeSchedule(subscriber, scheduler, function () {\n try {\n originalSourceSubscription.unsubscribe();\n innerFrom(_with({\n meta: meta,\n lastValue: lastValue,\n seen: seen,\n })).subscribe(subscriber);\n }\n catch (err) {\n subscriber.error(err);\n }\n }, delay);\n };\n originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();\n seen++;\n subscriber.next((lastValue = value));\n each > 0 && startTimer(each);\n }, undefined, undefined, function () {\n if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {\n timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();\n }\n lastValue = null;\n }));\n !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);\n });\n}\nfunction timeoutErrorFactory(info) {\n throw new TimeoutError(info);\n}\n//# sourceMappingURL=timeout.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n subscriber.next(project.call(thisArg, value, index++));\n }));\n });\n}\n//# sourceMappingURL=map.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n });\n}\n//# sourceMappingURL=filter.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function defaultIfEmpty(defaultValue) {\n return operate(function (source, subscriber) {\n var hasValue = false;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n hasValue = true;\n subscriber.next(value);\n }, function () {\n if (!hasValue) {\n subscriber.next(defaultValue);\n }\n subscriber.complete();\n }));\n });\n}\n//# sourceMappingURL=defaultIfEmpty.js.map","import { EMPTY } from '../observable/empty';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function take(count) {\n return count <= 0\n ?\n function () { return EMPTY; }\n : operate(function (source, subscriber) {\n var seen = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n if (++seen <= count) {\n subscriber.next(value);\n if (count <= seen) {\n subscriber.complete();\n }\n }\n }));\n });\n}\n//# sourceMappingURL=take.js.map","import { EmptyError } from '../util/EmptyError';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function throwIfEmpty(errorFactory) {\n if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }\n return operate(function (source, subscriber) {\n var hasValue = false;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n hasValue = true;\n subscriber.next(value);\n }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));\n });\n}\nfunction defaultErrorFactory() {\n return new EmptyError();\n}\n//# sourceMappingURL=throwIfEmpty.js.map","import { EmptyError } from '../util/EmptyError';\nimport { filter } from './filter';\nimport { take } from './take';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { throwIfEmpty } from './throwIfEmpty';\nimport { identity } from '../util/identity';\nexport function first(predicate, defaultValue) {\n var hasDefaultValue = arguments.length >= 2;\n return function (source) {\n return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));\n };\n}\n//# sourceMappingURL=first.js.map","import type {\n Agent,\n BaseEvent,\n BaseRecord,\n RecordDeletedEvent,\n RecordSavedEvent,\n RecordUpdatedEvent,\n} from '@credo-ts/core'\nimport type { Constructor } from '@credo-ts/core/build/utils/mixins'\n\nimport { RepositoryEventTypes } from '@credo-ts/core'\nimport { useMemo } from 'react'\nimport { filter, map, pipe } from 'rxjs'\n\n// BaseRecordAny makes sure we allow any type to be used for the generic\n// properties of the BaseRecord. The default BaseRecord type uses Empty objects\n// which means if you have a ConnectionRecord and BaseRecord with default properties\n// their types are incompatible.\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport type BaseRecordAny = BaseRecord<any, any, any>\ntype RecordClass<R extends BaseRecordAny> = Constructor<R> & { type: string }\nexport interface RecordsState<R extends BaseRecordAny> {\n loading: boolean\n records: R[]\n}\n\nexport const addRecord = <R extends BaseRecordAny>(record: R, state: RecordsState<R>): RecordsState<R> => {\n const newRecordsState = [...state.records]\n newRecordsState.unshift(record)\n return {\n loading: state.loading,\n records: newRecordsState,\n }\n}\n\nexport const updateRecord = <R extends BaseRecordAny>(record: R, state: RecordsState<R>): RecordsState<R> => {\n const newRecordsState = [...state.records]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n loading: state.loading,\n records: newRecordsState,\n }\n}\n\nexport const removeRecord = <R extends BaseRecordAny>(\n record: R | { id: string; type: R['type'] },\n state: RecordsState<R>\n): RecordsState<R> => {\n const newRecordsState = state.records.filter((r) => r.id !== record.id)\n return {\n loading: state.loading,\n records: newRecordsState,\n }\n}\n\nconst filterByType = <R extends BaseRecordAny>(recordClass: RecordClass<R>) => {\n return pipe(\n map((event: BaseEvent) => (event.payload as Record<string, R>).record),\n filter((record: R) => record.type === recordClass.type)\n )\n}\n\nexport const recordsAddedByType = <R extends BaseRecordAny>(agent: Agent | undefined, recordClass: RecordClass<R>) => {\n if (!agent) {\n throw new Error('Agent is required to check record type')\n }\n\n if (!recordClass) {\n throw new Error(\"The recordClass can't be undefined\")\n }\n\n return agent?.events.observable<RecordSavedEvent<R>>(RepositoryEventTypes.RecordSaved).pipe(filterByType(recordClass))\n}\n\nexport const recordsUpdatedByType = <R extends BaseRecordAny>(\n agent: Agent | undefined,\n recordClass: RecordClass<R>\n) => {\n if (!agent) {\n throw new Error('Agent is required to update record type')\n }\n\n if (!recordClass) {\n throw new Error(\"The recordClass can't be undefined\")\n }\n\n return agent?.events\n .observable<RecordUpdatedEvent<R>>(RepositoryEventTypes.RecordUpdated)\n .pipe(filterByType(recordClass))\n}\n\nexport const recordsRemovedByType = <R extends BaseRecordAny>(\n agent: Agent | undefined,\n recordClass: RecordClass<R>\n) => {\n if (!agent) {\n throw new Error('Agent is required to remove records by type')\n }\n\n if (!recordClass) {\n throw new Error(\"The recordClass can't be undefined\")\n }\n\n return agent?.events\n .observable<RecordDeletedEvent<R>>(RepositoryEventTypes.RecordDeleted)\n .pipe(filterByType(recordClass))\n}\n\nexport const isModuleRegistered = (agent: Agent, ModuleClass: Constructor) => {\n if (!agent) {\n throw new Error('Agent is required to check if a module is enabled')\n }\n\n const foundModule = Object.values(agent.dependencyManager.registeredModules).find(\n (module: unknown) => module instanceof ModuleClass\n )\n\n return foundModule !== undefined\n}\n\nexport const useIsModuleRegistered = (agent: Agent, ModuleClass: Constructor) => {\n return useMemo(() => isModuleRegistered(agent, ModuleClass), [agent, ModuleClass])\n}\n","import { type Agent, MdocRecord } from '@credo-ts/core'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport type * as React from 'react'\nimport { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from '../utils/records'\n\nexport { Mdoc, MdocRecord } from '@credo-ts/core'\n\ntype MdocRecordState = {\n mdocRecords: Array<MdocRecord>\n isLoading: boolean\n}\n\nconst addRecord = (record: MdocRecord, state: MdocRecordState): MdocRecordState => {\n const newRecordsState = [...state.mdocRecords]\n newRecordsState.unshift(record)\n return {\n isLoading: state.isLoading,\n mdocRecords: newRecordsState,\n }\n}\n\nconst updateRecord = (record: MdocRecord, state: MdocRecordState): MdocRecordState => {\n const newRecordsState = [...state.mdocRecords]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n isLoading: state.isLoading,\n mdocRecords: newRecordsState,\n }\n}\n\nconst removeRecord = (record: MdocRecord, state: MdocRecordState): MdocRecordState => {\n const newRecordsState = state.mdocRecords.filter((r) => r.id !== record.id)\n return {\n isLoading: state.isLoading,\n mdocRecords: newRecordsState,\n }\n}\n\nconst MdocRecordContext = createContext<MdocRecordState | undefined>(undefined)\n\nexport const useMdocRecords = (): MdocRecordState => {\n const mdocRecordContext = useContext(MdocRecordContext)\n if (!mdocRecordContext) {\n throw new Error('useMdocRecord must be used within a MdocRecordContextProvider')\n }\n\n return mdocRecordContext\n}\n\nexport const useMdocRecordById = (id: string): MdocRecord | undefined => {\n const { mdocRecords } = useMdocRecords()\n return mdocRecords.find((c) => c.id === id)\n}\n\ninterface Props {\n agent: Agent\n}\n\nexport const MdocRecordProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<MdocRecordState>({\n mdocRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n void agent.mdoc.getAll().then((mdocRecords) => setState({ mdocRecords, isLoading: false }))\n }, [agent.mdoc.getAll])\n\n useEffect(() => {\n if (!state.isLoading && agent) {\n const credentialAdded$ = recordsAddedByType(agent, MdocRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdate$ = recordsUpdatedByType(agent, MdocRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemove$ = recordsRemovedByType(agent, MdocRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$.unsubscribe()\n credentialUpdate$.unsubscribe()\n credentialRemove$.unsubscribe()\n }\n }\n }, [state, agent])\n\n return <MdocRecordContext.Provider value={state}>{children}</MdocRecordContext.Provider>\n}\n","import { type Agent, SdJwtVcRecord } from '@credo-ts/core'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from '../utils/records'\n\nexport { SdJwtVc, SdJwtVcRecord } from '@credo-ts/core'\n\ntype SdJwtVcRecordState = {\n sdJwtVcRecords: Array<SdJwtVcRecord>\n isLoading: boolean\n}\n\nconst addRecord = (record: SdJwtVcRecord, state: SdJwtVcRecordState): SdJwtVcRecordState => {\n const newRecordsState = [...state.sdJwtVcRecords]\n newRecordsState.unshift(record)\n return {\n isLoading: state.isLoading,\n sdJwtVcRecords: newRecordsState,\n }\n}\n\nconst updateRecord = (record: SdJwtVcRecord, state: SdJwtVcRecordState): SdJwtVcRecordState => {\n const newRecordsState = [...state.sdJwtVcRecords]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n isLoading: state.isLoading,\n sdJwtVcRecords: newRecordsState,\n }\n}\n\nconst removeRecord = (record: SdJwtVcRecord, state: SdJwtVcRecordState): SdJwtVcRecordState => {\n const newRecordsState = state.sdJwtVcRecords.filter((r) => r.id !== record.id)\n return {\n isLoading: state.isLoading,\n sdJwtVcRecords: newRecordsState,\n }\n}\n\nconst SdJwtVcRecordContext = createContext<SdJwtVcRecordState | undefined>(undefined)\n\nexport const useSdJwtVcRecords = (): SdJwtVcRecordState => {\n const sdJwtVcRecordContext = useContext(SdJwtVcRecordContext)\n if (!sdJwtVcRecordContext) {\n throw new Error('useSdJwtVcRecord must be used within a SdJwtVcRecordContextProvider')\n }\n\n return sdJwtVcRecordContext\n}\n\nexport const useSdJwtVcRecordById = (id: string): SdJwtVcRecord | undefined => {\n const { sdJwtVcRecords } = useSdJwtVcRecords()\n return sdJwtVcRecords.find((c) => c.id === id)\n}\n\ninterface Props {\n agent: Agent\n}\n\nexport const SdJwtVcRecordProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<SdJwtVcRecordState>({\n sdJwtVcRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n void agent.sdJwtVc.getAll().then((sdJwtVcRecords) => setState({ sdJwtVcRecords, isLoading: false }))\n }, [agent.sdJwtVc.getAll])\n\n useEffect(() => {\n if (!state.isLoading && agent) {\n const credentialAdded$ = recordsAddedByType(agent, SdJwtVcRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdate$ = recordsUpdatedByType(agent, SdJwtVcRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemove$ = recordsRemovedByType(agent, SdJwtVcRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$.unsubscribe()\n credentialUpdate$.unsubscribe()\n credentialRemove$.unsubscribe()\n }\n }\n }, [state, agent])\n\n return <SdJwtVcRecordContext.Provider value={state}>{children}</SdJwtVcRecordContext.Provider>\n}\n","import { type Agent, W3cCredentialRecord } from '@credo-ts/core'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from '../utils/records'\n\nexport { W3cCredentialRecord, W3cVerifiableCredential } from '@credo-ts/core'\n\ntype W3cCredentialRecordState = {\n w3cCredentialRecords: Array<W3cCredentialRecord>\n isLoading: boolean\n}\n\nconst addRecord = (record: W3cCredentialRecord, state: W3cCredentialRecordState): W3cCredentialRecordState => {\n const newRecordsState = [...state.w3cCredentialRecords]\n newRecordsState.unshift(record)\n return {\n isLoading: state.isLoading,\n w3cCredentialRecords: newRecordsState,\n }\n}\n\nconst updateRecord = (record: W3cCredentialRecord, state: W3cCredentialRecordState): W3cCredentialRecordState => {\n const newRecordsState = [...state.w3cCredentialRecords]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n isLoading: state.isLoading,\n w3cCredentialRecords: newRecordsState,\n }\n}\n\nconst removeRecord = (record: W3cCredentialRecord, state: W3cCredentialRecordState): W3cCredentialRecordState => {\n const newRecordsState = state.w3cCredentialRecords.filter((r) => r.id !== record.id)\n return {\n isLoading: state.isLoading,\n w3cCredentialRecords: newRecordsState,\n }\n}\n\nconst W3cCredentialRecordContext = createContext<W3cCredentialRecordState | undefined>(undefined)\n\nexport const useW3cCredentialRecords = (): W3cCredentialRecordState => {\n const w3cCredentialRecordContext = useContext(W3cCredentialRecordContext)\n if (!w3cCredentialRecordContext) {\n throw new Error('useW3cCredentialRecord must be used within a W3cCredentialRecordContextProvider')\n }\n\n return w3cCredentialRecordContext\n}\n\nexport const useW3cCredentialRecordById = (id: string): W3cCredentialRecord | undefined => {\n const { w3cCredentialRecords } = useW3cCredentialRecords()\n return w3cCredentialRecords.find((c) => c.id === id)\n}\n\ninterface Props {\n agent: Agent\n}\n\nexport const W3cCredentialRecordProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<W3cCredentialRecordState>({\n w3cCredentialRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n void agent.w3cCredentials\n .getAllCredentialRecords()\n .then((w3cCredentialRecords) => setState({ w3cCredentialRecords, isLoading: false }))\n }, [agent])\n\n useEffect(() => {\n if (!state.isLoading && agent) {\n const credentialAdded$ = recordsAddedByType(agent, W3cCredentialRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdate$ = recordsUpdatedByType(agent, W3cCredentialRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemove$ = recordsRemovedByType(agent, W3cCredentialRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$.unsubscribe()\n credentialUpdate$.unsubscribe()\n credentialRemove$.unsubscribe()\n }\n }\n }, [state, agent])\n\n return <W3cCredentialRecordContext.Provider value={state}>{children}</W3cCredentialRecordContext.Provider>\n}\n","import { useMemo } from 'react'\nimport { type CredentialForDisplay, getCredentialForDisplay } from '../display/credential'\nimport type { CredentialCategoryMetadata } from '../metadata/credentials'\nimport { useMdocRecords } from '../providers/MdocProvider'\nimport { useSdJwtVcRecords } from '../providers/SdJwtVcProvider'\nimport { useW3cCredentialRecords } from '../providers/W3cCredentialsProvider'\n\nexport const useCredentials = ({\n removeCanonicalRecords = true,\n credentialCategory,\n}: {\n removeCanonicalRecords?: boolean\n credentialCategory?: CredentialCategoryMetadata['credentialCategory']\n} = {}) => {\n const { w3cCredentialRecords, isLoading: isLoadingW3c } = useW3cCredentialRecords()\n const { sdJwtVcRecords, isLoading: isLoadingSdJwt } = useSdJwtVcRecords()\n const { mdocRecords, isLoading: isLoadingMdoc } = useMdocRecords()\n\n const credentials = useMemo((): CredentialForDisplay[] => {\n // Map into common structure that can be rendered\n const uniformW3cCredentialRecords = w3cCredentialRecords.map(getCredentialForDisplay)\n const uniformSdJwtVcRecords = sdJwtVcRecords.map(getCredentialForDisplay)\n const uniformMdocRecords = mdocRecords.map(getCredentialForDisplay)\n\n const presentCategories = new Set<string>()\n\n const allRecords = [...uniformW3cCredentialRecords, ...uniformSdJwtVcRecords, ...uniformMdocRecords]\n\n // Make sure only one for each category is present\n const finalRecords =\n removeCanonicalRecords || credentialCategory\n ? allRecords.filter((record, index) => {\n if (credentialCategory && record.category?.credentialCategory !== credentialCategory) return false\n\n if (removeCanonicalRecords) {\n if (!record.category) return true\n if (presentCategories.has(record.category.credentialCategory)) return false\n\n const shouldAddForCategory =\n record.category.displayPriority ||\n allRecords\n .slice(index + 1)\n .find(\n (r) =>\n r.category?.credentialCategory === record.category?.credentialCategory &&\n r.category?.displayPriority\n ) === undefined\n\n if (shouldAddForCategory) {\n presentCategories.add(record.category.credentialCategory)\n return true\n }\n }\n\n return true\n })\n : allRecords\n\n // Sort by creation date\n const sortedRecords = finalRecords.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n\n return sortedRecords\n }, [w3cCredentialRecords, sdJwtVcRecords, mdocRecords, removeCanonicalRecords, credentialCategory])\n\n return {\n credentials,\n isLoading: isLoadingSdJwt || isLoadingW3c || isLoadingMdoc,\n }\n}\n","import { type ClaimFormat, MdocRecord, SdJwtVcRecord } from '@credo-ts/core'\nimport type { CredentialForDisplay } from '../display/credential'\nimport { useCredentials } from './useCredentials'\n\nexport function useCredentialByCategory(credentialCategory?: string) {\n if (!credentialCategory) {\n return {\n credentials: [],\n isLoading: false,\n } as const\n }\n\n const { isLoading, credentials } = useCredentials({\n removeCanonicalRecords: false,\n credentialCategory,\n })\n\n if (isLoading) {\n return {\n credentials: undefined,\n isLoading: true,\n } as const\n }\n\n const credential =\n credentials.find((c) => c.category?.displayPriority) ?? (credentials[0] as CredentialForDisplay | undefined)\n\n return {\n isLoading: false,\n credential,\n credentials,\n mdoc: credentials.find(\n (c): c is typeof c & { record: MdocRecord; claimFormat: ClaimFormat.MsoMdoc } => c.record instanceof MdocRecord\n ),\n sdJwt: credentials.find(\n (c): c is typeof c & { record: SdJwtVcRecord; claimFormat: ClaimFormat.SdJwtVc } =>\n c.record instanceof SdJwtVcRecord\n ),\n } as const\n}\n","import { useMemo } from 'react'\nimport { useCredentials } from './useCredentials'\n\nexport type CredentialId = `w3c-credential-${string}` | `sd-jwt-vc-${string}` | `mdoc-${string}`\n\nexport const useCredentialById = (credentialId: CredentialId) => {\n const { credentials, isLoading } = useCredentials({ removeCanonicalRecords: false })\n\n return {\n isLoading,\n credential: useMemo(() => credentials.find((c) => c.id === credentialId), [credentials, credentialId]),\n }\n}\n","import {\n DidJwk,\n DidKey,\n DidsApi,\n type JwkDidCreateOptions,\n KeyBackend,\n type KeyDidCreateOptions,\n getJwkFromKey,\n} from '@credo-ts/core'\nimport { type OpenId4VciCredentialBindingResolver, OpenId4VciCredentialFormatProfile } from '@credo-ts/openid4vc'\n\nexport function getCredentialBindingResolver({\n pidSchemes,\n requestBatch,\n}: {\n pidSchemes?: { sdJwtVcVcts: Array<string>; msoMdocDoctypes: Array<string> }\n requestBatch?: boolean | number\n}): OpenId4VciCredentialBindingResolver {\n return async ({\n supportedDidMethods,\n credentialConfiguration,\n issuerMaxBatchSize,\n proofTypes,\n supportsAllDidMethods,\n supportsJwk,\n credentialFormat,\n agentContext,\n }) => {\n // First, we try to pick a did method\n // Prefer did:jwk, otherwise use did:key, otherwise use undefined\n let didMethod: 'key' | 'jwk' | undefined =\n supportsAllDidMethods || supportedDidMethods?.includes('did:jwk')\n ? 'jwk'\n : supportedDidMethods?.includes('did:key')\n ? 'key'\n : undefined\n\n // If supportedDidMethods is undefined, and supportsJwk is false, we will default to did:key\n // this is important as part of MATTR launchpad support which MUST use did:key but doesn't\n // define which did methods they support\n if (!supportedDidMethods && !supportsJwk) {\n didMethod = 'key'\n }\n\n const shouldKeyBeHardwareBackedForMsoMdoc =\n credentialConfiguration?.format === OpenId4VciCredentialFormatProfile.MsoMdoc &&\n pidSchemes?.msoMdocDoctypes.includes(credentialConfiguration.doctype)\n\n const shouldKeyBeHardwareBackedForSdJwtVc =\n (credentialConfiguration?.format === 'vc+sd-jwt' || credentialConfiguration.format === 'dc+sd-jwt') &&\n pidSchemes?.sdJwtVcVcts.includes(credentialConfiguration.vct)\n\n const shouldKeyBeHardwareBacked = shouldKeyBeHardwareBackedForSdJwtVc || shouldKeyBeHardwareBackedForMsoMdoc\n\n // We don't want to request more than 10 credentials\n const batchSize =\n requestBatch === true\n ? Math.min(issuerMaxBatchSize, 10)\n : typeof requestBatch === 'number'\n ? Math.min(issuerMaxBatchSize, requestBatch)\n : 1\n\n // TODO: support key attestations\n if (!proofTypes.jwt || proofTypes.jwt.keyAttestationsRequired) {\n throw new Error('Unable to request credentials. Only jwt proof type without key attestations supported')\n }\n\n const keyType = proofTypes.jwt.supportedKeyTypes[0]\n const keys = await Promise.all(\n new Array(batchSize).fill(0).map(() =>\n agentContext.wallet.createKey({\n keyType,\n keyBackend: shouldKeyBeHardwareBacked ? KeyBackend.SecureElement : KeyBackend.Software,\n })\n )\n )\n\n if (didMethod) {\n const dm = didMethod\n const didsApi = agentContext.dependencyManager.resolve(DidsApi)\n const didResults = await Promise.all(\n keys.map(async (key) => {\n const didResult = await didsApi.create<JwkDidCreateOptions | KeyDidCreateOptions>({\n method: dm,\n options: {\n key,\n },\n })\n\n if (didResult.didState.state !== 'finished') {\n throw new Error('DID creation failed.')\n }\n\n let verificationMethodId: string\n if (didMethod === 'jwk') {\n const didJwk = DidJwk.fromDid(didResult.didState.did)\n verificationMethodId = didJwk.verificationMethodId\n } else {\n const didKey = DidKey.fromDid(didResult.didState.did)\n verificationMethodId = `${didKey.did}#${didKey.key.fingerprint}`\n }\n\n return verificationMethodId\n })\n )\n\n return {\n method: 'did',\n didUrls: didResults,\n }\n }\n\n // Otherwise we also support plain jwk for sd-jwt only\n if (\n supportsJwk &&\n (credentialFormat === OpenId4VciCredentialFormatProfile.SdJwtVc ||\n credentialFormat === OpenId4VciCredentialFormatProfile.SdJwtDc ||\n credentialFormat === OpenId4VciCredentialFormatProfile.MsoMdoc)\n ) {\n return {\n method: 'jwk',\n keys: keys.map((key) => getJwkFromKey(key)),\n }\n }\n\n throw new Error(\n `No supported binding method could be found. Supported methods are did:key and did:jwk, or plain jwk for sd-jwt/mdoc. Issuer supports ${\n supportsJwk ? 'jwk, ' : ''\n }${supportedDidMethods?.join(', ') ?? 'Unknown'}`\n )\n }\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport { getCredentialDisplayWithDefaults } from '@paradym/wallet-sdk/display/common'\nimport { getOpenId4VcCredentialDisplay } from '@paradym/wallet-sdk/display/openid4vc'\nimport { extractOpenId4VcCredentialMetadata } from '@paradym/wallet-sdk/metadata/credentials'\n\nexport const getCredentialDisplay = (resolvedCredentialOffer?: OpenId4VciResolvedCredentialOffer) => {\n // TODO: where to transform?\n // Combine oid4vci issuer metadata and openid fed into one pipeline. If openid it's trusted\n const issuerMetadata = resolvedCredentialOffer?.metadata.credentialIssuer\n // We want the first supported configuration id\n // TODO: handle empty configuration ids\n const configurationId = resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n const configuration = configurationId\n ? resolvedCredentialOffer?.offeredCredentialConfigurations[configurationId]\n : undefined\n\n const credentialDisplay = getCredentialDisplayWithDefaults(\n configuration && issuerMetadata\n ? getOpenId4VcCredentialDisplay(\n extractOpenId4VcCredentialMetadata(configuration, {\n display: issuerMetadata?.display,\n id: issuerMetadata?.credential_issuer,\n })\n )\n : {}\n )\n\n return credentialDisplay\n}\n","import { ClaimFormat, type DcqlQueryResult } from '@credo-ts/core'\nimport { getDisclosedAttributePathArrays } from '../display/common'\nimport { getCredentialForDisplay } from '../display/credential'\nimport { getAttributesAndMetadataForMdocPayload } from '../display/mdoc'\nimport { getAttributesAndMetadataForSdJwtPayload } from '../display/sdJwt'\nimport type {\n FormattedSubmission,\n FormattedSubmissionEntry,\n FormattedSubmissionEntrySatisfiedCredential,\n} from './submission'\n\nfunction extractCredentialPlaceholderFromQueryCredential(credential: DcqlQueryResult['credentials'][number]) {\n if (credential.format === 'mso_mdoc') {\n return {\n claimFormat: ClaimFormat.MsoMdoc,\n credentialName: credential.meta?.doctype_value ?? 'Unknown',\n requestedAttributePaths: credential.claims?.map((c) => ('path' in c ? [c.path[1]] : [c.claim_name])),\n }\n }\n\n if (credential.format === 'vc+sd-jwt' || credential.format === 'dc+sd-jwt') {\n return {\n claimFormat: ClaimFormat.SdJwtVc,\n credentialName: credential.meta?.vct_values?.[0].replace('https://', ''),\n requestedAttributePaths: credential.claims?.map((c) => c.path),\n }\n }\n\n return {\n claimFormat: ClaimFormat.JwtVc,\n requestedAttributePaths: credential.claims?.map((c) => c.path),\n }\n}\n\nexport function formatDcqlCredentialsForRequest(dcqlQueryResult: DcqlQueryResult): FormattedSubmission {\n const credentialSets: NonNullable<DcqlQueryResult['credential_sets']> = dcqlQueryResult.credential_sets ?? [\n // If no credential sets are defined we create a default one with just all the credential options\n {\n required: true,\n options: [dcqlQueryResult.credentials.map((c) => c.id)],\n matching_options: dcqlQueryResult.canBeSatisfied ? [dcqlQueryResult.credentials.map((c) => c.id)] : undefined,\n },\n ]\n\n const entries: FormattedSubmissionEntry[] = []\n for (const credentialSet of credentialSets) {\n // Take first matching option, otherwise take first option\n for (const credentialId of credentialSet.matching_options?.[0] ?? credentialSet.options[0]) {\n const match = dcqlQueryResult.credential_matches[credentialId]\n const queryCredential = dcqlQueryResult.credentials.find((c) => c.id === credentialId)\n if (!queryCredential) {\n throw new Error(`Credential '${credentialId}' not found in dcql query`)\n }\n\n if (!match || !match.success) {\n const placeholderCredential = extractCredentialPlaceholderFromQueryCredential(queryCredential)\n entries.push({\n isSatisfied: false,\n inputDescriptorId: credentialId,\n name: placeholderCredential.credentialName,\n requestedAttributePaths: placeholderCredential.requestedAttributePaths ?? [],\n })\n continue\n }\n\n const credentialForDisplay = getCredentialForDisplay(match.record)\n\n let disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']\n if (match.output.credential_format === 'vc+sd-jwt' || match.output.credential_format === 'dc+sd-jwt') {\n if (match.record.type !== 'SdJwtVcRecord') throw new Error('Expected SdJwtRecord')\n\n if (queryCredential.format !== 'vc+sd-jwt' && queryCredential.format !== 'dc+sd-jwt') {\n throw new Error(`Expected queryr credential format ${queryCredential.format} to be vc+sd-jwt or dc+sd-jwt`)\n }\n\n // Creod already applied selective disclosure on payload\n const { attributes, metadata } = getAttributesAndMetadataForSdJwtPayload(match.output.claims)\n disclosed = {\n attributes,\n metadata,\n paths: getDisclosedAttributePathArrays(attributes, 2),\n }\n } else if (match.output.credential_format === 'mso_mdoc') {\n if (match.record.type !== 'MdocRecord') throw new Error('Expected MdocRecord')\n\n // TODO: check if fixed now\n // FIXME: the disclosed payload here doesn't have the correct encoding anymore\n // once we serialize input??\n disclosed = {\n ...getAttributesAndMetadataForMdocPayload(match.output.namespaces, match.record.credential),\n paths: getDisclosedAttributePathArrays(match.output.namespaces, 2),\n }\n } else {\n if (match.record.type !== 'W3cCredentialRecord') throw new Error('Expected W3cCredentialRecord')\n\n // All paths disclosed for W3C\n disclosed = {\n attributes: credentialForDisplay.attributes,\n metadata: credentialForDisplay.metadata,\n paths: getDisclosedAttributePathArrays(credentialForDisplay.attributes, 2),\n }\n }\n\n entries.push({\n inputDescriptorId: credentialId,\n credentials: [\n {\n credential: credentialForDisplay,\n disclosed,\n },\n ],\n isSatisfied: true,\n name: credentialForDisplay.display.name,\n })\n }\n }\n\n return {\n areAllSatisfied: entries.every((entry) => entry.isSatisfied),\n purpose: credentialSets.map((s) => s.purpose).find((purpose): purpose is string => typeof purpose === 'string'),\n entries,\n }\n}\n","import { JSONPath } from '@astronautlabs/jsonpath'\nimport { ClaimFormat, type DifPexCredentialsForRequest, type DifPresentationExchangeDefinitionV2 } from '@credo-ts/core'\nimport { getDisclosedAttributePathArrays } from '../display/common'\nimport { getCredentialForDisplay } from '../display/credential'\nimport { getAttributesAndMetadataForMdocPayload } from '../display/mdoc'\nimport { getAttributesAndMetadataForSdJwtPayload } from '../display/sdJwt'\nimport type { NonEmptyArray } from '../types'\nimport type {\n FormattedSubmission,\n FormattedSubmissionEntry,\n FormattedSubmissionEntrySatisfiedCredential,\n} from './submission'\n\nfunction simplifyJsonPath(path: string, format?: ClaimFormat, filterKeys: string[] = []) {\n try {\n const parsedPath: Array<{\n scope: string\n operation: string\n expression: { type: string; value: string; [key: string]: unknown }\n }> = JSONPath.parse(path)\n\n if (!Array.isArray(parsedPath)) {\n return null\n }\n\n const simplified: Array<string | null> = []\n\n if (format === ClaimFormat.MsoMdoc) {\n if (parsedPath.length === 3) {\n simplified.push(parsedPath[2].expression.value)\n }\n } else {\n for (const entry of parsedPath) {\n // Skip entries we want to remove\n const value = entry.expression.value\n if (['vc', 'vp', 'credentialSubject'].includes(value)) {\n continue\n }\n\n // Remove root\n if (entry.expression.type === 'root') {\n continue\n }\n\n if (\n entry.expression.type === 'wildcard' ||\n (entry.expression.type === 'numeric_literal' && !Number.isNaN(value))\n ) {\n // Replace wildcards and numeric indices with null\n simplified.push(null)\n }\n\n if (entry.expression.type === 'identifier' || entry.expression.type === 'string_literal') {\n // Return the identifier value for normal entries\n simplified.push(value)\n }\n }\n }\n\n if (filterKeys.some((key) => simplified.includes(key))) {\n return null\n }\n\n return simplified\n } catch (error) {\n return null\n }\n}\n\nexport function formatDifPexCredentialsForRequest(\n credentialsForRequest: DifPexCredentialsForRequest,\n definition: DifPresentationExchangeDefinitionV2\n): FormattedSubmission {\n const entries = credentialsForRequest.requirements.flatMap((requirement) => {\n // We take the first needsCount entries. Even if not satisfied we will just show these first entries as missing (otherwise it becomes too complex)\n // If selection is possible they can choose alternatives within that (otherwise it becomes too complex)\n const submissionEntries = requirement.submissionEntry.slice(0, requirement.needsCount)\n\n return submissionEntries.map((submission): FormattedSubmissionEntry => {\n if (submission.verifiableCredentials.length >= 1) {\n return {\n inputDescriptorId: submission.inputDescriptorId,\n name: submission.name,\n description: submission.purpose,\n isSatisfied: true,\n credentials: submission.verifiableCredentials.map(\n (verifiableCredential): FormattedSubmissionEntrySatisfiedCredential => {\n const credentialForDisplay = getCredentialForDisplay(verifiableCredential.credentialRecord)\n\n // By default the whole credential is disclosed\n let disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']\n if (verifiableCredential.claimFormat === ClaimFormat.SdJwtVc) {\n const { attributes, metadata } = getAttributesAndMetadataForSdJwtPayload(\n verifiableCredential.disclosedPayload\n )\n disclosed = {\n attributes,\n metadata,\n paths: getDisclosedAttributePathArrays(attributes, 2),\n }\n } else if (verifiableCredential.claimFormat === ClaimFormat.MsoMdoc) {\n disclosed = {\n ...getAttributesAndMetadataForMdocPayload(\n verifiableCredential.disclosedPayload,\n verifiableCredential.credentialRecord.credential\n ),\n paths: getDisclosedAttributePathArrays(verifiableCredential.disclosedPayload, 2),\n }\n } else {\n disclosed = {\n attributes: credentialForDisplay.attributes,\n metadata: credentialForDisplay.metadata,\n paths: getDisclosedAttributePathArrays(credentialForDisplay.attributes, 2),\n }\n }\n\n return {\n credential: credentialForDisplay,\n disclosed,\n }\n }\n ) as NonEmptyArray<FormattedSubmissionEntrySatisfiedCredential>,\n }\n }\n\n // Try to determine requested attributes for credential\n const inputDescriptor = definition.input_descriptors.find(({ id }) => id === submission.inputDescriptorId)\n const requestedAttributePaths =\n inputDescriptor?.constraints?.fields\n ?.map((a) =>\n simplifyJsonPath(a.path[0], inputDescriptor.format?.mso_mdoc ? ClaimFormat.MsoMdoc : undefined)?.filter(\n (entry): entry is string => entry !== null\n )\n )\n .filter((path): path is string[] => path !== undefined) ?? []\n\n const docType = inputDescriptor?.format?.mso_mdoc ? inputDescriptor.id : undefined\n const vctField = inputDescriptor?.format?.['vc+sd-jwt']\n ? inputDescriptor.constraints.fields?.find((field) => field.path.includes('$.vct'))\n : undefined\n const vct = (vctField?.filter?.const ?? vctField?.filter?.enum?.[0]) as string | undefined\n\n return {\n inputDescriptorId: submission.inputDescriptorId,\n name: requirement.name ?? docType ?? vct?.replace('https://', ''),\n description: requirement.purpose,\n isSatisfied: false,\n requestedAttributePaths: requestedAttributePaths,\n }\n })\n })\n\n return {\n areAllSatisfied: entries.every((entry) => entry.isSatisfied),\n name: credentialsForRequest.name,\n purpose: credentialsForRequest.purpose,\n entries,\n }\n}\n","import type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\n\nexport type GetTrustedEntitiesForDidOptions = {\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n}\n\nexport const getTrustedEntitiesForDid = async (options: GetTrustedEntitiesForDidOptions) => {\n const clientMetadata = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata\n const entityId = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_id\n const organizationName = clientMetadata?.client_name\n const logoUri = clientMetadata?.logo_uri\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n entityId,\n },\n trustedEntities: [],\n }\n}\n","import { X509Certificate, X509ModuleConfig } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '../../ParadymWalletSdk'\nimport type { TrustedEntity, X509TrustMechanismConfiguration } from '../trustMechanism'\n\nexport type TrustedX509Entity = {\n certificate: string\n name: string\n logoUri: string\n url: string\n demo?: boolean\n entityId: string\n}\n\nexport type GetTrustedEntitiesForX509CertificateOptions = {\n paradym: ParadymWalletSdk\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n trustMechanismConfiguration: X509TrustMechanismConfiguration\n walletTrustedEntity?: TrustedEntity\n}\n\nexport const getTrustedEntitiesForX509Certificate = async ({\n resolvedAuthorizationRequest,\n paradym,\n walletTrustedEntity,\n trustMechanismConfiguration,\n}: GetTrustedEntitiesForX509CertificateOptions) => {\n const trustedEntities: TrustedEntity[] = []\n let organizationName: string | undefined\n let logoUri: string | undefined\n const uri =\n typeof resolvedAuthorizationRequest.authorizationRequestPayload.response_uri === 'string'\n ? new URL(resolvedAuthorizationRequest.authorizationRequestPayload.response_uri).origin\n : undefined\n let entityId = resolvedAuthorizationRequest.authorizationRequestPayload.client_id\n\n const x509Config = paradym.agent.dependencyManager.resolve(X509ModuleConfig)\n const signer = resolvedAuthorizationRequest.signedAuthorizationRequest?.signer\n\n try {\n if (signer && signer.method === 'x5c') {\n // FIXME: we should return the x509 cert that was matched, then we can just see if it's in\n // the list of hardcoded trusted certificates\n const chain = await paradym.agent.x509\n .validateCertificateChain({\n certificateChain: signer.x5c,\n certificate: signer.x5c[0],\n trustedCertificates: x509Config.trustedCertificates,\n })\n .catch(() => null)\n\n const trustedEntity = chain\n ? trustMechanismConfiguration.trustedX509Entities.find((e) =>\n X509Certificate.fromEncodedCertificate(e.certificate).equal(chain[0])\n )\n : null\n if (trustedEntity) {\n organizationName = trustedEntity.name\n logoUri = trustedEntity.logoUri\n entityId = trustedEntity.entityId\n\n trustedEntities.push({\n entityId: trustedEntity.entityId,\n organizationName: trustedEntity.name,\n logoUri: trustedEntity.logoUri,\n uri: trustedEntity.url,\n demo: trustedEntity.demo,\n })\n\n if (walletTrustedEntity) trustedEntities.push(walletTrustedEntity)\n } else {\n organizationName = resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata?.client_name\n logoUri = resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata?.logo_uri\n }\n }\n } catch (error) {\n // no-op\n }\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n uri,\n entityId,\n },\n trustedEntities,\n }\n}\n","import { X509Certificate } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport type {\n AuthorizationRequestVerificationResult,\n EudiRpAuthenticationTrustMechanismConfiguration,\n TrustedEntity,\n} from '../trustMechanism'\nimport { type GetTrustedEntitiesForX509CertificateOptions, getTrustedEntitiesForX509Certificate } from './x509'\n\nexport type TrustList = TrustedEntity & {\n trustList: Array<TrustedEntity & { trustedRelyingPartyRegistrars: Array<TrustedEntity> }>\n}\n\nexport type GetTrustedEntitiesForEudiRpAuthenticationOptions = {\n paradym: ParadymWalletSdk\n authorizationRequestVerificationResult?: AuthorizationRequestVerificationResult\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n trustMechanismConfiguration: EudiRpAuthenticationTrustMechanismConfiguration\n}\n\nexport const getTrustedEntitiesForEudiRpAuthentication = async (\n options: GetTrustedEntitiesForEudiRpAuthenticationOptions\n) => {\n const trustedEntities: TrustedEntity[] = []\n let organizationName: string | undefined\n let logoUri: string | undefined\n let uri: string | undefined\n let entityId: string | undefined\n\n // We can take the first entry as it only allows 1 entry for now\n // This is the certificate of the relying party\n const [entry] = options.authorizationRequestVerificationResult ?? []\n\n const matchedCert = options.trustMechanismConfiguration.trustedX509Entities.find(\n (t) => X509Certificate.fromEncodedCertificate(t.certificate).subject === entry.x509RegistrationCertificate.issuer\n )\n\n if (matchedCert) {\n const dnsName = entry.x509RegistrationCertificate.sanDnsNames[0]\n const uriName = entry.x509RegistrationCertificate.sanUriNames[0]\n\n organizationName = dnsName\n logoUri = matchedCert.logoUri\n uri = uriName\n entityId = dnsName\n\n // FIXME: why do we match the SAN dnsName of the registration certificate\n // to the entity-id of the trusted relying party? Shouldn't it be the IAN\n const country = options.trustMechanismConfiguration.trustList.trustList.find(({ trustedRelyingPartyRegistrars }) =>\n trustedRelyingPartyRegistrars.some((rpr) => rpr.entityId === dnsName)\n )\n\n if (country) {\n const registrar = country.trustedRelyingPartyRegistrars.find((rpr) => rpr.entityId === dnsName) as TrustedEntity\n trustedEntities.push(registrar)\n trustedEntities.push(country)\n trustedEntities.push(options.trustMechanismConfiguration.trustList)\n }\n }\n\n // Casting works here as eudi_rp_authentication trust mechanism configuration extends\n // x509 trust mechanism configuration\n const { trustedEntities: x509TrustedEntities, relyingParty } = await getTrustedEntitiesForX509Certificate(\n options as unknown as GetTrustedEntitiesForX509CertificateOptions\n )\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n uri,\n entityId: entityId ?? relyingParty.entityId,\n },\n trustedEntities: [...x509TrustedEntities, ...trustedEntities],\n }\n}\n","import type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport type { OpenIdFederationTrustMechanismConfiguration } from '../trustMechanism'\n\nexport type GetTrustedEntitiesForOpenIdFederationOptions = {\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n paradym: ParadymWalletSdk\n origin?: string\n trustMechanismConfiguration: OpenIdFederationTrustMechanismConfiguration\n}\n\nexport const getTrustedEntitiesForOpenIdFederation = async (options: GetTrustedEntitiesForOpenIdFederationOptions) => {\n const clientMetadata = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata\n const entityId = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_id\n const organizationName = clientMetadata?.client_name\n const logoUri = clientMetadata?.logo_uri\n\n const resolvedChains = entityId\n ? await options.paradym.agent.modules.openId4VcHolder.resolveOpenIdFederationChains({\n entityId,\n trustAnchorEntityIds: options.trustMechanismConfiguration.trustedEntityIds as [string, ...string[]],\n })\n : undefined\n\n const uri =\n typeof options.resolvedAuthorizationRequest.authorizationRequestPayload.response_uri === 'string'\n ? new URL(options.resolvedAuthorizationRequest.authorizationRequestPayload.response_uri).origin\n : undefined\n\n const trustedEntities =\n resolvedChains\n ?.map((chain) => ({\n entityId: chain.trustAnchorEntityConfiguration.sub,\n organizationName:\n chain.trustAnchorEntityConfiguration.metadata?.federation_entity?.organization_name ?? 'Unknown organization',\n logoUri: chain.trustAnchorEntityConfiguration.metadata?.federation_entity?.logo_uri,\n }))\n .filter((entity, index, self) => self.findIndex((e) => e.entityId === entity.entityId) === index) ?? []\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n entityId,\n uri,\n },\n trustedEntities,\n }\n}\n","import type { X509Certificate } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { type GetTrustedEntitiesForDidOptions, getTrustedEntitiesForDid } from './handlers/did'\nimport {\n type GetTrustedEntitiesForEudiRpAuthenticationOptions,\n type TrustList,\n getTrustedEntitiesForEudiRpAuthentication,\n} from './handlers/eudiRpAuthentication'\nimport {\n type GetTrustedEntitiesForOpenIdFederationOptions,\n getTrustedEntitiesForOpenIdFederation,\n} from './handlers/openIdFederation'\nimport {\n type GetTrustedEntitiesForX509CertificateOptions,\n type TrustedX509Entity,\n getTrustedEntitiesForX509Certificate,\n} from './handlers/x509'\n\nexport type TrustedEntity = {\n entityId: string\n organizationName: string\n logoUri?: string\n uri?: string\n demo?: boolean\n}\n\nexport type TrustMechanism = 'eudi_rp_authentication' | 'openid_federation' | 'x509' | 'did'\n\nexport type EudiRpAuthenticationTrustMechanismConfiguration = {\n trustMechanism: 'eudi_rp_authentication'\n trustList: TrustList\n trustedX509Entities: TrustedX509Entity[]\n}\n\nexport type OpenIdFederationTrustMechanismConfiguration = {\n trustMechanism: 'openid_federation'\n trustedEntityIds: string[]\n}\n\nexport type X509TrustMechanismConfiguration = {\n trustMechanism: 'x509'\n trustedX509Entities: TrustedX509Entity[]\n}\n\nexport type DidTrustMechanismConfiguration = {\n trustMechanism: 'did'\n}\n\nexport type TrustMechanismConfiguration =\n | EudiRpAuthenticationTrustMechanismConfiguration\n | OpenIdFederationTrustMechanismConfiguration\n | X509TrustMechanismConfiguration\n | DidTrustMechanismConfiguration\n\nexport type AuthorizationRequestVerificationResult = {\n isValidButUntrusted: boolean\n isValidAndTrusted: boolean\n x509RegistrationCertificate: X509Certificate\n}[]\n\nexport type GetTrustedEntitiesOptions = Omit<\n { paradym: ParadymWalletSdk } & GetTrustedEntitiesForEudiRpAuthenticationOptions &\n GetTrustedEntitiesForOpenIdFederationOptions &\n GetTrustedEntitiesForDidOptions &\n GetTrustedEntitiesForX509CertificateOptions,\n 'trustMechanismConfiguration'\n>\n\nexport const detectTrustMechanism = (options: {\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n authorizationRequestVerificationResult?: AuthorizationRequestVerificationResult\n}): TrustMechanism => {\n if (options.authorizationRequestVerificationResult && options.authorizationRequestVerificationResult.length > 0) {\n return 'eudi_rp_authentication'\n }\n\n if (options.resolvedAuthorizationRequest.verifier.clientIdScheme === 'https') {\n return 'openid_federation'\n }\n\n if (options.resolvedAuthorizationRequest.signedAuthorizationRequest?.signer.method === 'x5c') {\n return 'x509'\n }\n\n if (options.resolvedAuthorizationRequest.verifier.clientIdScheme === 'did') {\n return 'did'\n }\n\n throw new Error('Could not infer trust mechanism for authorization request')\n}\n\nexport const getTrustedEntities = async (\n options: GetTrustedEntitiesOptions\n): Promise<{\n trustMechanism: TrustMechanism\n relyingParty: { logoUri?: string; uri?: string; organizationName?: string; entityId: string }\n trustedEntities: Array<TrustedEntity>\n}> => {\n const trustMechanism = detectTrustMechanism(options)\n\n const trustMechanismConfiguration = options.paradym.trustMechanisms.find((tm) => tm.trustMechanism === trustMechanism)\n\n // TODO(sdk): what do we want to do when a trust mechanism is used, but not configured? Ignore or error?\n if (!trustMechanismConfiguration) {\n throw new Error(`Found '${trustMechanism}', but without any configuration`)\n }\n\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n let trustedEntities\n switch (trustMechanism) {\n case 'eudi_rp_authentication':\n trustedEntities = await getTrustedEntitiesForEudiRpAuthentication({\n ...options,\n trustMechanismConfiguration: trustMechanismConfiguration as EudiRpAuthenticationTrustMechanismConfiguration,\n })\n break\n case 'openid_federation':\n trustedEntities = await getTrustedEntitiesForOpenIdFederation({\n ...options,\n trustMechanismConfiguration: trustMechanismConfiguration as OpenIdFederationTrustMechanismConfiguration,\n })\n break\n case 'x509':\n trustedEntities = await getTrustedEntitiesForX509Certificate({\n ...options,\n trustMechanismConfiguration: trustMechanismConfiguration as X509TrustMechanismConfiguration,\n })\n break\n case 'did':\n trustedEntities = await getTrustedEntitiesForDid(options)\n break\n default:\n throw new Error(`Could not handle trust mechanism: '${trustMechanism}'`)\n }\n\n let entityId = trustedEntities.relyingParty.entityId\n if (!entityId) {\n if (options.origin) entityId = `web-origin:${options.origin}`\n throw new Error('Missing required client_id in authorization request')\n }\n\n return {\n ...trustedEntities,\n trustMechanism,\n relyingParty: {\n ...trustedEntities.relyingParty,\n entityId,\n },\n }\n}\n","import { verifyOpenid4VpAuthorizationRequest } from '@animo-id/eudi-wallet-functionality'\nimport { type DifPresentationExchangeDefinitionV2, Jwt } from '@credo-ts/core'\nimport { getOpenid4vpClientId } from '@openid4vc/openid4vp'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { ParadymWalletNoRequestToResolveError } from '../error'\nimport { formatDcqlCredentialsForRequest } from '../format/dcqlRequest'\nimport { formatDifPexCredentialsForRequest } from '../format/presentationExchangeRequest'\nimport type { FormattedSubmission } from '../format/submission'\nimport { getTrustedEntities } from '../trust/trustMechanism'\n\nexport type GetCredentialsForProofRequestOptions = {\n paradym: ParadymWalletSdk\n requestPayload?: Record<string, unknown>\n uri?: string\n allowUntrusted?: boolean\n origin?: string\n}\n\nconst extractEntityIdFromPayload = (payload: Record<string, unknown>, origin?: string): string | null => {\n const { clientId, clientIdScheme } = getOpenid4vpClientId({\n clientId: payload.client_id as string,\n legacyClientIdScheme: payload.client_id_scheme,\n responseMode: payload.response_mode,\n origin,\n })\n\n if (clientIdScheme === 'https') return clientId\n return null\n}\n\nconst extractEntityIdFromJwt = (jwt: string, origin?: string): string | null => {\n const jwtPayload = Jwt.fromSerializedJwt(jwt).payload\n\n return extractEntityIdFromPayload(jwtPayload.additionalClaims, origin)\n}\n\nexport const getCredentialsForProofRequest = async ({\n paradym,\n uri,\n allowUntrusted = true,\n requestPayload,\n origin,\n}: GetCredentialsForProofRequestOptions) => {\n const requestToResolve = uri ?? requestPayload\n\n if (!requestToResolve) {\n throw new ParadymWalletNoRequestToResolveError(\n 'Either supply a uri or requestPayload to get the credentials for a proof request'\n )\n }\n\n const resolved = await paradym.agent.modules.openId4VcHolder.resolveOpenId4VpAuthorizationRequest(requestToResolve, {\n origin,\n trustedFederationEntityIds: paradym.trustMechanisms.find((tm) => tm.trustMechanism === 'openid_federation')\n ?.trustedEntityIds,\n })\n\n // TODO(sdk): will this still work if no eudi is used?\n const authorizationRequestVerificationResult = await verifyOpenid4VpAuthorizationRequest(paradym.agent.context, {\n resolvedAuthorizationRequest: resolved,\n allowUntrustedSigned: allowUntrusted,\n })\n\n // TODO(sdk): wallet trusted entity, how to manage this?\n const { trustMechanism, trustedEntities, relyingParty } = await getTrustedEntities({\n paradym,\n resolvedAuthorizationRequest: resolved,\n origin,\n authorizationRequestVerificationResult,\n })\n\n let formattedSubmission: FormattedSubmission\n if (resolved.presentationExchange) {\n formattedSubmission = formatDifPexCredentialsForRequest(\n resolved.presentationExchange.credentialsForRequest,\n resolved.presentationExchange.definition as DifPresentationExchangeDefinitionV2\n )\n } else if (resolved.dcql) {\n formattedSubmission = formatDcqlCredentialsForRequest(resolved.dcql.queryResult)\n } else {\n throw new Error('No presentation exchange or dcql found in authorization request.')\n }\n\n return {\n ...resolved.presentationExchange,\n ...resolved.dcql,\n origin,\n authorizationRequest: resolved.authorizationRequestPayload,\n formattedSubmission,\n transactionData: resolved.transactionData,\n trustMechanism,\n verifier: {\n hostName: relyingParty.uri,\n entityId: relyingParty.entityId,\n logo: relyingParty.logoUri\n ? {\n url: relyingParty.logoUri,\n }\n : undefined,\n name: relyingParty.organizationName,\n trustedEntities,\n },\n } as const\n}\n\nexport type CredentialsForProofRequest = Awaited<ReturnType<typeof getCredentialsForProofRequest>>\n","import {\n ClaimFormat,\n MdocRecord,\n SdJwtVcRecord,\n type VerifiableCredential,\n W3cCredentialRecord,\n W3cJsonLdVerifiableCredential,\n W3cJwtVerifiableCredential,\n type W3cVerifiableCredential,\n} from '@credo-ts/core'\n\nexport function decodeW3cCredential(credential: Record<string, unknown> | string): W3cVerifiableCredential {\n return typeof credential === 'string'\n ? W3cJwtVerifiableCredential.fromSerializedJwt(credential)\n : W3cJsonLdVerifiableCredential.fromJson(credential)\n}\n\nexport function encodeCredential(credential: VerifiableCredential): Record<string, unknown> | string {\n return credential.encoded\n}\n\nexport function credentialRecordFromCredential(credential: VerifiableCredential) {\n if (credential.claimFormat === ClaimFormat.SdJwtVc) {\n return new SdJwtVcRecord({\n compactSdJwtVc: credential.compact,\n typeMetadata: credential.typeMetadata,\n })\n }\n\n if (credential.claimFormat === ClaimFormat.MsoMdoc) {\n return new MdocRecord({\n mdoc: credential,\n })\n }\n\n return new W3cCredentialRecord({\n credential,\n // We don't support expanded types right now, but would become problem when we support JSON-LD\n tags: {},\n })\n}\n","import { V1OfferCredentialMessage, V1RequestPresentationMessage } from '@credo-ts/anoncreds'\nimport { JwaSignatureAlgorithm } from '@credo-ts/core'\nimport {\n type ConnectionRecord,\n CredentialEventTypes,\n CredentialState,\n type CredentialStateChangedEvent,\n type OutOfBandInvitation,\n type OutOfBandRecord,\n OutOfBandRepository,\n type PlaintextMessage,\n ProofEventTypes,\n ProofState,\n type ProofStateChangedEvent,\n V2OfferCredentialMessage,\n V2RequestPresentationMessage,\n parseMessageType,\n} from '@credo-ts/didcomm'\nimport { supportsIncomingMessageType } from '@credo-ts/didcomm/build/util/messageType'\nimport {\n OpenId4VciAuthorizationFlow,\n type OpenId4VciCredentialConfigurationSupportedWithFormats,\n type OpenId4VciRequestTokenResponse,\n type OpenId4VciResolvedAuthorizationRequest,\n type OpenId4VciResolvedCredentialOffer,\n getOfferedCredentials,\n getScopesFromCredentialConfigurationsSupported,\n} from '@credo-ts/openid4vc'\nimport { type Observable, filter, first, firstValueFrom, timeout } from 'rxjs'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { DidCommAgent, OpenId4VcAgent } from '../agent'\nimport type { CredentialDisplay } from '../display/credential'\nimport {\n ParadymWalletInvitationAlreadyUsedError,\n ParadymWalletInvitationDidcommUnsupportedProtocolError,\n ParadymWalletInvitationError,\n ParadymWalletInvitationMultipleRequestsError,\n ParadymWalletInvitationParseError,\n ParadymWalletInvitationReceiveError,\n} from '../error'\nimport {\n extractOpenId4VcCredentialMetadata,\n setBatchCredentialMetadata,\n setOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { getCredentialBindingResolver } from '../openid4vc/credentialBindingResolver'\nimport { getCredentialDisplay } from '../openid4vc/func/getCredentialDisplay'\nimport {\n type CredentialsForProofRequest,\n getCredentialsForProofRequest,\n} from '../openid4vc/getCredentialsForProofRequest'\nimport { credentialRecordFromCredential, encodeCredential } from '../utils/encoding'\n\nexport type AcceptOutOfBandInvitationResult<FlowType extends 'issue' | 'verify' | 'connect'> = Promise<\n FlowType extends 'issue'\n ? { flowType: 'issue'; credentialExchangeId: string; connectionId?: string }\n : FlowType extends 'verify'\n ? { flowType: 'verify'; proofExchangeId: string; connectionId?: string }\n : FlowType extends 'connect'\n ? { flowType: 'connect'; connectionId: string }\n : never\n>\n\nexport type ResolveOutOfBandInvitationResult = {\n outOfBandInvitation: OutOfBandInvitation\n\n /**\n * Whether an existing connection already exists based on this invitation\n */\n existingConnection?: ConnectionRecord\n\n /**\n * Whether a connection will be created as part of the exchange.\n *\n * When `existingConnection` is defined this will always be `false` as\n * the existing connection will be reused.\n *\n * If `createConnection` is `false` and `existingConnection` is undefined\n * it means the exchange will be connectionless.\n */\n createConnection: boolean\n\n /**\n * The flow type as indicated by the invitation.\n *\n * - `issue` when the goal code indicates the goal of the invitation is to issue, or a credential offer is attached\n * - `verify` when the goal code indicates the goal of the invittion is to verify, or a presentation request is attached\n * - `connect` in all other cases\n */\n flowType: 'issue' | 'verify' | 'connect'\n}\n\nexport type ResolveCredentialOfferOptions = {\n paradym: ParadymWalletSdk\n offer: { uri: string }\n authorization?: { clientId: string; redirectUri: string }\n fetchAuthorization?: boolean\n}\n\n// TODO: export from openid4vc\nexport type TransactionCodeInfo = {\n description?: string\n length?: number\n input_mode?: 'numeric' | 'text'\n}\n\ntype OpenId4VciResolvedAuthRequestPresentationDuringIssuance = Extract<\n OpenId4VciResolvedAuthorizationRequest,\n { authorizationFlow: OpenId4VciAuthorizationFlow.PresentationDuringIssuance }\n>\n\ntype OpenId4VciResolvedAuthRequestOauth2Redirect = Extract<\n OpenId4VciResolvedAuthorizationRequest,\n { authorizationFlow: OpenId4VciAuthorizationFlow.Oauth2Redirect }\n>\n\ntype ResolveCredentialOfferPreAuthReturn = {\n flow: 'pre-auth'\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n credentialDisplay: CredentialDisplay\n}\n\ntype ResolveCredentialOfferPreAuthWithTxCodeReturn = {\n flow: 'pre-auth-with-tx-code'\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n credentialDisplay: CredentialDisplay\n txCodeInfo: {\n description?: string\n length?: number\n input_mode?: 'numeric' | 'text'\n }\n}\n\ntype ResolveCredentialOfferAuthReturn = {\n flow: 'auth'\n credentialDisplay: CredentialDisplay\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n resolvedAuthorizationRequest: OpenId4VciResolvedAuthRequestOauth2Redirect\n}\n\ntype ResolveCredentialOfferAuthPresentationDuringIssuanceReturn = {\n flow: 'auth-presentation-during-issuance'\n credentialDisplay: CredentialDisplay\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n resolvedAuthorizationRequest: OpenId4VciResolvedAuthRequestPresentationDuringIssuance\n credentialsForProofRequest: CredentialsForProofRequest\n}\n\nexport type ResolveCredentialOfferReturn =\n | ResolveCredentialOfferPreAuthReturn\n | ResolveCredentialOfferPreAuthWithTxCodeReturn\n | ResolveCredentialOfferAuthReturn\n | ResolveCredentialOfferAuthPresentationDuringIssuanceReturn\n\nexport async function resolveCredentialOffer({\n paradym,\n offer,\n authorization,\n fetchAuthorization = true,\n}: ResolveCredentialOfferOptions): Promise<ResolveCredentialOfferReturn> {\n paradym.logger.info(`Receiving openid uri ${offer.uri}`, {\n uri: offer.uri,\n })\n\n const resolvedCredentialOffer = await paradym.agent.modules.openId4VcHolder.resolveCredentialOffer(offer.uri)\n let resolvedAuthorizationRequest: OpenId4VciResolvedAuthorizationRequest | undefined = undefined\n\n const preAuthGrant =\n resolvedCredentialOffer.credentialOfferPayload.grants?.['urn:ietf:params:oauth:grant-type:pre-authorized_code']\n\n const txCodeInfo = preAuthGrant?.tx_code\n\n const credentialDisplay = getCredentialDisplay(resolvedCredentialOffer)\n\n if (preAuthGrant) {\n if (txCodeInfo) {\n return {\n flow: 'pre-auth-with-tx-code',\n credentialDisplay,\n resolvedCredentialOffer,\n txCodeInfo,\n }\n }\n return {\n flow: 'pre-auth',\n credentialDisplay,\n resolvedCredentialOffer,\n }\n }\n\n // NOTE: we always assume scopes are used at the moment\n if (fetchAuthorization && resolvedCredentialOffer.credentialOfferPayload.grants?.authorization_code) {\n // If only authorization_code grant is valid and user didn't provide authorization details we can't continue\n if (!authorization) {\n throw new Error(\n \"Missing 'authorization' parameter with 'clientId' and 'redirectUri' and authorization code flow is only allowed grant type on offer.\"\n )\n }\n\n // TODO: authorization should only be initiated after we know which credentials we're going to request\n resolvedAuthorizationRequest = await paradym.agent.modules.openId4VcHolder.resolveOpenId4VciAuthorizationRequest(\n resolvedCredentialOffer,\n {\n redirectUri: authorization.redirectUri,\n clientId: authorization.clientId,\n scope: getScopesFromCredentialConfigurationsSupported(resolvedCredentialOffer.offeredCredentialConfigurations),\n }\n )\n\n if (resolvedAuthorizationRequest.authorizationFlow === OpenId4VciAuthorizationFlow.PresentationDuringIssuance) {\n const credentialsForProofRequest = await getCredentialsForProofRequest({\n paradym,\n uri: resolvedAuthorizationRequest.openid4vpRequestUrl,\n })\n\n return {\n flow: 'auth-presentation-during-issuance',\n credentialDisplay,\n resolvedCredentialOffer,\n resolvedAuthorizationRequest,\n credentialsForProofRequest,\n }\n }\n\n return {\n flow: 'auth',\n credentialDisplay,\n resolvedCredentialOffer,\n resolvedAuthorizationRequest,\n }\n }\n\n throw new Error(\n `Unable to determine whether it is the auth of pre-auth flow with the following grants: [${Object.keys(resolvedCredentialOffer.credentialOfferPayload.grants ?? {}).join(', ')}]`\n )\n}\n\nexport async function acquirePreAuthorizedAccessToken({\n agent,\n resolvedCredentialOffer,\n txCode,\n}: {\n agent: OpenId4VcAgent\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n txCode?: string\n}) {\n return await agent.modules.openId4VcHolder.requestToken({\n resolvedCredentialOffer,\n txCode,\n })\n}\n\n/**\n *\n * @todo how do we want to deal with the `pid` credential here?\n *\n */\nexport const receiveCredentialFromOpenId4VciOffer = async ({\n agent,\n resolvedCredentialOffer,\n credentialConfigurationIdsToRequest,\n accessToken,\n clientId,\n pidSchemes,\n requestBatch,\n}: {\n agent: OpenId4VcAgent\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n credentialConfigurationIdsToRequest?: string[]\n clientId?: string\n pidSchemes?: { sdJwtVcVcts: Array<string>; msoMdocDoctypes: Array<string> }\n requestBatch?: boolean | number\n\n // TODO: cNonce should maybe be provided separately (multiple calls can have different c_nonce values)\n accessToken: OpenId4VciRequestTokenResponse\n}) => {\n const offeredCredentialsToRequest = getOfferedCredentials(\n credentialConfigurationIdsToRequest ?? [\n resolvedCredentialOffer.credentialOfferPayload.credential_configuration_ids[0],\n ],\n resolvedCredentialOffer.offeredCredentialConfigurations\n ) as OpenId4VciCredentialConfigurationSupportedWithFormats\n\n if (Object.keys(offeredCredentialsToRequest).length === 0) {\n throw new Error(\n `Parameter 'credentialConfigurationIdsToRequest' with values ${credentialConfigurationIdsToRequest} is not a credential_configuration_id in the credential offer.`\n )\n }\n\n const credentials = await agent.modules.openId4VcHolder.requestCredentials({\n resolvedCredentialOffer,\n ...accessToken,\n clientId,\n credentialConfigurationIds: Object.keys(offeredCredentialsToRequest),\n verifyCredentialStatus: false,\n allowedProofOfPossessionSignatureAlgorithms: [JwaSignatureAlgorithm.ES256, JwaSignatureAlgorithm.EdDSA],\n credentialBindingResolver: getCredentialBindingResolver({\n pidSchemes,\n requestBatch,\n }),\n })\n\n return credentials.credentials.map(({ credentials, ...credentialResponse }) => {\n const configuration = resolvedCredentialOffer.offeredCredentialConfigurations[\n credentialResponse.credentialConfigurationId\n ] as OpenId4VciCredentialConfigurationSupportedWithFormats\n\n const firstCredential = credentials[0]\n\n const record = credentialRecordFromCredential(firstCredential)\n\n // OpenID4VC metadata\n const openId4VcMetadata = extractOpenId4VcCredentialMetadata(configuration, {\n id: resolvedCredentialOffer.metadata.credentialIssuer.credential_issuer,\n display: resolvedCredentialOffer.metadata.credentialIssuer.display,\n })\n setOpenId4VcCredentialMetadata(record, openId4VcMetadata)\n\n // Batch metadata\n if (credentials.length > 1) {\n setBatchCredentialMetadata(record, {\n additionalCredentials: credentials.slice(1).map(encodeCredential) as\n | Array<string>\n | Array<Record<string, unknown>>,\n })\n }\n\n return {\n ...credentialResponse,\n configuration,\n credential: record,\n }\n })\n}\n\nexport async function resolveOutOfBandInvitation(\n agent: DidCommAgent,\n invitation: OutOfBandInvitation\n): Promise<ResolveOutOfBandInvitationResult> {\n const requestMessages = invitation.getRequests() ?? []\n\n let flowType: 'issue' | 'verify' | 'connect'\n\n if (requestMessages.length > 1) {\n const message = 'Message contains multiple requests. Invitation should only contain a single request.'\n agent.config.logger.error(message)\n throw new ParadymWalletInvitationMultipleRequestsError(message)\n }\n\n // In this case we probably need to create a connection first. We will do this here, as we don't allow to just\n // create a connection\n if (requestMessages.length === 0) {\n if (!invitation.handshakeProtocols || invitation.handshakeProtocols.length === 0) {\n const message = 'No requests and no handshake protocols found in invitation.'\n agent.config.logger.error(message)\n throw new ParadymWalletInvitationParseError(message)\n }\n\n if (invitation.goalCode === 'issue-vc' || invitation.goalCode === 'aries.vc.issue') {\n flowType = 'issue'\n } else if (invitation.goalCode === 'request-proof' || invitation.goalCode === 'aries.vc.verify') {\n flowType = 'verify'\n } else {\n flowType = 'connect'\n }\n }\n // Validate the type of the request message\n else {\n const requestMessage = requestMessages[0] as PlaintextMessage\n const parsedMessageType = parseMessageType(requestMessage['@type'])\n const isValidOfferMessage =\n supportsIncomingMessageType(parsedMessageType, V1OfferCredentialMessage.type) ||\n supportsIncomingMessageType(parsedMessageType, V2OfferCredentialMessage.type)\n\n const isValidRequestMessage =\n supportsIncomingMessageType(parsedMessageType, V1RequestPresentationMessage.type) ||\n supportsIncomingMessageType(parsedMessageType, V2RequestPresentationMessage.type)\n\n if (isValidRequestMessage) {\n flowType = 'verify'\n } else if (isValidOfferMessage) {\n flowType = 'issue'\n } else {\n throw new ParadymWalletInvitationDidcommUnsupportedProtocolError()\n }\n }\n\n try {\n // Check if invitation already exists\n const receivedInvite = await agent.modules.outOfBand.findByReceivedInvitationId(invitation.id)\n if (receivedInvite) {\n throw new ParadymWalletInvitationAlreadyUsedError()\n }\n\n const existingConnection = (await findExistingDidcommConnectionForInvitation(agent, invitation)) ?? undefined\n\n return {\n outOfBandInvitation: invitation,\n createConnection: existingConnection ? false : !!invitation.handshakeProtocols?.length,\n existingConnection,\n flowType,\n }\n } catch (error) {\n agent.config.logger.error(`Error while receiving invitation: ${error as string}`)\n throw new ParadymWalletInvitationError(error as string)\n }\n}\n\nasync function findExistingDidcommConnectionForInvitation(\n agent: DidCommAgent,\n outOfBandInvitation: OutOfBandInvitation\n): Promise<ConnectionRecord | null> {\n for (const invitationDid of outOfBandInvitation.invitationDids) {\n const [connection] = await agent.modules.connections.findByInvitationDid(invitationDid)\n if (connection) return connection\n }\n\n return null\n}\n\n/**\n * NOTE: this method assumes `resolveOutOfBandInvitation` was called previously and thus no additional checks are performed.\n */\nexport async function acceptOutOfBandInvitation<FlowType extends 'issue' | 'verify' | 'connect'>(\n agent: DidCommAgent,\n invitation: OutOfBandInvitation,\n flowType: FlowType\n): AcceptOutOfBandInvitationResult<FlowType> {\n // The value is reassigned, but eslint doesn't know this.\n let connectionId: string | undefined\n\n let observable: Observable<CredentialStateChangedEvent | ProofStateChangedEvent> | undefined = undefined\n\n if (flowType === 'issue') {\n observable = agent.events.observable<CredentialStateChangedEvent>(CredentialEventTypes.CredentialStateChanged).pipe(\n filter((event) => event.payload.credentialRecord.state === CredentialState.OfferReceived),\n filter((event) => event.payload.credentialRecord.connectionId === connectionId)\n )\n } else if (flowType === 'verify') {\n observable = agent.events.observable<ProofStateChangedEvent>(ProofEventTypes.ProofStateChanged).pipe(\n filter((event) => event.payload.proofRecord.state === ProofState.RequestReceived),\n filter((event) => event.payload.proofRecord.connectionId === connectionId)\n )\n }\n\n const eventPromise = observable\n ? firstValueFrom(\n observable.pipe(\n first(),\n // We allow 15 seconds to receive a credential offer or proof request\n timeout(15 * 1000)\n )\n )\n : undefined\n\n let connectionRecord: ConnectionRecord | undefined\n let outOfBandRecord: OutOfBandRecord\n\n try {\n const receiveInvitationResult = await agent.modules.outOfBand.receiveInvitation(invitation, {\n reuseConnection: true,\n })\n connectionRecord = receiveInvitationResult.connectionRecord\n outOfBandRecord = receiveInvitationResult.outOfBandRecord\n\n // Assign connectionId so it can be used in the observables.\n connectionId = connectionRecord?.id\n } catch (error) {\n agent.config.logger.error(`Error while receiving invitation: ${error as string}`)\n throw new ParadymWalletInvitationReceiveError((error as Error).message)\n }\n\n try {\n const event = await eventPromise\n agent.config.logger.debug(`Received event ${event?.type}`)\n\n if (!event) {\n return {\n connectionId: connectionId as string,\n flowType: 'connect',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n } as any\n }\n\n if (event.type === CredentialEventTypes.CredentialStateChanged) {\n return {\n credentialExchangeId: event.payload.credentialRecord.id,\n connectionId,\n flowType: 'issue',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n } as any\n }\n if (event.type === ProofEventTypes.ProofStateChanged) {\n return {\n proofExchangeId: event.payload.proofRecord.id,\n connectionId,\n flowType: 'verify',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n } as any\n }\n } catch (error) {\n agent.config.logger.error('Error while accepting out of band invitation.')\n\n // Delete OOB record\n const outOfBandRepository = agent.dependencyManager.resolve(OutOfBandRepository)\n await outOfBandRepository.deleteById(agent.context, outOfBandRecord.id)\n\n // Delete connection record\n // TODO: delete did and mediation stuff\n if (connectionRecord) {\n await agent.modules.connections.deleteById(connectionRecord.id)\n }\n\n throw new ParadymWalletInvitationError((error as Error).message)\n }\n\n throw new ParadymWalletInvitationError()\n}\n","import type { ConnectionType, DidExchangeState } from '@credo-ts/didcomm'\nimport { ConnectionRecord } from '@credo-ts/didcomm'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport type { RecordsState } from '../utils/records'\nimport {\n addRecord,\n recordsAddedByType,\n recordsRemovedByType,\n recordsUpdatedByType,\n removeRecord,\n updateRecord,\n} from '../utils/records'\n\nexport type UseConnectionsOptions = {\n excludedTypes?: Array<ConnectionType | string>\n connectionState?: DidExchangeState\n}\n\nconst ConnectionContext = createContext<RecordsState<ConnectionRecord> | undefined>(undefined)\n\n/**\n * This method retrieves the connection context for the current agent.\n * From this you can access all connection records for the agent.\n * @param options options for useConnections hook, lets us filter out specific types and limit states\n * @returns a connection context containing information about the agents connections\n */\nexport const useConnections = (options: UseConnectionsOptions = {}) => {\n const connectionContext = useContext(ConnectionContext)\n\n let connections = connectionContext?.records\n connections = useMemo(() => {\n if (!connections) {\n throw new Error('useConnections must be used within a ConnectionContextProvider')\n }\n // do not filter if not filter options are provided to save on a loop\n if (!options.connectionState && !options.excludedTypes) return connections\n\n return connections.filter((record: ConnectionRecord) => {\n // By default we include this connection\n // Filter by state (if connectionState is defined)\n if (options.connectionState && options.connectionState !== record.state) return false\n\n // Exclude records with certain connection types (if defined)\n const recordTypes = record.connectionTypes as Array<ConnectionType | string> | null\n if (options.excludedTypes && recordTypes && recordTypes.length !== 0) {\n return recordTypes.some((connectionType) => !options.excludedTypes?.includes(connectionType))\n }\n return true\n })\n }, [connections, options.connectionState, options.excludedTypes])\n\n return { ...connectionContext, records: connections }\n}\n\nexport const useConnectionById = (id: string): ConnectionRecord | undefined => {\n const { records: connections } = useConnections()\n return connections.find((c: ConnectionRecord) => c.id === id)\n}\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const ConnectionProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<RecordsState<ConnectionRecord>>({\n records: [],\n loading: true,\n })\n\n useEffect(() => {\n agent.modules.connections.getAll().then((records) => setState({ records, loading: false }))\n }, [agent])\n\n useEffect(() => {\n if (state.loading) return\n\n const connectionAdded$ = recordsAddedByType(agent, ConnectionRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const connectionUpdated$ = recordsUpdatedByType(agent, ConnectionRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const connectionRemoved$ = recordsRemovedByType(agent, ConnectionRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n connectionAdded$.unsubscribe()\n connectionUpdated$.unsubscribe()\n connectionRemoved$.unsubscribe()\n }\n }, [state, agent])\n\n return <ConnectionContext.Provider value={state}>{children}</ConnectionContext.Provider>\n}\n","import type { CredentialState } from '@credo-ts/didcomm'\nimport { CredentialExchangeRecord } from '@credo-ts/didcomm'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport type { RecordsState } from '../utils/records'\nimport {\n addRecord,\n recordsAddedByType,\n recordsRemovedByType,\n recordsUpdatedByType,\n removeRecord,\n updateRecord,\n} from '../utils/records'\n\nconst CredentialContext = createContext<RecordsState<CredentialExchangeRecord> | undefined>(undefined)\n\nexport const useCredentials = () => {\n const credentialContext = useContext(CredentialContext)\n if (!credentialContext) {\n throw new Error('useCredentials must be used within a CredentialContextProvider')\n }\n return credentialContext\n}\n\nexport const useCredentialsByConnectionId = (connectionId: string): CredentialExchangeRecord[] => {\n const { records: credentials } = useCredentials()\n return useMemo(\n () => credentials.filter((credential: CredentialExchangeRecord) => credential.connectionId === connectionId),\n [credentials, connectionId]\n )\n}\n\nexport const useCredentialById = (id: string): CredentialExchangeRecord | undefined => {\n const { records: credentials } = useCredentials()\n return credentials.find((c: CredentialExchangeRecord) => c.id === id)\n}\n\nexport const useCredentialByState = (state: CredentialState | CredentialState[]): CredentialExchangeRecord[] => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: credentials } = useCredentials()\n\n const filteredCredentials = useMemo(\n () => credentials.filter((r: CredentialExchangeRecord) => states.includes(r.state)),\n [credentials, states]\n )\n return filteredCredentials\n}\n\nexport const useCredentialNotInState = (state: CredentialState | CredentialState[]) => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: credentials } = useCredentials()\n\n const filteredCredentials = useMemo(\n () => credentials.filter((r: CredentialExchangeRecord) => !states.includes(r.state)),\n [credentials, states]\n )\n\n return filteredCredentials\n}\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const CredentialExchangeProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<RecordsState<CredentialExchangeRecord>>({\n records: [],\n loading: true,\n })\n\n useEffect(() => {\n agent.modules.credentials.getAll().then((records) => setState({ records, loading: false }))\n }, [agent])\n\n useEffect(() => {\n if (state.loading) return\n\n const credentialAdded$ = recordsAddedByType(agent, CredentialExchangeRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdated$ = recordsUpdatedByType(agent, CredentialExchangeRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemoved$ = recordsRemovedByType(agent, CredentialExchangeRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$?.unsubscribe()\n credentialUpdated$?.unsubscribe()\n credentialRemoved$?.unsubscribe()\n }\n }, [state, agent])\n\n return <CredentialContext.Provider value={state}>{children}</CredentialContext.Provider>\n}\n","import type { ProofState } from '@credo-ts/didcomm'\nimport { ProofExchangeRecord } from '@credo-ts/didcomm'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport type { RecordsState } from '../utils/records'\nimport {\n addRecord,\n recordsAddedByType,\n recordsRemovedByType,\n recordsUpdatedByType,\n removeRecord,\n updateRecord,\n} from '../utils/records'\n\nconst ProofContext = createContext<RecordsState<ProofExchangeRecord> | undefined>(undefined)\n\nexport const useProofs = () => {\n const proofContext = useContext(ProofContext)\n if (!proofContext) {\n throw new Error('useProofs must be used within a ProofContextProvider')\n }\n return proofContext\n}\n\nexport const useProofsByConnectionId = (connectionId: string): ProofExchangeRecord[] => {\n const { records: proofs } = useProofs()\n return useMemo(\n () => proofs.filter((proof: ProofExchangeRecord) => proof.connectionId === connectionId),\n [proofs, connectionId]\n )\n}\n\nexport const useProofById = (id: string): ProofExchangeRecord | undefined => {\n const { records: proofs } = useProofs()\n return proofs.find((c: ProofExchangeRecord) => c.id === id)\n}\n\nexport const useProofByState = (state: ProofState | ProofState[]): ProofExchangeRecord[] => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: proofs } = useProofs()\n\n const filteredProofs = useMemo(\n () => proofs.filter((r: ProofExchangeRecord) => states.includes(r.state)),\n [proofs, states]\n )\n return filteredProofs\n}\n\nexport const useProofNotInState = (state: ProofState | ProofState[]) => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: proofs } = useProofs()\n\n const filteredProofs = useMemo(\n () => proofs.filter((r: ProofExchangeRecord) => !states.includes(r.state)),\n [proofs, states]\n )\n\n return filteredProofs\n}\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const ProofExchangeProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<RecordsState<ProofExchangeRecord>>({\n records: [],\n loading: true,\n })\n\n useEffect(() => {\n agent.modules.proofs.getAll().then((records) => setState({ records, loading: false }))\n }, [agent])\n\n useEffect(() => {\n if (state.loading) return\n\n const proofAdded$ = recordsAddedByType(agent, ProofExchangeRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const proofUpdated$ = recordsUpdatedByType(agent, ProofExchangeRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const proofRemoved$ = recordsRemovedByType(agent, ProofExchangeRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n proofAdded$?.unsubscribe()\n proofUpdated$?.unsubscribe()\n proofRemoved$?.unsubscribe()\n }\n }, [state, agent])\n\n return <ProofContext.Provider value={state}>{children}</ProofContext.Provider>\n}\n","import { CredentialState, ProofState } from '@credo-ts/didcomm'\nimport { useEffect } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport {\n getDidCommCredentialExchangeDisplayMetadata,\n getDidCommProofExchangeDisplayMetadata,\n setDidCommCredentialExchangeMetadata,\n setDidCommProofExchangeMetadata,\n} from '../metadata/credentials'\nimport { useConnections } from '../providers/ConnectionProvider'\nimport { useCredentialByState } from '../providers/CredentialExchangeProvider'\nimport { useProofByState } from '../providers/ProofExchangeProvider'\n\n/**\n * This hooks listens to all the credential and proof exchange records in the inbox and\n * will fetch the needed metadata for the records and add it to the metadata.\n *\n * This can be used on the main app, so it's is automatically triggered whenever an item\n * is added to the inbox.\n */\nexport const usePreFetchInboxDisplayMetadata = ({ agent }: { agent: DidCommAgent }) => {\n const credentialExchangeRecords = useCredentialByState([CredentialState.OfferReceived])\n const proofExchangeRecords = useProofByState([ProofState.RequestReceived])\n const { records: connections } = useConnections()\n // Fetch associated metadata for each record\n useEffect(() => {\n credentialExchangeRecords.map(async (record) => {\n const metadata = getDidCommCredentialExchangeDisplayMetadata(record)\n if (metadata) return\n\n const connection = record.connectionId\n ? connections.find((connection) => record.connectionId === connection.id)\n : undefined\n\n // Extract label from out-of-band invitation if no connection associated\n const outOfBandRecord =\n !connection && record.parentThreadId\n ? await agent.modules.outOfBand.findByReceivedInvitationId(record.parentThreadId)\n : undefined\n\n const formatData = await agent.modules.credentials.getFormatData(record.id)\n const offer = formatData.offer?.anoncreds ?? formatData.offer?.indy\n // We just return here, so the rest can still continue\n if (!offer) return\n\n const schemaId = offer.schema_id\n\n const issuerName = connection?.theirLabel ?? outOfBandRecord?.outOfBandInvitation.label\n const schemaResult = await agent.modules.anoncreds.getSchema(schemaId)\n const schemaName = schemaResult.schema?.name\n\n // Update the metadata on the record for future use\n if (issuerName || schemaName) {\n setDidCommCredentialExchangeMetadata(record, {\n issuerName,\n issuerLogoUri: connection?.imageUrl ?? outOfBandRecord?.outOfBandInvitation.imageUrl,\n credentialName: schemaName,\n })\n await agent.modules.credentials.update(record)\n }\n })\n }, [credentialExchangeRecords, agent, connections])\n\n // Fetch associated metadata for each record\n useEffect(() => {\n proofExchangeRecords.map(async (record) => {\n const metadata = getDidCommProofExchangeDisplayMetadata(record)\n if (metadata) return\n\n const connection = record.connectionId\n ? connections.find((connection) => record.connectionId === connection.id)\n : undefined\n\n // Extract label from out-of-band invitation if no connection associated\n const outOfBandRecord =\n !connection && record.parentThreadId\n ? await agent.modules.outOfBand.findByReceivedInvitationId(record.parentThreadId)\n : undefined\n\n const formatData = await agent.modules.proofs.getFormatData(record.id)\n const request = formatData.request?.anoncreds ?? formatData.request?.indy\n\n // We just return here, so the rest can still continue\n if (!request) return\n\n const verifierName = connection?.theirLabel ?? outOfBandRecord?.outOfBandInvitation.label\n const proofName = request.name\n\n // Update the metadata on the record for future use\n if (verifierName || proofName) {\n setDidCommProofExchangeMetadata(record, {\n proofName,\n verifierLogoUri: connection?.imageUrl ?? outOfBandRecord?.outOfBandInvitation.imageUrl,\n verifierName,\n })\n await agent.modules.proofs.update(record)\n }\n })\n }, [proofExchangeRecords, agent, connections])\n}\n","import type { PropsWithChildren } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport { usePreFetchInboxDisplayMetadata } from '../hooks/usePreFetchInboxDisplayMetadata'\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const ExchangeRecordDisplayMetadataProvider = ({ agent, children }: PropsWithChildren<Props>) => {\n usePreFetchInboxDisplayMetadata({ agent })\n\n return <>{children}</>\n}\n","import type { Agent } from '@credo-ts/core'\nimport { type PropsWithChildren, createContext, useContext, useMemo } from 'react'\nimport type { setupAgent } from '../agent'\nimport { ConnectionProvider } from './ConnectionProvider'\nimport { CredentialExchangeProvider } from './CredentialExchangeProvider'\nimport { ExchangeRecordDisplayMetadataProvider } from './ExchangeRecordDisplayMetadataProvider'\nimport { MdocRecordProvider } from './MdocProvider'\nimport { ProofExchangeProvider } from './ProofExchangeProvider'\nimport { SdJwtVcRecordProvider } from './SdJwtVcProvider'\nimport { W3cCredentialRecordProvider } from './W3cCredentialsProvider'\nimport { WalletJsonStoreProvider } from './WalletJsonStoreProvider'\n\nconst AgentContext = createContext<Agent | undefined>(undefined)\n\nexport type AgentProviderProps = {\n agent: Agent\n\n // TODO: can we remove this? Why not just ignore specific record ids and use em all?\n recordIds: Array<string>\n}\n\n/**\n *\n *\n * Hook to retrieve the agent.\n *\n */\nexport const useAgent = <ProvidedAgent extends Agent = Awaited<ReturnType<typeof setupAgent>>>() => {\n const agentContext = useContext(AgentContext)\n\n if (!agentContext) {\n throw new Error('useAgent must be used within a AgentContextProvider')\n }\n\n return {\n agent: agentContext as ProvidedAgent,\n }\n}\n\nexport const AgentProvider = ({ agent, recordIds, children }: PropsWithChildren<AgentProviderProps>) => {\n const DynamicProviders = useMemo(() => {\n return [\n agent.modules.proofs || agent.modules.credentials\n ? ({ children }: PropsWithChildren<{ agent: Agent }>) => (\n <ExchangeRecordDisplayMetadataProvider agent={agent}>{children}</ExchangeRecordDisplayMetadataProvider>\n )\n : undefined,\n agent.modules.credentials ? CredentialExchangeProvider : undefined,\n agent.modules.proofs ? ProofExchangeProvider : undefined,\n agent.modules.connections ? ConnectionProvider : undefined,\n ].filter((p): p is Exclude<typeof p, undefined> => p !== undefined)\n }, [agent])\n\n // Memoize the nested providers structure to prevent recreation on each render\n const providers = useMemo(() => {\n return DynamicProviders.reduce(\n (accChildren, Provider, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Provider key={index} agent={agent}>\n {accChildren}\n </Provider>\n ),\n <W3cCredentialRecordProvider agent={agent}>\n <SdJwtVcRecordProvider agent={agent}>\n <MdocRecordProvider agent={agent}>\n <WalletJsonStoreProvider recordIds={recordIds} agent={agent}>\n {children}\n </WalletJsonStoreProvider>\n </MdocRecordProvider>\n </SdJwtVcRecordProvider>\n </W3cCredentialRecordProvider>\n )\n }, [DynamicProviders, agent, children, recordIds])\n\n return <AgentContext.Provider value={agent}>{providers}</AgentContext.Provider>\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { useCallback } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport { type ResolveOutOfBandInvitationResult, acceptOutOfBandInvitation } from '../invitation/resolver'\nimport { useAgent } from '../providers/AgentProvider'\n\nexport function useDidCommConnectionActions(resolved?: ResolveOutOfBandInvitationResult) {\n const { agent } = useAgent<DidCommAgent>()\n\n const { mutateAsync: acceptConnectionMutation, status: acceptStatus } = useMutation({\n mutationKey: ['acceptDidCommConnection', resolved?.outOfBandInvitation.id],\n mutationFn: async () => {\n if (!resolved) throw new Error(\"Missing 'resolved' parameter\")\n\n const result = await acceptOutOfBandInvitation(agent, resolved.outOfBandInvitation, resolved.flowType)\n return result\n },\n })\n\n const declineConnection = useCallback(() => {\n // no-op\n }, [])\n\n return {\n acceptConnection: acceptConnectionMutation,\n declineConnection,\n acceptStatus,\n display: {\n connection: {\n name: resolved?.existingConnection\n ? // TODO: translations used\n resolved.existingConnection?.alias ?? resolved.existingConnection?.theirLabel ?? 't(commonMessages.unknown)'\n : // TODO: translations used\n resolved?.outOfBandInvitation.label ?? 't(commonMessages.unknown)',\n logo: {\n url: resolved?.existingConnection\n ? resolved?.existingConnection.imageUrl\n : resolved?.outOfBandInvitation.imageUrl,\n },\n },\n },\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow strict\n * @format\n */\n\n'use strict';\n\n/*::\nexport type AssetDestPathResolver = 'android' | 'generic';\n\nexport type PackagerAsset = {\n +__packager_asset: boolean,\n +fileSystemLocation: string,\n +httpServerLocation: string,\n +width: ?number,\n +height: ?number,\n +scales: Array<number>,\n +hash: string,\n +name: string,\n +type: string,\n +resolver?: AssetDestPathResolver,\n ...\n};\n*/\n\nconst assets /*: Array<PackagerAsset> */ = [];\n\nfunction registerAsset(asset /*: PackagerAsset */) /*: number */ {\n // `push` returns new array length, so the first asset will\n // get id 1 (not 0) to make the value truthy\n return assets.push(asset);\n}\n\nfunction getAssetByID(assetId /*: number */) /*: PackagerAsset */ {\n return assets[assetId - 1];\n}\n\nmodule.exports = {registerAsset, getAssetByID};\n","module.exports = null;\n","import { Platform } from 'expo-modules-core';\nimport { PixelRatio } from 'react-native';\n// Returns the Metro dev server-specific asset location.\nfunction getScaledAssetPath(asset) {\n const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get());\n const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';\n const type = !asset.type ? '' : `.${asset.type}`;\n if (__DEV__) {\n return asset.httpServerLocation + '/' + asset.name + scaleSuffix + type;\n }\n else {\n return asset.httpServerLocation.replace(/\\.\\.\\//g, '_') + '/' + asset.name + scaleSuffix + type;\n }\n}\nexport default class AssetSourceResolver {\n serverUrl;\n // where the jsbundle is being run from\n // NOTE(EvanBacon): Never defined on web.\n // @ts-expect-error: Never read locally\n jsbundleUrl;\n // the asset to resolve\n asset;\n constructor(serverUrl, jsbundleUrl, asset) {\n this.serverUrl = serverUrl || 'https://expo.dev';\n this.jsbundleUrl = null;\n this.asset = asset;\n }\n // Always true for web runtimes\n isLoadedFromServer() {\n return true;\n }\n // Always false for web runtimes\n isLoadedFromFileSystem() {\n return false;\n }\n defaultAsset() {\n return this.assetServerURL();\n }\n /**\n * @returns absolute remote URL for the hosted asset.\n */\n assetServerURL() {\n const fromUrl = new URL(getScaledAssetPath(this.asset), this.serverUrl);\n fromUrl.searchParams.set('platform', Platform.OS);\n fromUrl.searchParams.set('hash', this.asset.hash);\n return this.fromSource(\n // Relative on web\n fromUrl.toString().replace(fromUrl.origin, ''));\n }\n fromSource(source) {\n return {\n __packager_asset: true,\n width: this.asset.width ?? undefined,\n height: this.asset.height ?? undefined,\n uri: source,\n scale: AssetSourceResolver.pickScale(this.asset.scales, PixelRatio.get()),\n };\n }\n static pickScale(scales, deviceScale) {\n for (let i = 0; i < scales.length; i++) {\n if (scales[i] >= deviceScale) {\n return scales[i];\n }\n }\n return scales[scales.length - 1] || 1;\n }\n}\n//# sourceMappingURL=AssetSourceResolver.js.map","export var AppOwnership;\n(function (AppOwnership) {\n /**\n * The experience is running inside the Expo Go app.\n * @deprecated Use [`Constants.executionEnvironment`](#executionenvironment) instead.\n */\n AppOwnership[\"Expo\"] = \"expo\";\n})(AppOwnership || (AppOwnership = {}));\n// @docsMissing\nexport var ExecutionEnvironment;\n(function (ExecutionEnvironment) {\n ExecutionEnvironment[\"Bare\"] = \"bare\";\n ExecutionEnvironment[\"Standalone\"] = \"standalone\";\n ExecutionEnvironment[\"StoreClient\"] = \"storeClient\";\n})(ExecutionEnvironment || (ExecutionEnvironment = {}));\n// @needsAudit\n/**\n * Current supported values are `handset`, `tablet`, `desktop` and `tv`. CarPlay will show up\n * as `unsupported`.\n */\nexport var UserInterfaceIdiom;\n(function (UserInterfaceIdiom) {\n UserInterfaceIdiom[\"Handset\"] = \"handset\";\n UserInterfaceIdiom[\"Tablet\"] = \"tablet\";\n UserInterfaceIdiom[\"Desktop\"] = \"desktop\";\n UserInterfaceIdiom[\"TV\"] = \"tv\";\n UserInterfaceIdiom[\"Unsupported\"] = \"unsupported\";\n})(UserInterfaceIdiom || (UserInterfaceIdiom = {}));\n//# sourceMappingURL=Constants.types.js.map","import { requireOptionalNativeModule } from 'expo-modules-core';\nexport default requireOptionalNativeModule('ExponentConstants');\n//# sourceMappingURL=ExponentConstants.js.map","import { CodedError, requireOptionalNativeModule } from 'expo-modules-core';\nimport { Platform, NativeModules } from 'react-native';\nimport { AppOwnership, ExecutionEnvironment, UserInterfaceIdiom, } from './Constants.types';\nimport ExponentConstants from './ExponentConstants';\nexport { AppOwnership, ExecutionEnvironment, UserInterfaceIdiom, };\nif (!ExponentConstants) {\n console.warn(\"No native ExponentConstants module found, are you sure the expo-constants's module is linked properly?\");\n}\nconst ExpoUpdates = requireOptionalNativeModule('ExpoUpdates');\nlet rawUpdatesManifest = null;\n// If expo-updates defines a non-empty manifest, prefer that one\nif (ExpoUpdates) {\n let updatesManifest;\n if (ExpoUpdates.manifest) {\n updatesManifest = ExpoUpdates.manifest;\n }\n else if (ExpoUpdates.manifestString) {\n updatesManifest = JSON.parse(ExpoUpdates.manifestString);\n }\n if (updatesManifest && Object.keys(updatesManifest).length > 0) {\n rawUpdatesManifest = updatesManifest;\n }\n}\n// If dev-launcher defines a non-empty manifest, prefer that one\nlet rawDevLauncherManifest = null;\nif (NativeModules.EXDevLauncher) {\n let devLauncherManifest;\n if (NativeModules.EXDevLauncher.manifestString) {\n devLauncherManifest = JSON.parse(NativeModules.EXDevLauncher.manifestString);\n }\n if (devLauncherManifest && Object.keys(devLauncherManifest).length > 0) {\n rawDevLauncherManifest = devLauncherManifest;\n }\n}\n// Fall back to ExponentConstants.manifest if we don't have one from Updates\nlet rawAppConfig = null;\nif (ExponentConstants && ExponentConstants.manifest) {\n const appConfig = ExponentConstants.manifest;\n // On Android we pass the manifest in JSON form so this step is necessary\n if (typeof appConfig === 'string') {\n rawAppConfig = JSON.parse(appConfig);\n }\n else {\n rawAppConfig = appConfig;\n }\n}\nlet rawManifest = rawUpdatesManifest ?? rawDevLauncherManifest ?? rawAppConfig;\nconst { name, appOwnership, ...nativeConstants } = (ExponentConstants || {});\nconst constants = {\n ...nativeConstants,\n // Ensure this is null in bare workflow\n appOwnership: appOwnership ?? null,\n};\nObject.defineProperties(constants, {\n /**\n * Use `manifest` property by default.\n * This property is only used for internal purposes.\n * It behaves similarly to the original one, but suppresses warning upon no manifest available.\n * `expo-asset` uses it to prevent users from seeing mentioned warning.\n */\n __unsafeNoWarnManifest: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest || !isEmbeddedManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: false,\n },\n __unsafeNoWarnManifest2: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest || !isExpoUpdatesManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: false,\n },\n manifest: {\n get() {\n const maybeManifest = getManifest();\n if (!maybeManifest || !isEmbeddedManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: true,\n },\n manifest2: {\n get() {\n const maybeManifest = getManifest();\n if (!maybeManifest || !isExpoUpdatesManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: true,\n },\n expoConfig: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest) {\n return null;\n }\n // if running an embedded update, maybeManifest is a EmbeddedManifest which doesn't have\n // the expo config. Instead, the embedded expo-constants app.config should be used.\n if (ExpoUpdates && ExpoUpdates.isEmbeddedLaunch) {\n return rawAppConfig;\n }\n if (isExpoUpdatesManifest(maybeManifest)) {\n return maybeManifest.extra?.expoClient ?? null;\n }\n else if (isEmbeddedManifest(maybeManifest)) {\n return maybeManifest;\n }\n return null;\n },\n enumerable: true,\n },\n expoGoConfig: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest) {\n return null;\n }\n if (isExpoUpdatesManifest(maybeManifest)) {\n return maybeManifest.extra?.expoGo ?? null;\n }\n else if (isEmbeddedManifest(maybeManifest)) {\n return maybeManifest;\n }\n return null;\n },\n enumerable: true,\n },\n easConfig: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest) {\n return null;\n }\n if (isExpoUpdatesManifest(maybeManifest)) {\n return maybeManifest.extra?.eas ?? null;\n }\n else if (isEmbeddedManifest(maybeManifest)) {\n return maybeManifest;\n }\n return null;\n },\n enumerable: true,\n },\n __rawManifest_TEST: {\n get() {\n return rawManifest;\n },\n set(value) {\n rawManifest = value;\n },\n enumerable: false,\n },\n});\nfunction isEmbeddedManifest(manifest) {\n return !isExpoUpdatesManifest(manifest);\n}\nfunction isExpoUpdatesManifest(manifest) {\n return 'metadata' in manifest;\n}\nfunction getManifest(suppressWarning = false) {\n if (!rawManifest) {\n const invalidManifestType = rawManifest === null ? 'null' : 'undefined';\n if (nativeConstants.executionEnvironment === ExecutionEnvironment.Bare &&\n Platform.OS !== 'web') {\n if (!suppressWarning) {\n console.warn(`Constants.manifest is ${invalidManifestType} because the embedded app.config could not be read. Ensure that you have installed the expo-constants build scripts if you need to read from Constants.manifest.`);\n }\n }\n else if (nativeConstants.executionEnvironment === ExecutionEnvironment.StoreClient ||\n nativeConstants.executionEnvironment === ExecutionEnvironment.Standalone) {\n // If we somehow get here, this is a truly exceptional state to be in.\n // Constants.manifest should *always* be defined in those contexts.\n throw new CodedError('ERR_CONSTANTS_MANIFEST_UNAVAILABLE', `Constants.manifest is ${invalidManifestType}, must be an object.`);\n }\n }\n return rawManifest;\n}\nexport default constants;\n//# sourceMappingURL=Constants.js.map","export function getFilename(url) {\n const { pathname, searchParams } = new URL(url, 'https://e');\n // When attached to a dev server, we use `unstable_path` to represent the file path. This ensures\n // the file name is not canonicalized by the browser.\n // NOTE(EvanBacon): This is technically not tied to `__DEV__` as it's possible to use this while bundling in production\n // mode.\n if (__DEV__) {\n if (searchParams.has('unstable_path')) {\n const encodedFilePath = decodeURIComponent(searchParams.get('unstable_path'));\n return getBasename(encodedFilePath);\n }\n }\n return getBasename(pathname);\n}\nfunction getBasename(pathname) {\n return pathname.substring(pathname.lastIndexOf('/') + 1);\n}\nexport function getFileExtension(url) {\n const filename = getFilename(url);\n const dotIndex = filename.lastIndexOf('.');\n // Ignore leading dots for hidden files\n return dotIndex > 0 ? filename.substring(dotIndex) : '';\n}\n/**\n * Returns the base URL from a manifest's URL. For example, given a manifest hosted at\n * https://example.com/app/manifest.json, the base URL would be https://example.com/app/. Query\n * parameters and fragments also are removed.\n *\n * For an Expo-hosted project with a manifest hosted at https://exp.host/@user/project/index.exp, the\n * base URL would be https://exp.host/@user/project.\n *\n * We also normalize the \"exp\" protocol to \"http\" to handle internal URLs with the Expo schemes used\n * to tell the OS to open the URLs in the the Expo client.\n */\nexport function getManifestBaseUrl(manifestUrl) {\n const urlObject = new URL(manifestUrl);\n let nextProtocol = urlObject.protocol;\n // Change the scheme to http(s) if it is exp(s)\n if (nextProtocol === 'exp:') {\n nextProtocol = 'http:';\n }\n else if (nextProtocol === 'exps:') {\n nextProtocol = 'https:';\n }\n urlObject.protocol = nextProtocol;\n // Trim filename, query parameters, and fragment, if any\n const directory = urlObject.pathname.substring(0, urlObject.pathname.lastIndexOf('/') + 1);\n urlObject.pathname = directory;\n urlObject.search = '';\n urlObject.hash = '';\n // The URL spec doesn't allow for changing the protocol to `http` or `https`\n // without a port set so instead, we'll just swap the protocol manually.\n return urlObject.protocol !== nextProtocol\n ? urlObject.href.replace(urlObject.protocol, nextProtocol)\n : urlObject.href;\n}\n//# sourceMappingURL=AssetUris.js.map","import Constants from 'expo-constants';\nimport { requireNativeModule, requireOptionalNativeModule } from 'expo-modules-core';\nimport { getManifestBaseUrl } from './AssetUris';\nconst ExpoUpdates = requireOptionalNativeModule('ExpoUpdates');\nconst NativeExpoGoModule = (() => {\n try {\n return requireNativeModule('ExpoGo');\n }\n catch {\n return null;\n }\n})();\nfunction isRunningInExpoGo() {\n return NativeExpoGoModule != null;\n}\n// expo-updates (and Expo Go expo-updates override) manages assets from updates and exposes\n// the ExpoUpdates.localAssets constant containing information about the assets.\nconst expoUpdatesIsInstalledAndEnabled = !!ExpoUpdates?.isEnabled;\nconst expoUpdatesIsUsingEmbeddedAssets = ExpoUpdates?.isUsingEmbeddedAssets;\n// if expo-updates is installed but we're running directly from the embedded bundle, we don't want\n// to override the AssetSourceResolver.\nconst shouldUseUpdatesAssetResolution = expoUpdatesIsInstalledAndEnabled && !expoUpdatesIsUsingEmbeddedAssets;\n// Expo Go always uses the updates module for asset resolution (local assets) since it\n// overrides the expo-updates module.\nexport const IS_ENV_WITH_LOCAL_ASSETS = isRunningInExpoGo() || shouldUseUpdatesAssetResolution;\n// Get the localAssets property from the ExpoUpdates native module so that we do\n// not need to include expo-updates as a dependency of expo-asset\nexport function getLocalAssets() {\n return ExpoUpdates?.localAssets ?? {};\n}\nexport function getManifest2() {\n return Constants.__unsafeNoWarnManifest2;\n}\n// Compute manifest base URL if available\nexport const manifestBaseUrl = Constants.experienceUrl\n ? getManifestBaseUrl(Constants.experienceUrl)\n : null;\n//# sourceMappingURL=PlatformUtils.js.map","import { Platform } from 'expo-modules-core';\nimport { PixelRatio, NativeModules } from 'react-native';\nimport AssetSourceResolver from './AssetSourceResolver';\nimport { getManifest2, manifestBaseUrl } from './PlatformUtils';\n/**\n * Selects the best file for the given asset (ex: choosing the best scale for images) and returns\n * a { uri, hash } pair for the specific asset file.\n *\n * If the asset isn't an image with multiple scales, the first file is selected.\n */\nexport function selectAssetSource(meta) {\n // This logic is based on that of AssetSourceResolver, with additional support for file hashes and\n // explicitly provided URIs\n const scale = AssetSourceResolver.pickScale(meta.scales, PixelRatio.get());\n const index = meta.scales.findIndex((s) => s === scale);\n const hash = meta.fileHashes ? (meta.fileHashes[index] ?? meta.fileHashes[0]) : meta.hash;\n // Allow asset processors to directly provide the URL to load\n const uri = meta.fileUris ? (meta.fileUris[index] ?? meta.fileUris[0]) : meta.uri;\n if (uri) {\n return { uri: resolveUri(uri), hash };\n }\n const fileScale = scale === 1 ? '' : `@${scale}x`;\n const fileExtension = meta.type ? `.${encodeURIComponent(meta.type)}` : '';\n const suffix = `/${encodeURIComponent(meta.name)}${fileScale}${fileExtension}`;\n const params = new URLSearchParams({\n platform: Platform.OS,\n hash: meta.hash,\n });\n // For assets with a specified absolute URL, we use the existing origin instead of prepending the\n // development server or production CDN URL origin\n if (/^https?:\\/\\//.test(meta.httpServerLocation)) {\n const uri = meta.httpServerLocation + suffix + '?' + params;\n return { uri, hash };\n }\n // For assets during development using manifest2, we use the development server's URL origin\n const manifest2 = getManifest2();\n const devServerUrl = manifest2?.extra?.expoGo?.developer\n ? 'http://' + manifest2.extra.expoGo.debuggerHost\n : null;\n if (devServerUrl) {\n const baseUrl = new URL(meta.httpServerLocation + suffix, devServerUrl);\n baseUrl.searchParams.set('platform', Platform.OS);\n baseUrl.searchParams.set('hash', meta.hash);\n return {\n uri: baseUrl.href,\n hash,\n };\n }\n // Temporary fallback for loading assets in Expo Go home\n if (NativeModules['ExponentKernel']) {\n return { uri: `https://classic-assets.eascdn.net/~assets/${encodeURIComponent(hash)}`, hash };\n }\n // In correctly configured apps, we arrive here if the asset is locally available on disk due to\n // being managed by expo-updates, and `getLocalAssetUri(hash)` must return a local URI for this\n // hash. Since the asset is local, we don't have a remote URL and specify an invalid URL (an empty\n // string) as a placeholder.\n return { uri: '', hash };\n}\n/**\n * Resolves the given URI to an absolute URI. If the given URI is already an absolute URI, it is\n * simply returned. Otherwise, if it is a relative URI, it is resolved relative to the manifest's\n * base URI.\n */\nexport function resolveUri(uri) {\n // `manifestBaseUrl` is always an absolute URL or `null`.\n return manifestBaseUrl ? new URL(uri, manifestBaseUrl).href : uri;\n}\n//# sourceMappingURL=AssetSources.js.map","import { requireNativeModule } from 'expo-modules-core';\nconst AssetModule = requireNativeModule('ExpoAsset');\n/**\n * Downloads the asset from the given URL to a local cache and returns the local URL of the cached\n * file.\n *\n * If there is already a locally cached file and its MD5 hash matches the given `md5Hash` parameter,\n * if present, the remote asset is not downloaded. The `hash` property is included in Metro's asset\n * metadata objects when this module's `hashAssetFiles` plugin is used, which is the typical way the\n * `md5Hash` parameter of this function is provided.\n */\nexport async function downloadAsync(url, md5Hash, type) {\n return AssetModule.downloadAsync(url, md5Hash, type);\n}\n//# sourceMappingURL=ExpoAsset.js.map","/* eslint-env browser */\nimport { getFilename } from './AssetUris';\nexport function isImageType(type) {\n return /^(jpeg|jpg|gif|png|bmp|webp|heic)$/i.test(type);\n}\nexport function getImageInfoAsync(url) {\n if (typeof window === 'undefined') {\n return Promise.resolve({ name: getFilename(url), width: 0, height: 0 });\n }\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = reject;\n img.onload = () => {\n resolve({\n name: getFilename(url),\n width: img.naturalWidth,\n height: img.naturalHeight,\n });\n };\n img.src = url;\n });\n}\n//# sourceMappingURL=ImageAssets.js.map","import { getLocalAssets } from './PlatformUtils';\n// localAssets are provided by the expo-updates module\nconst localAssets = getLocalAssets();\n/**\n * Returns the URI of a local asset from its hash, or null if the asset is not available locally\n */\nexport function getLocalAssetUri(hash, type) {\n const localAssetsKey = hash;\n const legacyLocalAssetsKey = `${hash}.${type ?? ''}`;\n switch (true) {\n case localAssetsKey in localAssets: {\n return localAssets[localAssetsKey];\n }\n case legacyLocalAssetsKey in localAssets: {\n // legacy updates store assets with an extension\n return localAssets[legacyLocalAssetsKey];\n }\n default:\n return null;\n }\n}\n//# sourceMappingURL=LocalAssets.js.map","import { getAssetByID } from '@react-native/assets-registry/registry';\nimport AssetSourceResolver from './AssetSourceResolver';\nlet _customSourceTransformer;\nexport function setCustomSourceTransformer(transformer) {\n _customSourceTransformer = transformer;\n}\n/**\n * `source` is either a number (opaque type returned by require('./foo.png'))\n * or an `ImageSource` like { uri: '<http location || file path>' }\n */\nfunction resolveAssetSource(source) {\n if (typeof source === 'object') {\n return source;\n }\n const asset = getAssetByID(source);\n if (!asset) {\n return null;\n }\n const resolver = new AssetSourceResolver(\n // Doesn't matter since this is removed on web\n 'https://expo.dev', null, asset);\n if (_customSourceTransformer) {\n return _customSourceTransformer(resolver);\n }\n return resolver.defaultAsset();\n}\nObject.defineProperty(resolveAssetSource, 'setCustomSourceTransformer', {\n get() {\n return setCustomSourceTransformer;\n },\n});\nexport default resolveAssetSource;\nexport const { pickScale } = AssetSourceResolver;\n//# sourceMappingURL=resolveAssetSource.js.map","import { getAssetByID } from '@react-native/assets-registry/registry';\nimport { Platform } from 'expo-modules-core';\nimport { selectAssetSource } from './AssetSources';\nimport * as AssetUris from './AssetUris';\nimport { downloadAsync } from './ExpoAsset';\nimport * as ImageAssets from './ImageAssets';\nimport { getLocalAssetUri } from './LocalAssets';\nimport { IS_ENV_WITH_LOCAL_ASSETS } from './PlatformUtils';\nimport resolveAssetSource from './resolveAssetSource';\n/**\n * Android resource URL prefix.\n * @hidden\n */\nexport const ANDROID_EMBEDDED_URL_BASE_RESOURCE = 'file:///android_res/';\n/**\n * The `Asset` class represents an asset in your app. It gives metadata about the asset (such as its\n * name and type) and provides facilities to load the asset data.\n */\nexport class Asset {\n static byHash = {};\n static byUri = {};\n /**\n * The name of the asset file without the extension. Also without the part from `@` onward in the\n * filename (used to specify scale factor for images).\n */\n name;\n /**\n * The extension of the asset filename.\n */\n type;\n /**\n * The MD5 hash of the asset's data.\n */\n hash = null;\n /**\n * A URI that points to the asset's data on the remote server. When running the published version\n * of your app, this refers to the location on Expo's asset server where Expo has stored your\n * asset. When running the app from Expo CLI during development, this URI points to Expo CLI's\n * server running on your computer and the asset is served directly from your computer. If you\n * are not using Classic Updates (legacy), this field should be ignored as we ensure your assets\n * are on device before running your application logic.\n */\n uri;\n /**\n * If the asset has been downloaded (by calling [`downloadAsync()`](#downloadasync)), the\n * `file://` URI pointing to the local file on the device that contains the asset data.\n */\n localUri = null;\n /**\n * If the asset is an image, the width of the image data divided by the scale factor. The scale\n * factor is the number after `@` in the filename, or `1` if not present.\n */\n width = null;\n /**\n * If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after `@` in the filename, or `1` if not present.\n */\n height = null;\n downloading = false;\n /**\n * Whether the asset has finished downloading from a call to [`downloadAsync()`](#downloadasync).\n */\n downloaded = false;\n _downloadCallbacks = [];\n constructor({ name, type, hash = null, uri, width, height }) {\n this.name = name;\n this.type = type;\n this.hash = hash;\n this.uri = uri;\n if (typeof width === 'number') {\n this.width = width;\n }\n if (typeof height === 'number') {\n this.height = height;\n }\n if (hash) {\n this.localUri = getLocalAssetUri(hash, type);\n if (this.localUri?.startsWith(ANDROID_EMBEDDED_URL_BASE_RESOURCE)) {\n // Treat Android embedded resources as not downloaded state, because the uri is not direct accessible.\n this.uri = this.localUri;\n this.localUri = null;\n }\n else if (this.localUri) {\n this.downloaded = true;\n }\n }\n if (Platform.OS === 'web') {\n if (!name) {\n this.name = AssetUris.getFilename(uri);\n }\n if (!type) {\n this.type = AssetUris.getFileExtension(uri);\n }\n }\n }\n // @needsAudit\n /**\n * A helper that wraps `Asset.fromModule(module).downloadAsync` for convenience.\n * @param moduleId An array of `require('path/to/file')` or external network URLs. Can also be\n * just one module or URL without an Array.\n * @return Returns a Promise that fulfills with an array of `Asset`s when the asset(s) has been\n * saved to disk.\n * @example\n * ```ts\n * const [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));\n * ```\n */\n static loadAsync(moduleId) {\n const moduleIds = Array.isArray(moduleId) ? moduleId : [moduleId];\n return Promise.all(moduleIds.map((moduleId) => Asset.fromModule(moduleId).downloadAsync()));\n }\n // @needsAudit\n /**\n * Returns the [`Asset`](#asset) instance representing an asset given its module or URL.\n * @param virtualAssetModule The value of `require('path/to/file')` for the asset or external\n * network URL\n * @return The [`Asset`](#asset) instance for the asset.\n */\n static fromModule(virtualAssetModule) {\n if (typeof virtualAssetModule === 'string') {\n return Asset.fromURI(virtualAssetModule);\n }\n if (typeof virtualAssetModule === 'object' &&\n 'uri' in virtualAssetModule &&\n typeof virtualAssetModule.uri === 'string') {\n const extension = AssetUris.getFileExtension(virtualAssetModule.uri);\n return new Asset({\n name: '',\n type: extension.startsWith('.') ? extension.substring(1) : extension,\n hash: null,\n uri: virtualAssetModule.uri,\n width: virtualAssetModule.width,\n height: virtualAssetModule.height,\n });\n }\n const meta = getAssetByID(virtualAssetModule);\n if (!meta) {\n throw new Error(`Module \"${virtualAssetModule}\" is missing from the asset registry`);\n }\n // Outside of the managed env we need the moduleId to initialize the asset\n // because resolveAssetSource depends on it\n if (!IS_ENV_WITH_LOCAL_ASSETS) {\n // null-check is performed above with `getAssetByID`.\n const { uri } = resolveAssetSource(virtualAssetModule);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash: meta.hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n // For images backward compatibility,\n // keeps localUri the same as uri for React Native's Image that\n // works fine with drawable resource names.\n if (Platform.OS === 'android' && !uri.includes(':') && (meta.width || meta.height)) {\n asset.localUri = asset.uri;\n asset.downloaded = true;\n }\n Asset.byHash[meta.hash] = asset;\n return asset;\n }\n return Asset.fromMetadata(meta);\n }\n // @docsMissing\n static fromMetadata(meta) {\n // The hash of the whole asset, not to be confused with the hash of a specific file returned\n // from `selectAssetSource`\n const metaHash = meta.hash;\n if (Asset.byHash[metaHash]) {\n return Asset.byHash[metaHash];\n }\n const { uri, hash } = selectAssetSource(meta);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n Asset.byHash[metaHash] = asset;\n return asset;\n }\n // @docsMissing\n static fromURI(uri) {\n if (Asset.byUri[uri]) {\n return Asset.byUri[uri];\n }\n // Possibly a Base64-encoded URI\n let type = '';\n if (uri.indexOf(';base64') > -1) {\n type = uri.split(';')[0].split('/')[1];\n }\n else {\n const extension = AssetUris.getFileExtension(uri);\n type = extension.startsWith('.') ? extension.substring(1) : extension;\n }\n const asset = new Asset({\n name: '',\n type,\n hash: null,\n uri,\n });\n Asset.byUri[uri] = asset;\n return asset;\n }\n // @needsAudit\n /**\n * Downloads the asset data to a local file in the device's cache directory. Once the returned\n * promise is fulfilled without error, the [`localUri`](#localuri) field of this asset points\n * to a local file containing the asset data. The asset is only downloaded if an up-to-date local\n * file for the asset isn't already present due to an earlier download. The downloaded `Asset`\n * will be returned when the promise is resolved.\n * @return Returns a Promise which fulfills with an `Asset` instance.\n */\n async downloadAsync() {\n if (this.downloaded) {\n return this;\n }\n if (this.downloading) {\n await new Promise((resolve, reject) => {\n this._downloadCallbacks.push({ resolve, reject });\n });\n return this;\n }\n this.downloading = true;\n try {\n if (Platform.OS === 'web') {\n if (ImageAssets.isImageType(this.type)) {\n const { width, height, name } = await ImageAssets.getImageInfoAsync(this.uri);\n this.width = width;\n this.height = height;\n this.name = name;\n }\n else {\n this.name = AssetUris.getFilename(this.uri);\n }\n }\n this.localUri = await downloadAsync(this.uri, this.hash, this.type);\n this.downloaded = true;\n this._downloadCallbacks.forEach(({ resolve }) => resolve());\n }\n catch (e) {\n this._downloadCallbacks.forEach(({ reject }) => reject(e));\n throw e;\n }\n finally {\n this.downloading = false;\n this._downloadCallbacks = [];\n }\n return this;\n }\n}\n//# sourceMappingURL=Asset.js.map","import {\n MdocRecord,\n MdocRepository,\n type SdJwtVcRecord,\n SdJwtVcRepository,\n W3cCredentialRecord,\n W3cCredentialRepository,\n} from '@credo-ts/core'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { BaseAgent } from '../agent'\nimport type { CredentialForDisplayId } from '../display/credential'\nimport { registerCredentialsForDcApi } from '../openid4vc/dcApi'\n\nexport type CredentialRecord = W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n\nexport async function getCredential(agent: BaseAgent, credentialId: CredentialForDisplayId): Promise<CredentialRecord> {\n if (credentialId.startsWith('w3c-credential-')) {\n const w3cCredentialId = credentialId.replace('w3c-credential-', '')\n return agent.w3cCredentials.getCredentialRecordById(w3cCredentialId)\n }\n\n if (credentialId.startsWith('sd-jwt-vc')) {\n const sdJwtVcId = credentialId.replace('sd-jwt-vc-', '')\n return agent.sdJwtVc.getById(sdJwtVcId)\n }\n\n if (credentialId.startsWith('mdoc-')) {\n const mdocId = credentialId.replace('mdoc-', '')\n return agent.mdoc.getById(mdocId)\n }\n\n throw new Error('Unsupported record type')\n}\n\nexport async function updateCredential(agent: BaseAgent, credentialRecord: CredentialRecord) {\n if (credentialRecord instanceof W3cCredentialRecord) {\n await agent.dependencyManager.resolve(W3cCredentialRepository).update(agent.context, credentialRecord)\n } else if (credentialRecord instanceof MdocRecord) {\n await agent.dependencyManager.resolve(MdocRepository).update(agent.context, credentialRecord)\n } else {\n await agent.dependencyManager.resolve(SdJwtVcRepository).update(agent.context, credentialRecord)\n }\n\n // Update database when we update a credential\n await registerCredentialsForDcApi(agent)\n}\n\nexport async function storeCredential(paradym: ParadymWalletSdk, credentialRecord: CredentialRecord) {\n if (credentialRecord instanceof W3cCredentialRecord) {\n await paradym.agent.dependencyManager.resolve(W3cCredentialRepository).save(paradym.agent.context, credentialRecord)\n } else if (credentialRecord instanceof MdocRecord) {\n await paradym.agent.dependencyManager.resolve(MdocRepository).save(paradym.agent.context, credentialRecord)\n } else {\n await paradym.agent.dependencyManager.resolve(SdJwtVcRepository).save(paradym.agent.context, credentialRecord)\n }\n\n // Update database when we store a credential\n await registerCredentialsForDcApi(paradym.agent)\n}\n\nexport async function deleteCredential(agent: BaseAgent, credentialId: CredentialForDisplayId) {\n if (credentialId.startsWith('w3c-credential-')) {\n const w3cCredentialId = credentialId.replace('w3c-credential-', '')\n await agent.w3cCredentials.removeCredentialRecord(w3cCredentialId)\n } else if (credentialId.startsWith('sd-jwt-vc')) {\n const sdJwtVcId = credentialId.replace('sd-jwt-vc-', '')\n await agent.sdJwtVc.deleteById(sdJwtVcId)\n } else if (credentialId.startsWith('mdoc-')) {\n const mdocId = credentialId.replace('mdoc-', '')\n await agent.mdoc.deleteById(mdocId)\n }\n\n // Update database when we delete a credential\n await registerCredentialsForDcApi(agent)\n}\n","import { Mdoc, MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'\nimport type { OpenId4VcAgent } from '../agent'\nimport {\n type RefreshCredentialMetadata,\n getBatchCredentialMetadata,\n getRefreshCredentialMetadata,\n} from '../metadata/credentials'\nimport { updateCredential } from '../storage/credentials'\nimport { decodeW3cCredential } from '../utils/encoding'\n\nexport type BatchableCredentialRecord = W3cCredentialRecord | SdJwtVcRecord | MdocRecord\nexport type FetchBatchCredentialOptions = {\n agent: OpenId4VcAgent\n credentialRecord: BatchableCredentialRecord\n refreshMetadata: RefreshCredentialMetadata\n}\nexport type FetchBatchCredentialCallback = (options: FetchBatchCredentialOptions) => Promise<BatchableCredentialRecord>\n\n/**\n * If available, takes a credential from the batch.\n *\n * @todo what if batch is gone?\n *\n * @todo does not deal with the PID anymore as it is a generic SDK. How do we want to deal with this now?\n */\nexport async function handleBatchCredential(\n agent: OpenId4VcAgent,\n credentialRecord: BatchableCredentialRecord,\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n): Promise<BatchableCredentialRecord> {\n const batchMetadata = getBatchCredentialMetadata(credentialRecord)\n if (!batchMetadata) return credentialRecord\n\n // TODO: maybe we should also store the main credential in the additional credentials (and rename it)\n // As right now the main one is mostly for display\n const batchCredential = batchMetadata.additionalCredentials.pop()\n\n // Store the record with the used credential removed. Even if the presentation fails we remove it, as we want to be careful\n // if the presentation was shared\n if (batchCredential) await updateCredential(agent, credentialRecord)\n\n const refreshMetadata = getRefreshCredentialMetadata(credentialRecord)\n\n if (fetchBatchCredentialCallback && batchMetadata.additionalCredentials.length === 0 && refreshMetadata) {\n return await fetchBatchCredentialCallback({ agent, credentialRecord, refreshMetadata })\n }\n\n if (batchCredential) {\n if (credentialRecord instanceof MdocRecord) {\n return new MdocRecord({\n mdoc: Mdoc.fromBase64Url(batchCredential as string),\n })\n }\n if (credentialRecord instanceof SdJwtVcRecord) {\n return new SdJwtVcRecord({\n compactSdJwtVc: batchCredential as string,\n })\n }\n if (credentialRecord instanceof W3cCredentialRecord) {\n return new W3cCredentialRecord({\n tags: { expandedTypes: [] },\n credential: decodeW3cCredential(batchCredential),\n })\n }\n }\n\n return credentialRecord\n}\n","import type { CredentialsForProofRequest } from './getCredentialsForProofRequest'\n\nexport type FormattedTransactionData = ReturnType<typeof getFormattedTransactionData>\nexport type QtspInfo = CredentialsForProofRequest['verifier']\n\nexport const getFormattedTransactionData = (credentialsForRequest?: CredentialsForProofRequest) => {\n if (!credentialsForRequest) return undefined\n\n const transactionData = credentialsForRequest.transactionData\n\n if (!transactionData || transactionData.length === 0) return undefined\n\n // Only allow one transaction data entry\n if (transactionData.length > 1) throw new Error('Multiple transactions are not supported yet.')\n\n const transactionDataEntry = transactionData[0]\n\n // Only allow qes_authorization is supported at this time\n if (transactionDataEntry.entry.transactionData.type !== 'qes_authorization')\n throw new Error('Only document signing is supported at this time.')\n\n // TODO: this needs to be updated when we support credential selection\n const cardForSigningId = transactionDataEntry.matchedCredentialIds.find((id) =>\n credentialsForRequest.formattedSubmission.entries.find((a) => a.inputDescriptorId === id)\n )\n\n return {\n type: transactionDataEntry.entry.transactionData.type,\n documentName: (transactionDataEntry.entry.transactionData.documentDigests as Array<{ label: string }>)[0].label,\n qtsp: credentialsForRequest.verifier, // Just use RP info for now\n cardForSigningId,\n }\n}\n","import {\n type BaseRecord,\n ClaimFormat,\n type DcqlCredentialsForRequest,\n type DcqlQueryResult,\n type MdocRecord,\n type SdJwtVcRecord,\n type W3cCredentialRecord,\n} from '@credo-ts/core'\nimport { Linking } from 'react-native'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { type FetchBatchCredentialCallback, handleBatchCredential } from '../openid4vc/batch'\nimport type { CredentialsForProofRequest } from '../openid4vc/getCredentialsForProofRequest'\nimport { getFormattedTransactionData } from '../openid4vc/transaction'\n\nexport const shareProof = async ({\n resolvedRequest,\n selectedCredentials,\n acceptTransactionData,\n fetchBatchCredentialCallback,\n paradym,\n}: {\n paradym: ParadymWalletSdk\n resolvedRequest: CredentialsForProofRequest\n selectedCredentials: { [inputDescriptorId: string]: string }\n // FIXME: Should be a more complex structure allowing which credential to use for which entry\n acceptTransactionData?: boolean\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n}) => {\n const { authorizationRequest } = resolvedRequest\n if (\n !resolvedRequest.credentialsForRequest?.areRequirementsSatisfied &&\n !resolvedRequest.queryResult?.canBeSatisfied\n ) {\n throw new Error('Requirements from proof request are not satisfied')\n }\n\n // Map all requirements and entries to a credential record. If a credential record for an\n // input descriptor has been provided in `selectedCredentials` we will use that. Otherwise\n // it will pick the first available credential.\n const presentationExchangeCredentials = resolvedRequest.credentialsForRequest\n ? Object.fromEntries(\n await Promise.all(\n resolvedRequest.credentialsForRequest.requirements.flatMap((requirement) =>\n requirement.submissionEntry.slice(0, requirement.needsCount).map(async (entry) => {\n const credentialId = selectedCredentials[entry.inputDescriptorId]\n const credential =\n entry.verifiableCredentials.find((vc) => vc.credentialRecord.id === credentialId) ??\n entry.verifiableCredentials[0]\n\n // Optionally use a batch credential\n const credentialRecord = await handleBatchCredential(\n paradym.agent,\n credential.credentialRecord,\n fetchBatchCredentialCallback\n )\n\n return [entry.inputDescriptorId, [{ ...credential, credentialRecord }]]\n })\n )\n )\n )\n : undefined\n\n const dcqlCredentials = resolvedRequest.queryResult\n ? Object.fromEntries(\n await Promise.all(\n Object.entries(\n Object.keys(selectedCredentials).length > 0\n ? getSelectedCredentialsForRequest(resolvedRequest.queryResult, selectedCredentials)\n : paradym.agent.modules.openId4VcHolder.selectCredentialsForDcqlRequest(resolvedRequest.queryResult)\n ).map(async ([queryCredentialId, credential]) => {\n // Optionally use a batch credential\n const credentialRecord = await handleBatchCredential(\n paradym.agent,\n credential.credentialRecord,\n fetchBatchCredentialCallback\n )\n\n return [queryCredentialId, { ...credential, credentialRecord }]\n })\n )\n )\n : undefined\n\n const cardForSigningId = getFormattedTransactionData(resolvedRequest)?.cardForSigningId\n\n try {\n const result = await paradym.agent.modules.openId4VcHolder.acceptOpenId4VpAuthorizationRequest({\n authorizationRequestPayload: authorizationRequest,\n presentationExchange: presentationExchangeCredentials\n ? {\n credentials: presentationExchangeCredentials,\n }\n : undefined,\n dcql: dcqlCredentials\n ? {\n credentials: dcqlCredentials,\n }\n : undefined,\n transactionData:\n resolvedRequest.transactionData && acceptTransactionData && cardForSigningId\n ? [{ credentialId: cardForSigningId }]\n : undefined,\n origin: resolvedRequest.origin,\n })\n\n // if redirect_uri is provided, open it in the browser\n // Even if the response returned an error, we must open this uri\n if (result.redirectUri) {\n await Linking.openURL(result.redirectUri)\n }\n\n if (result.serverResponse && (result.serverResponse.status < 200 || result.serverResponse.status > 299)) {\n paradym.logger.error('Error while accepting authorization request', {\n authorizationRequest,\n response: result.authorizationResponse,\n responsePayload: result.authorizationResponsePayload,\n })\n throw new Error(\n `Error while accepting authorization request. ${JSON.stringify(result.serverResponse.body, null, 2)}`\n )\n }\n\n return result\n } catch (error) {\n // TODO\n throw Error('TODO')\n }\n}\n\n/**\n * Selects the credentials to use based on the output from `getCredentialsForRequest`\n * Use this method if you don't want to manually select the credentials yourself.\n */\nfunction getSelectedCredentialsForRequest(\n dcqlQueryResult: DcqlQueryResult,\n selectedCredentials: { [credentialQueryId: string]: string }\n): DcqlCredentialsForRequest {\n if (!dcqlQueryResult.canBeSatisfied) {\n throw new Error('Cannot select the credentials for the dcql query presentation if the request cannot be satisfied')\n }\n\n const credentials: DcqlCredentialsForRequest = {}\n\n for (const [credentialQueryId, credentialRecordId] of Object.entries(selectedCredentials)) {\n const matchesForCredentialQuery = dcqlQueryResult.credential_matches[credentialQueryId]\n if (matchesForCredentialQuery.success) {\n const match = matchesForCredentialQuery.all\n .map((credential) =>\n credential.find((claimSet) =>\n claimSet?.success && 'record' in claimSet && (claimSet.record as BaseRecord).id === credentialRecordId\n ? claimSet\n : undefined\n )\n )\n .find((i) => i !== undefined)\n // TODO: fix the typing, make selection in Credo easier\n const matchWithRecord = match as typeof match & { record: MdocRecord | SdJwtVcRecord | W3cCredentialRecord }\n\n if (\n matchWithRecord?.success &&\n matchWithRecord.record.type === 'MdocRecord' &&\n matchWithRecord.output.credential_format === 'mso_mdoc'\n ) {\n credentials[credentialQueryId] = {\n claimFormat: ClaimFormat.MsoMdoc,\n credentialRecord: matchWithRecord.record,\n disclosedPayload: matchWithRecord.output.namespaces,\n }\n } else if (\n matchWithRecord?.success &&\n matchWithRecord.record.type === 'SdJwtVcRecord' &&\n (matchWithRecord.output.credential_format === 'dc+sd-jwt' ||\n matchWithRecord.output.credential_format === 'vc+sd-jwt')\n ) {\n credentials[credentialQueryId] = {\n claimFormat: ClaimFormat.SdJwtVc,\n credentialRecord: matchWithRecord.record,\n disclosedPayload: matchWithRecord.output.claims,\n }\n }\n }\n }\n\n return credentials\n}\n","import {\n type DigitalCredentialsRequest,\n type RegisterCredentialsOptions,\n registerCredentials,\n sendErrorResponse,\n sendResponse,\n} from '@animo-id/expo-digital-credentials-api'\nimport { DateOnly, type Logger, type MdocNameSpaces } from '@credo-ts/core'\nimport * as ExpoAsset from 'expo-asset'\nimport { Image } from 'expo-image'\nimport { ImageManipulator, SaveFormat } from 'expo-image-manipulator'\nimport { Platform } from 'react-native'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { BaseAgent } from '../agent'\nimport { getCredentialForDisplay } from '../display/credential'\nimport { sanitizeString } from '../display/strings'\nimport { shareProof } from '../invitation/shareProof'\nimport { getHostNameFromUrl } from '../utils/url'\nimport type { FetchBatchCredentialCallback } from './batch'\nimport { type CredentialsForProofRequest, getCredentialsForProofRequest } from './getCredentialsForProofRequest'\n\ntype CredentialItem = RegisterCredentialsOptions['credentials'][number]\ntype CredentialDisplayClaim = NonNullable<CredentialItem['display']['claims']>[number]\n\nfunction mapMdocAttributes(namespaces: MdocNameSpaces) {\n return Object.fromEntries(\n Object.entries(namespaces).map(([namespace, values]) => [\n namespace,\n Object.fromEntries(\n Object.entries(values).map(([key, value]) => {\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {\n return [key, value]\n }\n\n if (value instanceof Date || value instanceof DateOnly) {\n return [key, value.toISOString()]\n }\n\n // For all other complex types we don't allow matching based on the value\n return [key, null]\n })\n ),\n ])\n )\n}\n\nfunction mapMdocAttributesToClaimDisplay(namespaces: MdocNameSpaces) {\n return Object.entries(namespaces).flatMap(([namespace, values]) =>\n Object.keys(values).map((key) => ({\n path: [namespace, key],\n // FIXME: we need to integrate with claim based mapping of names.\n // For that we first need to:\n // - use the claims arrays with path syntax in our Wallet instead of the custom mappings\n // - support oid4vci draft 15 claim syntax\n displayName: sanitizeString(key),\n }))\n )\n}\n\nfunction mapSdJwtAttributesToClaimDisplay(claims: object, path: string[] = []): CredentialDisplayClaim[] {\n return Object.entries(claims).flatMap(([claimName, value]) => {\n const nestedClaims =\n value && typeof value === 'object' && !Array.isArray(value)\n ? mapSdJwtAttributesToClaimDisplay(value, [...path, claimName])\n : []\n\n return [\n {\n path: [...path, claimName],\n // FIXME: we need to integrate with claim based mapping of names.\n // For that we first need to:\n // - use the claims arrays with path syntax in our Wallet instead of the custom mappings\n // - support oid4vci draft 15 claim syntax\n displayName: sanitizeString(claimName),\n },\n ...nestedClaims,\n ]\n })\n}\n\n/**\n * Returns base64 data url\n */\nasync function resizeImageWithAspectRatio(logger: Logger, asset: ExpoAsset.Asset) {\n try {\n // Make sure the asset is loaded\n if (!asset.localUri) {\n await asset.downloadAsync()\n }\n\n if (!asset.localUri) {\n return undefined\n }\n\n const image = await Image.loadAsync(asset.localUri)\n\n // Calculate new dimensions maintaining aspect ratio\n let width: number\n let height: number\n if (image.width >= image.height) {\n // If width is the larger dimension\n width = 20\n height = Math.round((image.height / image.width) * 20)\n } else {\n // If height is the larger dimension\n height = 20\n width = Math.round((image.width / image.height) * 20)\n }\n\n // Use the new API to resize the image\n const resizedImage = await ImageManipulator.manipulate(image).resize({ width, height }).renderAsync()\n const savedImages = await resizedImage.saveAsync({\n base64: true,\n format: SaveFormat.PNG,\n compress: 1,\n })\n\n if (!savedImages.base64) {\n return undefined\n }\n\n return `data:image/png;base64,${savedImages.base64}` as const\n } catch (error) {\n logger.error('Error resizing image.', {\n error,\n })\n throw error\n }\n}\n\nasync function loadCachedImageAsBase64DataUrl(logger: Logger, url: string) {\n let asset: ExpoAsset.Asset\n\n try {\n // in case of external image\n if (url.startsWith('data://') || url.startsWith('https://')) {\n const cachePath = await Image.getCachePathAsync(url)\n if (!cachePath) return undefined\n\n asset = await ExpoAsset.Asset.fromURI(`file://${cachePath}`).downloadAsync()\n }\n // In case of local image\n else {\n asset = ExpoAsset.Asset.fromModule(url)\n }\n\n return await resizeImageWithAspectRatio(logger, asset)\n } catch (error) {\n // just ignore it, we don't want to cause issues with registering crednetials\n logger.error('Error resizing and retrieving cached image for DC API', {\n error,\n })\n }\n}\n\n// TODO(sdk): should be a method on the sdk\nexport async function registerCredentialsForDcApi(agent: BaseAgent) {\n if (Platform.OS === 'ios') return\n\n const mdocRecords = await agent.mdoc.getAll()\n const sdJwtVcRecords = await agent.sdJwtVc.getAll()\n\n const mdocCredentials = mdocRecords.map(async (record): Promise<CredentialItem> => {\n const mdoc = record.credential\n const { display } = getCredentialForDisplay(record)\n\n const iconDataUrl = display.backgroundImage?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.backgroundImage?.url)\n : display.issuer.logo?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.issuer.logo.url)\n : undefined\n\n return {\n id: record.id,\n credential: {\n doctype: mdoc.docType,\n format: 'mso_mdoc',\n namespaces: mapMdocAttributes(mdoc.issuerSignedNamespaces),\n },\n display: {\n title: display.name,\n subtitle: `Issued by ${display.issuer.name}`,\n claims: mapMdocAttributesToClaimDisplay(mdoc.issuerSignedNamespaces),\n iconDataUrl,\n },\n } as const\n })\n\n const sdJwtCredentials = sdJwtVcRecords.map(async (record): Promise<CredentialItem> => {\n const sdJwtVc = record.credential\n const { display } = getCredentialForDisplay(record)\n\n const iconDataUrl = display.backgroundImage?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.backgroundImage?.url)\n : display.issuer.logo?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.issuer.logo.url)\n : undefined\n\n return {\n id: record.id,\n credential: {\n vct: record.getTags().vct,\n format: 'dc+sd-jwt',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n claims: sdJwtVc.prettyClaims as any,\n },\n display: {\n title: display.name,\n subtitle: `Issued by ${display.issuer.name}`,\n claims: mapSdJwtAttributesToClaimDisplay(sdJwtVc.prettyClaims),\n iconDataUrl,\n },\n } as const\n })\n\n const credentials = await Promise.all([...sdJwtCredentials, ...mdocCredentials])\n agent.config.logger.trace('Registering credentials for Digital Credentials API')\n\n await registerCredentials({\n credentials,\n matcher: 'ubique',\n })\n}\n\nexport async function resolveRequestForDcApi({\n paradym,\n request,\n}: { paradym: ParadymWalletSdk; request: DigitalCredentialsRequest }) {\n const providerRequest = request.request.requests\n ? request.request.requests[request.selectedEntry.providerIndex].data\n : request.request.providers[request.selectedEntry.providerIndex].request\n\n const authorizationRequestPayload =\n typeof providerRequest === 'string' ? JSON.parse(providerRequest) : providerRequest\n\n // TODO: should allow limiting it to a specific credential (as we already know the credential id)\n const result = await getCredentialsForProofRequest({\n paradym,\n requestPayload: authorizationRequestPayload,\n origin: request.origin,\n })\n\n if (result.formattedSubmission.entries.length !== 1) {\n throw new Error('Only requests for a single credential supported for digital credentials api')\n }\n\n paradym.logger.debug('Resolved request', {\n result,\n })\n if (result.formattedSubmission.entries[0].isSatisfied) {\n const credential = result.formattedSubmission.entries[0].credentials.find(\n (c) => c.credential.record.id === request.selectedEntry.credentialId\n )\n if (!credential)\n throw new Error(\n `Could not find selected credential with id '${request.selectedEntry.credentialId}' in formatted submission`\n )\n\n // Update to only contain the already selected credential\n result.formattedSubmission.entries[0].credentials = [credential]\n }\n\n return {\n ...result,\n verifier: {\n ...result.verifier,\n hostName: getHostNameFromUrl(request.origin),\n },\n }\n}\n\nexport async function sendResponseForDcApi({\n paradym,\n resolvedRequest,\n dcRequest,\n fetchBatchCredentialCallback,\n}: {\n paradym: ParadymWalletSdk\n resolvedRequest: CredentialsForProofRequest\n dcRequest: DigitalCredentialsRequest\n\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n}) {\n const firstEntry = resolvedRequest.formattedSubmission.entries[0]\n if (!firstEntry.isSatisfied) {\n paradym.logger.debug('Expected one entry for DC API response', {\n resolvedRequest,\n dcRequest,\n })\n throw new Error('Expected one entry for DC API response')\n }\n\n const result = await shareProof({\n paradym,\n resolvedRequest,\n fetchBatchCredentialCallback,\n selectedCredentials: {\n [firstEntry.inputDescriptorId]: dcRequest.selectedEntry.credentialId,\n },\n })\n\n paradym.logger.debug('Sending response for Digital Credentials API', {\n result,\n })\n\n sendResponse({\n response: JSON.stringify(result.authorizationResponse),\n })\n}\n\nexport async function sendErrorResponseForDcApi(errorMessage: string) {\n sendErrorResponse({\n errorMessage,\n })\n}\n","import { CredoError } from '@credo-ts/core'\nimport { MediatorPickupStrategy } from '@credo-ts/didcomm'\nimport type { DidCommAgent } from '../agent'\n\n/**\n * Check whether a default mediator is configued\n */\nexport async function hasMediationConfigured(agent: DidCommAgent) {\n const mediationRecord = await agent.modules.mediationRecipient.findDefaultMediator()\n\n return mediationRecord !== null\n}\n\n/**\n * Create connection to mediator and request mediation.\n *\n * This connects based on a did\n */\nexport async function setupMediationWithDid(agent: DidCommAgent, mediatorDid: string) {\n // If the invitation is a did, the invitation id is the did\n const outOfBandRecord = await agent.modules.outOfBand.findByReceivedInvitationId(mediatorDid)\n let [connection] = outOfBandRecord ? await agent.modules.connections.findAllByOutOfBandId(outOfBandRecord.id) : []\n\n if (!connection) {\n agent.config.logger.debug('Mediation connection does not exist, creating connection')\n // We don't want to use the current default mediator when connecting to another mediator\n const routing = await agent.modules.mediationRecipient.getRouting({ useDefaultMediator: false })\n\n agent.config.logger.debug('Routing created', routing)\n const { connectionRecord: newConnection } = await agent.modules.outOfBand.receiveImplicitInvitation({\n did: mediatorDid,\n routing,\n })\n agent.config.logger.debug('Mediation invitation processed', { mediatorDid })\n\n if (!newConnection) {\n throw new CredoError('No connection record to provision mediation.')\n }\n\n connection = newConnection\n }\n\n const readyConnection = connection.isReady\n ? connection\n : await agent.modules.connections.returnWhenIsConnected(connection.id)\n\n return agent.modules.mediationRecipient.provision(readyConnection)\n}\n\n/**\n * Initiate message pickup from the mediator.\n */\nexport async function initiateMessagePickup(agent: DidCommAgent) {\n agent.config.logger.info('Initiating message pickup from mediator')\n\n // Iniate message pickup from the mediator. Passing no mediator, will use default mediator\n await agent.modules.mediationRecipient.initiateMessagePickup(undefined, MediatorPickupStrategy.Implicit)\n}\n\n/**\n * Stop message pickup from the mediator.\n */\nexport async function stopMessagePickup(agent: DidCommAgent) {\n agent.config.logger.info('Stopping message pickup from mediator')\n\n // Stop message pickup. Will stopp all message pickup, not just from the mediator\n await agent.modules.mediationRecipient.stopMessagePickup()\n}\n","import { useEffect } from 'react'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { initiateMessagePickup, stopMessagePickup } from '../didcomm/mediation'\n\n/**\n * Hook to enable message pickup from the mediator.\n *\n * You can use the `isEnabled` config property to enable/disable message pickup.\n * This is useful if e.g. there's no internet connection, or mediation has not been setup yet\n */\nexport function useDidCommMessagePickup({\n isEnabled = true,\n paradym,\n}: {\n isEnabled?: boolean\n paradym?: ParadymWalletSdk\n}) {\n useEffect(() => {\n // Do not pickup messages if not enabled\n if (!isEnabled || !paradym) return\n\n paradym.logger.debug('Initiating message pickup.')\n\n void initiateMessagePickup(paradym.agent)\n\n // Stop message pickup when component unmounts\n return () => {\n void stopMessagePickup(paradym.agent)\n }\n }, [isEnabled, paradym])\n}\n","import { useEffect, useState } from 'react'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { hasMediationConfigured, setupMediationWithDid } from '../didcomm/mediation'\nimport { ParadymWalletNoMediatorDidProvidedError } from '../error'\nimport { useDidCommMessagePickup } from './useDidCommMessagePickup'\n\nexport function useDidCommMediatorSetup({\n mediatorDid,\n paradym,\n}: {\n mediatorDid?: string\n paradym?: ParadymWalletSdk\n}) {\n const [isSettingUpMediation, setIsSettingUpMediation] = useState(false)\n const [isMediationConfigured, setIsMediationConfigured] = useState(false)\n\n // Enable message pickup when mediation is configured and internet connection is available\n useDidCommMessagePickup({\n isEnabled: isMediationConfigured,\n })\n\n useEffect(() => {\n if (!paradym) return\n if (isMediationConfigured) return\n if (isSettingUpMediation) return\n\n setIsSettingUpMediation(true)\n\n paradym.logger.debug('Checking if mediation is configured')\n\n void hasMediationConfigured(paradym.agent)\n .then(async (mediationConfigured) => {\n if (!mediationConfigured) {\n paradym.logger.debug('Mediation not configured yet')\n if (!mediatorDid) throw new ParadymWalletNoMediatorDidProvidedError()\n await setupMediationWithDid(paradym.agent, mediatorDid)\n }\n\n paradym.logger.info('Mediation configured')\n setIsMediationConfigured(true)\n })\n .finally(() => {\n setIsSettingUpMediation(false)\n })\n }, [isMediationConfigured, isSettingUpMediation, mediatorDid, paradym])\n\n return { isMediationConfigured, isSettingUpMediation }\n}\n","import { registerCredentialsForDcApi } from '../openid4vc/dcApi'\nimport {\n type SecureUnlockReturnInitializing,\n type SecureUnlockReturnLocked,\n type SecureUnlockReturnNotConfigured,\n type SecureUnlockReturnUnlocked,\n type SecureUnlockReturnWalletKeyAcquired,\n useSecureUnlock,\n} from '../secure'\nimport { useDidCommMediatorSetup } from './useDidCommMediatorSetup'\n\ntype ParadymLoadingState = SecureUnlockReturnInitializing /*{\n state: 'loading'\n}*/\n\ntype ParadymNotConfiguredState = SecureUnlockReturnNotConfigured /*{\n state: 'not-configured'\n setup: (pin: string) => Promise<void>\n reinitialize: () => void\n}*/\n\ntype ParadymAcquiredWalletKeyState = SecureUnlockReturnWalletKeyAcquired /*{\n state: 'acquired-wallet-key'\n unlockMethod: UnlockMethod\n unlock: (options?: { enableBiometrics: boolean }) => Promise<void>\n reinitialize: () => void\n}*/\n\ntype ParadymLockedState = SecureUnlockReturnLocked /*{\n state: 'locked'\n canTryUnlockingUsingBiometrics: boolean\n isUnlocking: boolean\n tryUnlockingUsingBiometrics: () => Promise<void>\n unlockUsingPin: (pin: string) => Promise<void>\n reinitialize: () => void\n}*/\n\ntype ParadymUnlockedState = SecureUnlockReturnUnlocked /*{\n state: 'unlocked'\n unlockMethod: UnlockMethod\n lock: () => Promise<void>\n paradym: ParadymWalletSdk\n reinitialize: () => void\n}*/\n\nexport type ParadymState =\n | ParadymLoadingState\n | ParadymNotConfiguredState\n | ParadymAcquiredWalletKeyState\n | ParadymLockedState\n | ParadymUnlockedState\n\nexport function useParadym(): ParadymState\nexport function useParadym(assertState: 'initializing'): ParadymLoadingState\nexport function useParadym(assertState: 'not-configured'): ParadymNotConfiguredState\nexport function useParadym(assertState: 'acquired-wallet-key'): ParadymAcquiredWalletKeyState\nexport function useParadym(assertState: 'locked'): ParadymLockedState\nexport function useParadym(assertState: 'unlocked'): ParadymUnlockedState\nexport function useParadym(assertState?: ParadymState['state']): ParadymState {\n const unlock = useSecureUnlock()\n\n useDidCommMediatorSetup({ paradym: unlock.state === 'unlocked' ? unlock.paradym : undefined })\n\n if (assertState && unlock.state !== assertState) {\n throw new Error(`Unlock state '${unlock.state}' did not match the asserted state of '${assertState}'`)\n }\n\n if (unlock.state === 'initializing') {\n return unlock\n }\n\n if (unlock.state === 'not-configured') {\n return unlock\n }\n\n if (unlock.state === 'acquired-wallet-key') {\n return unlock\n }\n\n if (unlock.state === 'locked') {\n return unlock\n }\n\n if (unlock.state === 'unlocked') {\n // When the state changes to unlocked, we register the credentials for the digital credentials API\n void registerCredentialsForDcApi(unlock.paradym.agent)\n return unlock\n }\n\n throw new Error(`Invalid unlock state: '${JSON.stringify(unlock)}'`)\n}\n","import { W3cCredentialRepository } from '@credo-ts/core'\nimport type { CredentialStateChangedEvent } from '@credo-ts/didcomm'\nimport { CredentialEventTypes, CredentialState } from '@credo-ts/didcomm'\nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { firstValueFrom } from 'rxjs'\nimport { filter, first, timeout } from 'rxjs/operators'\nimport type { DidCommAgent } from '../agent'\nimport {\n getDidCommCredentialExchangeDisplayMetadata,\n openIdCredentialMetadataFromDidCommCredentialExchangeMetadata,\n setOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { useAgent } from '../providers/AgentProvider'\nimport { useCredentialById } from '../providers/CredentialExchangeProvider'\nimport { addReceivedActivity } from '../storage/activities'\nimport { useParadym } from './useParadym'\n\ntype AcceptCredentialOptions = {\n storeAsActivity?: boolean\n}\n\ntype DeclineCredentialOptions = {\n deleteCredential?: boolean\n}\n\nfunction useOfferAttributes(credentialExchangeId: string) {\n const { agent } = useAgent<DidCommAgent>()\n\n const { data, status } = useQuery({\n queryKey: ['didCommCredentialOfferAttributes', credentialExchangeId],\n queryFn: async () => {\n const formatData = await agent.modules.credentials.getFormatData(credentialExchangeId)\n const offer = formatData.offer?.anoncreds ?? formatData.offer?.indy\n const offerAttributes = formatData.offerAttributes\n\n if (!offer || !offerAttributes) {\n throw new Error('Invalid credential offer')\n }\n\n return {\n attributes: Object.fromEntries(offerAttributes.map(({ name, value }) => [name, value])),\n schemaId: offer.schema_id,\n }\n },\n })\n\n return {\n data,\n status,\n }\n}\n\nexport function useDidCommCredentialActions(credentialExchangeId: string) {\n const { paradym } = useParadym('unlocked')\n\n const credentialExchange = useCredentialById(credentialExchangeId)\n const { data } = useOfferAttributes(credentialExchangeId)\n\n const { mutateAsync: acceptCredentialMutation, status: acceptStatus } = useMutation({\n mutationKey: ['acceptDidCommCredential', credentialExchangeId],\n mutationFn: async (options: AcceptCredentialOptions = { storeAsActivity: true }) => {\n if (!credentialExchange) return\n\n const credentialDone$ = paradym.agent.events\n .observable<CredentialStateChangedEvent>(CredentialEventTypes.CredentialStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.credentialRecord.id === credentialExchangeId &&\n [CredentialState.CredentialReceived, CredentialState.Done].includes(event.payload.credentialRecord.state)\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const credentialDonePromise = firstValueFrom(credentialDone$)\n\n await paradym.agent.modules.credentials.acceptOffer({ credentialRecordId: credentialExchangeId })\n const doneEvent = await credentialDonePromise\n\n const w3cCredentialRecordId = doneEvent.payload.credentialRecord.credentials.find(\n (c) => c.credentialRecordType === 'w3c'\n )?.credentialRecordId\n const didCommDisplayMetadata = getDidCommCredentialExchangeDisplayMetadata(doneEvent.payload.credentialRecord)\n\n // Update the w3c credential record metadata, based on the didcomm credential exchange display metadata\n if (w3cCredentialRecordId && didCommDisplayMetadata) {\n // NOTE: we store the metadata also in openid4vc format, just because it's simple. In the future\n // we may want to have our own display format we use for all credential types\n const w3cRecord = await paradym.agent.w3cCredentials.getCredentialRecordById(w3cCredentialRecordId)\n\n // TODO: we must somehow link the w3c credential record to a DIDComm connection\n // first in Paradym Wallet, but would alos be nice to do this within Credo\n setOpenId4VcCredentialMetadata(\n w3cRecord,\n openIdCredentialMetadataFromDidCommCredentialExchangeMetadata(\n doneEvent.payload.credentialRecord,\n didCommDisplayMetadata\n )\n )\n\n const w3cCredentialRepository = paradym.agent.dependencyManager.resolve(W3cCredentialRepository)\n await w3cCredentialRepository.update(paradym.agent.context, w3cRecord)\n\n if (options.storeAsActivity) {\n await addReceivedActivity(paradym, {\n entityId: credentialExchange?.connectionId,\n name: didcommDisplayMetadata?.issuerName ?? 'Unknown',\n logo: { url: didcommDisplayMetadata?.issuerLogoUri },\n backgroundColor: '#ffffff', // Default to a white background for now\n credentialIds: [`w3c-credential-${w3cRecord?.id}`],\n })\n }\n\n return w3cRecord\n }\n },\n })\n const { mutateAsync: declineCredentialMutation, status: declineStatus } = useMutation({\n mutationKey: ['declineDidCommCredential', credentialExchangeId],\n mutationFn: async (options: DeclineCredentialOptions = { deleteCredential: true }) => {\n if (!credentialExchange) return\n\n const credentialDone$ = paradym.agent.events\n .observable<CredentialStateChangedEvent>(CredentialEventTypes.CredentialStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.credentialRecord.id === credentialExchangeId &&\n event.payload.credentialRecord.state === CredentialState.Declined\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const credentialDonePromise = firstValueFrom(credentialDone$)\n\n await paradym.agent.modules.credentials.declineOffer(credentialExchangeId, {\n sendProblemReport: true,\n })\n\n if (options.deleteCredential) {\n await paradym.agent.modules.credentials.deleteById(credentialExchangeId)\n }\n\n await credentialDonePromise\n },\n })\n\n const didcommDisplayMetadata = credentialExchange\n ? getDidCommCredentialExchangeDisplayMetadata(credentialExchange)\n : undefined\n\n return {\n acceptCredential: (options?: AcceptCredentialOptions) => acceptCredentialMutation(options),\n declineCredential: (options?: DeclineCredentialOptions) => declineCredentialMutation(options),\n acceptStatus,\n declineStatus,\n credentialExchange,\n display: {\n issuer: {\n name: didcommDisplayMetadata?.issuerName,\n logo: {\n url: didcommDisplayMetadata?.issuerLogoUri,\n },\n },\n name: didcommDisplayMetadata?.credentialName,\n },\n attributes: data?.attributes,\n }\n}\n","import type {\n AnonCredsRequestedAttributeMatch,\n AnonCredsRequestedPredicateMatch,\n AnonCredsSelectedCredentials,\n} from '@credo-ts/anoncreds'\nimport { CredoError } from '@credo-ts/core'\nimport type { ProofStateChangedEvent } from '@credo-ts/didcomm'\nimport { ProofEventTypes, ProofState, V2RequestPresentationMessage } from '@credo-ts/didcomm'\nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { firstValueFrom } from 'rxjs'\nimport { filter, first, timeout } from 'rxjs/operators'\nimport { getCredentialForDisplay } from '../display/credential'\nimport type {\n FormattedSubmission,\n FormattedSubmissionEntry,\n FormattedSubmissionEntrySatisfiedCredential,\n} from '../format/submission'\nimport { useConnectionById } from '../providers/ConnectionProvider'\nimport { useProofById } from '../providers/ProofExchangeProvider'\nimport { addSharedActivityForSubmission } from '../storage/activities'\nimport { getCredential } from '../storage/credentials'\nimport type { NonEmptyArray } from '../types'\nimport { useParadym } from './useParadym'\n\ntype AcceptPresentationOptions = {\n selectedCredentials?: { [inputDescriptorId: string]: string }\n storeAsActivity?: boolean\n}\n\ntype DeclinePresentationOptions = {\n deletePresentation?: boolean\n storeAsActivity?: boolean\n}\n\nexport function useDidCommPresentationActions(proofExchangeId: string) {\n const { paradym } = useParadym('unlocked')\n\n const proofExchange = useProofById(proofExchangeId)\n const connection = useConnectionById(proofExchange?.connectionId ?? '')\n\n const { data } = useQuery({\n queryKey: ['didCommPresentationSubmission', proofExchangeId],\n queryFn: async () => {\n const formatData = await paradym.agent.modules.proofs.getFormatData(proofExchangeId)\n\n const proofRequest = formatData.request?.anoncreds ?? formatData.request?.indy\n\n const credentialsForRequest = await paradym.agent.modules.proofs.getCredentialsForRequest({\n proofRecordId: proofExchangeId,\n })\n\n const formatKey = formatData.request?.anoncreds !== undefined ? 'anoncreds' : 'indy'\n const anonCredsCredentials =\n credentialsForRequest.proofFormats.anoncreds ?? credentialsForRequest.proofFormats.indy\n if (!anonCredsCredentials || !proofRequest) {\n throw new CredoError('Invalid proof request.')\n }\n\n const entries = new Map<\n string,\n {\n groupNames: {\n attributes: string[]\n predicates: string[]\n }\n matches: Array<AnonCredsRequestedPredicateMatch>\n requestedAttributes: Set<string>\n }\n >()\n\n const mergeOrSetEntry = (\n type: 'attribute' | 'predicate',\n groupName: string,\n requestedAttributeNames: string[],\n matches: AnonCredsRequestedAttributeMatch[] | AnonCredsRequestedPredicateMatch[]\n ) => {\n // We create an entry hash. This way we can group all items that have the same credentials\n // available. If no credentials are available for a group, we create a entry hash based\n // on the group name\n const entryHash = groupName.includes('__CREDENTIAL__')\n ? groupName.split('__CREDENTIAL__')[0]\n : matches.length > 0\n ? matches\n .map((a) => a.credentialId)\n .sort()\n .join(',')\n : groupName\n\n const entry = entries.get(entryHash)\n\n if (!entry) {\n entries.set(entryHash, {\n groupNames: {\n attributes: type === 'attribute' ? [groupName] : [],\n predicates: type === 'predicate' ? [groupName] : [],\n },\n matches,\n requestedAttributes: new Set(requestedAttributeNames),\n })\n return\n }\n\n if (type === 'attribute') {\n entry.groupNames.attributes.push(groupName)\n } else {\n entry.groupNames.predicates.push(groupName)\n }\n\n entry.requestedAttributes = new Set([...requestedAttributeNames, ...entry.requestedAttributes])\n\n // We only include the matches which are present in both entries. If we use the __CREDENTIAL__ it means we can only use\n // credentials that match both (we want this in Paradym). For the other ones we create a 'hash' from all available credentialIds\n // first already, so it should give the same result.\n entry.matches = entry.matches.filter((match) =>\n matches.some((innerMatch) => match.credentialId === innerMatch.credentialId)\n )\n }\n\n for (const [groupName, attributeArray] of Object.entries(anonCredsCredentials.attributes)) {\n const requestedAttribute = proofRequest.requested_attributes[groupName]\n if (!requestedAttribute) throw new Error('Invalid presentation request')\n const requestedAttributesNames = requestedAttribute.names ?? [requestedAttribute.name as string]\n\n mergeOrSetEntry('attribute', groupName, requestedAttributesNames, attributeArray)\n }\n\n for (const [groupName, predicateArray] of Object.entries(anonCredsCredentials.predicates)) {\n const requestedPredicate = proofRequest.requested_predicates[groupName]\n if (!requestedPredicate) throw new Error('Invalid presentation request')\n\n mergeOrSetEntry('predicate', groupName, ['TODO'], predicateArray)\n }\n\n const entriesArray = await Promise.all(\n Array.from(entries.entries()).map(async ([entryHash, entry]): Promise<FormattedSubmissionEntry> => {\n if (entry.matches.length === 0) {\n return {\n inputDescriptorId: entryHash,\n isSatisfied: false,\n // TODO: we can fetch the schema name based on requirements\n name: 't(commonMessages.credential)',\n requestedAttributePaths: Array.from(entry.requestedAttributes).map((a) => [a]),\n }\n }\n\n const credentials = (await Promise.all(\n entry.matches.map(async (match): Promise<FormattedSubmissionEntrySatisfiedCredential> => {\n const credential = await getCredential(paradym.agent, `w3c-credential-${match.credentialId}`)\n const credentialForDisplay = getCredentialForDisplay(credential)\n\n const disclosedAttributesWithValues = Object.entries(credentialForDisplay.attributes)\n .filter(([key]) => entry.requestedAttributes.has(key))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})\n\n const disclosedPredicatesWithValues = Object.entries(anonCredsCredentials.predicates).reduce(\n (acc, [groupName]) => {\n const requestedPredicate = proofRequest.requested_predicates[groupName]\n return {\n ...acc,\n [requestedPredicate.name]: {\n type: requestedPredicate.p_type,\n value: requestedPredicate.p_value,\n },\n }\n },\n {}\n )\n\n return {\n credential: credentialForDisplay,\n disclosed: {\n attributes: {\n ...disclosedAttributesWithValues,\n ...disclosedPredicatesWithValues,\n },\n metadata: credentialForDisplay.metadata,\n paths: Array.from(entry.requestedAttributes).map((a) => [a]),\n },\n }\n })\n )) as NonEmptyArray<FormattedSubmissionEntrySatisfiedCredential>\n\n return {\n inputDescriptorId: entryHash,\n credentials,\n isSatisfied: true,\n name: credentials[0].credential.display.name,\n }\n })\n )\n const requestMessage = await paradym.agent.modules.proofs.findRequestMessage(proofExchangeId)\n const purpose =\n requestMessage?.comment ??\n (requestMessage instanceof V2RequestPresentationMessage ? requestMessage.goal : undefined)\n\n const submission: FormattedSubmission = {\n areAllSatisfied: entriesArray.every((entry) => entry.isSatisfied),\n entries: entriesArray,\n name: proofRequest?.name ?? 't(commonMessages.unknown)',\n purpose,\n }\n\n return { submission, formatKey, entries }\n },\n })\n\n const { mutateAsync: acceptMutateAsync, status: acceptStatus } = useMutation({\n mutationKey: ['acceptDidCommPresentation', proofExchangeId],\n mutationFn: async (options: AcceptPresentationOptions = { storeAsActivity: true }) => {\n try {\n let formatInput: { indy?: AnonCredsSelectedCredentials; anoncreds?: AnonCredsSelectedCredentials } | undefined =\n undefined\n\n if (options?.selectedCredentials && Object.keys(options.selectedCredentials).length > 0) {\n if (!data?.formatKey || !data.entries) throw new Error('Unable to accept presentation without credentials')\n\n const selectedAttributes: Record<string, AnonCredsRequestedAttributeMatch> = {}\n const selectedPredicates: Record<string, AnonCredsRequestedPredicateMatch> = {}\n\n for (const [inputDescriptorId, entry] of Array.from(data.entries.entries())) {\n const credentialId = options.selectedCredentials[inputDescriptorId]\n const match = entry.matches.find((match) => match.credentialId === credentialId) ?? entry.matches[0]\n\n for (const groupName of entry.groupNames.attributes) {\n selectedAttributes[groupName] = {\n ...match,\n revealed: true,\n }\n }\n\n for (const groupName of entry.groupNames.predicates) {\n selectedPredicates[groupName] = match\n }\n }\n\n formatInput = {\n [data.formatKey]: {\n attributes: selectedAttributes,\n predicates: selectedPredicates,\n selfAttestedAttributes: {},\n },\n }\n }\n\n const presentationDone$ = paradym.agent.events\n .observable<ProofStateChangedEvent>(ProofEventTypes.ProofStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.proofRecord.id === proofExchangeId &&\n [ProofState.PresentationSent, ProofState.Done].includes(event.payload.proofRecord.state)\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const presentationDonePromise = firstValueFrom(presentationDone$)\n await paradym.agent.modules.proofs.acceptRequest({\n proofRecordId: proofExchangeId,\n proofFormats: formatInput,\n })\n await presentationDonePromise\n\n if (options.storeAsActivity && data) {\n await addSharedActivityForSubmission(\n paradym,\n data.submission,\n {\n id: proofExchangeId,\n name: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n },\n 'success'\n )\n }\n } catch {\n if (options.storeAsActivity && data) {\n await addSharedActivityForSubmission(\n paradym,\n data.submission,\n {\n id: proofExchangeId,\n name: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n },\n 'failed'\n )\n }\n }\n },\n })\n\n const { mutateAsync: declineMutateAsync, status: declineStatus } = useMutation({\n mutationKey: ['declineDidCommPresentation', proofExchangeId],\n mutationFn: async (options: DeclinePresentationOptions = { deletePresentation: true, storeAsActivity: true }) => {\n const presentationDeclined$ = paradym.agent.events\n .observable<ProofStateChangedEvent>(ProofEventTypes.ProofStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.proofRecord.id === proofExchangeId &&\n [ProofState.Declined].includes(event.payload.proofRecord.state)\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const presentationDeclinePromise = firstValueFrom(presentationDeclined$)\n await paradym.agent.modules.proofs.declineRequest({ proofRecordId: proofExchangeId, sendProblemReport: true })\n await presentationDeclinePromise\n\n if (options.deletePresentation) {\n void paradym.agent.modules.proofs.deleteById(proofExchangeId)\n }\n\n if (options.storeAsActivity && data) {\n await addSharedActivityForSubmission(\n paradym,\n data.submission,\n {\n id: proofExchangeId,\n name: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n },\n 'stopped'\n )\n }\n },\n })\n\n return {\n acceptPresentation: (options?: AcceptPresentationOptions) => acceptMutateAsync(options),\n declinePresentation: (options?: DeclinePresentationOptions) => declineMutateAsync(options),\n acceptStatus,\n declineStatus,\n proofExchange,\n submission: data?.submission,\n verifierName: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n }\n}\n\n/**\n * Format requested predicate into string\n * @example `age greater than 18`\n *\n * @todo we could improve on this rendering, by e.g. recognizing dates in predicates (e.g. 20200101)\n */\n// function formatPredicate(t: typeof _t, requestedPredicate: AnonCredsRequestedPredicate) {\n// return `${requestedPredicate.name} ${t(predicateMessages[requestedPredicate.p_type])} ${requestedPredicate.p_value}`\n// }\n","import { type DidCommAgent, assertDidcommAgent } from '../agent'\nimport { useAgent } from '../providers/AgentProvider'\n\nexport const useDidCommAgent = () => {\n const { agent } = useAgent<DidCommAgent>()\n assertDidcommAgent(agent)\n return { agent }\n}\n","import { type OpenId4VcAgent, assertOpenId4VcAgent } from '../agent'\nimport { useAgent } from '../providers/AgentProvider'\n\nexport const useOpenId4VcAgent = () => {\n const { agent } = useAgent<OpenId4VcAgent>()\n assertOpenId4VcAgent(agent)\n return { agent }\n}\n","import { useMemo } from 'react'\nimport { useMdocRecords } from '../providers/MdocProvider'\nimport { useSdJwtVcRecords } from '../providers/SdJwtVcProvider'\nimport { useW3cCredentialRecords } from '../providers/W3cCredentialsProvider'\n\nexport const useCredentialRecords = () => {\n const { w3cCredentialRecords, isLoading: isLoadingW3c } = useW3cCredentialRecords()\n const { sdJwtVcRecords, isLoading: isLoadingSdJwt } = useSdJwtVcRecords()\n const { mdocRecords, isLoading: isLoadingMdoc } = useMdocRecords()\n\n const credentials = useMemo(() => {\n const allRecords = [...w3cCredentialRecords, ...mdocRecords, ...sdJwtVcRecords]\n\n // Sort by creation date\n const sortedRecords = allRecords.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n\n return sortedRecords\n }, [w3cCredentialRecords, sdJwtVcRecords, mdocRecords])\n\n return {\n credentials,\n isLoading: isLoadingSdJwt || isLoadingW3c || isLoadingMdoc,\n }\n}\n","import { useCredentialRecords } from './useCredentialRecords'\n\nexport const useCredentialRecordById = (id: string) => {\n const { isLoading, credentials } = useCredentialRecords()\n\n return {\n isLoading,\n credential: credentials.find((credential) => credential.id === id),\n }\n}\n","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn [decodeURIComponent(components.join(''))];\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher) || [];\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher) || [];\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","'use strict';\nmodule.exports = function (obj, predicate) {\n\tvar ret = {};\n\tvar keys = Object.keys(obj);\n\tvar isArr = Array.isArray(predicate);\n\n\tfor (var i = 0; i < keys.length; i++) {\n\t\tvar key = keys[i];\n\t\tvar val = obj[key];\n\n\t\tif (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n\t\t\tret[key] = val;\n\t\t}\n\t}\n\n\treturn ret;\n};\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\nconst filterObject = require('filter-obj');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nconst encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'colon-list-separator':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), ':list='].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), ':list=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\tcase 'bracket-separator': {\n\t\t\tconst keyValueSep = options.arrayFormat === 'bracket-separator' ?\n\t\t\t\t'[]=' :\n\t\t\t\t'=';\n\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\t// Translate null to an empty string so that it doesn't serialize as 'null'\n\t\t\t\tvalue = value === null ? '' : value;\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), keyValueSep, encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'colon-list-separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(:list)$/.exec(key);\n\t\t\t\tkey = key.replace(/:list$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n\t\t\t\tconst isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));\n\t\t\t\tvalue = isEncodedArray ? decode(value, options) : value;\n\t\t\t\tconst newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tcase 'bracket-separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = /(\\[\\])$/.test(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!isArray) {\n\t\t\t\t\taccumulator[key] = value ? decode(value, options) : value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst arrayValue = value === null ?\n\t\t\t\t\t[] :\n\t\t\t\t\tvalue.split(options.arrayFormatSeparator).map(item => decode(item, options));\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = arrayValue;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], arrayValue);\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(query, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof query !== 'string') {\n\t\treturn ret;\n\t}\n\n\tquery = query.trim().replace(/^[?#&]/, '');\n\n\tif (!query) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of query.split('&')) {\n\t\tif (param === '') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : ['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key])) ||\n\t\t(options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const key of Object.keys(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = object[key];\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length === 0 && options.arrayFormat === 'bracket-separator') {\n\t\t\t\treturn encode(key, options) + '[]';\n\t\t\t}\n\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (url, options) => {\n\toptions = Object.assign({\n\t\tdecode: true\n\t}, options);\n\n\tconst [url_, hash] = splitOnFirst(url, '#');\n\n\treturn Object.assign(\n\t\t{\n\t\t\turl: url_.split('?')[0] || '',\n\t\t\tquery: parse(extract(url), options)\n\t\t},\n\t\toptions && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}\n\t);\n};\n\nexports.stringifyUrl = (object, options) => {\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\t[encodeFragmentIdentifier]: true\n\t}, options);\n\n\tconst url = removeHash(object.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(object.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});\n\n\tconst query = Object.assign(parsedQueryFromUrl, object.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\tlet hash = getHash(object.url);\n\tif (object.fragmentIdentifier) {\n\t\thash = `#${options[encodeFragmentIdentifier] ? encode(object.fragmentIdentifier, options) : object.fragmentIdentifier}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n\nexports.pick = (input, filter, options) => {\n\toptions = Object.assign({\n\t\tparseFragmentIdentifier: true,\n\t\t[encodeFragmentIdentifier]: false\n\t}, options);\n\n\tconst {url, query, fragmentIdentifier} = exports.parseUrl(input, options);\n\treturn exports.stringifyUrl({\n\t\turl,\n\t\tquery: filterObject(query, filter),\n\t\tfragmentIdentifier\n\t}, options);\n};\n\nexports.exclude = (input, filter, options) => {\n\tconst exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);\n\n\treturn exports.pick(input, exclusionFilter, options);\n};\n","import type { DifPresentationExchangeDefinitionV2 } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { CredentialForDisplay } from '../display/credential'\nimport { formatDcqlCredentialsForRequest } from './dcqlRequest'\nimport { formatDifPexCredentialsForRequest } from './presentationExchangeRequest'\n\nexport interface FormattedSubmissionEntryNotSatisfied {\n /**\n * can be either:\n * - AnonCreds groupName\n * - PEX inputDescriptorId\n * - DCQL credential query id\n */\n inputDescriptorId: string\n\n name?: string\n description?: string\n\n /**\n * Whether the entry is satisfied\n */\n isSatisfied: false\n\n requestedAttributePaths: Array<Array<string | number | null>>\n}\n\nexport interface FormattedSubmissionEntrySatisfied {\n /**\n * can be either:\n * - AnonCreds groupName\n * - PEX inputDescriptorId\n * - DCQL credential query id\n */\n inputDescriptorId: string\n\n name?: string\n description?: string\n\n /**\n * Whether the entry is satisfied\n */\n isSatisfied: true\n\n /**\n * Credentials that match the request entry. Wallet always needs to pick one.\n */\n credentials: FormattedSubmissionEntrySatisfiedCredential[]\n}\n\nexport type FormattedSubmissionEntry = FormattedSubmissionEntryNotSatisfied | FormattedSubmissionEntrySatisfied\n\nexport interface FormattedSubmission {\n name?: string\n purpose?: string\n areAllSatisfied: boolean\n entries: FormattedSubmissionEntry[]\n}\n\nexport interface FormattedSubmissionEntrySatisfiedCredential {\n credential: CredentialForDisplay\n\n /**\n * If not present the whole credential will be disclosed\n */\n disclosed: {\n attributes: CredentialForDisplay['attributes']\n metadata: CredentialForDisplay['metadata']\n\n paths: string[][]\n }\n}\n\nexport function getFormattedSubmission(resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest) {\n if (resolvedAuthorizationRequest.presentationExchange) {\n return formatDifPexCredentialsForRequest(\n resolvedAuthorizationRequest.presentationExchange.credentialsForRequest,\n resolvedAuthorizationRequest.presentationExchange.definition as DifPresentationExchangeDefinitionV2\n )\n }\n\n if (resolvedAuthorizationRequest.dcql) {\n return formatDcqlCredentialsForRequest(resolvedAuthorizationRequest.dcql.queryResult)\n }\n\n throw new Error('No presentation exchange or dcql found in authorization request.')\n}\n","import type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { ParadymWalletInvitationNotRecognizedError, ParadymWalletInvitationRetrievalError } from '../error'\nimport { type InvitationResult, parseOpenIdPresentationRequestInvitation } from './parser'\n\nexport type FetchInvitationResult = InvitationResult\n\nexport async function fetchInvitationDataUrl(\n paradym: ParadymWalletSdk,\n dataUrl: string\n): Promise<FetchInvitationResult> {\n // If we haven't had a response after 10 seconds, we will handle as if the invitation is not valid.\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 10000)\n\n try {\n // If we still don't know what type of invitation it is, we assume it is a URL that we need to fetch to retrieve the invitation.\n const response = await fetch(dataUrl, {\n headers: {\n // for DIDComm out of band invitations we should include application/json\n // but we are flexible and also want to support other types of invitations\n // as e.g. the OpenID4VP request is a signed encoded JWT string\n Accept: 'application/json, text/plain, */*',\n },\n })\n clearTimeout(timeout)\n\n if (!response.ok) {\n throw new ParadymWalletInvitationRetrievalError()\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n const json: unknown = await response.json()\n return handleJsonResponse(json)\n }\n\n const text = await response.text()\n return handleTextResponse(paradym, text)\n } catch (error) {\n clearTimeout(timeout)\n throw new ParadymWalletInvitationRetrievalError()\n }\n}\n\n// TODO: what is the structure for didcomm?\nfunction handleJsonResponse(json: unknown): FetchInvitationResult {\n // We expect a JSON object\n if (!json || typeof json !== 'object' || Array.isArray(json)) {\n throw new ParadymWalletInvitationNotRecognizedError()\n }\n\n if ('@type' in json) {\n throw new ParadymWalletInvitationNotRecognizedError('not yet supported')\n }\n\n if ('credential_issuer' in json) {\n throw new ParadymWalletInvitationNotRecognizedError('not yet supported')\n }\n\n throw new ParadymWalletInvitationNotRecognizedError()\n}\n\nasync function handleTextResponse(paradym: ParadymWalletSdk, text: string): Promise<FetchInvitationResult> {\n // If the text starts with 'ey' we assume it's a JWT and thus an OpenID authorization request\n if (text.startsWith('ey')) {\n const { id, formattedSubmission } = await parseOpenIdPresentationRequestInvitation(paradym, text)\n return {\n __internal: {\n id,\n },\n openId4VcPresentationRequest: {\n formattedSubmission,\n },\n }\n }\n\n const json = JSON.parse(text)\n return handleJsonResponse(json)\n}\n","import { parseInvitationJson } from '@credo-ts/didcomm/build/util/parseInvitation'\nimport queryString from 'query-string'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { type CredentialForDisplay, getCredentialForDisplay } from '../display/credential'\nimport { ParadymWalletInvitationNotRecognizedError } from '../error'\nimport { type FormattedSubmission, getFormattedSubmission } from '../format/submission'\nimport { fetchInvitationDataUrl } from './fetch'\nimport {\n acquirePreAuthorizedAccessToken,\n receiveCredentialFromOpenId4VciOffer,\n resolveCredentialOffer,\n} from './resolver'\n\nexport type InvitationType = 'didcomm' | 'openid-credential-offer' | 'openid-authorization-request'\n\nexport type InvitationResult = {\n __internal: {\n id: string\n }\n didcomm?: {\n imageUrl?: string\n label?: string\n }\n openId4VcPresentationRequest?: {\n formattedSubmission: FormattedSubmission\n }\n openId4VcCredentialOffer?: {\n display: CredentialForDisplay\n }\n}\n\nexport enum InvitationQrTypes {\n OPENID_INITIATE_ISSUANCE = 'openid-initiate-issuance://',\n OPENID_CREDENTIAL_OFFER = 'openid-credential-offer://',\n OPENID4VP = 'openid4vp://',\n EUDI_OPENID4VP = 'eudi-openid4vp://',\n MDOC_OPENID4VP = 'mdoc-openid4vp://',\n OPENID_VC = 'openid-vc://',\n DIDCOMM = 'didcomm://',\n HTTPS = 'https://',\n HAIP = 'haip://',\n\n // TODO: this is included here, do want to allow for custom invitation types?\n EASY_PID = 'id.animo.ausweis:',\n}\n\nexport const isOpenIdCredentialOffer = (url: string) => {\n if (\n url.startsWith(InvitationQrTypes.OPENID_INITIATE_ISSUANCE) ||\n url.startsWith(InvitationQrTypes.OPENID_CREDENTIAL_OFFER)\n ) {\n return true\n }\n\n if (url.includes('credential_offer_uri=') || url.includes('credential_offer=')) {\n return true\n }\n\n return false\n}\n\nexport const isOpenIdPresentationRequest = (url: string) => {\n if (\n url.startsWith(InvitationQrTypes.OPENID_VC) ||\n url.startsWith(InvitationQrTypes.OPENID4VP) ||\n url.startsWith(InvitationQrTypes.EUDI_OPENID4VP) ||\n url.startsWith(InvitationQrTypes.MDOC_OPENID4VP)\n ) {\n return true\n }\n\n if (url.includes('request_uri=') || url.includes('request=')) {\n return true\n }\n\n return false\n}\n\nexport const isDidCommInvitation = (url: string) => {\n if (url.startsWith(InvitationQrTypes.DIDCOMM)) {\n return true\n }\n\n if (url.includes('c_i=') || url.includes('oob=') || url.includes('oobUrl=') || url.includes('d_m=')) {\n return true\n }\n\n return false\n}\n\nexport async function parseDidCommInvitation(paradym: ParadymWalletSdk, invitation: string | Record<string, unknown>) {\n if (typeof invitation === 'string') {\n const parsedUrl = queryString.parseUrl(invitation)\n const updatedInvitationUrl = (parsedUrl.query.oobUrl as string | undefined) ?? invitation\n\n // Try to parse the invitation as an DIDComm invitation.\n // We can't know for sure, as it could be a shortened URL to a DIDComm invitation.\n // So we use the parseMessage from credo and see if this returns a valid message.\n // Parse invitation supports legacy connection invitations, oob invitations, and\n // legacy connectionless invitations, and will all transform them into an OOB invitation.\n const parsedInvitation = await paradym.agent.modules.outOfBand.parseInvitation(updatedInvitationUrl)\n paradym.logger.debug(`Parsed didcomm invitation with id ${parsedInvitation.id}`)\n return parsedInvitation\n }\n return parseInvitationJson(invitation)\n}\n\nexport async function parseOpenIdCredentialOfferInvitation(paradym: ParadymWalletSdk, invitationUrl: string) {\n const { resolvedCredentialOffer } = await resolveCredentialOffer({\n paradym,\n offer: { uri: invitationUrl },\n })\n const tokenResponse = await acquirePreAuthorizedAccessToken({ agent: paradym.agent, resolvedCredentialOffer })\n const credentialResponses = await receiveCredentialFromOpenId4VciOffer({\n agent: paradym.agent,\n resolvedCredentialOffer,\n accessToken: tokenResponse,\n })\n\n const [{ credential }] = credentialResponses\n\n const display = getCredentialForDisplay(credential)\n\n return {\n id: credential.id,\n display,\n }\n}\n\nexport async function parseOpenIdPresentationRequestInvitation(paradym: ParadymWalletSdk, invitationUrl: string) {\n const resolved = await paradym.agent.modules.openId4VcHolder.resolveOpenId4VpAuthorizationRequest(invitationUrl)\n\n const formattedSubmission = getFormattedSubmission(resolved)\n\n // The output of this should be the input into the `shareProof` method\n\n return {\n id: 'TODO',\n formattedSubmission,\n }\n}\n\n// TODO(sdk): this, or another version of this method, cannot depend on the paradym instance for deeplink redirecting\nexport async function parseInvitationUrl(paradym: ParadymWalletSdk, invitationUrl: string): Promise<InvitationResult> {\n if (isOpenIdCredentialOffer(invitationUrl)) {\n const metadata = await parseOpenIdCredentialOfferInvitation(paradym, invitationUrl)\n\n return {\n __internal: { id: metadata.id },\n openId4VcCredentialOffer: {\n display: metadata.display,\n },\n }\n }\n\n if (isOpenIdPresentationRequest(invitationUrl)) {\n const { formattedSubmission, id } = await parseOpenIdPresentationRequestInvitation(paradym, invitationUrl)\n\n return {\n __internal: { id },\n openId4VcPresentationRequest: { formattedSubmission },\n }\n }\n\n if (isDidCommInvitation(invitationUrl)) {\n const outOfBandInvitation = await parseDidCommInvitation(paradym, invitationUrl)\n\n return {\n __internal: { id: outOfBandInvitation.id },\n didcomm: {\n imageUrl: outOfBandInvitation.imageUrl,\n label: outOfBandInvitation.label,\n },\n }\n }\n\n // If we can't detect the type of invitation from the URL, we will try to fetch the data from the URL\n // and see if we can detect if based on the response\n if (invitationUrl.startsWith('https://')) {\n return await fetchInvitationDataUrl(paradym, invitationUrl)\n }\n\n throw new ParadymWalletInvitationNotRecognizedError()\n}\n","import type {\n OpenId4VciRequestTokenResponse,\n OpenId4VciResolvedAuthorizationRequest,\n OpenId4VciResolvedCredentialOffer,\n} from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { getCredentialForDisplay } from '@paradym/wallet-sdk/display/credential'\nimport { receiveCredentialFromOpenId4VciOffer } from '@paradym/wallet-sdk/invitation/resolver'\n\nexport type RetrieveCredentialOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n tokenResponse: OpenId4VciRequestTokenResponse\n configurationId: string\n resolvedAuthorizationRequest?: OpenId4VciResolvedAuthorizationRequest\n\n // TODO(sdk): can we do this better?\n authorization?: {\n clientId: string\n redirectUri: string\n }\n}\n\nexport const retrieveCredentials = async (options: RetrieveCredentialOptions) => {\n const credentialResponses = await receiveCredentialFromOpenId4VciOffer({\n agent: options.paradym.agent,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n credentialConfigurationIdsToRequest: [options.configurationId],\n accessToken: options.tokenResponse,\n clientId: options.authorization ? options.authorization?.clientId : undefined,\n // Always request batch for non pid credentials\n requestBatch: true,\n })\n\n const credentialRecord = credentialResponses[0].credential\n return getCredentialForDisplay(credentialRecord)\n}\n","import type { OpenId4VciResolvedAuthorizationRequest, OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { retrieveCredentials } from './retrieveCredentials'\n\nexport type AcquireCredentialsAuthOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n resolvedAuthorizationRequest: OpenId4VciResolvedAuthorizationRequest\n authorization: {\n clientId: string\n redirectUri: string\n }\n authorizationCode: string\n}\n\nexport const acquireCredentialsAuth = async (options: AcquireCredentialsAuthOptions) => {\n const configurationId = Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n\n const tokenResponse = await options.paradym.agent.modules.openId4VcHolder.requestToken({\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n redirectUri: options.authorization.redirectUri,\n code: options.authorizationCode,\n clientId: options.authorization.clientId,\n codeVerifier:\n 'codeVerifier' in options.resolvedAuthorizationRequest\n ? options.resolvedAuthorizationRequest.codeVerifier\n : undefined,\n })\n\n const credential = await retrieveCredentials({\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n authorization: options.authorization,\n paradym: options.paradym,\n configurationId,\n tokenResponse,\n resolvedAuthorizationRequest: options.resolvedAuthorizationRequest,\n })\n\n return credential\n}\n","import { shareProof } from '@paradym/wallet-sdk/invitation/shareProof'\nimport type { FetchBatchCredentialCallback } from '../batch'\nimport type { CredentialsForProofRequest } from '../getCredentialsForProofRequest'\nimport { type AcquireCredentialsAuthOptions, acquireCredentialsAuth } from './acquireCredentialsAuth'\n\nexport type AcquireCredentialsAuthPresentationDuringIssuanceOptions = Omit<\n AcquireCredentialsAuthOptions,\n 'authorizationCode'\n> & {\n credentialsForRequest: CredentialsForProofRequest\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n}\n\nexport const acquireCredentialsAuthPresentationDuringIssuance = async (\n options: AcquireCredentialsAuthPresentationDuringIssuanceOptions\n) => {\n const { presentationDuringIssuanceSession } = await shareProof({\n paradym: options.paradym,\n resolvedRequest: options.credentialsForRequest,\n selectedCredentials: {},\n fetchBatchCredentialCallback: options.fetchBatchCredentialCallback,\n })\n\n if (!('authSession' in options.resolvedAuthorizationRequest)) {\n throw new Error('Auth session is not available in the resolved authorization request')\n }\n\n const { authorizationCode } =\n await options.paradym.agent.modules.openId4VcHolder.retrieveAuthorizationCodeUsingPresentation({\n authSession: options.resolvedAuthorizationRequest.authSession,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n presentationDuringIssuanceSession,\n })\n\n return await acquireCredentialsAuth({ ...options, authorizationCode })\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { acquirePreAuthorizedAccessToken } from '@paradym/wallet-sdk/invitation/resolver'\nimport { retrieveCredentials } from './retrieveCredentials'\n\nexport type AcquireCredentialsPreAuthOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n}\n\nexport const acquireCredentialsPreAuth = async (options: AcquireCredentialsPreAuthOptions) => {\n // We want the first supported configuration id\n // TODO: handle empty configuration ids\n const configurationId = options.resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n\n if (!configurationId) {\n throw new Error('Could not establish the configuration id')\n }\n\n const tokenResponse = await acquirePreAuthorizedAccessToken({\n agent: options.paradym.agent,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n })\n\n return await retrieveCredentials({\n paradym: options.paradym,\n tokenResponse,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n configurationId,\n })\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { acquirePreAuthorizedAccessToken } from '@paradym/wallet-sdk/invitation/resolver'\nimport { retrieveCredentials } from './retrieveCredentials'\n\nexport type AcquireCredentialsPreAuthWithTransactionCodeOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n transactionCode: string\n}\n\nexport const acquireCredentialsPreAuthWithTransactionCode = async (\n options: AcquireCredentialsPreAuthWithTransactionCodeOptions\n) => {\n // We want the first supported configuration id\n // TODO: handle empty configuration ids\n const configurationId = options.resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n\n if (!configurationId) {\n throw new Error('Could not establish the configuration id')\n }\n\n const tokenResponse = await acquirePreAuthorizedAccessToken({\n agent: options.paradym.agent,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n })\n\n return await retrieveCredentials({\n paradym: options.paradym,\n tokenResponse,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n configurationId,\n })\n}\n","import type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { type AcquireCredentialsAuthOptions, acquireCredentialsAuth } from './acquireCredentialsAuth'\nimport {\n type AcquireCredentialsAuthPresentationDuringIssuanceOptions,\n acquireCredentialsAuthPresentationDuringIssuance,\n} from './acquireCredentialsAuthPresentationDuringIssuance'\nimport { type AcquireCredentialsPreAuthOptions, acquireCredentialsPreAuth } from './acquireCredentialsPreAuth'\nimport {\n type AcquireCredentialsPreAuthWithTransactionCodeOptions,\n acquireCredentialsPreAuthWithTransactionCode,\n} from './acquireCredentialsPreAuthWithTransactionCode'\n\nexport type AcquireCredentialsOptions = { paradym: ParadymWalletSdk } & (\n | AcquireCredentialsPreAuthWithTransactionCodeOptions\n | AcquireCredentialsPreAuthOptions\n | AcquireCredentialsAuthOptions\n | AcquireCredentialsAuthPresentationDuringIssuanceOptions\n)\n\nexport const acquireCredentials = async (options: AcquireCredentialsOptions) => {\n if ('transactionCode' in options) {\n return await acquireCredentialsPreAuthWithTransactionCode(options)\n }\n\n if ('credentialsForRequest' in options) {\n return await acquireCredentialsAuthPresentationDuringIssuance(options)\n }\n\n if ('authorizationCode' in options) {\n return await acquireCredentialsAuth(options)\n }\n\n return await acquireCredentialsPreAuth(options)\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport { getCredentialDisplayWithDefaults } from '@paradym/wallet-sdk/display/common'\nimport { getCredentialForDisplayId } from '@paradym/wallet-sdk/display/credential'\nimport { getOpenId4VcCredentialDisplay } from '@paradym/wallet-sdk/display/openid4vc'\nimport { extractOpenId4VcCredentialMetadata } from '@paradym/wallet-sdk/metadata/credentials'\nimport type { ParadymWalletSdk } from '../../ParadymWalletSdk'\nimport { addReceivedActivity } from '../../storage/activities'\nimport { type CredentialRecord, storeCredential } from '../../storage/credentials'\n\nexport type CompleteCredentialRetrievalOptions = {\n paradym: ParadymWalletSdk\n record: CredentialRecord\n resolvedCredentialOffer?: OpenId4VciResolvedCredentialOffer\n}\n\nexport const completeCredentialRetrieval = async (options: CompleteCredentialRetrievalOptions) => {\n const credentialDisplayId = getCredentialForDisplayId(options.record)\n\n // We want the first supported configuration id\n // TODO(sdk): handle empty configuration ids\n const configurationId = options.resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n const configuration = configurationId\n ? options.resolvedCredentialOffer?.offeredCredentialConfigurations[configurationId]\n : undefined\n\n const issuerMetadata = options.resolvedCredentialOffer?.metadata.credentialIssuer\n\n const credentialDisplay = getCredentialDisplayWithDefaults(\n configuration && issuerMetadata\n ? getOpenId4VcCredentialDisplay(\n extractOpenId4VcCredentialMetadata(configuration, {\n display: issuerMetadata?.display,\n id: issuerMetadata?.credential_issuer,\n })\n )\n : {}\n )\n\n await storeCredential(options.paradym, options.record)\n await addReceivedActivity(options.paradym, {\n // FIXME: Should probably be the `iss`, but then we can't show it before we retrieved\n // the credential. Signed issuer metadata is the solution.\n entityId: options.resolvedCredentialOffer?.metadata.credentialIssuer.credential_issuer,\n host: credentialDisplay.issuer.domain,\n name: credentialDisplay.issuer.name,\n logo: credentialDisplay.issuer.logo,\n backgroundColor: '#ffffff', // Default to a white background for now\n credentialIds: [credentialDisplayId],\n })\n}\n","import { WalletInvalidKeyError } from '@credo-ts/core'\nimport { agentDependencies } from '@credo-ts/react-native'\nimport type { PropsWithChildren } from 'react'\nimport { type FullAgent, type SetupAgentOptions, setupAgent } from './agent'\nimport type { CredentialForDisplayId } from './display/credential'\nimport { ParadymWalletMustBeInitializedError } from './error'\nimport { useParadym } from './hooks'\nimport { useActivities } from './hooks/useActivities'\nimport { useActivityById } from './hooks/useActivityById'\nimport { useCredentialByCategory } from './hooks/useCredentialByCategory'\nimport { useCredentialById } from './hooks/useCredentialById'\nimport { useCredentialRecordById } from './hooks/useCredentialRecordById'\nimport { useCredentialRecords } from './hooks/useCredentialRecords'\nimport { useCredentials } from './hooks/useCredentials'\nimport { useDidCommConnectionActions } from './hooks/useDidCommConnectionActions'\nimport { useDidCommCredentialActions } from './hooks/useDidCommCredentialActions'\nimport { useDidCommPresentationActions } from './hooks/useDidCommPresentationActions'\nimport { useDidCommAgent } from './hooks/useDidcommAgent'\nimport { useOpenId4VcAgent } from './hooks/useOpenId4VcAgent'\nimport { type InvitationResult, parseDidCommInvitation, parseInvitationUrl } from './invitation/parser'\nimport {\n type ResolveCredentialOfferOptions,\n type ResolveOutOfBandInvitationResult,\n resolveCredentialOffer,\n resolveOutOfBandInvitation,\n} from './invitation/resolver'\nimport type { ParadymWalletSdkLogger } from './logger'\nimport { type AcquireCredentialsOptions, acquireCredentials } from './openid4vc/func/acquireCredentials'\nimport {\n type CompleteCredentialRetrievalOptions,\n completeCredentialRetrieval,\n} from './openid4vc/func/completeCredentialRetrieval'\nimport { AgentProvider, useAgent } from './providers/AgentProvider'\nimport { SecureUnlockProvider, secureWalletKey } from './secure'\nimport { type CredentialRecord, deleteCredential, storeCredential } from './storage/credentials'\nimport type { TrustMechanismConfiguration } from './trust/trustMechanism'\nimport type { DistributedOmit } from './types'\n\nexport type ParadymWalletSdkResult<T extends Record<string, unknown> = Record<string, unknown>> =\n | ({ success: true } & T)\n | { success: false; message: string }\n\nexport type ParadymWalletSdkOptions = SetupAgentOptions & {\n /**\n *\n * Trust mechanisms supported by the wallet\n *\n * The order matters. The first index will be tried first, until the last\n *\n * When one is found that works, it will be used\n *\n */\n // TODO(sdk): this will get more complex, as eudi_rp_auth needs more configuration\n trustMechanisms: TrustMechanismConfiguration[]\n}\n\nexport type SetupParadymWalletSdkOptions = Omit<ParadymWalletSdkOptions, 'key'>\n\nexport class ParadymWalletSdk {\n public trustMechanisms: TrustMechanismConfiguration[]\n public readonly agent: FullAgent\n\n public constructor(options: ParadymWalletSdkOptions) {\n this.agent = setupAgent(options) as FullAgent\n this.trustMechanisms = options.trustMechanisms\n }\n\n private assertAgentIsInitialized() {\n if (!this.agent.isInitialized) throw new ParadymWalletMustBeInitializedError()\n }\n\n public get walletId() {\n return this.agent.config.walletConfig?.id\n }\n\n public async reset() {\n this.logger.debug('Resetting wallet')\n\n await this.agent.wallet.delete()\n await this.agent.shutdown()\n\n const fs = new agentDependencies.FileSystem()\n\n // Clear cach and temp path\n if (await fs.exists(fs.cachePath)) await fs.delete(fs.cachePath)\n if (await fs.exists(fs.tempPath)) await fs.delete(fs.tempPath)\n\n const walletDirectory = `${fs.dataPath}/wallet/${this.walletId}`\n\n const walletDirectoryExists = await fs.exists(walletDirectory)\n if (walletDirectoryExists) {\n console.log('wallet directory exists, deleting')\n await fs.delete(walletDirectory)\n } else {\n console.log('wallet directory does not exist')\n }\n\n // I think removing triggers the biometrics somehow. We look at the salt\n // to see if the secure unlock has been setup.\n // await secureWalletKey.removeWalletKey(secureWalletKey.getWalletKeyVersion())\n await secureWalletKey.removeSalt(secureWalletKey.getWalletKeyVersion())\n }\n\n /**\n *\n * Initialized the wallet sdk and sets everything up for usage\n *\n */\n public async initialize(): Promise<ParadymWalletSdkResult> {\n try {\n await this.agent.initialize()\n return { success: true }\n } catch (e) {\n if (e instanceof WalletInvalidKeyError) {\n return { success: false, message: 'Invalid key' }\n }\n return { success: false, message: (e as Error).message }\n }\n }\n\n /**\n *\n * Shutsdown the agent and closes the wallet\n *\n */\n public async shutdown() {\n await this.agent.shutdown()\n }\n\n /**\n *\n * Paradym logger\n *\n * defaults to a console logger\n *\n */\n public get logger() {\n return this.agent.config.logger as ParadymWalletSdkLogger\n }\n\n /**\n *\n * All available hooks provided by the wallet SDK\n *\n */\n public get hooks() {\n this.assertAgentIsInitialized()\n\n return {\n useCredentials,\n useCredentialById,\n useCredentialByCategory,\n\n useActivities,\n useActivityById,\n\n // TODO: these are quite different than the openid4vc way\n // do we want to keep it like this or make them more consistent?\n useDidCommConnectionActions,\n useDidCommCredentialActions,\n useDidCommPresentationActions,\n }\n }\n\n /**\n *\n * Unstable hooks that can be used for more low-level functionality\n *\n * It is generally recommended to see if the desired output can be reached with `ParadymWalletSdk.hooks` first\n *\n */\n public get internalHooks() {\n this.assertAgentIsInitialized()\n\n return {\n useAgent,\n useDidCommAgent,\n useOpenId4VcAgent,\n useCredentialRecords,\n useCredentialRecordById,\n }\n }\n\n /**\n *\n * Provider for the WalletSdk\n *\n * Wrap your application in this, if you want to leverage the provided `this.hooks`\n *\n * @todo(sdk) New name for this provider\n *\n */\n public static UnlockProvider({\n children,\n configuration,\n }: PropsWithChildren<{ configuration: SetupParadymWalletSdkOptions }>) {\n return <SecureUnlockProvider configuration={configuration}>{children}</SecureUnlockProvider>\n }\n\n /**\n *\n * @todo(sdk) New name for this provider\n *\n */\n public static AppProvider({ children, recordIds }: PropsWithChildren<{ recordIds: string[] }>) {\n const { paradym } = useParadym('unlocked')\n\n return (\n <AgentProvider agent={paradym.agent} recordIds={recordIds}>\n {children}\n </AgentProvider>\n )\n }\n\n public async receiveInvitation(\n invitationUrl: string\n ): Promise<ParadymWalletSdkResult<Omit<InvitationResult, '__internal'>>> {\n this.assertAgentIsInitialized()\n\n try {\n const invitationResult = await parseInvitationUrl(this, invitationUrl)\n return { success: true, ...invitationResult }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : (error as string),\n }\n }\n }\n\n /**\n *\n * @todo how do we want to deal with didcomm proofs and credentials?\n *\n */\n public get credentials() {\n return {\n delete: this.deleteCredentials,\n store: this.storeCredential,\n }\n }\n\n private async deleteCredentials(\n ids: CredentialForDisplayId | Array<CredentialForDisplayId>\n ): Promise<ParadymWalletSdkResult> {\n try {\n const deleteCredentials = (Array.isArray(ids) ? ids : [ids]).map((id) => deleteCredential(this.agent, id))\n await Promise.all(deleteCredentials)\n return { success: true }\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : (error as string) }\n }\n }\n\n private async storeCredential(record: CredentialRecord): Promise<ParadymWalletSdkResult> {\n try {\n await storeCredential(this, record)\n return { success: true }\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : (error as string) }\n }\n }\n\n public async resolveDidCommInvitation(\n invitation: string | Record<string, unknown>\n ): Promise<ParadymWalletSdkResult<ResolveOutOfBandInvitationResult>> {\n try {\n const parsedInvitation = await parseDidCommInvitation(this, invitation)\n return { success: true, ...(await resolveOutOfBandInvitation(this.agent, parsedInvitation)) }\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : `${error}` }\n }\n }\n\n public get openid4vc() {\n return {\n resolveCredentialOffer: (options: Omit<ResolveCredentialOfferOptions, 'paradym'>) =>\n resolveCredentialOffer({ ...options, paradym: this }),\n\n acquireCredentials: (options: DistributedOmit<AcquireCredentialsOptions, 'paradym'>) =>\n acquireCredentials({ ...options, paradym: this }),\n\n completeCredentialRetrieval: (options: Omit<CompleteCredentialRetrievalOptions, 'paradym'>) =>\n completeCredentialRetrieval({ ...options, paradym: this }),\n }\n }\n}\n"],"x_google_ignoreList":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,105,106,107,108,109,110,111,112,113,114,115,116,117,118,134,135,136,137,138],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAM,qBAAqB,UAAoB,MAAM,KAAK,SAAS,SAAS,KAAK,GAAG;AAEpF,MAAa,iBAAiB;CAE5B;CAKA;CAKA,GAAG,kBAAkB;EAAC;EAAI;EAAI;EAAI;EAAI;EAAG;EAAG;EAAE,CAAC;CAChD;AAED,MAAa,qBAAqB;CAEhC;CAIA;CAKA,GAAG,kBAAkB;EAAC;EAAI;EAAG;EAAG;EAAG;EAAI;EAAI;EAAG;EAAG,CAAC;CAElD;CACD;;;;AC7BD,IAAa,wBAAb,cAA2C,MAAM;CAC/C,YAAY,UAAkB,IAAI,OAAO,MAAM;AAC7C,QAAM,QAAQ;;;AAIlB,IAAa,uCAAb,cAA0D,sBAAsB;AAChF,IAAa,yCAAb,cAA4D,sBAAsB;AAClF,IAAa,sCAAb,cAAyD,sBAAsB;AAE/E,IAAa,oDAAb,cAAuE,sBAAsB;AAE7F,IAAa,0CAAb,cAA6D,sBAAsB;AAEnF,IAAa,+BAAb,cAAkD,sBAAsB;AACxE,IAAa,sCAAb,cAAyD,6BAA6B;AACtF,IAAa,+CAAb,cAAkE,6BAA6B;AAC/F,IAAa,4CAAb,cAA+D,6BAA6B;AAC5F,IAAa,oCAAb,cAAuD,6BAA6B;AACpF,IAAa,wCAAb,cAA2D,6BAA6B;AAExF,IAAa,0CAAb,cAA6D,6BAA6B;AAC1F,IAAa,yDAAb,cAA4E,6BAA6B;AAIzG,IAAa,uCAAb,cAA0D,6BAA6B;AAKvF,IAAa,4CAAb,MAAa,kDAAkD,sBAAsB;CACnF,OAAc,kBAAkB,OAAkE;AAChG,MAAI,mDAAmD,wCAAwC,MAAM,CACnG,QAAO,IAAI,2CAA2C;AAGxD,MAAI,oDAAoD,yCAAyC,MAAM,CACrG,QAAO,IAAI,2CAA2C;AAGxD,SAAO;;;AAKX,IAAa,qDAAb,cAAwE,0CAA0C;CAChH,OAAc,wCAAwC,OAAgB;AACpE,SAAO,iBAAiB,SAAS,eAAe,MAAM,MAAM,MAAM,QAAQ,aAAa,CAAC,SAAS,EAAE,CAAC;;;AAKxG,IAAa,sDAAb,cAAyE,0CAA0C;CACjH,OAAc,yCAAyC,OAAgB;AACrE,SAAO,iBAAiB,SAAS,mBAAmB,MAAM,MAAM,MAAM,QAAQ,aAAa,CAAC,SAAS,EAAE,CAAC;;;;;;AClD5G,IAAa,yBAAb,cAA4C,cAAc;;;wBACjB,EAAE;6BACX;;CAE9B,AAAO,oBAAoB,eAAe,KAAM;AAC9C,OAAK,sBAAsB;;CAG7B,AAAO,sBAAsB;AAC3B,OAAK,iBAAiB,EAAE;;CAG1B,AAAO,6BAA6B;AAClC,OAAK,sBAAsB;AAC3B,OAAK,iBAAiB,EAAE;;CAG1B,IAAW,wBAAwB;AACjC,SAAO,KAAK,UAAU,KAAK,eAAe;;CAG5C,AAAQ,oBAAoB,OAAiB,SAAiB,MAAgB;AAC5E,MAAI,KAAK,wBAAwB,EAAG;AACpC,MAAI,KAAK,eAAe,UAAU,KAAK,oBAAqB,MAAK,eAAe,OAAO;AACvF,OAAK,eAAe,KAAK;GACvB;GACA;GACA;GACD,CAAC;;CAGJ,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,oBAAoB,SAAS,OAAO,SAAS,KAAK;AACvD,QAAM,MAAM,SAAS,KAAK;;CAE5B,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,oBAAoB,SAAS,OAAO,SAAS,KAAK;AACvD,QAAM,MAAM,SAAS,KAAK;;CAE5B,AAAO,KAAK,SAAiB,MAAsB;AACjD,MAAI,QAAQ,SAAS,yBAAyB,CAAE;AAChD,OAAK,oBAAoB,SAAS,MAAM,SAAS,KAAK;AACtD,QAAM,KAAK,SAAS,KAAK;;CAE3B,AAAO,KAAK,SAAiB,MAAsB;AACjD,OAAK,oBAAoB,SAAS,MAAM,SAAS,KAAK;AACtD,QAAM,KAAK,SAAS,KAAK;;CAE3B,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,oBAAoB,SAAS,OAAO,SAAS,KAAK;AACvD,QAAM,MAAM,SAAS,KAAK;;CAE5B,AAAO,MAAM,SAAiB,MAAsB;AAClD,OAAK,oBAAoB,SAAS,OAAO,SAAS,KAAK;AACvD,QAAM,MAAM,SAAS,KAAK;;;AAI9B,MAAa,UAAU,WAAqB,SAAS,SAAS,IAAI,uBAAuB,SAAS;;;;ACjElG,IAAa,gBAAb,cAAmC,MAAM;CAGvC,AAAO,YAAY,SAAiB,UAAmE,EAAE,EAAE;AACzG,QAAM,SAAS,QAAQ;AACvB,OAAK,SAAS,QAAQ,UAAU;;;;;;ACLpC,IAAa,oBAAb,cAAuC,MAAM;;;;;;;;;;;;;ACW7C,MAAM,SAAS,OAAO,KAAa,SAAkC;CAGnE,MAAM,EAAE,YAAY,MAAM,OAAO,KAAK,MAAM;EAC1C,YAAY;EACZ,MAAM;EACN,aAAa;EACb,YAAY;EACZ,QAAQ,KAAK;EACd,CAAC;AAEF,QAAO;;;;;;;;AAST,MAAM,qBAAqB,OAAO,gBAAgB,IAAI,WAAW,GAAG,CAAC,CAAC,KAAK,GAAG;;;;;;;AAQ9E,MAAa,MAAM;CAAE;CAAQ;CAAc;;;;;;;;;AC5B3C,eAAsB,kBAAkB,IAAY,OAAe,SAAyC;AAa1G,KAAI,CAZW,MAAM,SAAS,mBAAmB,IAAI,OAAO;EAC1D,GAAG;EACH,SAAS;EACV,CAAC,CAAC,OAAO,UAAU;AAClB,QACE,0CAA0C,kBAAkB,MAAM,IAClE,IAAI,cAAc,+BAA+B,GAAG,gBAAgB,EAClE,OAAO,OACR,CAAC;GAEJ,CAGA,OAAM,IAAI,cAAc,+BAA+B,GAAG,eAAe;;;;;;;;;AAW7E,eAAsB,oBAAoB,IAAY,SAAkD;CACtG,MAAM,SAAS,MAAM,SAAS,mBAAmB;EAC/C,GAAG;EACH,SAAS;EACV,CAAC,CAAC,OAAO,UAAU;AAClB,QACE,0CAA0C,kBAAkB,MAAM,IAClE,IAAI,cAAc,mCAAmC,GAAG,kBAAkB;GACxE,OAAO;GACP,QAAQ;GACT,CAAC;GAEJ;AAEF,KAAI,CAAC,OACH,QAAO;AAGT,QAAO,OAAO;;;;;;;;AAShB,eAAsB,uBAAuB,IAAY,SAA4C;AAUnG,QATe,MAAM,SAAS,qBAAqB;EACjD,GAAG;EACH,SAAS;EACV,CAAC,CAAC,OAAO,UAAU;AAClB,QAAM,IAAI,cAAc,iCAAiC,GAAG,kBAAkB,EAC5E,OAAO,OACR,CAAC;GACF;;;;;ACnEJ,MAAMA,uBAAwC,EAE5C,YAAY,SAAS,WAAW,gCACjC;AAED,MAAM,WAAW,YAAoB,uBAAuB;;;;;;AAO5D,eAAe,UAAU,MAAc,SAAgC;AAGrE,OAAM,kBAFS,QAAQ,QAAQ,EAEC,MAAM,qBAAqB;;;;;;;;AAS7D,eAAe,QAAQ,SAAyC;AAM9D,QAFa,MAAM,oBAHJ,QAAQ,QAAQ,EAGgB,qBAAqB;;AAQtE,eAAe,mBAAmB,gBAAyB,SAAiB;AAC1E,KAAI,gBAAgB;EAClB,MAAM,eAAe,MAAM,QAAQ,QAAQ;AAC3C,MAAI,aAAc,QAAO;;CAG3B,MAAM,OAAO,IAAI,cAAc;AAC/B,OAAM,UAAU,MAAM,QAAQ;AAE9B,QAAO;;AAGT,eAAe,WAAW,SAAiB;AAEzC,QAAO,MAAM,uBADE,QAAQ,QAAQ,EACa,qBAAqB;;AAGnE,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACD;;;;AC1DD,MAAMC,4BAA6C;CAEjD,eAAe,SAAS,eAAe;CAKvC,YAAY,SAAS,WAAW;CAGhC,sBAAsB;EACpB,OAAO;EACP,aAAa;EACd;CAGD,eAAe,SAAS,eAAe;CAGvC,SAAS,SAAS,aAAa;CAG/B,oBAAoB,SAAS,oBAAoB;CAClD;AAED,MAAM,iBAAiB,YAAoB,sBAAsB;;;;;AAMjE,eAAe,gCAAkD;AAC/D,KAAI,SAAS,OAAO,WAAW;;;;;;;AAO7B,MAAI,SAAS,UAAU,GACrB,QAAO;;;;EAMT,MAAM,gBAAgB,MAAM,SAAS,iBAAiB,0BAA0B;AAChF,MAAI,CAAC,iBAAiB,kBAAkB,SAAS,eAAe,gBAC9D,QAAO;;AAIX,KAAI,SAAS,OAAO,OAKlB;MAAI,CADyB,MAAM,SAAS,uBAAuB,0BAA0B,CAClE,QAAO;;;;;AAQpC,QAL8B,MAAM,SAAS,yBAAyB,0BAA0B,KAK/D;;;;;;;;;;AAWnC,eAAe,eAAe,WAAmB,SAAgC;AAE/E,OAAM,kBADc,cAAc,QAAQ,EACL,WAAW,0BAA0B;;;;;;;;AAS5E,eAAe,4BAA4B,SAAyC;AAElF,QAAO,MAAM,oBADO,cAAc,QAAQ,EACI,0BAA0B;;;;;;;;AAS1E,eAAe,gBAAgB,SAAmC;AAEhE,QAAO,MAAM,uBADO,cAAc,QAAQ,EACO,0BAA0B;;AAG7E,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACD;;;;ACxGD,MAAM,OAAO,IAAI,MAAM;AAEvB,eAAe,qBAAqB,KAAa,SAAiB;CAChE,MAAM,OAAO,MAAM,mBAAmB,QAAQ,QAAQ;AACtD,KAAI,CAAC,KACH,OAAM,IAAI,kBAAkB,6CAA6C;CAG3E,MAAM,gBAAgB,MAAM,IAAI,OAAO,KAAK,KAAK;AAMjD,QAFkB,MAAM,oBAAoB,EAAE,MAAM,kBAAkB,WAAW,cAAc,EAAE,CAAC;;AASpG,SAAgB,sBAAsB;AACpC,QAAO,KAAK,UAAU,mBAAmB,IAAI;;AAG/C,SAAgB,oBAAoB,SAAiB;AACnD,MAAK,IAAI,oBAAoB,QAAQ;;AAGvC,MAAa,kBAAkB;CAC7B;CACA,GAAG;CACH,GAAG;CAEH;CACA;CACD;;;;ACqBD,MAAM,sBAAsB,cAAkC,EAC5D,OAAO,gBACR,CAAC;AAEF,SAAgB,kBAAsC;CACpD,MAAM,QAAQ,WAAW,oBAAoB;AAC7C,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,gEAAgE;AAGlF,QAAO;;AAGT,SAAgB,qBAAqB,EACnC,UACA,iBACqE;CACrE,MAAM,oBAAoB,sBAAsB,cAAc;AAE9D,QAAO,oBAAC,oBAAoB;EAAS,OAAO;EAAoB;GAAwC;;AAG1G,SAAS,sBAAsB,eAAiE;CAC9F,MAAM,CAAC,OAAO,YAAY,SAA4B,eAAe;CACrE,MAAM,CAAC,gCAAgC,qCAAqC,SAAkB,KAAK;CACnG,MAAM,CAAC,kBAAkB,uBAAuB,UAAmB;CACnE,MAAM,CAAC,0BAA0B,+BAA+B,SAAS,EAAE;CAC3E,MAAM,CAAC,cAAc,mBAAmB,UAAwB;CAChE,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,CAAC,SAAS,cAAc,UAA4B;CAC1D,MAAM,CAAC,WAAW,gBAAgB,UAAkB;AAEpD,UAAS;EACP,SAAS,YAAY;GACnB,MAAM,OAAO,MAAM,gBAAgB,QAAQ,gBAAgB,qBAAqB,CAAC;GAMjF,MAAM,MAAM,MAAM,gBAAgB,+BAA+B;AACjE,uBAAoB,IAAI;AACxB,qCAAkC,IAAI;AAEtC,YAAS,OAAO,WAAW,iBAAiB;AAC5C,UAAO;;EAET,UAAU,CAAC,qBAAqB;EAChC,SAAS,UAAU;EACpB,CAAC;AAEF,iBAAgB;AACd,UAAQ,IAAI,yBAAyB,MAAM;IAC1C,CAAC,MAAM,CAAC;CAEX,MAAM,qBAAqB;AACzB,WAAS,eAAe;AACxB,oCAAkC,KAAK;AACvC,8BAA4B,EAAE;AAC9B,kBAAgB,OAAU;AAC1B,sBAAoB,OAAU;AAC9B,iBAAe,MAAM;;AAGvB,KAAI,UAAU,iBACZ,QAAO;EACL;EACA;EACA,QAAQ,OAAO,QAAQ;AACrB,SAAM,gBAAgB,mBAAmB,MAAM,gBAAgB,qBAAqB,CAAC;AAGrF,gBAFkB,MAAM,gBAAgB,qBAAqB,KAAK,gBAAgB,qBAAqB,CAAC,CAEjF;AACvB,mBAAgB,MAAM;AACtB,YAAS,sBAAsB;;EAElC;AAGH,KAAI,UAAU,uBAAuB;AACnC,MAAI,CAAC,aAAa,CAAC,aACjB,OAAM,IAAI,MAAM,oCAAoC;AAGtD,SAAO;GACL;GACA;GACA;GACA,QAAQ,OAAO,YAAY;AACzB,QAAI;KACF,MAAM,mBAAmB,gBAAgB,qBAAqB;AAG9D,SAAI,oBAAoB,SAAS,kBAAkB;AACjD,YAAM,gBAAgB,eAAe,WAAW,iBAAiB;AACjE,YAAM,gBAAgB,4BAA4B,gBAAgB,qBAAqB,CAAC;;KAG1F,MAAM,KAAK,kBAAkB;KAC7B,MAAM,MAAM;KAGZ,MAAM,MAAM,IAAI,iBAAiB;MAC/B,GAAG;MACH;MACA;MACD,CAAC;AACF,SAAI,YAAY,CAAC,MAAM,WAAW;AAChC,UAAI,OAAO,SAAS;AAClB,gBAAS,WAAW;AACpB,kBAAW,IAAI;aACV;AACL,eAAQ,MAAM,OAAO,QAAQ;AAC7B,aAAM,MAAM,OAAO,QAAQ;;OAE7B;aACK,OAAO;AACd,SAAI,iBAAiB,uBAAuB;AAC1C,UAAI,iBAAiB,aACnB,mCAAkC,MAAM;AAG1C,eAAS,SAAS;AAClB,mBAAa,OAAU;AACvB,sBAAgB,OAAU;;AAE5B,WAAM;;;GAGX;;AAGH,KAAI,UAAU,SACZ,QAAO;EACL;EACA;EACA;EACA;EACA,6BAA6B,YAAY;AAEvC,OAAI,CAAC,+BAAgC;AAErC,kBAAe,KAAK;AACpB,gCAA6B,aAAa,WAAW,EAAE;AACvD,OAAI;IACF,MAAMC,cAAY,MAAM,gBAAgB,4BAA4B,gBAAgB,qBAAqB,CAAC;AAC1G,QAAIA,aAAW;AACb,kBAAaA,YAAU;AACvB,qBAAgB,aAAa;AAC7B,cAAS,sBAAsB;;YAE1B,OAAO;AAEd,QAAI,iBAAiB,iBAAiB,MAAM,WAAW,gBACrD,mCAAkC,MAAM;aAGjC,2BAA2B,EAClC,mCAAkC,MAAM;aAElC;AACR,mBAAe,MAAM;;;EAGzB,gBAAgB,OAAO,QAAgB;AACrC,kBAAe,KAAK;AACpB,OAAI;AAGF,iBAFkB,MAAM,gBAAgB,qBAAqB,KAAK,gBAAgB,qBAAqB,CAAC,CAEjF;AACvB,oBAAgB,MAAM;AACtB,aAAS,sBAAsB;aACvB;AACR,mBAAe,MAAM;;;EAG1B;AAGH,KAAI,UAAU,YAAY;AACxB,MAAI,CAAC,gBAAgB,CAAC,QACpB,OAAM,IAAI,MAAM,iBAAiB,CAAC,CAAC,aAAa,gBAAgB,CAAC,CAAC,QAAQ,GAAG;AAG/E,SAAO;GACL;GACA;GACA;GACA,OAAO,QAAQ;GACf;GACA,MAAM,YAAY;AAChB,UAAM,QAAQ,UAAU;AACxB,eAAW,OAAU;AACrB,aAAS,SAAS;AAClB,oBAAgB,OAAU;;GAE7B;;AAGH,QAAO,EACL,OACD;;;;;;;;;;AC3IH,MAAa,cAAc,YAA+B;CACxD,MAAM,yBAAyB,QAAQ,0BAA0B,EAAE;CAEnE,MAAM,uBAAuB,QAAQ,wBAAwB;CAE7D,MAAM,UAAU;EACd,OAAO,IAAI,YAAY,EACrB,OACD,CAAC;EAEF,GAAI,yBAAyB,oBAAoB,uBAAuB,GAAG,EAAE;EAC7E,GAAI,uBAAuB,kBAAkB,qBAAqB,GAAG,EAAE;EACxE;CAED,MAAM,mBAAmB,gBAAgB,qBAAqB;CAE9D,MAAM,yBAAyB,QAAQ,UAAU,OAAO,QAAQ,QAAQ,MAAM,GAAG;AAEjF,KAAI,QAAQ,SAAS,MACnB,yBAAwB,oBAAoB,QAAQ,QAAQ,WAAW;CAGzE,MAAM,QAAQ,IAAI,MAAM;EACtB,QAAQ;GACN,OAAO,uBAAuB,qBAAqB,QAAQ;GAC3D,cAAc;IACZ,IAAI,GAAG,QAAQ,MAAM,iBAAiB,GAAG;IACzC,KAAK,QAAQ;IACb,qBAAqB,oBAAoB;IAC1C;GACD,QAAQ;GACT;EACD,cAAc;EACd;EACD,CAAC;AAEF,KAAI,sBAAsB;EACxB,MAAM,eAAe;AACrB,eAAa,QAAQ,QAAQ,0BAA0B,IAAI,uBAAuB,CAAC;AACnF,eAAa,QAAQ,QAAQ,0BAA0B,IAAI,qBAAqB,CAAC;;AAGnF,QAAO;;AAGT,MAAM,uBAAuB,4BAAyF;CACpH,iBAAiB,IAAI,uBAAuB;CAC5C,MAAM,IAAI,WAAW;EACnB,qBAAqB,wBAAwB;EAC7C,uCAAuC,wBAAwB;EAChE,CAAC;CACH;AAGD,MAAM,qBAAqB,2BAAsF;CAC/G,aAAa,IAAI,mBAAmB;CACpC,eAAe,IAAI,qBAAqB;CACxC,WAAW,IAAI,wBAAwB;CACvC,MAAM,IAAI,YAAY;CACtB,WAAW,IAAI,iBAAiB;CAChC,SAAS,IAAI,eAAe;CAC5B,oBAAoB,IAAI,0BAA0B;CAClD,aAAa,IAAI,kBAAkB;EACjC,uBAAuB,qBAAqB;EAC5C,qBAAqB,CACnB,IAAI,qBAAqB,EACvB,sBAAsB,IAAI,mCAAmC,EAC9D,CAAC,EACF,IAAI,qBAAqB,EACvB,mBAAmB,CAAC,IAAI,mCAAmC,EAAE,IAAI,kCAAkC,CAAC,EACrG,CAAC,CACH;EACF,CAAC;CACF,QAAQ,IAAI,aAAa;EACvB,kBAAkB,gBAAgB;EAClC,gBAAgB,CACd,IAAI,gBAAgB,EAClB,iBAAiB,IAAI,8BAA8B,EACpD,CAAC,EACF,IAAI,gBAAgB,EAClB,cAAc,CAAC,IAAI,8BAA8B,EAAE,IAAI,6BAA6B,CAAC,EACtF,CAAC,CACH;EACF,CAAC;CACF,WAAW,IAAI,gBAAgB;EAC7B,YAAY,CAAC,IAAI,wBAAwB,EAAE,IAAI,yBAAyB,CAAC;EACzE;EACD,CAAC;CACF,OAAO,IAAI,YACT,IAAI,kBAAkB,EACpB,UAAU,CACR,EACE,SAAS,WACV,EACD,EACE,SAAS,WACV,CACF,EACF,CAAC,CACH;CACF;AAOD,MAAa,kBAAkB,UAAkD,aAAa,MAAM;AACpG,MAAa,sBAAsB,UAAuD;AACxF,KAAI,CAAC,eAAe,MAAM,CACxB,OAAM,IAAI,sCAAsC;AAGlD,QAAO;;AAGT,MAAa,oBAAoB,UAAkD,qBAAqB,MAAM;AAC9G,MAAa,wBAAwB,UAAyD;AAC5F,KAAI,CAAC,iBAAiB,MAAM,CAC1B,OAAM,IAAI,wCAAwC;AAGpD,QAAO;;;;;AC1OT,MAAM,yBAAyB,cAAgD,OAAU;AAEzF,MAAa,uBAA2B,OAA8D;CACpG,MAAMC,YAAU,WAAW,uBAAuB;AAClD,KAAI,CAACA,UACH,OAAM,IAAI,MAAM,oEAAoE;CAGtF,MAAM,SAASA,UAAQ,YAAY,MAAM,MAAM,EAAE,OAAO,GAAG;AAC3D,QAAO;EACL,WAAWA,UAAQ;EACnB,QAAQ,QAAQ;EACjB;;AASH,MAAaC,2BAA4C,EAAE,OAAO,UAAU,gBAAgB;CAC1F,MAAM,CAAC,OAAO,YAAY,SAA+B;EACvD,aAAa,EAAE;EACf,WAAW;EACZ,CAAC;AAEF,iBAAgB;EACd,MAAM,eAAe,YAAY;AAG/B,YAAS;IAAE,cAFK,MAAM,QAAQ,IAAI,UAAU,KAAK,OAAO,MAAM,eAAe,SAAS,GAAG,CAAC,CAAC,EAC9D,QAAQ,WAAoC,WAAW,KAAK;IACnD,WAAW;IAAO,CAAC;;AAE3D,EAAK,cAAc;IAClB,CAAC,OAAO,UAAU,CAAC;AAEtB,iBAAgB;AACd,MAAI,CAAC,MAAM,WAAW;GACpB,MAAM,eAAe,UAA6C;AAChE,QAAI,UAAU,SAAS,MAAM,QAAQ,OAAO,GAAG,CAC7C,WAAU,eAAe;KACvB,GAAG;KACH,aAAa,UAAU,YAAY,KAAK,MACtC,EAAE,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,QAAQ,SAAS,EAC3D;KACF,EAAE;;GAIP,MAAM,YAAY,UAA2C;AAC3D,QAAI,UAAU,SAAS,MAAM,QAAQ,OAAO,GAAG,CAC7C,WAAU,eAAe;KACvB,GAAG;KACH,aAAa,CAAC,GAAG,UAAU,aAAa,MAAM,QAAQ,OAAO;KAC9D,EAAE;;GAIP,MAAM,eAAe,UAA6C;AAChE,QAAI,UAAU,SAAS,MAAM,QAAQ,OAAO,GAAG,CAC7C,WAAU,eAAe;KACvB,GAAG;KACH,aAAa,UAAU,YAAY,QAAQ,MAAM,EAAE,OAAO,MAAM,QAAQ,OAAO,GAAG;KACnF,EAAE;;AAIP,SAAM,OAAO,GAAsC,qBAAqB,eAAe,YAAY;AACnG,SAAM,OAAO,GAAoC,qBAAqB,aAAa,SAAS;AAC5F,SAAM,OAAO,GAAsC,qBAAqB,eAAe,YAAY;AAEnG,gBAAa;AACX,UAAM,OAAO,IAAI,qBAAqB,eAAe,YAAY;AACjE,UAAM,OAAO,IAAI,qBAAqB,aAAa,SAAS;AAC5D,UAAM,OAAO,IAAI,qBAAqB,eAAe,YAAY;;;IAGpE;EAAC,MAAM;EAAW;EAAO;EAAU,CAAC;AAEvC,QAAO,oBAAC,uBAAuB;EAAS,OAAO;EAAQ;GAA2C;;;;;AC9FpG,SAAgB,aAAa,OAAe;AAE1C,QAAO,MAAM,WAAW,MAAuB,MAAM,MAAM,gDAAgD;;AAG7G,SAAgB,WAAW,OAAsB,SAA6C;CAC5F,MAAM,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,MAAM;CAE5D,MAAM,UAAU,KAAK,aAAa,KAAK,KAAK,KAAK,eAAe,KAAK;CAGrE,MAAM,cAFc,SAAS,eAAe,UAGvC;EACC,MAAM;EACN,QAAQ;EACR,WAAW;EACZ,GACD,EAAE;AAEN,QAAO,KAAK,eAAe,SAAS;EAClC,MAAM;EACN,OAAO;EACP,KAAK;EACL,GAAG;EACJ,CAAC;;;;;ACxBJ,SAAgB,eACd,KACA,EAAE,yBAAyB,SAA+C,EAAE,EAC5E;CAEA,IAAI,QADW,IAAI,QAAQ,sBAAsB,QAAQ,CAAC,QAAQ,KAAK,IAAI,CACxD,MAAM,IAAI;AAC7B,SAAQ,MAAM,KAAK,MAAM,UAAU;AACjC,MAAI,2BAA2B,UAAU,KAAK,KAAK,aAAa,KAAK,MACnE,QAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;AAErD,SAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;GACnD;AACF,QAAO,MAAM,KAAK,IAAI;;;;;ACNxB,SAAgB,YACd,SACqB;AACrB,KAAI,CAAC,QAAS,QAAO;CAErB,IAAI,OAAO,QAAQ,MAAM,MAAM,EAAE,QAAQ,WAAW,MAAM,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AACxF,KAAI,CAAC,KAAM,QAAO,QAAQ,MAAM,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,KAAK;AAC3D,KAAI,CAAC,KAAM,QAAO,QAAQ;AAE1B,QAAO;;AAGT,SAAgB,gCACd,SACA,WAA+B,QAC/B,SAAmB,EAAE,EACT;CACZ,IAAIC,iBAA6B,EAAE;AAEnC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE;AAClD,MAAI,CAAC,MAAO;EAGZ,MAAM,UAAU,CAAC,GAAG,QAAQ,IAAI;AAChC,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,EAErD,kBAAiB,CACf,GAAG,gBACH,GAAG,gCAAgC,OAAO,aAAa,SAAY,WAAW,IAAI,QAAW,QAAQ,CACtG;MAGD,gBAAe,KAAK,QAAQ;;AAIhC,QAAO;;AAGT,SAAgB,qCAAqC,YAAyD;AAQ5G,KAAI,WAAW,WAAW,gBAAgB,YAAY,QACpD,QAAO,MAAM,KAAK,IAAI,IAAI,WAAW,UAAU,MAAM,KAAK,SAAS,eAAe,KAAK,GAAG,CAAC,CAAC,CAAC;AAI/F,QAAO,MAAM,KACX,IAAI,IACF,WAAW,UAAU,MAClB,QAAQ,SAA2B,OAAO,KAAK,OAAO,SAAS,CAC/D,KAAK,SAAS,eAAe,KAAK,GAAG,CAAC,CAC1C,CACF;;AAGH,SAAgB,uCAAuC,OAAwC;CAC7F,MAAM,mBAAmB,CAAC,OAAO,MAAM;AACvC,QAAO,MAAM,KACX,IAAI,IACF,MACG,QACE,SACC,OAAO,KAAK,OAAO,YAAY,CAAC,KAAK,MAAM,MAAM,iBAAiB,SAAS,EAAY,CAAC,CAC3F,CACA,KAAK,SAAS,eAAe,KAAK,GAAG,CAAC,CAC1C,CACF;;AAEH,SAAgB,iCAAiC,mBAAmE;AAClH,QAAO;EACL,GAAG;EACH,MAAM,mBAAmB,QAAQ;EACjC,QAAQ;GACN,GAAG,mBAAmB;GACtB,MAAM,mBAAmB,QAAQ,QAAQ;GAC1C;EACF;;;;;ACrFH,MAAM,QAAQ,OAAO,OAAc,IAAY,UAAmC;CAChF,MAAM,SAAS,IAAI,cAAc;EAAE;EAAI,SAAS;EAAO,CAAC;AACxD,OAAM,MAAM,eAAe,KAAK,OAAO;;AAGzC,MAAM,SAAS,OAAO,OAAc,IAAY,UAAmC;CACjF,MAAM,SAAS,IAAI,cAAc;EAAE;EAAI,SAAS;EAAO,CAAC;AACxD,OAAM,MAAM,eAAe,OAAO,OAAO;;AAG3C,MAAM,UAAU,OAAU,OAAc,OAAuC;CAC7E,MAAM,SAAS,MAAM,MAAM,eAAe,SAAS,GAAG;AAEtD,KAAI,CAAC,OACH;AAGF,QAAO,OAAO;;AAGhB,MAAa,kBAAkB;CAC7B;CACA;CACA;CACD;AAED,SAAgB,mBAA4D,UAAkB;AAC5F,QAAO;EACL;EACA,OAAO,OAAO,OAAc,YAAqB,gBAAgB,MAAM,OAAO,UAAU,QAAQ;EAChG,QAAQ,OAAO,OAAc,YAAqB,gBAAgB,OAAO,OAAO,UAAU,QAAQ;EAClG,KAAK,OAAO,UAAiB,gBAAgB,QAAiB,OAAO,SAAS;EAC/E;;;;;ACsCH,MAAM,0BAA0B,mBAAmC,0BAA0B;AAE7F,MAAa,kBAAkB;CAC7B,UAAU,wBAAwB;CAClC,aAAa,OAAO,OAAkB,aAAuB;EAE3D,MAAM,SAAS,MAAM,wBAAwB,IAAI,MAAM;AACvD,MAAI,CAAC,OACH,OAAM,wBAAwB,MAAM,OAAO,EACzC,YAAY,CAAC,SAAS,EACvB,CAAC;OACG;AACL,UAAO,WAAW,KAAK,SAAS;AAChC,SAAM,wBAAwB,OAAO,OAAO,OAAO;;;CAGxD;AAED,MAAa,sBAAsB,OACjC,SACA,UAQG;AACH,OAAM,gBAAgB,YAAY,QAAQ,OAAO;EAC/C,IAAI,MAAM,MAAM;EAChB,uBAAM,IAAI,MAAM,EAAC,aAAa;EAC9B,MAAM;EACN,QAAQ;EACR,QAAQ;GACN,IAAI,MAAM;GACV,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,iBAAiB,MAAM;GACxB;EACD,eAAe,MAAM;EACtB,CAAC;;AAGJ,MAAa,4BAA4B,OACvC,SACA,UACG;AACH,KAAI,iBAAiB,SAAS,MAAM,YAClC,OAAM,gBAAgB,YAAY,QAAQ,OAAO;EAC/C,GAAG;EACH,IAAI,MAAM,MAAM;EAChB,uBAAM,IAAI,MAAM,EAAC,aAAa;EAC9B,MAAM;EACP,CAAC;KAEF,OAAM,gBAAgB,YAAY,QAAQ,OAAO;EAC/C,GAAG;EACH,IAAI,MAAM,MAAM;EAChB,uBAAM,IAAI,MAAM,EAAC,aAAa;EAC9B,MAAM;EACP,CAAC;;AAmCN,SAAgB,+BACd,SACA,YACA,UAKA,QACA;AACA,QAAO,0BAA0B,SAAS;EACxC;EACA,QAAQ;GACN,IAAI,SAAS;GACb,MAAM,SAAS;GACf,MAAM,SAAS;GAChB;EACD,SAAS;GACP,MAAM,WAAW;GACjB,SAAS,WAAW;GACpB,aAAa,oCAAoC,WAAW;GAC5D,eACE,WAAW,WAAY,CAAC,WAAW,kBAAkB,wBAAwB,YAAa;GAC7F;EACF,CAAC;;AAGJ,SAAgB,oCACd,qBACgF;AAChF,QAAO,oBAAoB,QAAQ,KAAK,UAAU;AAChD,MAAI,CAAC,MAAM,YACT,QAAO;GACL,MAAM,MAAM;GACZ,gBAAgB,uCAAuC,MAAM,wBAAwB;GACtF;EAIH,MAAM,aAAa,MAAM,YAAY;AAErC,SAAO;GACL,IAAI,WAAW,WAAW;GAC1B,gBAAgB,qCAAqC,WAAW;GAChE,YAAY,WAAW,UAAU;GACjC,UAAU,WAAW,UAAU;GAChC;GACD;;;;;ACrNJ,MAAa,iBAAiB,EAAE,YAAiD,EAAE,KAAK;CACtF,MAAM,EAAE,QAAQ,cAAc,oBAAoC,gBAAgB,SAAS;AAU3F,QAAO;EACL,YATiB,cAAc;AAC/B,OAAI,CAAC,QAAQ,WAAY,QAAO,EAAE;AAElC,UAAO,CAAC,GAAG,OAAO,WAAW,CAC1B,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CACvE,QAAQ,aAAa,CAAC,SAAS,YAAY,SAAS,OAAO,OAAO,SAAS,SAAS;KACtF,CAAC,QAAQ,YAAY,SAAS,SAAS,CAAC;EAIzC;EACD;;;;;ACfH,MAAa,mBAAmB,OAAe;CAC7C,MAAM,EAAE,WAAW,eAAe,eAAe;AAEjD,QAAO;EACL;EACA,UAAU,cAAc,WAAW,MAAM,MAAM,EAAE,OAAO,GAAG,EAAE,CAAC,YAAY,GAAG,CAAC;EAC/E;;;;;ACsEH,MAAM,iCAAiC;AACvC,MAAM,6BAA6B;AACnC,MAAM,gCAAgC;AACtC,MAAM,+BAA+B;AACrC,MAAM,8CAA8C;AACpD,MAAM,yCAAyC;AAE/C,SAAgB,+BACd,kBACA,UACA;AACA,kBAAiB,SAAS,IAAI,gCAAgC,SAAS;;AAGzE,SAAgB,mCACd,oBACA,gBAC6B;AAC7B,QAAO;EACL,YAAY;GACV,SAAS,mBAAmB;GAC5B,OAAO,mBAAmB;GAC1B,QAAQ,mBAAmB,SAAU,mBAAmB,SAAqC;GAC9F;EACD,QAAQ;GACN,SAAS,eAAe;GACxB,IAAI,eAAe;GACpB;EACF;;AAGH,SAAgB,2BACd,kBACgC;AAChC,QAAO,iBAAiB,SAAS,IAAI,2BAA2B;;AAGlE,SAAgB,8BACd,kBACmC;AACnC,QAAO,iBAAiB,SAAS,IAAI,8BAA8B;;AAGrE,SAAgB,6BACd,kBACkC;AAClC,QAAO,iBAAiB,SAAS,IAAI,6BAA6B;;AAUpE,SAAgB,+BACd,kBACoC;CACpC,MAAMC,iBACJ,iBAAiB,SAAS,IAAI,+BAA+B;AAE/D,KAAI,CAAC,eAAgB,QAAO;AAE5B,QAAO;EACL,QAAQ;GACN,GAAG,eAAe;GAClB,SAAS,eAAe,OAAO,SAAS,KAAK,EAAE,KAAM,GAAG,mBAAmB;IACzE,GAAG;IAEH,MAAM,OAAO;KAAE,GAAG;KAAM,KAAK,KAAK,OAAQ,KAAK;KAAgB,GAAG;IACnE,EAAE;GACJ;EACD,YAAY;GACV,GAAG,eAAe;GAClB,SAAS,eAAe,WAAW,SAAS,KAAK,EAAE,kBAAkB,KAAM,GAAG,mBAAmB;IAC/F,GAAG;IAEH,kBAAkB,mBACd;KAAE,GAAG;KAAkB,KAAK,iBAAiB,OAAQ,iBAAiB;KAAgB,GACtF;IAEJ,MAAM,OAAO;KAAE,GAAG;KAAM,KAAK,KAAK,OAAQ,KAAK;KAAgB,GAAG;IACnE,EAAE;GACJ;EACF;;AAGH,SAAgB,2BACd,kBACA,UACA;AACA,kBAAiB,SAAS,IAAI,4BAA4B,SAAS;;;;;AAMrE,SAAgB,4CACd,0BACiD;AACjD,QAAO,yBAAyB,SAAS,IAAI,4CAA4C;;;;;;;AAQ3F,SAAgB,qCACd,0BACA,UACA;AACA,0BAAyB,SAAS,IAAI,6CAA6C,SAAS;;;;;AAM9F,SAAgB,uCACd,qBAC4C;AAC5C,QAAO,oBAAoB,SAAS,IAAI,uCAAuC;;;;;;;AAQjF,SAAgB,gCACd,qBACA,UACA;AACA,qBAAoB,SAAS,IAAI,wCAAwC,SAAS;;AAGpF,SAAgB,8DACd,0BACA,iBAC6B;AAC7B,QAAO;EACL,YAAY,EACV,SAAS,gBAAgB,iBACrB,CACE,EACE,MAAM,iBAAiB,gBACxB,CACF,GACD,QACL;EACD,QAAQ;GACN,IAAI,yBAAyB,gBAAgB,yBAAyB;GACtE,SAAS,gBAAgB,aACrB,CACE;IACE,MAAM,iBAAiB;IACvB,MAAM,gBAAgB,gBAClB,EACE,KAAK,gBAAgB,eACtB,GACD;IACL,CACF,GACD;GACL;EACF;;;;;ACnPH,SAAgB,2BAA2B,KAAkC;AAC3E,KAAI;AAOF,SAAO,gDANY,kBAAkB,YACnC,OAAO,KACL,KAAK,UAAU;GAAE,GAAG,IAAI;GAAG,GAAG,IAAI;GAAG,KAAK,IAAI;GAAK,KAAK,IAAI;GAAK,GAAG,IAAI;GAAG,GAAG,IAAI;GAAG,GAAG,IAAI;GAAG,CAAC,EAChG,UACD,CACF;UAEM,GAAG;AACV;;;;;;ACcJ,MAAM,uBAAuB;CAC3B,aAAa;CACb,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,UAAU;CACV,wBAAwB;CACxB,mBAAmB;CACnB,iBAAiB;CACjB,aAAa;CACb,YAAY;CACZ,oBAAoB;CACpB,OAAO;CACP,MAAM;CACN,uBAAuB;CACxB;AAED,MAAM,uBAAuB,QAAgB;AAC3C,QAAO,qBAAqB,QAAQ,eAAe,IAAI;;AAGzD,SAAgB,2BAA2B,YAAoC;CAC7E,MAAMC,kBAA4C,EAAE;CAEpD,MAAM,EAAE,mBAAoB,GAAG,wBAAwB;CAEvD,MAAM,iBAAiB,OAAO,QAAQ,oBAAoB,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW,YAAY,CAAC;CAEzG,MAAM,6BAA6B,OAAO,YACxC,OAAO,QAAQ,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,WAAW,YAAY,CAAC,CACpF;AAED,KAAI,mBACF,iBAAgB,KAAK,CACnB,sBACA,OAAO,YAAY,OAAO,QAAQ,mBAAmB,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,oBAAoB,IAAI,EAAE,MAAM,CAAC,CAAC,CAChH,CAAC;AAGJ,KAAI,eAAe,SAAS,EAC1B,iBAAgB,KAAK,CAAC,YAAY,OAAO,YAAY,eAAe,CAAC,CAAC;AAGxE,QAAO,OAAO,YAAY,CACxB,GAAG,OAAO,QAAQ,2BAA2B,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,oBAAoB,IAAI,EAAE,MAAM,CAAC,EACtG,GAAG,gBACJ,CAAC;;;;;ACtEJ,MAAM,sBAAsB;CAC1B,4CAA4C,eAAwC;AAClF,SAAO,2BAA2B,WAAW;;CAG/C,0BAA0B,eAAwC;AAChE,SAAO,2BAA2B,WAAW;;CAEhD;AAED,MAAa,gCAAgC,EAC3C,MACA,iBAII,oBAAoB,QAA4C,WAAW;;;;AClBjF,SAAgB,oBAAoB,MAAqD;AAEvF,KAAI,KAAK,SAAS,GAChB,QAAO;AAIT,KAAI,KAAK,OAAO,OAAQ,KAAK,OAAO,OAAQ,KAAK,OAAO,IACtD,QAAO;AAQT,KACE,KAAK,OAAO,KACZ,KAAK,OAAO,KACZ,KAAK,OAAO,KACZ,KAAK,OAAO,MACZ,KAAK,OAAO,OACZ,KAAK,OAAO,MACZ,KAAK,OAAO,MACZ,KAAK,OAAO,MACZ,KAAK,OAAO,MACZ,KAAK,OAAO,MACZ,KAAK,QAAQ,OACb,KAAK,QAAQ,GAEb,QAAO;AAIT,KAAI,KAAK,OAAO,OAAQ,KAAK,OAAO,MAAQ,KAAK,OAAO,OAAQ,KAAK,OAAO,GAC1E,QAAO;AAGT,QAAO;;;;;ACzBT,SAAgB,6BAA6B,OAA4C;AACvF,KAAI,iBAAiB,YAAY;EAC/B,MAAM,gBAAgB,oBAAoB,MAAM;AAChD,MAAI,cACF,QAAO,QAAQ,cAAc,UAAU,kBAAkB,SAAS,MAAM;AAI1E,SAAO,kBAAkB,aAAa,MAAM;;AAE9C,KAAI,UAAU,QAAQ,UAAU,UAAa,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO;AAE7G,KAAI,iBAAiB,QAAQ,iBAAiB,YAAa,OAAO,UAAU,YAAY,aAAa,MAAM,CACzG,QAAO,WAAW,iBAAiB,WAAW,MAAM,aAAa,GAAG,MAAM;AAE5E,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,iBAAiB,IACnB,QAAO,OAAO,YACZ,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,KAAKC,aAAW,CAAC,KAAK,6BAA6BA,QAAM,CAAC,CAAC,CAC9F;AAEH,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,IAAI,6BAA6B;AAExE,QAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,KAAKA,aAAW,CAAC,KAAK,6BAA6BA,QAAM,CAAC,CAAC,CAAC;;;;;ACpCpH,MAAM,WAAW;AAEjB,SAAgB,mBAAmB,KAAa;CAC9C,MAAM,QAAQ,SAAS,KAAK,IAAI;AAChC,QAAO,QAAQ,MAAM,KAAK;;;;;ACC5B,SAAgB,0BACd,mBACyB;CACzB,MAAMC,gBAAkD,EAAE;AAG1D,KAAI,mBAAmB;EACrB,MAAM,sBAAsB,YAAY,kBAAkB,OAAO,QAAQ;AAEzE,MAAI,qBAAqB;AACvB,iBAAc,OAAO,oBAAoB;AAEzC,OAAI,oBAAoB,KACtB,eAAc,OAAO;IACnB,KAAK,oBAAoB,MAAM;IAC/B,SAAS,oBAAoB,MAAM;IACpC;;EAKL,MAAM,0BAA0B,YAAY,kBAAkB,WAAW,QAAQ;AACjF,MAAI,2BAA2B,CAAC,cAAc,QAAQ,wBAAwB,KAC5E,eAAc,OAAO;GACnB,KAAK,wBAAwB,MAAM;GACnC,SAAS,wBAAwB,MAAM;GACxC;;AAKL,KAAI,CAAC,cAAc,QAAQ,mBAAmB,OAAO,GACnD,eAAc,OAAO,mBAAmB,kBAAkB,OAAO,GAAG;AAGtE,KAAI,mBAAmB,OAAO,GAC5B,eAAc,SAAS,mBAAmB,kBAAkB,OAAO,GAAG;AAGxE,QAAO;EACL,GAAG;EACH,MAAM,cAAc,QAAQ;EAC7B;;AAGH,SAAgB,8BAA8B,mBAAgD;CAC5F,MAAM,0BAA0B,YAAY,kBAAkB,WAAW,QAAQ;AAiBjF,QAf+E;EAC7E,MAAM,yBAAyB;EAC/B,aAAa,yBAAyB;EACtC,WAAW,yBAAyB;EACpC,iBAAiB,yBAAyB;EAC1C,iBAAiB,yBAAyB,mBACtC,EACE,KAAK,wBAAwB,iBAAiB,KAC/C,GACD;EACJ,QAAQ,0BAA0B,kBAAkB;EACrD;;;;;ACpDH,SAAgB,uCACd,kBACA,wBACA,iBACA,4BACsB;CACtB,MAAM,eAAe,iBAAiB;CAEtC,MAAM,oBAAoB,+BAA+B,iBAAiB;CAC1E,MAAM,oBAAoB,yBAAyB,cAAc,kBAAkB;CACnF,MAAM,gBAAgB,0BAA0B,kBAAkB;CAClE,MAAM,EAAE,YAAY,aAAa,uCAC/B,aAAa,wBACb,aACD;CACD,MAAM,6BACJ,6BAA6B;EAC3B,MAAM,aAAa;EACnB;EACD,CAAC,IAAI;AAER,QAAO;EACL,IAAI;EACJ,WAAW,iBAAiB;EAC5B,SAAS;GACP,GAAG;GACH,QAAQ;GACT;EACD,YAAY;EACZ,eAAe;EACf;EACA,aAAa,YAAY;EACzB,QAAQ;EACR,UAAU,8BAA8B;EACxC;EACD;;AAGH,SAAS,yBAAyB,MAAY,mBAAuD;CACnG,IAAIC,oBAAgD,EAAE;AAEtD,KAAI,kBACF,qBAAoB,8BAA8B,kBAAkB;AAGtE,QAAO;EACL,GAAG;EAEH,MAAM,kBAAkB,QAAQ,KAAK;EACtC;;AAGH,SAAgB,uCAAuC,YAA4B,cAAoB;AA4BrG,QAAO;EACL,YA5BqD,OAAO,YAC5D,OAAO,OAAO,WAAW,CAAC,SAAS,MAAM;AACvC,UAAO,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,6BAA6B,MAAM,CAAC,CAAC;IAC1F,CACH;EAyBC,UApBuC;GACvC,MAAM,aAAa;GACnB,QAAQ,aAAa,YACjB,2BAA2B,cAAc,aAAa,UAAU,CAAC,QAAQ,CAAC,GAC1E;GACJ,UAAU,aAAa,aAAa,OAAO,aAAa;GACxD,WACE,aAAa,aAAa,qBAAqB,QAC/C,CAAC,OAAO,MAAM,aAAa,aAAa,UAAU,SAAS,CAAC,GACxD,aAAa,aAAa,UAAU,aAAa,GACjD;GACN,YACE,aAAa,aAAa,sBAAsB,QAChD,CAAC,OAAO,MAAM,aAAa,aAAa,WAAW,SAAS,CAAC,GACzD,aAAa,aAAa,WAAW,aAAa,GAClD;GACP;EAKA;;;;;ACjFH,SAAgB,wCACd,kBACA,wBACA,iBACA,4BACsB;CACtB,MAAM,UAAU,iBAAiB;CAEjC,MAAM,oBAAoB,+BAA+B,iBAAiB;CAC1E,MAAM,oBAAoB,iBAAiB;CAC3C,MAAM,gBAAgB,0BAA0B,kBAAkB;CAElE,MAAM,oBAAoB,0BAA0B,QAAQ,cAAc,mBAAmB,kBAAkB;CAC/G,MAAM,EAAE,YAAY,aAAa,wCAAwC,QAAQ,aAAa;CAU9F,MAAM,6BACJ,6BAA6B;EAC3B,MAAM,QAAQ,QAAQ;EACtB;EACD,CAAC,IAAI;AAER,QAAO;EACL,IAAI;EACJ,WAAW,iBAAiB;EAC5B,SAAS;GACP,GAAG;GACH,QAAQ;GACT;EACD,YAAY;EACZ,eAAe;EACf;EACA,aAAa,YAAY;EACzB,QAAQ;EACR,UAAU,8BAA8B;EACxC;EACD;;AAGH,SAAS,sCACP,mBACgE;CAChE,MAAM,sBAAsB,YAAY,kBAAkB,QAAQ;AAiBlE,QAb0B;EACxB,MAAM,qBAAqB;EAC3B,aAAa,qBAAqB;EAClC,WAAW,qBAAqB,WAAW,QAAQ;EACnD,iBAAiB,qBAAqB,WAAW,QAAQ;EACzD,iBAAiB,qBAAqB,WAAW,QAAQ,OACrD;GACE,KAAK,qBAAqB,WAAW,QAAQ,KAAK;GAClD,SAAS,qBAAqB,WAAW,QAAQ,KAAK;GACvD,GACD;EACL;;AAKH,SAAS,0BACP,mBACA,mBACA,cACA;CACA,IAAIC,oBAAgD,EAAE;AAItD,KAAI,aACF,qBAAoB,sCAAsC,aAAa;UAC9D,kBACT,qBAAoB,8BAA8B,kBAAkB;AAKtE,KAAI,CAAC,kBAAkB,QAAQ,OAAO,kBAAkB,QAAQ,SAC9D,mBAAkB,OAAO,eAAe,kBAAkB,IAAI;AAGhE,QAAO;EACL,GAAG;EAGH,MAAM,kBAAkB,QAAQ;EACjC;;AAGH,SAAgB,wCAAwC,gBAAyC;CAU/F,MAAM,EAAE,SAAS,UAAU,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,OAAQ,GAAG,sBAClE;CAGF,MAAMC,qBAAyC;EAC7C,MAAM;EACN,QAAQ;EACR,QAJa,MAAO,IAAI,OAAO,IAAI,MAAM,2BAA2B,IAAI,IAAe,GAAG,SAAa;EAKvG,UAAU,uBAAM,IAAI,KAAK,MAAM,IAAK,EAAC,aAAa,GAAG;EACrD,YAAY,uBAAM,IAAI,KAAK,MAAM,IAAK,EAAC,aAAa,GAAG;EACvD,WAAW,uBAAM,IAAI,KAAK,MAAM,IAAK,EAAC,aAAa,GAAG;EACtD;EACD;AAED,QAAO;EACL,YAAY,OAAO,YACjB,OAAO,QAAQ,kBAAkB,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,6BAA6B,MAAM,CAAC,CAAC,CACpG;EACD,UAAU;EACX;;;;;AC1FH,SAAgB,sCACd,kBACA,wBACA,iBACA,4BACsB;CACtB,MAAM,aAAa,gBAAgB,OACjC,iBAAiB,WAAW,gBAAgB,YAAY,QACpD,iBAAiB,WAAW,aAC5B,iBAAiB,WAAW,QAAQ,CACzC;CAID,MAAM,QAAS,WAAmB;CAKlC,MAAM,aAAa,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK;CACrD,MAAM,cAAc,WAAW,gBAAgB;CAE/C,IAAI,OAAO,iBAAiB,WAAW,KAAK,iBAAiB,WAAW,KAAK,SAAS;AACtF,KAAI,YACF,QAAO,WAAW,sBAAsB;CAG1C,MAAM,oBAAoB,+BAA+B,iBAAiB;CAC1E,MAAM,gBAAgB,oBAAoB,YAAY,kBAAkB;CACxE,MAAM,oBAAoB,wBAAwB,YAAY,kBAAkB;CAGhF,MAAM,uBAAuB,MAAM,QAAQ,WAAW,kBAAkB,GACpE,WAAW,kBAAkB,MAAM,EAAE,GACrC,WAAW;AAEf,QAAO;EACL,IAAI;EACJ,WAAW,iBAAiB;EAC5B,SAAS;GACP,GAAG;GACH,QAAQ;GACT;EACD,YAAY;EACZ,eAAe;EACf,UAAU;GACR,QAAQ,iBAAiB,WAAW,qBAAqB;GACzD,QAAQ,iBAAiB,WAAW;GACpC;GACA,UAAU,IAAI,KAAK,iBAAiB,WAAW,aAAa,CAAC,aAAa;GAC1E,YAAY,iBAAiB,WAAW,iBACpC,IAAI,KAAK,iBAAiB,WAAW,eAAe,CAAC,aAAa,GAClE;GACJ,WAAW,IAAI,KAAK,iBAAiB,WAAW,aAAa,CAAC,aAAa;GAC5E;EACD,aAAa,iBAAiB,WAAW;EACzC,QAAQ;EACR,UAAU,8BAA8B;EACxC;EACD;;AAGH,SAAS,oBACP,YACA,mBACyB;CACzB,MAAMC,gBAAkD,EAAE;AAG1D,KAAI,mBAAmB;EACrB,MAAM,sBAAsB,YAAY,kBAAkB,OAAO,QAAQ;AAEzE,MAAI,qBAAqB;AACvB,iBAAc,OAAO,oBAAoB;AAEzC,OAAI,oBAAoB,KACtB,eAAc,OAAO;IACnB,KAAK,oBAAoB,MAAM;IAC/B,SAAS,oBAAoB,MAAM;IACpC;;EAKL,MAAM,0BAA0B,YAAY,kBAAkB,WAAW,QAAQ;AACjF,MAAI,2BAA2B,CAAC,cAAc,QAAQ,wBAAwB,KAC5E,eAAc,OAAO;GACnB,KAAK,wBAAwB,MAAM;GACnC,SAAS,wBAAwB,MAAM;GACxC;;CAKL,MAAM,gBAAgB;CACtB,MAAM,aAAa,OAAO,cAAc,WAAW,WAAW,SAAY,cAAc;AAGxF,KAAI,CAAC,cAAc,QAAQ,CAAC,cAAc,KAAK,KAC7C;MAAI,YAAY,QACd,eAAc,OAAO,EACnB,KAAK,YAAY,SAClB;WACQ,YAAY,MACrB,eAAc,OAAO,EACnB,KAAK,OAAO,WAAW,UAAU,WAAW,WAAW,QAAQ,WAAW,MAAM,IACjF;;AAKL,KAAI,CAAC,cAAc,KACjB,eAAc,OAAO,YAAY;AAInC,KAAI,CAAC,cAAc,QAAQ,mBAAmB,OAAO,GACnD,eAAc,OAAO,mBAAmB,kBAAkB,OAAO,GAAG;AAGtE,QAAO;EACL,GAAG;EACH,MAAM,cAAc,QAAQ;EAC7B;;AAGH,SAAS,wBACP,YACA,mBACA;CACA,IAAIC,oBAAgD,EAAE;AAEtD,KAAI,kBACF,qBAAoB,8BAA8B,kBAAkB;CAItE,MAAM,gBAAgB;AAEtB,KAAI,CAAC,kBAAkB,KACrB,mBAAkB,OAAO,cAAc;AAKzC,KAAI,CAAC,kBAAkB,QAAQ,cAAc,KAAK,SAAS,GAAG;EAC5D,MAAM,WAAW,cAAc,KAAK,cAAc,KAAK,SAAS;AAChE,MAAI,YAAY,CAAC,SAAS,WAAW,OAAO,CAC1C,mBAAkB,OAAO,eAAe,SAAS;;AAKrD,KAAI,CAAC,kBAAkB,mBAAmB,cAAc,oBAAoB,gBAC1E,mBAAkB,kBAAkB,cAAc,mBAAmB;AAGvE,QAAO;EACL,GAAG;EACH,QAAQ,oBAAoB,YAAY,kBAAkB;EAG1D,MAAM,kBAAkB,QAAQ;EACjC;;;;;AC3IH,SAAgB,0BACd,kBACwB;AACxB,KAAI,4BAA4B,cAC9B,QAAO,aAAa,iBAAiB;AAEvC,KAAI,4BAA4B,oBAC9B,QAAO,kBAAkB,iBAAiB;AAE5C,KAAI,4BAA4B,WAC9B,QAAO,QAAQ,iBAAiB;AAGlC,OAAM,IAAI,mDAAmD;;AAG/D,SAAgB,wBACd,kBACsB;CACtB,MAAM,6BAA6B,8BAA8B,iBAAiB;CAClF,MAAM,yBAAyB,0BAA0B,iBAAiB;CAC1E,MAAM,kBAAkB,6BAA6B,iBAAiB,KAAK;AAE3E,KAAI,4BAA4B,cAC9B,QAAO,wCACL,kBACA,wBACA,iBACA,2BACD;AAEH,KAAI,4BAA4B,WAC9B,QAAO,uCACL,kBACA,wBACA,iBACA,2BACD;AAEH,KAAI,4BAA4B,oBAC9B,QAAO,sCACL,kBACA,wBACA,iBACA,2BACD;AAGH,OAAM,IAAI,mDAAmD;;;;;;;;;;;;;;;;;;;AC3G/D,IAAI,gBAAgB,SAAS,GAAG,GAAG;AACjC,iBAAgB,OAAO,kBAClB,EAAE,WAAW,EAAE,EAAE,YAAY,SAAS,SAAU,KAAG,KAAG;AAAE,MAAE,YAAYC;MACvE,SAAU,KAAG,KAAG;AAAE,OAAK,IAAI,KAAKA,IAAG,KAAI,OAAO,UAAU,eAAe,KAAKA,KAAG,EAAE,CAAE,KAAE,KAAKA,IAAE;;AAChG,QAAO,cAAc,GAAG,EAAE;;AAG5B,SAAgB,UAAU,GAAG,GAAG;AAC9B,KAAI,OAAO,MAAM,cAAc,MAAM,KACjC,OAAM,IAAI,UAAU,yBAAyB,OAAO,EAAE,GAAG,gCAAgC;AAC7F,eAAc,GAAG,EAAE;CACnB,SAAS,KAAK;AAAE,OAAK,cAAc;;AACnC,GAAE,YAAY,MAAM,OAAO,OAAO,OAAO,EAAE,IAAI,GAAG,YAAY,EAAE,WAAW,IAAI,IAAI;;AAsFrF,SAAgB,UAAU,SAAS,YAAY,GAAG,WAAW;CAC3D,SAAS,MAAM,OAAO;AAAE,SAAO,iBAAiB,IAAI,QAAQ,IAAI,EAAE,SAAU,SAAS;AAAE,WAAQ,MAAM;IAAI;;AACzG,QAAO,KAAK,MAAM,IAAI,UAAU,SAAU,SAAS,QAAQ;EACvD,SAAS,UAAU,OAAO;AAAE,OAAI;AAAE,SAAK,UAAU,KAAK,MAAM,CAAC;YAAW,GAAG;AAAE,WAAO,EAAE;;;EACtF,SAAS,SAAS,OAAO;AAAE,OAAI;AAAE,SAAK,UAAU,SAAS,MAAM,CAAC;YAAW,GAAG;AAAE,WAAO,EAAE;;;EACzF,SAAS,KAAK,QAAQ;AAAE,UAAO,OAAO,QAAQ,OAAO,MAAM,GAAG,MAAM,OAAO,MAAM,CAAC,KAAK,WAAW,SAAS;;AAC3G,QAAM,YAAY,UAAU,MAAM,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC;GACvE;;AAGJ,SAAgB,YAAY,SAAS,MAAM;CACzC,IAAI,IAAI;EAAE,OAAO;EAAG,MAAM,WAAW;AAAE,OAAI,EAAE,KAAK,EAAG,OAAM,EAAE;AAAI,UAAO,EAAE;;EAAO,MAAM,EAAE;EAAE,KAAK,EAAE;EAAE,EAAE,GAAG,GAAG,GAAG,IAAI,OAAO,QAAQ,OAAO,aAAa,aAAa,WAAW,QAAQ,UAAU;AAChM,QAAO,EAAE,OAAO,KAAK,EAAE,EAAE,EAAE,WAAW,KAAK,EAAE,EAAE,EAAE,YAAY,KAAK,EAAE,EAAE,OAAO,WAAW,eAAe,EAAE,OAAO,YAAY,WAAW;AAAE,SAAO;KAAU;CAC1J,SAAS,KAAK,GAAG;AAAE,SAAO,SAAU,GAAG;AAAE,UAAO,KAAK,CAAC,GAAG,EAAE,CAAC;;;CAC5D,SAAS,KAAK,IAAI;AACd,MAAI,EAAG,OAAM,IAAI,UAAU,kCAAkC;AAC7D,SAAO,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,KAAK,EAAG,KAAI;AAC1C,OAAI,IAAI,GAAG,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,cAAc,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,GAAG,EAAE,KAAM,QAAO;AAC3J,OAAI,IAAI,GAAG,EAAG,MAAK,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM;AACvC,WAAQ,GAAG,IAAX;IACI,KAAK;IAAG,KAAK;AAAG,SAAI;AAAI;IACxB,KAAK;AAAG,OAAE;AAAS,YAAO;MAAE,OAAO,GAAG;MAAI,MAAM;MAAO;IACvD,KAAK;AAAG,OAAE;AAAS,SAAI,GAAG;AAAI,UAAK,CAAC,EAAE;AAAE;IACxC,KAAK;AAAG,UAAK,EAAE,IAAI,KAAK;AAAE,OAAE,KAAK,KAAK;AAAE;IACxC;AACI,SAAI,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,SAAS,KAAK,EAAE,EAAE,SAAS,QAAQ,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI;AAAE,UAAI;AAAG;;AACjG,SAAI,GAAG,OAAO,MAAM,CAAC,KAAM,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,KAAM;AAAE,QAAE,QAAQ,GAAG;AAAI;;AAC9E,SAAI,GAAG,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI;AAAE,QAAE,QAAQ,EAAE;AAAI,UAAI;AAAI;;AAC7D,SAAI,KAAK,EAAE,QAAQ,EAAE,IAAI;AAAE,QAAE,QAAQ,EAAE;AAAI,QAAE,IAAI,KAAK,GAAG;AAAE;;AAC3D,SAAI,EAAE,GAAI,GAAE,IAAI,KAAK;AACrB,OAAE,KAAK,KAAK;AAAE;;AAEtB,QAAK,KAAK,KAAK,SAAS,EAAE;WACrB,GAAG;AAAE,QAAK,CAAC,GAAG,EAAE;AAAE,OAAI;YAAa;AAAE,OAAI,IAAI;;AACtD,MAAI,GAAG,KAAK,EAAG,OAAM,GAAG;AAAI,SAAO;GAAE,OAAO,GAAG,KAAK,GAAG,KAAK,KAAK;GAAG,MAAM;GAAM;;;AAoBtF,SAAgB,SAAS,GAAG;CAC1B,IAAI,IAAI,OAAO,WAAW,cAAc,OAAO,UAAU,IAAI,KAAK,EAAE,IAAI,IAAI;AAC5E,KAAI,EAAG,QAAO,EAAE,KAAK,EAAE;AACvB,KAAI,KAAK,OAAO,EAAE,WAAW,SAAU,QAAO,EAC1C,MAAM,WAAY;AACd,MAAI,KAAK,KAAK,EAAE,OAAQ,KAAI,KAAK;AACjC,SAAO;GAAE,OAAO,KAAK,EAAE;GAAM,MAAM,CAAC;GAAG;IAE9C;AACD,OAAM,IAAI,UAAU,IAAI,4BAA4B,kCAAkC;;AAGxF,SAAgB,OAAO,GAAG,GAAG;CAC3B,IAAI,IAAI,OAAO,WAAW,cAAc,EAAE,OAAO;AACjD,KAAI,CAAC,EAAG,QAAO;CACf,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE;AAC/B,KAAI;AACA,UAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAM,IAAG,KAAK,EAAE,MAAM;UAEvE,OAAO;AAAE,MAAI,EAAS,OAAO;WAC5B;AACJ,MAAI;AACA,OAAI,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,WAAY,GAAE,KAAK,EAAE;YAE5C;AAAE,OAAI,EAAG,OAAM,EAAE;;;AAE7B,QAAO;;AAmBT,SAAgB,cAAc,IAAI,MAAM,MAAM;AAC5C,KAAI,QAAQ,UAAU,WAAW,GAAG;OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,IAC5E,KAAI,MAAM,EAAE,KAAK,OAAO;AACpB,OAAI,CAAC,GAAI,MAAK,MAAM,UAAU,MAAM,KAAK,MAAM,GAAG,EAAE;AACpD,MAAG,KAAK,KAAK;;;AAGrB,QAAO,GAAG,OAAO,MAAM,MAAM,UAAU,MAAM,KAAK,KAAK,CAAC;;AAG1D,SAAgB,QAAQ,GAAG;AACzB,QAAO,gBAAgB,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,QAAQ,EAAE;;AAGtE,SAAgB,iBAAiB,SAAS,YAAY,WAAW;AAC/D,KAAI,CAAC,OAAO,cAAe,OAAM,IAAI,UAAU,uCAAuC;CACtF,IAAI,IAAI,UAAU,MAAM,SAAS,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE;AAC7D,QAAO,IAAI,OAAO,QAAQ,OAAO,kBAAkB,aAAa,gBAAgB,QAAQ,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,YAAY,EAAE,EAAE,OAAO,iBAAiB,WAAY;AAAE,SAAO;IAAS;CACtN,SAAS,YAAY,GAAG;AAAE,SAAO,SAAU,GAAG;AAAE,UAAO,QAAQ,QAAQ,EAAE,CAAC,KAAK,GAAG,OAAO;;;CACzF,SAAS,KAAK,GAAG,GAAG;AAAE,MAAI,EAAE,IAAI;AAAE,KAAE,KAAK,SAAU,GAAG;AAAE,WAAO,IAAI,QAAQ,SAAU,GAAG,GAAG;AAAE,OAAE,KAAK;MAAC;MAAG;MAAG;MAAG;MAAE,CAAC,GAAG,KAAK,OAAO,GAAG,EAAE;MAAI;;AAAK,OAAI,EAAG,GAAE,KAAK,EAAE,EAAE,GAAG;;;CACnK,SAAS,OAAO,GAAG,GAAG;AAAE,MAAI;AAAE,QAAK,EAAE,GAAG,EAAE,CAAC;WAAW,GAAG;AAAE,UAAO,EAAE,GAAG,IAAI,EAAE;;;CAC7E,SAAS,KAAK,GAAG;AAAE,IAAE,iBAAiB,UAAU,QAAQ,QAAQ,EAAE,MAAM,EAAE,CAAC,KAAK,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE;;CACrH,SAAS,QAAQ,OAAO;AAAE,SAAO,QAAQ,MAAM;;CAC/C,SAAS,OAAO,OAAO;AAAE,SAAO,SAAS,MAAM;;CAC/C,SAAS,OAAO,GAAG,GAAG;AAAE,MAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,OAAQ,QAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG;;;AASjF,SAAgB,cAAc,GAAG;AAC/B,KAAI,CAAC,OAAO,cAAe,OAAM,IAAI,UAAU,uCAAuC;CACtF,IAAI,IAAI,EAAE,OAAO,gBAAgB;AACjC,QAAO,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO,aAAa,aAAa,SAAS,EAAE,GAAG,EAAE,OAAO,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,EAAE,OAAO,iBAAiB,WAAY;AAAE,SAAO;IAAS;CAC9M,SAAS,KAAK,GAAG;AAAE,IAAE,KAAK,EAAE,MAAM,SAAU,GAAG;AAAE,UAAO,IAAI,QAAQ,SAAU,SAAS,QAAQ;AAAE,QAAI,EAAE,GAAG,EAAE,EAAE,OAAO,SAAS,QAAQ,EAAE,MAAM,EAAE,MAAM;KAAI;;;CAC1J,SAAS,OAAO,SAAS,QAAQ,GAAG,GAAG;AAAE,UAAQ,QAAQ,EAAE,CAAC,KAAK,SAAS,KAAG;AAAE,WAAQ;IAAE,OAAOC;IAAG,MAAM;IAAG,CAAC;KAAK,OAAO;;;;;;AC3P3H,SAAgB,WAAW,OAAO;AAC9B,QAAO,OAAO,UAAU;;;;;ACD5B,SAAgB,iBAAiB,YAAY;CACzC,IAAI,SAAS,SAAU,UAAU;AAC7B,QAAM,KAAK,SAAS;AACpB,WAAS,yBAAQ,IAAI,OAAO,EAAC;;CAEjC,IAAI,WAAW,WAAW,OAAO;AACjC,UAAS,YAAY,OAAO,OAAO,MAAM,UAAU;AACnD,UAAS,UAAU,cAAc;AACjC,QAAO;;;;;ACPX,IAAW,sBAAsB,iBAAiB,SAAU,QAAQ;AAChE,QAAO,SAAS,wBAAwB,QAAQ;AAC5C,SAAO,KAAK;AACZ,OAAK,UAAU,SACT,OAAO,SAAS,8CAA8C,OAAO,IAAI,SAAU,KAAK,GAAG;AAAE,UAAO,IAAI,IAAI,OAAO,IAAI,UAAU;IAAI,CAAC,KAAK,OAAO,GAClJ;AACN,OAAK,OAAO;AACZ,OAAK,SAAS;;EAEpB;;;;ACVF,SAAgB,UAAU,KAAK,MAAM;AACjC,KAAI,KAAK;EACL,IAAI,QAAQ,IAAI,QAAQ,KAAK;AAC7B,OAAK,SAAS,IAAI,OAAO,OAAO,EAAE;;;;;;ACC1C,IAAI,eAAgB,WAAY;CAC5B,SAASC,eAAa,iBAAiB;AACnC,OAAK,kBAAkB;AACvB,OAAK,SAAS;AACd,OAAK,aAAa;AAClB,OAAK,cAAc;;AAEvB,gBAAa,UAAU,cAAc,WAAY;EAC7C,IAAI,KAAK,IAAI,KAAK;EAClB,IAAI;AACJ,MAAI,CAAC,KAAK,QAAQ;AACd,QAAK,SAAS;GACd,IAAI,aAAa,KAAK;AACtB,OAAI,YAAY;AACZ,SAAK,aAAa;AAClB,QAAI,MAAM,QAAQ,WAAW,CACzB,KAAI;AACA,UAAK,IAAI,eAAe,SAAS,WAAW,EAAE,iBAAiB,aAAa,MAAM,EAAE,CAAC,eAAe,MAAM,iBAAiB,aAAa,MAAM,CAE1I,CADe,eAAe,MACrB,OAAO,KAAK;aAGtB,OAAO;AAAE,WAAM,EAAE,OAAO,OAAO;cAC9B;AACJ,SAAI;AACA,UAAI,kBAAkB,CAAC,eAAe,SAAS,KAAK,aAAa,QAAS,IAAG,KAAK,aAAa;eAE3F;AAAE,UAAI,IAAK,OAAM,IAAI;;;QAIjC,YAAW,OAAO,KAAK;;GAG/B,IAAI,mBAAmB,KAAK;AAC5B,OAAI,WAAW,iBAAiB,CAC5B,KAAI;AACA,sBAAkB;YAEf,GAAG;AACN,aAAS,aAAa,sBAAsB,EAAE,SAAS,CAAC,EAAE;;GAGlE,IAAI,cAAc,KAAK;AACvB,OAAI,aAAa;AACb,SAAK,cAAc;AACnB,QAAI;AACA,UAAK,IAAI,gBAAgB,SAAS,YAAY,EAAE,kBAAkB,cAAc,MAAM,EAAE,CAAC,gBAAgB,MAAM,kBAAkB,cAAc,MAAM,EAAE;MACnJ,IAAI,YAAY,gBAAgB;AAChC,UAAI;AACA,qBAAc,UAAU;eAErB,KAAK;AACR,gBAAS,WAAW,QAAQ,WAAW,KAAK,IAAI,SAAS,EAAE;AAC3D,WAAI,eAAe,oBACf,UAAS,cAAc,cAAc,EAAE,EAAE,OAAO,OAAO,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC;WAG7E,QAAO,KAAK,IAAI;;;aAKzB,OAAO;AAAE,WAAM,EAAE,OAAO,OAAO;cAC9B;AACJ,SAAI;AACA,UAAI,mBAAmB,CAAC,gBAAgB,SAAS,KAAK,cAAc,QAAS,IAAG,KAAK,cAAc;eAE/F;AAAE,UAAI,IAAK,OAAM,IAAI;;;;AAGrC,OAAI,OACA,OAAM,IAAI,oBAAoB,OAAO;;;AAIjD,gBAAa,UAAU,MAAM,SAAU,UAAU;EAC7C,IAAI;AACJ,MAAI,YAAY,aAAa,KACzB,KAAI,KAAK,OACL,eAAc,SAAS;OAEtB;AACD,OAAI,oBAAoBA,gBAAc;AAClC,QAAI,SAAS,UAAU,SAAS,WAAW,KAAK,CAC5C;AAEJ,aAAS,WAAW,KAAK;;AAE7B,IAAC,KAAK,eAAe,KAAK,KAAK,iBAAiB,QAAQ,OAAO,KAAK,IAAI,KAAK,EAAE,EAAE,KAAK,SAAS;;;AAI3G,gBAAa,UAAU,aAAa,SAAU,QAAQ;EAClD,IAAI,aAAa,KAAK;AACtB,SAAO,eAAe,UAAW,MAAM,QAAQ,WAAW,IAAI,WAAW,SAAS,OAAO;;AAE7F,gBAAa,UAAU,aAAa,SAAU,QAAQ;EAClD,IAAI,aAAa,KAAK;AACtB,OAAK,aAAa,MAAM,QAAQ,WAAW,IAAI,WAAW,KAAK,OAAO,EAAE,cAAc,aAAa,CAAC,YAAY,OAAO,GAAG;;AAE9H,gBAAa,UAAU,gBAAgB,SAAU,QAAQ;EACrD,IAAI,aAAa,KAAK;AACtB,MAAI,eAAe,OACf,MAAK,aAAa;WAEb,MAAM,QAAQ,WAAW,CAC9B,WAAU,YAAY,OAAO;;AAGrC,gBAAa,UAAU,SAAS,SAAU,UAAU;EAChD,IAAI,cAAc,KAAK;AACvB,iBAAe,UAAU,aAAa,SAAS;AAC/C,MAAI,oBAAoBA,eACpB,UAAS,cAAc,KAAK;;AAGpC,gBAAa,SAAS,WAAY;EAC9B,IAAI,QAAQ,IAAIA,gBAAc;AAC9B,QAAM,SAAS;AACf,SAAO;KACP;AACJ,QAAOA;GACR;AAEH,IAAW,qBAAqB,aAAa;AAC7C,SAAgB,eAAe,OAAO;AAClC,QAAQ,iBAAiB,gBACpB,SAAS,YAAY,SAAS,WAAW,MAAM,OAAO,IAAI,WAAW,MAAM,IAAI,IAAI,WAAW,MAAM,YAAY;;AAEzH,SAAS,cAAc,WAAW;AAC9B,KAAI,WAAW,UAAU,CACrB,YAAW;KAGX,WAAU,aAAa;;;;;AC3I/B,IAAW,SAAS;CAChB,kBAAkB;CAClB,uBAAuB;CACvB,SAAS;CACT,uCAAuC;CACvC,0BAA0B;CAC7B;;;;ACLD,IAAW,kBAAkB;CACzB,YAAY,SAAU,SAAS,WAAS;EACpC,IAAI,OAAO,EAAE;AACb,OAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,KACpC,MAAK,KAAK,KAAK,UAAU;EAE7B,IAAI,WAAW,gBAAgB;AAC/B,MAAI,aAAa,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,SAAS,WAC7D,QAAO,SAAS,WAAW,MAAM,UAAU,cAAc,CAAC,SAASC,UAAQ,EAAE,OAAO,KAAK,CAAC,CAAC;AAE/F,SAAO,WAAW,MAAM,KAAK,GAAG,cAAc,CAAC,SAASA,UAAQ,EAAE,OAAO,KAAK,CAAC,CAAC;;CAEpF,cAAc,SAAU,QAAQ;EAC5B,IAAI,WAAW,gBAAgB;AAC/B,WAAS,aAAa,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,SAAS,iBAAiB,cAAc,OAAO;;CAEhH,UAAU;CACb;;;;AChBD,SAAgB,qBAAqB,KAAK;AACtC,iBAAgB,WAAW,WAAY;EACnC,IAAI,mBAAmB,OAAO;AAC9B,MAAI,iBACA,kBAAiB,IAAI;MAGrB,OAAM;GAEZ;;;;;ACXN,SAAgB,OAAO;;;;ACAvB,IAAW,yBAAyB,WAAY;AAAE,QAAO,mBAAmB,KAAK,QAAW,OAAU;IAAM;AAC5G,SAAgB,kBAAkB,OAAO;AACrC,QAAO,mBAAmB,KAAK,QAAW,MAAM;;AAEpD,SAAgB,iBAAiB,OAAO;AACpC,QAAO,mBAAmB,KAAK,OAAO,OAAU;;AAEpD,SAAgB,mBAAmB,MAAM,OAAO,OAAO;AACnD,QAAO;EACG;EACC;EACA;EACV;;;;;ACXL,IAAI,UAAU;AACd,SAAgB,aAAa,IAAI;AAC7B,KAAI,OAAO,uCAAuC;EAC9C,IAAI,SAAS,CAAC;AACd,MAAI,OACA,WAAU;GAAE,aAAa;GAAO,OAAO;GAAM;AAEjD,MAAI;AACJ,MAAI,QAAQ;GACR,IAAI,KAAK,SAAS,cAAc,GAAG,aAAa,QAAQ,GAAG;AAC3D,aAAU;AACV,OAAI,YACA,OAAM;;OAKd,KAAI;;AAGZ,SAAgB,aAAa,KAAK;AAC9B,KAAI,OAAO,yCAAyC,SAAS;AACzD,UAAQ,cAAc;AACtB,UAAQ,QAAQ;;;;;;ACfxB,IAAI,aAAc,SAAU,QAAQ;AAChC,WAAUC,cAAY,OAAO;CAC7B,SAASA,aAAW,aAAa;EAC7B,IAAI,QAAQ,OAAO,KAAK,KAAK,IAAI;AACjC,QAAM,YAAY;AAClB,MAAI,aAAa;AACb,SAAM,cAAc;AACpB,OAAI,eAAe,YAAY,CAC3B,aAAY,IAAI,MAAM;QAI1B,OAAM,cAAc;AAExB,SAAO;;AAEX,cAAW,SAAS,SAAU,MAAM,OAAO,UAAU;AACjD,SAAO,IAAI,eAAe,MAAM,OAAO,SAAS;;AAEpD,cAAW,UAAU,OAAO,SAAU,OAAO;AACzC,MAAI,KAAK,UACL,2BAA0B,iBAAiB,MAAM,EAAE,KAAK;MAGxD,MAAK,MAAM,MAAM;;AAGzB,cAAW,UAAU,QAAQ,SAAU,KAAK;AACxC,MAAI,KAAK,UACL,2BAA0B,kBAAkB,IAAI,EAAE,KAAK;OAEtD;AACD,QAAK,YAAY;AACjB,QAAK,OAAO,IAAI;;;AAGxB,cAAW,UAAU,WAAW,WAAY;AACxC,MAAI,KAAK,UACL,2BAA0B,uBAAuB,KAAK;OAErD;AACD,QAAK,YAAY;AACjB,QAAK,WAAW;;;AAGxB,cAAW,UAAU,cAAc,WAAY;AAC3C,MAAI,CAAC,KAAK,QAAQ;AACd,QAAK,YAAY;AACjB,UAAO,UAAU,YAAY,KAAK,KAAK;AACvC,QAAK,cAAc;;;AAG3B,cAAW,UAAU,QAAQ,SAAU,OAAO;AAC1C,OAAK,YAAY,KAAK,MAAM;;AAEhC,cAAW,UAAU,SAAS,SAAU,KAAK;AACzC,MAAI;AACA,QAAK,YAAY,MAAM,IAAI;YAEvB;AACJ,QAAK,aAAa;;;AAG1B,cAAW,UAAU,YAAY,WAAY;AACzC,MAAI;AACA,QAAK,YAAY,UAAU;YAEvB;AACJ,QAAK,aAAa;;;AAG1B,QAAOA;EACT,aAAa;AAEf,IAAI,QAAQ,SAAS,UAAU;AAC/B,SAAS,KAAK,IAAI,SAAS;AACvB,QAAO,MAAM,KAAK,IAAI,QAAQ;;AAElC,IAAI,mBAAoB,WAAY;CAChC,SAASC,mBAAiB,iBAAiB;AACvC,OAAK,kBAAkB;;AAE3B,oBAAiB,UAAU,OAAO,SAAU,OAAO;EAC/C,IAAI,kBAAkB,KAAK;AAC3B,MAAI,gBAAgB,KAChB,KAAI;AACA,mBAAgB,KAAK,MAAM;WAExB,OAAO;AACV,wBAAqB,MAAM;;;AAIvC,oBAAiB,UAAU,QAAQ,SAAU,KAAK;EAC9C,IAAI,kBAAkB,KAAK;AAC3B,MAAI,gBAAgB,MAChB,KAAI;AACA,mBAAgB,MAAM,IAAI;WAEvB,OAAO;AACV,wBAAqB,MAAM;;MAI/B,sBAAqB,IAAI;;AAGjC,oBAAiB,UAAU,WAAW,WAAY;EAC9C,IAAI,kBAAkB,KAAK;AAC3B,MAAI,gBAAgB,SAChB,KAAI;AACA,mBAAgB,UAAU;WAEvB,OAAO;AACV,wBAAqB,MAAM;;;AAIvC,QAAOA;GACR;AACH,IAAI,iBAAkB,SAAU,QAAQ;AACpC,WAAUC,kBAAgB,OAAO;CACjC,SAASA,iBAAe,gBAAgB,OAAO,UAAU;EACrD,IAAI,QAAQ,OAAO,KAAK,KAAK,IAAI;EACjC,IAAI;AACJ,MAAI,WAAW,eAAe,IAAI,CAAC,eAC/B,mBAAkB;GACd,MAAO,mBAAmB,QAAQ,mBAAmB,KAAK,IAAI,iBAAiB;GAC/E,OAAO,UAAU,QAAQ,UAAU,KAAK,IAAI,QAAQ;GACpD,UAAU,aAAa,QAAQ,aAAa,KAAK,IAAI,WAAW;GACnE;OAEA;GACD,IAAI;AACJ,OAAI,SAAS,OAAO,0BAA0B;AAC1C,gBAAY,OAAO,OAAO,eAAe;AACzC,cAAU,cAAc,WAAY;AAAE,YAAO,MAAM,aAAa;;AAChE,sBAAkB;KACd,MAAM,eAAe,QAAQ,KAAK,eAAe,MAAM,UAAU;KACjE,OAAO,eAAe,SAAS,KAAK,eAAe,OAAO,UAAU;KACpE,UAAU,eAAe,YAAY,KAAK,eAAe,UAAU,UAAU;KAChF;SAGD,mBAAkB;;AAG1B,QAAM,cAAc,IAAI,iBAAiB,gBAAgB;AACzD,SAAO;;AAEX,QAAOA;EACT,WAAW;AAEb,SAAS,qBAAqB,OAAO;AACjC,KAAI,OAAO,sCACP,cAAa,MAAM;KAGnB,sBAAqB,MAAM;;AAGnC,SAAS,oBAAoB,KAAK;AAC9B,OAAM;;AAEV,SAAS,0BAA0B,cAAc,YAAY;CACzD,IAAI,wBAAwB,OAAO;AACnC,0BAAyB,gBAAgB,WAAW,WAAY;AAAE,SAAO,sBAAsB,cAAc,WAAW;GAAI;;AAEhI,IAAW,iBAAiB;CACxB,QAAQ;CACR,MAAM;CACN,OAAO;CACP,UAAU;CACb;;;;ACtLD,IAAW,cAAc,WAAY;AAAE,QAAQ,OAAO,WAAW,cAAc,OAAO,cAAe;IAAoB;;;;ACAzH,SAAgB,SAAS,GAAG;AACxB,QAAO;;;;;ACAX,SAAgB,OAAO;CACnB,IAAI,MAAM,EAAE;AACZ,MAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,KACpC,KAAI,MAAM,UAAU;AAExB,QAAO,cAAc,IAAI;;AAE7B,SAAgB,cAAc,KAAK;AAC/B,KAAI,IAAI,WAAW,EACf,QAAO;AAEX,KAAI,IAAI,WAAW,EACf,QAAO,IAAI;AAEf,QAAO,SAAS,MAAM,OAAO;AACzB,SAAO,IAAI,OAAO,SAAU,MAAM,IAAI;AAAE,UAAO,GAAG,KAAK;KAAK,MAAM;;;;;;ACT1E,IAAI,aAAc,WAAY;CAC1B,SAASC,aAAW,WAAW;AAC3B,MAAI,UACA,MAAK,aAAa;;AAG1B,cAAW,UAAU,OAAO,SAAU,UAAU;EAC5C,IAAIC,eAAa,IAAID,cAAY;AACjC,eAAW,SAAS;AACpB,eAAW,WAAW;AACtB,SAAOC;;AAEX,cAAW,UAAU,YAAY,SAAU,gBAAgB,OAAO,UAAU;EACxE,IAAI,QAAQ;EACZ,IAAI,aAAa,aAAa,eAAe,GAAG,iBAAiB,IAAI,eAAe,gBAAgB,OAAO,SAAS;AACpH,eAAa,WAAY;GACrB,IAAI,KAAK,OAAO,WAAW,GAAG,UAAU,SAAS,GAAG;AACpD,cAAW,IAAI,WAEP,SAAS,KAAK,YAAY,OAAO,GACnC,SAEM,MAAM,WAAW,WAAW,GAE5B,MAAM,cAAc,WAAW,CAAC;IAC9C;AACF,SAAO;;AAEX,cAAW,UAAU,gBAAgB,SAAU,MAAM;AACjD,MAAI;AACA,UAAO,KAAK,WAAW,KAAK;WAEzB,KAAK;AACR,QAAK,MAAM,IAAI;;;AAGvB,cAAW,UAAU,UAAU,SAAU,MAAM,aAAa;EACxD,IAAI,QAAQ;AACZ,gBAAc,eAAe,YAAY;AACzC,SAAO,IAAI,YAAY,SAAU,SAAS,QAAQ;GAC9C,IAAI,aAAa,IAAI,eAAe;IAChC,MAAM,SAAU,OAAO;AACnB,SAAI;AACA,WAAK,MAAM;cAER,KAAK;AACR,aAAO,IAAI;AACX,iBAAW,aAAa;;;IAGhC,OAAO;IACP,UAAU;IACb,CAAC;AACF,SAAM,UAAU,WAAW;IAC7B;;AAEN,cAAW,UAAU,aAAa,SAAU,YAAY;EACpD,IAAI;AACJ,UAAQ,KAAK,KAAK,YAAY,QAAQ,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,UAAU,WAAW;;AAE3F,cAAW,UAAUC,cAAqB,WAAY;AAClD,SAAO;;AAEX,cAAW,UAAU,OAAO,WAAY;EACpC,IAAI,aAAa,EAAE;AACnB,OAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,KACpC,YAAW,MAAM,UAAU;AAE/B,SAAO,cAAc,WAAW,CAAC,KAAK;;AAE1C,cAAW,UAAU,YAAY,SAAU,aAAa;EACpD,IAAI,QAAQ;AACZ,gBAAc,eAAe,YAAY;AACzC,SAAO,IAAI,YAAY,SAAU,SAAS,QAAQ;GAC9C,IAAI;AACJ,SAAM,UAAU,SAAU,GAAG;AAAE,WAAQ,QAAQ;MAAO,SAAU,KAAK;AAAE,WAAO,OAAO,IAAI;MAAK,WAAY;AAAE,WAAO,QAAQ,MAAM;KAAI;IACvI;;AAEN,cAAW,SAAS,SAAU,WAAW;AACrC,SAAO,IAAIF,aAAW,UAAU;;AAEpC,QAAOA;GACR;AAEH,SAAS,eAAe,aAAa;CACjC,IAAI;AACJ,SAAQ,KAAK,gBAAgB,QAAQ,gBAAgB,KAAK,IAAI,cAAc,OAAO,aAAa,QAAQ,OAAO,KAAK,IAAI,KAAK;;AAEjI,SAAS,WAAW,OAAO;AACvB,QAAO,SAAS,WAAW,MAAM,KAAK,IAAI,WAAW,MAAM,MAAM,IAAI,WAAW,MAAM,SAAS;;AAEnG,SAAS,aAAa,OAAO;AACzB,QAAQ,SAAS,iBAAiB,cAAgB,WAAW,MAAM,IAAI,eAAe,MAAM;;;;;AClGhG,SAAgB,QAAQ,QAAQ;AAC5B,QAAO,WAAW,WAAW,QAAQ,WAAW,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK;;AAElF,SAAgB,QAAQ,MAAM;AAC1B,QAAO,SAAU,QAAQ;AACrB,MAAI,QAAQ,OAAO,CACf,QAAO,OAAO,KAAK,SAAU,cAAc;AACvC,OAAI;AACA,WAAO,KAAK,cAAc,KAAK;YAE5B,KAAK;AACR,SAAK,MAAM,IAAI;;IAErB;AAEN,QAAM,IAAI,UAAU,yCAAyC;;;;;;ACdrE,SAAgB,yBAAyB,aAAa,QAAQ,YAAY,SAAS,YAAY;AAC3F,QAAO,IAAI,mBAAmB,aAAa,QAAQ,YAAY,SAAS,WAAW;;AAEvF,IAAI,qBAAsB,SAAU,QAAQ;AACxC,WAAUG,sBAAoB,OAAO;CACrC,SAASA,qBAAmB,aAAa,QAAQ,YAAY,SAAS,YAAY,mBAAmB;EACjG,IAAI,QAAQ,OAAO,KAAK,MAAM,YAAY,IAAI;AAC9C,QAAM,aAAa;AACnB,QAAM,oBAAoB;AAC1B,QAAM,QAAQ,SACR,SAAU,OAAO;AACf,OAAI;AACA,WAAO,MAAM;YAEV,KAAK;AACR,gBAAY,MAAM,IAAI;;MAG5B,OAAO,UAAU;AACvB,QAAM,SAAS,UACT,SAAU,KAAK;AACb,OAAI;AACA,YAAQ,IAAI;YAETC,OAAK;AACR,gBAAY,MAAMA,MAAI;aAElB;AACJ,SAAK,aAAa;;MAGxB,OAAO,UAAU;AACvB,QAAM,YAAY,aACZ,WAAY;AACV,OAAI;AACA,gBAAY;YAET,KAAK;AACR,gBAAY,MAAM,IAAI;aAElB;AACJ,SAAK,aAAa;;MAGxB,OAAO,UAAU;AACvB,SAAO;;AAEX,sBAAmB,UAAU,cAAc,WAAY;EACnD,IAAI;AACJ,MAAI,CAAC,KAAK,qBAAqB,KAAK,mBAAmB,EAAE;GACrD,IAAI,WAAW,KAAK;AACpB,UAAO,UAAU,YAAY,KAAK,KAAK;AACvC,IAAC,cAAc,KAAK,KAAK,gBAAgB,QAAQ,OAAO,KAAK,KAAa,GAAG,KAAK,KAAK;;;AAG/F,QAAOD;EACT,WAAW;;;;AC1Db,IAAW,wBAAwB;CAC/B,KAAK,WAAY;AACb,UAAQ,sBAAsB,YAAY,MAAM,KAAK;;CAEzD,UAAU;CACb;;;;ACHD,IAAI,SAAU,SAAU,QAAQ;AAC5B,WAAUE,UAAQ,OAAO;CACzB,SAASA,SAAO,WAAW,MAAM;AAC7B,SAAO,OAAO,KAAK,KAAK,IAAI;;AAEhC,UAAO,UAAU,WAAW,SAAU,OAAO,OAAO;AAChD,MAAI,UAAU,KAAK,EAAK,SAAQ;AAChC,SAAO;;AAEX,QAAOA;EACT,aAAa;;;;ACXf,IAAW,mBAAmB;CAC1B,aAAa,SAAU,SAAS,WAAS;EACrC,IAAI,OAAO,EAAE;AACb,OAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,KACpC,MAAK,KAAK,KAAK,UAAU;EAE7B,IAAI,WAAW,iBAAiB;AAChC,MAAI,aAAa,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,SAAS,YAC7D,QAAO,SAAS,YAAY,MAAM,UAAU,cAAc,CAAC,SAASC,UAAQ,EAAE,OAAO,KAAK,CAAC,CAAC;AAEhG,SAAO,YAAY,MAAM,KAAK,GAAG,cAAc,CAAC,SAASA,UAAQ,EAAE,OAAO,KAAK,CAAC,CAAC;;CAErF,eAAe,SAAU,QAAQ;EAC7B,IAAI,WAAW,iBAAiB;AAChC,WAAS,aAAa,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,SAAS,kBAAkB,eAAe,OAAO;;CAElH,UAAU;CACb;;;;ACdD,IAAI,cAAe,SAAU,QAAQ;AACjC,WAAUC,eAAa,OAAO;CAC9B,SAASA,cAAY,WAAW,MAAM;EAClC,IAAI,QAAQ,OAAO,KAAK,MAAM,WAAW,KAAK,IAAI;AAClD,QAAM,YAAY;AAClB,QAAM,OAAO;AACb,QAAM,UAAU;AAChB,SAAO;;AAEX,eAAY,UAAU,WAAW,SAAU,OAAO,OAAO;EACrD,IAAI;AACJ,MAAI,UAAU,KAAK,EAAK,SAAQ;AAChC,MAAI,KAAK,OACL,QAAO;AAEX,OAAK,QAAQ;EACb,IAAI,KAAK,KAAK;EACd,IAAI,YAAY,KAAK;AACrB,MAAI,MAAM,KACN,MAAK,KAAK,KAAK,eAAe,WAAW,IAAI,MAAM;AAEvD,OAAK,UAAU;AACf,OAAK,QAAQ;AACb,OAAK,MAAM,KAAK,KAAK,QAAQ,QAAQ,OAAO,KAAK,IAAI,KAAK,KAAK,eAAe,WAAW,KAAK,IAAI,MAAM;AACxG,SAAO;;AAEX,eAAY,UAAU,iBAAiB,SAAU,WAAW,KAAK,OAAO;AACpE,MAAI,UAAU,KAAK,EAAK,SAAQ;AAChC,SAAO,iBAAiB,YAAY,UAAU,MAAM,KAAK,WAAW,KAAK,EAAE,MAAM;;AAErF,eAAY,UAAU,iBAAiB,SAAU,YAAY,IAAI,OAAO;AACpE,MAAI,UAAU,KAAK,EAAK,SAAQ;AAChC,MAAI,SAAS,QAAQ,KAAK,UAAU,SAAS,KAAK,YAAY,MAC1D,QAAO;AAEX,MAAI,MAAM,KACN,kBAAiB,cAAc,GAAG;;AAI1C,eAAY,UAAU,UAAU,SAAU,OAAO,OAAO;AACpD,MAAI,KAAK,OACL,wBAAO,IAAI,MAAM,+BAA+B;AAEpD,OAAK,UAAU;EACf,IAAI,QAAQ,KAAK,SAAS,OAAO,MAAM;AACvC,MAAI,MACA,QAAO;WAEF,KAAK,YAAY,SAAS,KAAK,MAAM,KAC1C,MAAK,KAAK,KAAK,eAAe,KAAK,WAAW,KAAK,IAAI,KAAK;;AAGpE,eAAY,UAAU,WAAW,SAAU,OAAO,QAAQ;EACtD,IAAI,UAAU;EACd,IAAI;AACJ,MAAI;AACA,QAAK,KAAK,MAAM;WAEb,GAAG;AACN,aAAU;AACV,gBAAa,IAAI,oBAAI,IAAI,MAAM,qCAAqC;;AAExE,MAAI,SAAS;AACT,QAAK,aAAa;AAClB,UAAO;;;AAGf,eAAY,UAAU,cAAc,WAAY;AAC5C,MAAI,CAAC,KAAK,QAAQ;GACd,IAAI,KAAK,MAAM,KAAK,GAAG,IAAI,YAAY,GAAG;GAC1C,IAAI,UAAU,UAAU;AACxB,QAAK,OAAO,KAAK,QAAQ,KAAK,YAAY;AAC1C,QAAK,UAAU;AACf,aAAU,SAAS,KAAK;AACxB,OAAI,MAAM,KACN,MAAK,KAAK,KAAK,eAAe,WAAW,IAAI,KAAK;AAEtD,QAAK,QAAQ;AACb,UAAO,UAAU,YAAY,KAAK,KAAK;;;AAG/C,QAAOA;EACT,OAAO;;;;ACtFT,IAAI,YAAa,WAAY;CACzB,SAASC,YAAU,qBAAqB,KAAK;AACzC,MAAI,QAAQ,KAAK,EAAK,OAAMA,YAAU;AACtC,OAAK,sBAAsB;AAC3B,OAAK,MAAM;;AAEf,aAAU,UAAU,WAAW,SAAU,MAAM,OAAO,OAAO;AACzD,MAAI,UAAU,KAAK,EAAK,SAAQ;AAChC,SAAO,IAAI,KAAK,oBAAoB,MAAM,KAAK,CAAC,SAAS,OAAO,MAAM;;AAE1E,aAAU,MAAM,sBAAsB;AACtC,QAAOA;GACR;;;;ACXH,IAAI,iBAAkB,SAAU,QAAQ;AACpC,WAAUC,kBAAgB,OAAO;CACjC,SAASA,iBAAe,iBAAiB,KAAK;AAC1C,MAAI,QAAQ,KAAK,EAAK,OAAM,UAAU;EACtC,IAAI,QAAQ,OAAO,KAAK,MAAM,iBAAiB,IAAI,IAAI;AACvD,QAAM,UAAU,EAAE;AAClB,QAAM,UAAU;AAChB,SAAO;;AAEX,kBAAe,UAAU,QAAQ,SAAU,QAAQ;EAC/C,IAAI,UAAU,KAAK;AACnB,MAAI,KAAK,SAAS;AACd,WAAQ,KAAK,OAAO;AACpB;;EAEJ,IAAI;AACJ,OAAK,UAAU;AACf;AACI,OAAK,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO,MAAM,CACnD;SAEE,SAAS,QAAQ,OAAO;AAClC,OAAK,UAAU;AACf,MAAI,OAAO;AACP,UAAQ,SAAS,QAAQ,OAAO,CAC5B,QAAO,aAAa;AAExB,SAAM;;;AAGd,QAAOA;EACT,UAAU;;;;AC/BZ,IAAW,iBAAiB,IAAI,eAAe,YAAY;;;;ACD3D,IAAW,QAAQ,IAAI,WAAW,SAAU,YAAY;AAAE,QAAO,WAAW,UAAU;EAAI;;;;ACD1F,IAAW,eAAe,SAAU,GAAG;AAAE,QAAO,KAAK,OAAO,EAAE,WAAW,YAAY,OAAO,MAAM;;;;;ACClG,SAAgB,UAAU,OAAO;AAC7B,QAAO,WAAW,UAAU,QAAQ,UAAU,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK;;;;;ACA/E,SAAgB,oBAAoB,OAAO;AACvC,QAAO,WAAW,MAAMC,YAAmB;;;;;ACF/C,SAAgB,gBAAgB,KAAK;AACjC,QAAO,OAAO,iBAAiB,WAAW,QAAQ,QAAQ,QAAQ,KAAK,IAAI,KAAK,IAAI,IAAI,OAAO,eAAe;;;;;ACFlH,SAAgB,iCAAiC,OAAO;AACpD,wBAAO,IAAI,UAAU,mBAAmB,UAAU,QAAQ,OAAO,UAAU,WAAW,sBAAsB,MAAM,QAAQ,OAAO,2HAA2H;;;;;ACDhQ,SAAgB,oBAAoB;AAChC,KAAI,OAAO,WAAW,cAAc,CAAC,OAAO,SACxC,QAAO;AAEX,QAAO,OAAO;;AAElB,IAAW,WAAW,mBAAmB;;;;ACJzC,SAAgB,WAAW,OAAO;AAC9B,QAAO,WAAW,UAAU,QAAQ,UAAU,KAAK,IAAI,KAAK,IAAI,MAAMC,UAAiB;;;;;ACD3F,SAAgB,mCAAmC,gBAAgB;AAC/D,QAAO,iBAAiB,MAAM,WAAW,SAAS,uCAAuC;EACrF,IAAI,QAAQ,IAAI,OAAO;AACvB,SAAO,YAAY,MAAM,SAAU,IAAI;AACnC,WAAQ,GAAG,OAAX;IACI,KAAK;AACD,cAAS,eAAe,WAAW;AACnC,QAAG,QAAQ;IACf,KAAK;AACD,QAAG,KAAK,KAAK;MAAC;;MAAK;MAAG;MAAG,CAAC;AAC1B,QAAG,QAAQ;IACf,KAAK,EAED,QAAO,CAAC,GAAG,QAAQ,OAAO,MAAM,CAAC,CAAC;IACtC,KAAK;AACD,UAAK,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,OAAO,GAAG;AAC5C,SAAI,CAAC,KAAM,QAAO,CAAC,GAAG,EAAE;AACxB,YAAO,CAAC,GAAG,QAAQ,KAAK,EAAE,CAAC;IAC/B,KAAK,EAAG,QAAO,CAAC,GAAG,GAAG,MAAM,CAAC;IAC7B,KAAK,EAAG,QAAO,CAAC,GAAG,QAAQ,MAAM,CAAC;IAClC,KAAK,EAAG,QAAO,CAAC,GAAG,GAAG,MAAM,CAAC;IAC7B,KAAK;AACD,QAAG,MAAM;AACT,YAAO,CAAC,GAAG,EAAE;IACjB,KAAK,EAAG,QAAO,CAAC,GAAG,GAAG;IACtB,KAAK;AACD,YAAO,aAAa;AACpB,YAAO,CAAC,EAAE;IACd,KAAK,GAAI,QAAO,CAAC,EAAE;;IAEzB;GACJ;;AAEN,SAAgB,qBAAqB,KAAK;AACtC,QAAO,WAAW,QAAQ,QAAQ,QAAQ,KAAK,IAAI,KAAK,IAAI,IAAI,UAAU;;;;;ACxB9E,SAAgB,UAAU,OAAO;AAC7B,KAAI,iBAAiB,WACjB,QAAO;AAEX,KAAI,SAAS,MAAM;AACf,MAAI,oBAAoB,MAAM,CAC1B,QAAO,sBAAsB,MAAM;AAEvC,MAAI,YAAY,MAAM,CAClB,QAAO,cAAc,MAAM;AAE/B,MAAI,UAAU,MAAM,CAChB,QAAO,YAAY,MAAM;AAE7B,MAAI,gBAAgB,MAAM,CACtB,QAAO,kBAAkB,MAAM;AAEnC,MAAI,WAAW,MAAM,CACjB,QAAO,aAAa,MAAM;AAE9B,MAAI,qBAAqB,MAAM,CAC3B,QAAO,uBAAuB,MAAM;;AAG5C,OAAM,iCAAiC,MAAM;;AAEjD,SAAgB,sBAAsB,KAAK;AACvC,QAAO,IAAI,WAAW,SAAU,YAAY;EACxC,IAAI,MAAM,IAAIC,aAAoB;AAClC,MAAI,WAAW,IAAI,UAAU,CACzB,QAAO,IAAI,UAAU,WAAW;AAEpC,QAAM,IAAI,UAAU,iEAAiE;GACvF;;AAEN,SAAgB,cAAc,OAAO;AACjC,QAAO,IAAI,WAAW,SAAU,YAAY;AACxC,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,UAAU,CAAC,WAAW,QAAQ,IACpD,YAAW,KAAK,MAAM,GAAG;AAE7B,aAAW,UAAU;GACvB;;AAEN,SAAgB,YAAY,SAAS;AACjC,QAAO,IAAI,WAAW,SAAU,YAAY;AACxC,UACK,KAAK,SAAU,OAAO;AACvB,OAAI,CAAC,WAAW,QAAQ;AACpB,eAAW,KAAK,MAAM;AACtB,eAAW,UAAU;;KAE1B,SAAU,KAAK;AAAE,UAAO,WAAW,MAAM,IAAI;IAAI,CAC/C,KAAK,MAAM,qBAAqB;GACvC;;AAEN,SAAgB,aAAa,UAAU;AACnC,QAAO,IAAI,WAAW,SAAU,YAAY;EACxC,IAAI,KAAK;AACT,MAAI;AACA,QAAK,IAAI,aAAa,SAAS,SAAS,EAAE,eAAe,WAAW,MAAM,EAAE,CAAC,aAAa,MAAM,eAAe,WAAW,MAAM,EAAE;IAC9H,IAAI,QAAQ,aAAa;AACzB,eAAW,KAAK,MAAM;AACtB,QAAI,WAAW,OACX;;WAIL,OAAO;AAAE,SAAM,EAAE,OAAO,OAAO;YAC9B;AACJ,OAAI;AACA,QAAI,gBAAgB,CAAC,aAAa,SAAS,KAAK,WAAW,QAAS,IAAG,KAAK,WAAW;aAEnF;AAAE,QAAI,IAAK,OAAM,IAAI;;;AAEjC,aAAW,UAAU;GACvB;;AAEN,SAAgB,kBAAkB,eAAe;AAC7C,QAAO,IAAI,WAAW,SAAU,YAAY;AACxC,UAAQ,eAAe,WAAW,CAAC,MAAM,SAAU,KAAK;AAAE,UAAO,WAAW,MAAM,IAAI;IAAI;GAC5F;;AAEN,SAAgB,uBAAuB,gBAAgB;AACnD,QAAO,kBAAkB,mCAAmC,eAAe,CAAC;;AAEhF,SAAS,QAAQ,eAAe,YAAY;CACxC,IAAI,iBAAiB;CACrB,IAAI,KAAK;AACT,QAAO,UAAU,MAAM,KAAK,GAAG,KAAK,GAAG,WAAY;EAC/C,IAAI,OAAO;AACX,SAAO,YAAY,MAAM,SAAU,IAAI;AACnC,WAAQ,GAAG,OAAX;IACI,KAAK;AACD,QAAG,KAAK,KAAK;MAAC;MAAG;MAAG;MAAG;MAAG,CAAC;AAC3B,uBAAkB,cAAc,cAAc;AAC9C,QAAG,QAAQ;IACf,KAAK,EAAG,QAAO,CAAC,GAAG,gBAAgB,MAAM,CAAC;IAC1C,KAAK;AACD,SAAI,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAAC,kBAAkB,MAAO,QAAO,CAAC,GAAG,EAAE;AAC5E,aAAQ,kBAAkB;AAC1B,gBAAW,KAAK,MAAM;AACtB,SAAI,WAAW,OACX,QAAO,CAAC,EAAE;AAEd,QAAG,QAAQ;IACf,KAAK,EAAG,QAAO,CAAC,GAAG,EAAE;IACrB,KAAK,EAAG,QAAO,CAAC,GAAG,GAAG;IACtB,KAAK;AACD,aAAQ,GAAG,MAAM;AACjB,WAAM,EAAE,OAAO,OAAO;AACtB,YAAO,CAAC,GAAG,GAAG;IAClB,KAAK;AACD,QAAG,KAAK,KAAK;MAAC;;MAAK;MAAG;MAAG,CAAC;AAC1B,SAAI,EAAE,qBAAqB,CAAC,kBAAkB,SAAS,KAAK,gBAAgB,SAAU,QAAO,CAAC,GAAG,EAAE;AACnG,YAAO,CAAC,GAAG,GAAG,KAAK,gBAAgB,CAAC;IACxC,KAAK;AACD,QAAG,MAAM;AACT,QAAG,QAAQ;IACf,KAAK,EAAG,QAAO,CAAC,GAAG,GAAG;IACtB,KAAK;AACD,SAAI,IAAK,OAAM,IAAI;AACnB,YAAO,CAAC,EAAE;IACd,KAAK,GAAI,QAAO,CAAC,EAAE;IACnB,KAAK;AACD,gBAAW,UAAU;AACrB,YAAO,CAAC,EAAE;;IAEpB;GACJ;;;;;AC5IN,SAAgB,gBAAgB,oBAAoB,WAAW,MAAM,OAAO,QAAQ;AAChF,KAAI,UAAU,KAAK,EAAK,SAAQ;AAChC,KAAI,WAAW,KAAK,EAAK,UAAS;CAClC,IAAI,uBAAuB,UAAU,SAAS,WAAY;AACtD,QAAM;AACN,MAAI,OACA,oBAAmB,IAAI,KAAK,SAAS,MAAM,MAAM,CAAC;MAGlD,MAAK,aAAa;IAEvB,MAAM;AACT,oBAAmB,IAAI,qBAAqB;AAC5C,KAAI,CAAC,OACD,QAAO;;;;;ACbf,IAAW,aAAa,iBAAiB,SAAU,QAAQ;AACvD,QAAO,SAAS,iBAAiB;AAC7B,SAAO,KAAK;AACZ,OAAK,OAAO;AACZ,OAAK,UAAU;;EAErB;;;;ACLF,SAAgB,eAAe,QAAQ,UAAQ;CAC3C,IAAI,YAAY,OAAOC,aAAW;AAClC,QAAO,IAAI,QAAQ,SAAU,SAAS,QAAQ;EAC1C,IAAI,aAAa,IAAI,eAAe;GAChC,MAAM,SAAU,OAAO;AACnB,YAAQ,MAAM;AACd,eAAW,aAAa;;GAE5B,OAAO;GACP,UAAU,WAAY;AAClB,QAAI,UACA,SAAQA,SAAO,aAAa;QAG5B,QAAO,IAAI,YAAY,CAAC;;GAGnC,CAAC;AACF,SAAO,UAAU,WAAW;GAC9B;;;;;ACrBN,SAAgB,YAAY,OAAO;AAC/B,QAAO,iBAAiB,QAAQ,CAAC,MAAM,MAAM;;;;;ACMjD,IAAW,eAAe,iBAAiB,SAAU,QAAQ;AACzD,QAAO,SAAS,iBAAiB,MAAM;AACnC,MAAI,SAAS,KAAK,EAAK,QAAO;AAC9B,SAAO,KAAK;AACZ,OAAK,UAAU;AACf,OAAK,OAAO;AACZ,OAAK,OAAO;;EAElB;AACF,SAAgB,QAAQ,UAAQ,cAAc;CAC1C,IAAI,KAAM,YAAYC,SAAO,GAAG,EAAE,OAAOA,UAAQ,GAAG,OAAOA,aAAW,WAAW,EAAE,MAAMA,UAAQ,GAAGA,UAASC,UAAQ,GAAG,OAAO,OAAO,GAAG,MAAM,KAAK,GAAG,MAAM,QAAQ,OAAO,KAAK,IAAI,sBAAsB,IAAI,KAAK,GAAG,WAAW,YAAY,OAAO,KAAK,IAAI,iBAAiB,QAAQ,iBAAiB,KAAK,IAAI,eAAe,iBAAiB,IAAI,KAAK,GAAG,MAAM,OAAO,OAAO,KAAK,IAAI,OAAO;AACjY,KAAIA,WAAS,QAAQ,QAAQ,KACzB,OAAM,IAAI,UAAU,uBAAuB;AAE/C,QAAO,QAAQ,SAAU,QAAQ,YAAY;EACzC,IAAI;EACJ,IAAI;EACJ,IAAI,YAAY;EAChB,IAAI,OAAO;EACX,IAAI,aAAa,SAAU,OAAO;AAC9B,uBAAoB,gBAAgB,YAAY,WAAW,WAAY;AACnE,QAAI;AACA,gCAA2B,aAAa;AACxC,eAAU,MAAM;MACN;MACK;MACL;MACT,CAAC,CAAC,CAAC,UAAU,WAAW;aAEtB,KAAK;AACR,gBAAW,MAAM,IAAI;;MAE1B,MAAM;;AAEb,+BAA6B,OAAO,UAAU,yBAAyB,YAAY,SAAU,OAAO;AAChG,yBAAsB,QAAQ,sBAAsB,KAAK,KAAa,kBAAkB,aAAa;AACrG;AACA,cAAW,KAAM,YAAY,MAAO;AACpC,UAAO,KAAK,WAAW,KAAK;KAC7B,QAAW,QAAW,WAAY;AACjC,OAAI,EAAE,sBAAsB,QAAQ,sBAAsB,KAAK,IAAI,KAAK,IAAI,kBAAkB,QAC1F,uBAAsB,QAAQ,sBAAsB,KAAK,KAAa,kBAAkB,aAAa;AAEzG,eAAY;IACd,CAAC;AACH,GAAC,QAAQ,WAAWA,WAAS,OAAQ,OAAOA,YAAU,WAAWA,UAAQ,CAACA,UAAQ,UAAU,KAAK,GAAI,KAAK;GAC5G;;AAEN,SAAS,oBAAoB,MAAM;AAC/B,OAAM,IAAI,aAAa,KAAK;;;;;ACtDhC,SAAgB,IAAI,SAAS,SAAS;AAClC,QAAO,QAAQ,SAAU,QAAQ,YAAY;EACzC,IAAI,QAAQ;AACZ,SAAO,UAAU,yBAAyB,YAAY,SAAU,OAAO;AACnE,cAAW,KAAK,QAAQ,KAAK,SAAS,OAAO,QAAQ,CAAC;IACxD,CAAC;GACL;;;;;ACNN,SAAgB,OAAO,WAAW,SAAS;AACvC,QAAO,QAAQ,SAAU,QAAQ,YAAY;EACzC,IAAI,QAAQ;AACZ,SAAO,UAAU,yBAAyB,YAAY,SAAU,OAAO;AAAE,UAAO,UAAU,KAAK,SAAS,OAAO,QAAQ,IAAI,WAAW,KAAK,MAAM;IAAI,CAAC;GACxJ;;;;;ACJN,SAAgB,eAAe,cAAc;AACzC,QAAO,QAAQ,SAAU,QAAQ,YAAY;EACzC,IAAI,WAAW;AACf,SAAO,UAAU,yBAAyB,YAAY,SAAU,OAAO;AACnE,cAAW;AACX,cAAW,KAAK,MAAM;KACvB,WAAY;AACX,OAAI,CAAC,SACD,YAAW,KAAK,aAAa;AAEjC,cAAW,UAAU;IACvB,CAAC;GACL;;;;;ACXN,SAAgB,KAAK,OAAO;AACxB,QAAO,SAAS,IAER,WAAY;AAAE,SAAO;KACvB,QAAQ,SAAU,QAAQ,YAAY;EACpC,IAAI,OAAO;AACX,SAAO,UAAU,yBAAyB,YAAY,SAAU,OAAO;AACnE,OAAI,EAAE,QAAQ,OAAO;AACjB,eAAW,KAAK,MAAM;AACtB,QAAI,SAAS,KACT,YAAW,UAAU;;IAG/B,CAAC;GACL;;;;;ACdV,SAAgB,aAAa,cAAc;AACvC,KAAI,iBAAiB,KAAK,EAAK,gBAAe;AAC9C,QAAO,QAAQ,SAAU,QAAQ,YAAY;EACzC,IAAI,WAAW;AACf,SAAO,UAAU,yBAAyB,YAAY,SAAU,OAAO;AACnE,cAAW;AACX,cAAW,KAAK,MAAM;KACvB,WAAY;AAAE,UAAQ,WAAW,WAAW,UAAU,GAAG,WAAW,MAAM,cAAc,CAAC;IAAK,CAAC;GACpG;;AAEN,SAAS,sBAAsB;AAC3B,QAAO,IAAI,YAAY;;;;;ACR3B,SAAgB,MAAM,WAAW,cAAc;CAC3C,IAAI,kBAAkB,UAAU,UAAU;AAC1C,QAAO,SAAU,QAAQ;AACrB,SAAO,OAAO,KAAK,YAAY,OAAO,SAAU,GAAG,GAAG;AAAE,UAAO,UAAU,GAAG,GAAG,OAAO;IAAI,GAAG,UAAU,KAAK,EAAE,EAAE,kBAAkB,eAAe,aAAa,GAAG,aAAa,WAAY;AAAE,UAAO,IAAI,YAAY;IAAI,CAAC;;;;;;ACiBhO,MAAa,aAAsC,QAAW,UAA4C;CACxG,MAAM,kBAAkB,CAAC,GAAG,MAAM,QAAQ;AAC1C,iBAAgB,QAAQ,OAAO;AAC/B,QAAO;EACL,SAAS,MAAM;EACf,SAAS;EACV;;AAGH,MAAa,gBAAyC,QAAW,UAA4C;CAC3G,MAAM,kBAAkB,CAAC,GAAG,MAAM,QAAQ;CAC1C,MAAM,QAAQ,gBAAgB,WAAW,MAAM,EAAE,OAAO,OAAO,GAAG;AAClE,KAAI,QAAQ,GACV,iBAAgB,SAAS;AAE3B,QAAO;EACL,SAAS,MAAM;EACf,SAAS;EACV;;AAGH,MAAa,gBACX,QACA,UACoB;CACpB,MAAM,kBAAkB,MAAM,QAAQ,QAAQ,MAAM,EAAE,OAAO,OAAO,GAAG;AACvE,QAAO;EACL,SAAS,MAAM;EACf,SAAS;EACV;;AAGH,MAAM,gBAAyC,gBAAgC;AAC7E,QAAO,KACL,KAAK,UAAsB,MAAM,QAA8B,OAAO,EACtE,QAAQ,WAAc,OAAO,SAAS,YAAY,KAAK,CACxD;;AAGH,MAAa,sBAA+C,OAA0B,gBAAgC;AACpH,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yCAAyC;AAG3D,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,qCAAqC;AAGvD,QAAO,OAAO,OAAO,WAAgC,qBAAqB,YAAY,CAAC,KAAK,aAAa,YAAY,CAAC;;AAGxH,MAAa,wBACX,OACA,gBACG;AACH,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,0CAA0C;AAG5D,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,qCAAqC;AAGvD,QAAO,OAAO,OACX,WAAkC,qBAAqB,cAAc,CACrE,KAAK,aAAa,YAAY,CAAC;;AAGpC,MAAa,wBACX,OACA,gBACG;AACH,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,8CAA8C;AAGhE,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,qCAAqC;AAGvD,QAAO,OAAO,OACX,WAAkC,qBAAqB,cAAc,CACrE,KAAK,aAAa,YAAY,CAAC;;;;;AC/FpC,MAAMC,eAAa,QAAoB,UAA4C;CACjF,MAAM,kBAAkB,CAAC,GAAG,MAAM,YAAY;AAC9C,iBAAgB,QAAQ,OAAO;AAC/B,QAAO;EACL,WAAW,MAAM;EACjB,aAAa;EACd;;AAGH,MAAMC,kBAAgB,QAAoB,UAA4C;CACpF,MAAM,kBAAkB,CAAC,GAAG,MAAM,YAAY;CAC9C,MAAM,QAAQ,gBAAgB,WAAW,MAAM,EAAE,OAAO,OAAO,GAAG;AAClE,KAAI,QAAQ,GACV,iBAAgB,SAAS;AAE3B,QAAO;EACL,WAAW,MAAM;EACjB,aAAa;EACd;;AAGH,MAAMC,kBAAgB,QAAoB,UAA4C;CACpF,MAAM,kBAAkB,MAAM,YAAY,QAAQ,MAAM,EAAE,OAAO,OAAO,GAAG;AAC3E,QAAO;EACL,WAAW,MAAM;EACjB,aAAa;EACd;;AAGH,MAAM,oBAAoB,cAA2C,OAAU;AAE/E,MAAa,uBAAwC;CACnD,MAAM,oBAAoB,WAAW,kBAAkB;AACvD,KAAI,CAAC,kBACH,OAAM,IAAI,MAAM,gEAAgE;AAGlF,QAAO;;AAYT,MAAaC,sBAA0D,EAAE,OAAO,eAAe;CAC7F,MAAM,CAAC,OAAO,YAAY,SAA0B;EAClD,aAAa,EAAE;EACf,WAAW;EACZ,CAAC;AAEF,iBAAgB;AACd,EAAK,MAAM,KAAK,QAAQ,CAAC,MAAM,gBAAgB,SAAS;GAAE;GAAa,WAAW;GAAO,CAAC,CAAC;IAC1F,CAAC,MAAM,KAAK,OAAO,CAAC;AAEvB,iBAAgB;AACd,MAAI,CAAC,MAAM,aAAa,OAAO;GAC7B,MAAM,mBAAmB,mBAAmB,OAAO,WAAW,CAAC,WAAW,WACxE,SAASH,YAAU,QAAQ,MAAM,CAAC,CACnC;GAED,MAAM,oBAAoB,qBAAqB,OAAO,WAAW,CAAC,WAAW,WAC3E,SAASC,eAAa,QAAQ,MAAM,CAAC,CACtC;GAED,MAAM,oBAAoB,qBAAqB,OAAO,WAAW,CAAC,WAAW,WAC3E,SAASC,eAAa,QAAQ,MAAM,CAAC,CACtC;AAED,gBAAa;AACX,qBAAiB,aAAa;AAC9B,sBAAkB,aAAa;AAC/B,sBAAkB,aAAa;;;IAGlC,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO,oBAAC,kBAAkB;EAAS,OAAO;EAAQ;GAAsC;;;;;AClF1F,MAAME,eAAa,QAAuB,UAAkD;CAC1F,MAAM,kBAAkB,CAAC,GAAG,MAAM,eAAe;AACjD,iBAAgB,QAAQ,OAAO;AAC/B,QAAO;EACL,WAAW,MAAM;EACjB,gBAAgB;EACjB;;AAGH,MAAMC,kBAAgB,QAAuB,UAAkD;CAC7F,MAAM,kBAAkB,CAAC,GAAG,MAAM,eAAe;CACjD,MAAM,QAAQ,gBAAgB,WAAW,MAAM,EAAE,OAAO,OAAO,GAAG;AAClE,KAAI,QAAQ,GACV,iBAAgB,SAAS;AAE3B,QAAO;EACL,WAAW,MAAM;EACjB,gBAAgB;EACjB;;AAGH,MAAMC,kBAAgB,QAAuB,UAAkD;CAC7F,MAAM,kBAAkB,MAAM,eAAe,QAAQ,MAAM,EAAE,OAAO,OAAO,GAAG;AAC9E,QAAO;EACL,WAAW,MAAM;EACjB,gBAAgB;EACjB;;AAGH,MAAM,uBAAuB,cAA8C,OAAU;AAErF,MAAa,0BAA8C;CACzD,MAAM,uBAAuB,WAAW,qBAAqB;AAC7D,KAAI,CAAC,qBACH,OAAM,IAAI,MAAM,sEAAsE;AAGxF,QAAO;;AAYT,MAAaC,yBAA6D,EAAE,OAAO,eAAe;CAChG,MAAM,CAAC,OAAO,YAAY,SAA6B;EACrD,gBAAgB,EAAE;EAClB,WAAW;EACZ,CAAC;AAEF,iBAAgB;AACd,EAAK,MAAM,QAAQ,QAAQ,CAAC,MAAM,mBAAmB,SAAS;GAAE;GAAgB,WAAW;GAAO,CAAC,CAAC;IACnG,CAAC,MAAM,QAAQ,OAAO,CAAC;AAE1B,iBAAgB;AACd,MAAI,CAAC,MAAM,aAAa,OAAO;GAC7B,MAAM,mBAAmB,mBAAmB,OAAO,cAAc,CAAC,WAAW,WAC3E,SAASH,YAAU,QAAQ,MAAM,CAAC,CACnC;GAED,MAAM,oBAAoB,qBAAqB,OAAO,cAAc,CAAC,WAAW,WAC9E,SAASC,eAAa,QAAQ,MAAM,CAAC,CACtC;GAED,MAAM,oBAAoB,qBAAqB,OAAO,cAAc,CAAC,WAAW,WAC9E,SAASC,eAAa,QAAQ,MAAM,CAAC,CACtC;AAED,gBAAa;AACX,qBAAiB,aAAa;AAC9B,sBAAkB,aAAa;AAC/B,sBAAkB,aAAa;;;IAGlC,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO,oBAAC,qBAAqB;EAAS,OAAO;EAAQ;GAAyC;;;;;ACjFhG,MAAME,eAAa,QAA6B,UAA8D;CAC5G,MAAM,kBAAkB,CAAC,GAAG,MAAM,qBAAqB;AACvD,iBAAgB,QAAQ,OAAO;AAC/B,QAAO;EACL,WAAW,MAAM;EACjB,sBAAsB;EACvB;;AAGH,MAAMC,kBAAgB,QAA6B,UAA8D;CAC/G,MAAM,kBAAkB,CAAC,GAAG,MAAM,qBAAqB;CACvD,MAAM,QAAQ,gBAAgB,WAAW,MAAM,EAAE,OAAO,OAAO,GAAG;AAClE,KAAI,QAAQ,GACV,iBAAgB,SAAS;AAE3B,QAAO;EACL,WAAW,MAAM;EACjB,sBAAsB;EACvB;;AAGH,MAAMC,kBAAgB,QAA6B,UAA8D;CAC/G,MAAM,kBAAkB,MAAM,qBAAqB,QAAQ,MAAM,EAAE,OAAO,OAAO,GAAG;AACpF,QAAO;EACL,WAAW,MAAM;EACjB,sBAAsB;EACvB;;AAGH,MAAM,6BAA6B,cAAoD,OAAU;AAEjG,MAAa,gCAA0D;CACrE,MAAM,6BAA6B,WAAW,2BAA2B;AACzE,KAAI,CAAC,2BACH,OAAM,IAAI,MAAM,kFAAkF;AAGpG,QAAO;;AAYT,MAAaC,+BAAmE,EAAE,OAAO,eAAe;CACtG,MAAM,CAAC,OAAO,YAAY,SAAmC;EAC3D,sBAAsB,EAAE;EACxB,WAAW;EACZ,CAAC;AAEF,iBAAgB;AACd,EAAK,MAAM,eACR,yBAAyB,CACzB,MAAM,yBAAyB,SAAS;GAAE;GAAsB,WAAW;GAAO,CAAC,CAAC;IACtF,CAAC,MAAM,CAAC;AAEX,iBAAgB;AACd,MAAI,CAAC,MAAM,aAAa,OAAO;GAC7B,MAAM,mBAAmB,mBAAmB,OAAO,oBAAoB,CAAC,WAAW,WACjF,SAASH,YAAU,QAAQ,MAAM,CAAC,CACnC;GAED,MAAM,oBAAoB,qBAAqB,OAAO,oBAAoB,CAAC,WAAW,WACpF,SAASC,eAAa,QAAQ,MAAM,CAAC,CACtC;GAED,MAAM,oBAAoB,qBAAqB,OAAO,oBAAoB,CAAC,WAAW,WACpF,SAASC,eAAa,QAAQ,MAAM,CAAC,CACtC;AAED,gBAAa;AACX,qBAAiB,aAAa;AAC9B,sBAAkB,aAAa;AAC/B,sBAAkB,aAAa;;;IAGlC,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO,oBAAC,2BAA2B;EAAS,OAAO;EAAQ;GAA+C;;;;;ACxF5G,MAAa,kBAAkB,EAC7B,yBAAyB,MACzB,uBAIE,EAAE,KAAK;CACT,MAAM,EAAE,sBAAsB,WAAW,iBAAiB,yBAAyB;CACnF,MAAM,EAAE,gBAAgB,WAAW,mBAAmB,mBAAmB;CACzE,MAAM,EAAE,aAAa,WAAW,kBAAkB,gBAAgB;AAgDlE,QAAO;EACL,aA/CkB,cAAsC;GAExD,MAAM,8BAA8B,qBAAqB,IAAI,wBAAwB;GACrF,MAAM,wBAAwB,eAAe,IAAI,wBAAwB;GACzE,MAAM,qBAAqB,YAAY,IAAI,wBAAwB;GAEnE,MAAM,oCAAoB,IAAI,KAAa;GAE3C,MAAM,aAAa;IAAC,GAAG;IAA6B,GAAG;IAAuB,GAAG;IAAmB;AAmCpG,WA/BE,0BAA0B,qBACtB,WAAW,QAAQ,QAAQ,UAAU;AACnC,QAAI,sBAAsB,OAAO,UAAU,uBAAuB,mBAAoB,QAAO;AAE7F,QAAI,wBAAwB;AAC1B,SAAI,CAAC,OAAO,SAAU,QAAO;AAC7B,SAAI,kBAAkB,IAAI,OAAO,SAAS,mBAAmB,CAAE,QAAO;AAYtE,SATE,OAAO,SAAS,mBAChB,WACG,MAAM,QAAQ,EAAE,CAChB,MACE,MACC,EAAE,UAAU,uBAAuB,OAAO,UAAU,sBACpD,EAAE,UAAU,gBACf,KAAK,QAEgB;AACxB,wBAAkB,IAAI,OAAO,SAAS,mBAAmB;AACzD,aAAO;;;AAIX,WAAO;KACP,GACF,YAG6B,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC;KAG/F;GAAC;GAAsB;GAAgB;GAAa;GAAwB;GAAmB,CAAC;EAIjG,WAAW,kBAAkB,gBAAgB;EAC9C;;;;;AC/DH,SAAgB,wBAAwB,oBAA6B;AACnE,KAAI,CAAC,mBACH,QAAO;EACL,aAAa,EAAE;EACf,WAAW;EACZ;CAGH,MAAM,EAAE,WAAW,gBAAgB,eAAe;EAChD,wBAAwB;EACxB;EACD,CAAC;AAEF,KAAI,UACF,QAAO;EACL,aAAa;EACb,WAAW;EACZ;AAMH,QAAO;EACL,WAAW;EACX,YAJA,YAAY,MAAM,MAAM,EAAE,UAAU,gBAAgB,IAAK,YAAY;EAKrE;EACA,MAAM,YAAY,MACf,MAAgF,EAAE,kBAAkB,WACtG;EACD,OAAO,YAAY,MAChB,MACC,EAAE,kBAAkB,cACvB;EACF;;;;;ACjCH,MAAa,qBAAqB,iBAA+B;CAC/D,MAAM,EAAE,aAAa,cAAc,eAAe,EAAE,wBAAwB,OAAO,CAAC;AAEpF,QAAO;EACL;EACA,YAAY,cAAc,YAAY,MAAM,MAAM,EAAE,OAAO,aAAa,EAAE,CAAC,aAAa,aAAa,CAAC;EACvG;;;;;ACAH,SAAgB,6BAA6B,EAC3C,YACA,gBAIsC;AACtC,QAAO,OAAO,EACZ,qBACA,yBACA,oBACA,YACA,uBACA,aACA,kBACA,mBACI;EAGJ,IAAIE,YACF,yBAAyB,qBAAqB,SAAS,UAAU,GAC7D,QACA,qBAAqB,SAAS,UAAU,GACtC,QACA;AAKR,MAAI,CAAC,uBAAuB,CAAC,YAC3B,aAAY;EAGd,MAAM,sCACJ,yBAAyB,WAAW,kCAAkC,WACtE,YAAY,gBAAgB,SAAS,wBAAwB,QAAQ;EAMvE,MAAM,6BAHH,yBAAyB,WAAW,eAAe,wBAAwB,WAAW,gBACvF,YAAY,YAAY,SAAS,wBAAwB,IAAI,IAEU;EAGzE,MAAM,YACJ,iBAAiB,OACb,KAAK,IAAI,oBAAoB,GAAG,GAChC,OAAO,iBAAiB,WACtB,KAAK,IAAI,oBAAoB,aAAa,GAC1C;AAGR,MAAI,CAAC,WAAW,OAAO,WAAW,IAAI,wBACpC,OAAM,IAAI,MAAM,wFAAwF;EAG1G,MAAM,UAAU,WAAW,IAAI,kBAAkB;EACjD,MAAM,OAAO,MAAM,QAAQ,IACzB,IAAI,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,UAC3B,aAAa,OAAO,UAAU;GAC5B;GACA,YAAY,4BAA4B,WAAW,gBAAgB,WAAW;GAC/E,CAAC,CACH,CACF;AAED,MAAI,WAAW;GACb,MAAM,KAAK;GACX,MAAM,UAAU,aAAa,kBAAkB,QAAQ,QAAQ;AA2B/D,UAAO;IACL,QAAQ;IACR,SA5BiB,MAAM,QAAQ,IAC/B,KAAK,IAAI,OAAO,QAAQ;KACtB,MAAM,YAAY,MAAM,QAAQ,OAAkD;MAChF,QAAQ;MACR,SAAS,EACP,KACD;MACF,CAAC;AAEF,SAAI,UAAU,SAAS,UAAU,WAC/B,OAAM,IAAI,MAAM,uBAAuB;KAGzC,IAAIC;AACJ,SAAI,cAAc,MAEhB,wBADe,OAAO,QAAQ,UAAU,SAAS,IAAI,CACvB;UACzB;MACL,MAAM,SAAS,OAAO,QAAQ,UAAU,SAAS,IAAI;AACrD,6BAAuB,GAAG,OAAO,IAAI,GAAG,OAAO,IAAI;;AAGrD,YAAO;MACP,CACH;IAKA;;AAIH,MACE,gBACC,qBAAqB,kCAAkC,WACtD,qBAAqB,kCAAkC,WACvD,qBAAqB,kCAAkC,SAEzD,QAAO;GACL,QAAQ;GACR,MAAM,KAAK,KAAK,QAAQ,cAAc,IAAI,CAAC;GAC5C;AAGH,QAAM,IAAI,MACR,wIACE,cAAc,UAAU,KACvB,qBAAqB,KAAK,KAAK,IAAI,YACvC;;;;;;AC5HL,MAAa,wBAAwB,4BAAgE;CAGnG,MAAM,iBAAiB,yBAAyB,SAAS;CAGzD,MAAM,kBAAkB,yBAAyB,kCAC7C,OAAO,KAAK,wBAAwB,gCAAgC,CAAC,KACrE;CACJ,MAAM,gBAAgB,kBAClB,yBAAyB,gCAAgC,mBACzD;AAaJ,QAX0B,iCACxB,iBAAiB,iBACb,8BACE,mCAAmC,eAAe;EAChD,SAAS,gBAAgB;EACzB,IAAI,gBAAgB;EACrB,CAAC,CACH,GACD,EAAE,CACP;;;;;AChBH,SAAS,gDAAgD,YAAoD;AAC3G,KAAI,WAAW,WAAW,WACxB,QAAO;EACL,aAAa,YAAY;EACzB,gBAAgB,WAAW,MAAM,iBAAiB;EAClD,yBAAyB,WAAW,QAAQ,KAAK,MAAO,UAAU,IAAI,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,EAAE,WAAW,CAAE;EACrG;AAGH,KAAI,WAAW,WAAW,eAAe,WAAW,WAAW,YAC7D,QAAO;EACL,aAAa,YAAY;EACzB,gBAAgB,WAAW,MAAM,aAAa,GAAG,QAAQ,YAAY,GAAG;EACxE,yBAAyB,WAAW,QAAQ,KAAK,MAAM,EAAE,KAAK;EAC/D;AAGH,QAAO;EACL,aAAa,YAAY;EACzB,yBAAyB,WAAW,QAAQ,KAAK,MAAM,EAAE,KAAK;EAC/D;;AAGH,SAAgB,gCAAgC,iBAAuD;CACrG,MAAMC,iBAAkE,gBAAgB,mBAAmB,CAEzG;EACE,UAAU;EACV,SAAS,CAAC,gBAAgB,YAAY,KAAK,MAAM,EAAE,GAAG,CAAC;EACvD,kBAAkB,gBAAgB,iBAAiB,CAAC,gBAAgB,YAAY,KAAK,MAAM,EAAE,GAAG,CAAC,GAAG;EACrG,CACF;CAED,MAAMC,UAAsC,EAAE;AAC9C,MAAK,MAAM,iBAAiB,eAE1B,MAAK,MAAM,gBAAgB,cAAc,mBAAmB,MAAM,cAAc,QAAQ,IAAI;EAC1F,MAAM,QAAQ,gBAAgB,mBAAmB;EACjD,MAAM,kBAAkB,gBAAgB,YAAY,MAAM,MAAM,EAAE,OAAO,aAAa;AACtF,MAAI,CAAC,gBACH,OAAM,IAAI,MAAM,eAAe,aAAa,2BAA2B;AAGzE,MAAI,CAAC,SAAS,CAAC,MAAM,SAAS;GAC5B,MAAM,wBAAwB,gDAAgD,gBAAgB;AAC9F,WAAQ,KAAK;IACX,aAAa;IACb,mBAAmB;IACnB,MAAM,sBAAsB;IAC5B,yBAAyB,sBAAsB,2BAA2B,EAAE;IAC7E,CAAC;AACF;;EAGF,MAAM,uBAAuB,wBAAwB,MAAM,OAAO;EAElE,IAAIC;AACJ,MAAI,MAAM,OAAO,sBAAsB,eAAe,MAAM,OAAO,sBAAsB,aAAa;AACpG,OAAI,MAAM,OAAO,SAAS,gBAAiB,OAAM,IAAI,MAAM,uBAAuB;AAElF,OAAI,gBAAgB,WAAW,eAAe,gBAAgB,WAAW,YACvE,OAAM,IAAI,MAAM,qCAAqC,gBAAgB,OAAO,+BAA+B;GAI7G,MAAM,EAAE,YAAY,aAAa,wCAAwC,MAAM,OAAO,OAAO;AAC7F,eAAY;IACV;IACA;IACA,OAAO,gCAAgC,YAAY,EAAE;IACtD;aACQ,MAAM,OAAO,sBAAsB,YAAY;AACxD,OAAI,MAAM,OAAO,SAAS,aAAc,OAAM,IAAI,MAAM,sBAAsB;AAK9E,eAAY;IACV,GAAG,uCAAuC,MAAM,OAAO,YAAY,MAAM,OAAO,WAAW;IAC3F,OAAO,gCAAgC,MAAM,OAAO,YAAY,EAAE;IACnE;SACI;AACL,OAAI,MAAM,OAAO,SAAS,sBAAuB,OAAM,IAAI,MAAM,+BAA+B;AAGhG,eAAY;IACV,YAAY,qBAAqB;IACjC,UAAU,qBAAqB;IAC/B,OAAO,gCAAgC,qBAAqB,YAAY,EAAE;IAC3E;;AAGH,UAAQ,KAAK;GACX,mBAAmB;GACnB,aAAa,CACX;IACE,YAAY;IACZ;IACD,CACF;GACD,aAAa;GACb,MAAM,qBAAqB,QAAQ;GACpC,CAAC;;AAIN,QAAO;EACL,iBAAiB,QAAQ,OAAO,UAAU,MAAM,YAAY;EAC5D,SAAS,eAAe,KAAK,MAAM,EAAE,QAAQ,CAAC,MAAM,YAA+B,OAAO,YAAY,SAAS;EAC/G;EACD;;;;;AC5GH,SAAS,iBAAiB,MAAc,QAAsB,aAAuB,EAAE,EAAE;AACvF,KAAI;EACF,MAAMC,aAID,SAAS,MAAM,KAAK;AAEzB,MAAI,CAAC,MAAM,QAAQ,WAAW,CAC5B,QAAO;EAGT,MAAMC,aAAmC,EAAE;AAE3C,MAAI,WAAW,YAAY,SACzB;OAAI,WAAW,WAAW,EACxB,YAAW,KAAK,WAAW,GAAG,WAAW,MAAM;QAGjD,MAAK,MAAM,SAAS,YAAY;GAE9B,MAAM,QAAQ,MAAM,WAAW;AAC/B,OAAI;IAAC;IAAM;IAAM;IAAoB,CAAC,SAAS,MAAM,CACnD;AAIF,OAAI,MAAM,WAAW,SAAS,OAC5B;AAGF,OACE,MAAM,WAAW,SAAS,cACzB,MAAM,WAAW,SAAS,qBAAqB,CAAC,OAAO,MAAM,MAAM,CAGpE,YAAW,KAAK,KAAK;AAGvB,OAAI,MAAM,WAAW,SAAS,gBAAgB,MAAM,WAAW,SAAS,iBAEtE,YAAW,KAAK,MAAM;;AAK5B,MAAI,WAAW,MAAM,QAAQ,WAAW,SAAS,IAAI,CAAC,CACpD,QAAO;AAGT,SAAO;UACA,OAAO;AACd,SAAO;;;AAIX,SAAgB,kCACd,uBACA,YACqB;CACrB,MAAM,UAAU,sBAAsB,aAAa,SAAS,gBAAgB;AAK1E,SAF0B,YAAY,gBAAgB,MAAM,GAAG,YAAY,WAAW,CAE7D,KAAK,eAAyC;AACrE,OAAI,WAAW,sBAAsB,UAAU,EAC7C,QAAO;IACL,mBAAmB,WAAW;IAC9B,MAAM,WAAW;IACjB,aAAa,WAAW;IACxB,aAAa;IACb,aAAa,WAAW,sBAAsB,KAC3C,yBAAsE;KACrE,MAAM,uBAAuB,wBAAwB,qBAAqB,iBAAiB;KAG3F,IAAIC;AACJ,SAAI,qBAAqB,gBAAgB,YAAY,SAAS;MAC5D,MAAM,EAAE,YAAY,aAAa,wCAC/B,qBAAqB,iBACtB;AACD,kBAAY;OACV;OACA;OACA,OAAO,gCAAgC,YAAY,EAAE;OACtD;gBACQ,qBAAqB,gBAAgB,YAAY,QAC1D,aAAY;MACV,GAAG,uCACD,qBAAqB,kBACrB,qBAAqB,iBAAiB,WACvC;MACD,OAAO,gCAAgC,qBAAqB,kBAAkB,EAAE;MACjF;SAED,aAAY;MACV,YAAY,qBAAqB;MACjC,UAAU,qBAAqB;MAC/B,OAAO,gCAAgC,qBAAqB,YAAY,EAAE;MAC3E;AAGH,YAAO;MACL,YAAY;MACZ;MACD;MAEJ;IACF;GAIH,MAAM,kBAAkB,WAAW,kBAAkB,MAAM,EAAE,SAAS,OAAO,WAAW,kBAAkB;GAC1G,MAAM,0BACJ,iBAAiB,aAAa,QAC1B,KAAK,MACL,iBAAiB,EAAE,KAAK,IAAI,gBAAgB,QAAQ,WAAW,YAAY,UAAU,OAAU,EAAE,QAC9F,UAA2B,UAAU,KACvC,CACF,CACA,QAAQ,SAA2B,SAAS,OAAU,IAAI,EAAE;GAEjE,MAAM,UAAU,iBAAiB,QAAQ,WAAW,gBAAgB,KAAK;GACzE,MAAM,WAAW,iBAAiB,SAAS,eACvC,gBAAgB,YAAY,QAAQ,MAAM,UAAU,MAAM,KAAK,SAAS,QAAQ,CAAC,GACjF;GACJ,MAAM,MAAO,UAAU,QAAQ,SAAS,UAAU,QAAQ,OAAO;AAEjE,UAAO;IACL,mBAAmB,WAAW;IAC9B,MAAM,YAAY,QAAQ,WAAW,KAAK,QAAQ,YAAY,GAAG;IACjE,aAAa,YAAY;IACzB,aAAa;IACY;IAC1B;IACD;GACF;AAEF,QAAO;EACL,iBAAiB,QAAQ,OAAO,UAAU,MAAM,YAAY;EAC5D,MAAM,sBAAsB;EAC5B,SAAS,sBAAsB;EAC/B;EACD;;;;;ACvJH,MAAa,2BAA2B,OAAO,YAA6C;CAC1F,MAAM,iBAAiB,QAAQ,6BAA6B,4BAA4B;CACxF,MAAM,WAAW,QAAQ,6BAA6B,4BAA4B;AAIlF,QAAO;EACL,cAAc;GACZ,kBALqB,gBAAgB;GAMrC,SALY,gBAAgB;GAM5B;GACD;EACD,iBAAiB,EAAE;EACpB;;;;;ACEH,MAAa,uCAAuC,OAAO,EACzD,8BACA,SACA,qBACA,kCACiD;CACjD,MAAMC,kBAAmC,EAAE;CAC3C,IAAIC;CACJ,IAAIC;CACJ,MAAM,MACJ,OAAO,6BAA6B,4BAA4B,iBAAiB,WAC7E,IAAI,IAAI,6BAA6B,4BAA4B,aAAa,CAAC,SAC/E;CACN,IAAI,WAAW,6BAA6B,4BAA4B;CAExE,MAAM,aAAa,QAAQ,MAAM,kBAAkB,QAAQ,iBAAiB;CAC5E,MAAM,SAAS,6BAA6B,4BAA4B;AAExE,KAAI;AACF,MAAI,UAAU,OAAO,WAAW,OAAO;GAGrC,MAAM,QAAQ,MAAM,QAAQ,MAAM,KAC/B,yBAAyB;IACxB,kBAAkB,OAAO;IACzB,aAAa,OAAO,IAAI;IACxB,qBAAqB,WAAW;IACjC,CAAC,CACD,YAAY,KAAK;GAEpB,MAAM,gBAAgB,QAClB,4BAA4B,oBAAoB,MAAM,MACpD,gBAAgB,uBAAuB,EAAE,YAAY,CAAC,MAAM,MAAM,GAAG,CACtE,GACD;AACJ,OAAI,eAAe;AACjB,uBAAmB,cAAc;AACjC,cAAU,cAAc;AACxB,eAAW,cAAc;AAEzB,oBAAgB,KAAK;KACnB,UAAU,cAAc;KACxB,kBAAkB,cAAc;KAChC,SAAS,cAAc;KACvB,KAAK,cAAc;KACnB,MAAM,cAAc;KACrB,CAAC;AAEF,QAAI,oBAAqB,iBAAgB,KAAK,oBAAoB;UAC7D;AACL,uBAAmB,6BAA6B,4BAA4B,iBAAiB;AAC7F,cAAU,6BAA6B,4BAA4B,iBAAiB;;;UAGjF,OAAO;AAIhB,QAAO;EACL,cAAc;GACZ;GACA;GACA;GACA;GACD;EACD;EACD;;;;;AClEH,MAAa,4CAA4C,OACvD,YACG;CACH,MAAMC,kBAAmC,EAAE;CAC3C,IAAIC;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAIC;CAIJ,MAAM,CAAC,SAAS,QAAQ,0CAA0C,EAAE;CAEpE,MAAM,cAAc,QAAQ,4BAA4B,oBAAoB,MACzE,MAAM,gBAAgB,uBAAuB,EAAE,YAAY,CAAC,YAAY,MAAM,4BAA4B,OAC5G;AAED,KAAI,aAAa;EACf,MAAM,UAAU,MAAM,4BAA4B,YAAY;EAC9D,MAAM,UAAU,MAAM,4BAA4B,YAAY;AAE9D,qBAAmB;AACnB,YAAU,YAAY;AACtB,QAAM;AACN,aAAW;EAIX,MAAM,UAAU,QAAQ,4BAA4B,UAAU,UAAU,MAAM,EAAE,oCAC9E,8BAA8B,MAAM,QAAQ,IAAI,aAAa,QAAQ,CACtE;AAED,MAAI,SAAS;GACX,MAAM,YAAY,QAAQ,8BAA8B,MAAM,QAAQ,IAAI,aAAa,QAAQ;AAC/F,mBAAgB,KAAK,UAAU;AAC/B,mBAAgB,KAAK,QAAQ;AAC7B,mBAAgB,KAAK,QAAQ,4BAA4B,UAAU;;;CAMvE,MAAM,EAAE,iBAAiB,qBAAqB,iBAAiB,MAAM,qCACnE,QACD;AAED,QAAO;EACL,cAAc;GACZ;GACA;GACA;GACA,UAAU,YAAY,aAAa;GACpC;EACD,iBAAiB,CAAC,GAAG,qBAAqB,GAAG,gBAAgB;EAC9D;;;;;AChEH,MAAa,wCAAwC,OAAO,YAA0D;CACpH,MAAM,iBAAiB,QAAQ,6BAA6B,4BAA4B;CACxF,MAAM,WAAW,QAAQ,6BAA6B,4BAA4B;CAClF,MAAM,mBAAmB,gBAAgB;CACzC,MAAM,UAAU,gBAAgB;CAEhC,MAAM,iBAAiB,WACnB,MAAM,QAAQ,QAAQ,MAAM,QAAQ,gBAAgB,8BAA8B;EAChF;EACA,sBAAsB,QAAQ,4BAA4B;EAC3D,CAAC,GACF;CAEJ,MAAM,MACJ,OAAO,QAAQ,6BAA6B,4BAA4B,iBAAiB,WACrF,IAAI,IAAI,QAAQ,6BAA6B,4BAA4B,aAAa,CAAC,SACvF;CAEN,MAAM,kBACJ,gBACI,KAAK,WAAW;EAChB,UAAU,MAAM,+BAA+B;EAC/C,kBACE,MAAM,+BAA+B,UAAU,mBAAmB,qBAAqB;EACzF,SAAS,MAAM,+BAA+B,UAAU,mBAAmB;EAC5E,EAAE,CACF,QAAQ,QAAQ,OAAO,SAAS,KAAK,WAAW,MAAM,EAAE,aAAa,OAAO,SAAS,KAAK,MAAM,IAAI,EAAE;AAE3G,QAAO;EACL,cAAc;GACZ;GACA;GACA;GACA;GACD;EACD;EACD;;;;;ACsBH,MAAa,wBAAwB,YAGf;AACpB,KAAI,QAAQ,0CAA0C,QAAQ,uCAAuC,SAAS,EAC5G,QAAO;AAGT,KAAI,QAAQ,6BAA6B,SAAS,mBAAmB,QACnE,QAAO;AAGT,KAAI,QAAQ,6BAA6B,4BAA4B,OAAO,WAAW,MACrF,QAAO;AAGT,KAAI,QAAQ,6BAA6B,SAAS,mBAAmB,MACnE,QAAO;AAGT,OAAM,IAAI,MAAM,4DAA4D;;AAG9E,MAAa,qBAAqB,OAChC,YAKI;CACJ,MAAM,iBAAiB,qBAAqB,QAAQ;CAEpD,MAAM,8BAA8B,QAAQ,QAAQ,gBAAgB,MAAM,OAAO,GAAG,mBAAmB,eAAe;AAGtH,KAAI,CAAC,4BACH,OAAM,IAAI,MAAM,UAAU,eAAe,kCAAkC;CAI7E,IAAI;AACJ,SAAQ,gBAAR;EACE,KAAK;AACH,qBAAkB,MAAM,0CAA0C;IAChE,GAAG;IAC0B;IAC9B,CAAC;AACF;EACF,KAAK;AACH,qBAAkB,MAAM,sCAAsC;IAC5D,GAAG;IAC0B;IAC9B,CAAC;AACF;EACF,KAAK;AACH,qBAAkB,MAAM,qCAAqC;IAC3D,GAAG;IAC0B;IAC9B,CAAC;AACF;EACF,KAAK;AACH,qBAAkB,MAAM,yBAAyB,QAAQ;AACzD;EACF,QACE,OAAM,IAAI,MAAM,sCAAsC,eAAe,GAAG;;CAG5E,IAAI,WAAW,gBAAgB,aAAa;AAC5C,KAAI,CAAC,UAAU;AACb,MAAI,QAAQ,OAAQ,YAAW,cAAc,QAAQ;AACrD,QAAM,IAAI,MAAM,sDAAsD;;AAGxE,QAAO;EACL,GAAG;EACH;EACA,cAAc;GACZ,GAAG,gBAAgB;GACnB;GACD;EACF;;;;;ACjHH,MAAa,gCAAgC,OAAO,EAClD,SACA,KACA,iBAAiB,MACjB,gBACA,aAC0C;CAC1C,MAAM,mBAAmB,OAAO;AAEhC,KAAI,CAAC,iBACH,OAAM,IAAI,qCACR,mFACD;CAGH,MAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,qCAAqC,kBAAkB;EAClH;EACA,4BAA4B,QAAQ,gBAAgB,MAAM,OAAO,GAAG,mBAAmB,oBAAoB,EACvG;EACL,CAAC;CASF,MAAM,EAAE,gBAAgB,iBAAiB,iBAAiB,MAAM,mBAAmB;EACjF;EACA,8BAA8B;EAC9B;EACA,wCAV6C,MAAM,oCAAoC,QAAQ,MAAM,SAAS;GAC9G,8BAA8B;GAC9B,sBAAsB;GACvB,CAAC;EAQD,CAAC;CAEF,IAAIC;AACJ,KAAI,SAAS,qBACX,uBAAsB,kCACpB,SAAS,qBAAqB,uBAC9B,SAAS,qBAAqB,WAC/B;UACQ,SAAS,KAClB,uBAAsB,gCAAgC,SAAS,KAAK,YAAY;KAEhF,OAAM,IAAI,MAAM,mEAAmE;AAGrF,QAAO;EACL,GAAG,SAAS;EACZ,GAAG,SAAS;EACZ;EACA,sBAAsB,SAAS;EAC/B;EACA,iBAAiB,SAAS;EAC1B;EACA,UAAU;GACR,UAAU,aAAa;GACvB,UAAU,aAAa;GACvB,MAAM,aAAa,UACf,EACE,KAAK,aAAa,SACnB,GACD;GACJ,MAAM,aAAa;GACnB;GACD;EACF;;;;;AC3FH,SAAgB,oBAAoB,YAAuE;AACzG,QAAO,OAAO,eAAe,WACzB,2BAA2B,kBAAkB,WAAW,GACxD,8BAA8B,SAAS,WAAW;;AAGxD,SAAgB,iBAAiB,YAAoE;AACnG,QAAO,WAAW;;AAGpB,SAAgB,+BAA+B,YAAkC;AAC/E,KAAI,WAAW,gBAAgB,YAAY,QACzC,QAAO,IAAI,cAAc;EACvB,gBAAgB,WAAW;EAC3B,cAAc,WAAW;EAC1B,CAAC;AAGJ,KAAI,WAAW,gBAAgB,YAAY,QACzC,QAAO,IAAI,WAAW,EACpB,MAAM,YACP,CAAC;AAGJ,QAAO,IAAI,oBAAoB;EAC7B;EAEA,MAAM,EAAE;EACT,CAAC;;;;;ACmHJ,eAAsB,uBAAuB,EAC3C,SACA,OACA,eACA,qBAAqB,QACkD;AACvE,SAAQ,OAAO,KAAK,wBAAwB,MAAM,OAAO,EACvD,KAAK,MAAM,KACZ,CAAC;CAEF,MAAM,0BAA0B,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,uBAAuB,MAAM,IAAI;CAC7G,IAAIC,+BAAmF;CAEvF,MAAM,eACJ,wBAAwB,uBAAuB,SAAS;CAE1D,MAAM,aAAa,cAAc;CAEjC,MAAM,oBAAoB,qBAAqB,wBAAwB;AAEvE,KAAI,cAAc;AAChB,MAAI,WACF,QAAO;GACL,MAAM;GACN;GACA;GACA;GACD;AAEH,SAAO;GACL,MAAM;GACN;GACA;GACD;;AAIH,KAAI,sBAAsB,wBAAwB,uBAAuB,QAAQ,oBAAoB;AAEnG,MAAI,CAAC,cACH,OAAM,IAAI,MACR,uIACD;AAIH,iCAA+B,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,sCACzE,yBACA;GACE,aAAa,cAAc;GAC3B,UAAU,cAAc;GACxB,OAAO,+CAA+C,wBAAwB,gCAAgC;GAC/G,CACF;AAED,MAAI,6BAA6B,sBAAsBC,8BAA4B,4BAA4B;GAC7G,MAAM,6BAA6B,MAAM,8BAA8B;IACrE;IACA,KAAK,6BAA6B;IACnC,CAAC;AAEF,UAAO;IACL,MAAM;IACN;IACA;IACA;IACA;IACD;;AAGH,SAAO;GACL,MAAM;GACN;GACA;GACA;GACD;;AAGH,OAAM,IAAI,MACR,2FAA2F,OAAO,KAAK,wBAAwB,uBAAuB,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,GAChL;;AAGH,eAAsB,gCAAgC,EACpD,OACA,yBACA,UAKC;AACD,QAAO,MAAM,MAAM,QAAQ,gBAAgB,aAAa;EACtD;EACA;EACD,CAAC;;;;;;;AAQJ,MAAa,uCAAuC,OAAO,EACzD,OACA,yBACA,qCACA,aACA,UACA,YACA,mBAWI;CACJ,MAAM,8BAA8B,sBAClC,uCAAuC,CACrC,wBAAwB,uBAAuB,6BAA6B,GAC7E,EACD,wBAAwB,gCACzB;AAED,KAAI,OAAO,KAAK,4BAA4B,CAAC,WAAW,EACtD,OAAM,IAAI,MACR,+DAA+D,oCAAoC,gEACpG;AAgBH,SAboB,MAAM,MAAM,QAAQ,gBAAgB,mBAAmB;EACzE;EACA,GAAG;EACH;EACA,4BAA4B,OAAO,KAAK,4BAA4B;EACpE,wBAAwB;EACxB,6CAA6C,CAAC,sBAAsB,OAAO,sBAAsB,MAAM;EACvG,2BAA2B,6BAA6B;GACtD;GACA;GACD,CAAC;EACH,CAAC,EAEiB,YAAY,KAAK,EAAE,YAAa,GAAG,yBAAyB;EAC7E,MAAM,gBAAgB,wBAAwB,gCAC5C,mBAAmB;EAGrB,MAAM,kBAAkB,YAAY;EAEpC,MAAM,SAAS,+BAA+B,gBAAgB;AAO9D,iCAA+B,QAJL,mCAAmC,eAAe;GAC1E,IAAI,wBAAwB,SAAS,iBAAiB;GACtD,SAAS,wBAAwB,SAAS,iBAAiB;GAC5D,CAAC,CACuD;AAGzD,MAAI,YAAY,SAAS,EACvB,4BAA2B,QAAQ,EACjC,uBAAuB,YAAY,MAAM,EAAE,CAAC,IAAI,iBAAiB,EAGlE,CAAC;AAGJ,SAAO;GACL,GAAG;GACH;GACA,YAAY;GACb;GACD;;AAGJ,eAAsB,2BACpB,OACA,YAC2C;CAC3C,MAAM,kBAAkB,WAAW,aAAa,IAAI,EAAE;CAEtD,IAAIC;AAEJ,KAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,UAAU;AAChB,QAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,QAAM,IAAI,6CAA6C,QAAQ;;AAKjE,KAAI,gBAAgB,WAAW,GAAG;AAChC,MAAI,CAAC,WAAW,sBAAsB,WAAW,mBAAmB,WAAW,GAAG;GAChF,MAAM,UAAU;AAChB,SAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,SAAM,IAAI,kCAAkC,QAAQ;;AAGtD,MAAI,WAAW,aAAa,cAAc,WAAW,aAAa,iBAChE,YAAW;WACF,WAAW,aAAa,mBAAmB,WAAW,aAAa,kBAC5E,YAAW;MAEX,YAAW;QAIV;EACH,MAAM,iBAAiB,gBAAgB;EACvC,MAAM,oBAAoB,iBAAiB,eAAe,SAAS;EACnE,MAAM,sBACJ,4BAA4B,mBAAmB,yBAAyB,KAAK,IAC7E,4BAA4B,mBAAmB,yBAAyB,KAAK;AAM/E,MAHE,4BAA4B,mBAAmB,6BAA6B,KAAK,IACjF,4BAA4B,mBAAmB,6BAA6B,KAAK,CAGjF,YAAW;WACF,oBACT,YAAW;MAEX,OAAM,IAAI,wDAAwD;;AAItE,KAAI;AAGF,MADuB,MAAM,MAAM,QAAQ,UAAU,2BAA2B,WAAW,GAAG,CAE5F,OAAM,IAAI,yCAAyC;EAGrD,MAAM,qBAAsB,MAAM,2CAA2C,OAAO,WAAW,IAAK;AAEpG,SAAO;GACL,qBAAqB;GACrB,kBAAkB,qBAAqB,QAAQ,CAAC,CAAC,WAAW,oBAAoB;GAChF;GACA;GACD;UACM,OAAO;AACd,QAAM,OAAO,OAAO,MAAM,qCAAqC,QAAkB;AACjF,QAAM,IAAI,6BAA6B,MAAgB;;;AAI3D,eAAe,2CACb,OACA,qBACkC;AAClC,MAAK,MAAM,iBAAiB,oBAAoB,gBAAgB;EAC9D,MAAM,CAAC,cAAc,MAAM,MAAM,QAAQ,YAAY,oBAAoB,cAAc;AACvF,MAAI,WAAY,QAAO;;AAGzB,QAAO;;;;;AAMT,eAAsB,0BACpB,OACA,YACA,UAC2C;CAE3C,IAAIC;CAEJ,IAAIC,eAA2F;AAE/F,KAAI,aAAa,QACf,gBAAa,MAAM,OAAO,WAAwC,qBAAqB,uBAAuB,CAAC,KAC7G,QAAQ,UAAU,MAAM,QAAQ,iBAAiB,UAAU,gBAAgB,cAAc,EACzF,QAAQ,UAAU,MAAM,QAAQ,iBAAiB,iBAAiB,aAAa,CAChF;UACQ,aAAa,SACtB,gBAAa,MAAM,OAAO,WAAmC,gBAAgB,kBAAkB,CAAC,KAC9F,QAAQ,UAAU,MAAM,QAAQ,YAAY,UAAU,WAAW,gBAAgB,EACjF,QAAQ,UAAU,MAAM,QAAQ,YAAY,iBAAiB,aAAa,CAC3E;CAGH,MAAM,eAAeC,eACjB,eACEA,aAAW,KACT,OAAO,EAEP,QAAQ,KAAK,IAAK,CACnB,CACF,GACD;CAEJ,IAAIC;CACJ,IAAIC;AAEJ,KAAI;EACF,MAAM,0BAA0B,MAAM,MAAM,QAAQ,UAAU,kBAAkB,YAAY,EAC1F,iBAAiB,MAClB,CAAC;AACF,qBAAmB,wBAAwB;AAC3C,oBAAkB,wBAAwB;AAG1C,iBAAe,kBAAkB;UAC1B,OAAO;AACd,QAAM,OAAO,OAAO,MAAM,qCAAqC,QAAkB;AACjF,QAAM,IAAI,oCAAqC,MAAgB,QAAQ;;AAGzE,KAAI;EACF,MAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,OAAO,MAAM,kBAAkB,OAAO,OAAO;AAE1D,MAAI,CAAC,MACH,QAAO;GACS;GACd,UAAU;GAEX;AAGH,MAAI,MAAM,SAAS,qBAAqB,uBACtC,QAAO;GACL,sBAAsB,MAAM,QAAQ,iBAAiB;GACrD;GACA,UAAU;GAEX;AAEH,MAAI,MAAM,SAAS,gBAAgB,kBACjC,QAAO;GACL,iBAAiB,MAAM,QAAQ,YAAY;GAC3C;GACA,UAAU;GAEX;UAEI,OAAO;AACd,QAAM,OAAO,OAAO,MAAM,gDAAgD;AAI1E,QAD4B,MAAM,kBAAkB,QAAQ,oBAAoB,CACtD,WAAW,MAAM,SAAS,gBAAgB,GAAG;AAIvE,MAAI,iBACF,OAAM,MAAM,QAAQ,YAAY,WAAW,iBAAiB,GAAG;AAGjE,QAAM,IAAI,6BAA8B,MAAgB,QAAQ;;AAGlE,OAAM,IAAI,8BAA8B;;;;;AChf1C,MAAM,oBAAoB,cAA0D,OAAU;;;;;;;AAQ9F,MAAa,kBAAkB,UAAiC,EAAE,KAAK;CACrE,MAAM,oBAAoB,WAAW,kBAAkB;CAEvD,IAAI,cAAc,mBAAmB;AACrC,eAAc,cAAc;AAC1B,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,iEAAiE;AAGnF,MAAI,CAAC,QAAQ,mBAAmB,CAAC,QAAQ,cAAe,QAAO;AAE/D,SAAO,YAAY,QAAQ,WAA6B;AAGtD,OAAI,QAAQ,mBAAmB,QAAQ,oBAAoB,OAAO,MAAO,QAAO;GAGhF,MAAM,cAAc,OAAO;AAC3B,OAAI,QAAQ,iBAAiB,eAAe,YAAY,WAAW,EACjE,QAAO,YAAY,MAAM,mBAAmB,CAAC,QAAQ,eAAe,SAAS,eAAe,CAAC;AAE/F,UAAO;IACP;IACD;EAAC;EAAa,QAAQ;EAAiB,QAAQ;EAAc,CAAC;AAEjE,QAAO;EAAE,GAAG;EAAmB,SAAS;EAAa;;AAGvD,MAAa,qBAAqB,OAA6C;CAC7E,MAAM,EAAE,SAAS,gBAAgB,gBAAgB;AACjD,QAAO,YAAY,MAAM,MAAwB,EAAE,OAAO,GAAG;;AAO/D,MAAaC,sBAA0D,EAAE,OAAO,eAAe;CAC7F,MAAM,CAAC,OAAO,YAAY,SAAyC;EACjE,SAAS,EAAE;EACX,SAAS;EACV,CAAC;AAEF,iBAAgB;AACd,QAAM,QAAQ,YAAY,QAAQ,CAAC,MAAM,YAAY,SAAS;GAAE;GAAS,SAAS;GAAO,CAAC,CAAC;IAC1F,CAAC,MAAM,CAAC;AAEX,iBAAgB;AACd,MAAI,MAAM,QAAS;EAEnB,MAAM,mBAAmB,mBAAmB,OAAO,iBAAiB,CAAC,WAAW,WAC9E,SAAS,UAAU,QAAQ,MAAM,CAAC,CACnC;EAED,MAAM,qBAAqB,qBAAqB,OAAO,iBAAiB,CAAC,WAAW,WAClF,SAAS,aAAa,QAAQ,MAAM,CAAC,CACtC;EAED,MAAM,qBAAqB,qBAAqB,OAAO,iBAAiB,CAAC,WAAW,WAClF,SAAS,aAAa,QAAQ,MAAM,CAAC,CACtC;AAED,eAAa;AACX,oBAAiB,aAAa;AAC9B,sBAAmB,aAAa;AAChC,sBAAmB,aAAa;;IAEjC,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO,oBAAC,kBAAkB;EAAS,OAAO;EAAQ;GAAsC;;;;;AClF1F,MAAM,oBAAoB,cAAkE,OAAU;AAEtG,MAAaC,yBAAuB;CAClC,MAAM,oBAAoB,WAAW,kBAAkB;AACvD,KAAI,CAAC,kBACH,OAAM,IAAI,MAAM,iEAAiE;AAEnF,QAAO;;AAWT,MAAaC,uBAAqB,OAAqD;CACrF,MAAM,EAAE,SAAS,gBAAgBD,kBAAgB;AACjD,QAAO,YAAY,MAAM,MAAgC,EAAE,OAAO,GAAG;;AAGvE,MAAa,wBAAwB,UAA2E;CAC9G,MAAM,SAAS,cAAe,OAAO,UAAU,WAAW,CAAC,MAAM,GAAG,OAAQ,CAAC,MAAM,CAAC;CAEpF,MAAM,EAAE,SAAS,gBAAgBA,kBAAgB;AAMjD,QAJ4B,cACpB,YAAY,QAAQ,MAAgC,OAAO,SAAS,EAAE,MAAM,CAAC,EACnF,CAAC,aAAa,OAAO,CACtB;;AAqBH,MAAaE,8BAAkE,EAAE,OAAO,eAAe;CACrG,MAAM,CAAC,OAAO,YAAY,SAAiD;EACzE,SAAS,EAAE;EACX,SAAS;EACV,CAAC;AAEF,iBAAgB;AACd,QAAM,QAAQ,YAAY,QAAQ,CAAC,MAAM,YAAY,SAAS;GAAE;GAAS,SAAS;GAAO,CAAC,CAAC;IAC1F,CAAC,MAAM,CAAC;AAEX,iBAAgB;AACd,MAAI,MAAM,QAAS;EAEnB,MAAM,mBAAmB,mBAAmB,OAAO,yBAAyB,CAAC,WAAW,WACtF,SAAS,UAAU,QAAQ,MAAM,CAAC,CACnC;EAED,MAAM,qBAAqB,qBAAqB,OAAO,yBAAyB,CAAC,WAAW,WAC1F,SAAS,aAAa,QAAQ,MAAM,CAAC,CACtC;EAED,MAAM,qBAAqB,qBAAqB,OAAO,yBAAyB,CAAC,WAAW,WAC1F,SAAS,aAAa,QAAQ,MAAM,CAAC,CACtC;AAED,eAAa;AACX,qBAAkB,aAAa;AAC/B,uBAAoB,aAAa;AACjC,uBAAoB,aAAa;;IAElC,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO,oBAAC,kBAAkB;EAAS,OAAO;EAAQ;GAAsC;;;;;ACpF1F,MAAM,eAAe,cAA6D,OAAU;AAE5F,MAAa,kBAAkB;CAC7B,MAAM,eAAe,WAAW,aAAa;AAC7C,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAO;;AAWT,MAAa,gBAAgB,OAAgD;CAC3E,MAAM,EAAE,SAAS,WAAW,WAAW;AACvC,QAAO,OAAO,MAAM,MAA2B,EAAE,OAAO,GAAG;;AAG7D,MAAa,mBAAmB,UAA4D;CAC1F,MAAM,SAAS,cAAe,OAAO,UAAU,WAAW,CAAC,MAAM,GAAG,OAAQ,CAAC,MAAM,CAAC;CAEpF,MAAM,EAAE,SAAS,WAAW,WAAW;AAMvC,QAJuB,cACf,OAAO,QAAQ,MAA2B,OAAO,SAAS,EAAE,MAAM,CAAC,EACzE,CAAC,QAAQ,OAAO,CACjB;;AAqBH,MAAaC,yBAA6D,EAAE,OAAO,eAAe;CAChG,MAAM,CAAC,OAAO,YAAY,SAA4C;EACpE,SAAS,EAAE;EACX,SAAS;EACV,CAAC;AAEF,iBAAgB;AACd,QAAM,QAAQ,OAAO,QAAQ,CAAC,MAAM,YAAY,SAAS;GAAE;GAAS,SAAS;GAAO,CAAC,CAAC;IACrF,CAAC,MAAM,CAAC;AAEX,iBAAgB;AACd,MAAI,MAAM,QAAS;EAEnB,MAAM,cAAc,mBAAmB,OAAO,oBAAoB,CAAC,WAAW,WAC5E,SAAS,UAAU,QAAQ,MAAM,CAAC,CACnC;EAED,MAAM,gBAAgB,qBAAqB,OAAO,oBAAoB,CAAC,WAAW,WAChF,SAAS,aAAa,QAAQ,MAAM,CAAC,CACtC;EAED,MAAM,gBAAgB,qBAAqB,OAAO,oBAAoB,CAAC,WAAW,WAChF,SAAS,aAAa,QAAQ,MAAM,CAAC,CACtC;AAED,eAAa;AACX,gBAAa,aAAa;AAC1B,kBAAe,aAAa;AAC5B,kBAAe,aAAa;;IAE7B,CAAC,OAAO,MAAM,CAAC;AAElB,QAAO,oBAAC,aAAa;EAAS,OAAO;EAAQ;GAAiC;;;;;;;;;;;;AC/EhF,MAAa,mCAAmC,EAAE,YAAqC;CACrF,MAAM,4BAA4B,qBAAqB,CAAC,gBAAgB,cAAc,CAAC;CACvF,MAAM,uBAAuB,gBAAgB,CAAC,WAAW,gBAAgB,CAAC;CAC1E,MAAM,EAAE,SAAS,gBAAgB,gBAAgB;AAEjD,iBAAgB;AACd,4BAA0B,IAAI,OAAO,WAAW;AAE9C,OADiB,4CAA4C,OAAO,CACtD;GAEd,MAAM,aAAa,OAAO,eACtB,YAAY,MAAM,iBAAe,OAAO,iBAAiBC,aAAW,GAAG,GACvE;GAGJ,MAAM,kBACJ,CAAC,cAAc,OAAO,iBAClB,MAAM,MAAM,QAAQ,UAAU,2BAA2B,OAAO,eAAe,GAC/E;GAEN,MAAM,aAAa,MAAM,MAAM,QAAQ,YAAY,cAAc,OAAO,GAAG;GAC3E,MAAM,QAAQ,WAAW,OAAO,aAAa,WAAW,OAAO;AAE/D,OAAI,CAAC,MAAO;GAEZ,MAAM,WAAW,MAAM;GAEvB,MAAM,aAAa,YAAY,cAAc,iBAAiB,oBAAoB;GAElF,MAAM,cADe,MAAM,MAAM,QAAQ,UAAU,UAAU,SAAS,EACtC,QAAQ;AAGxC,OAAI,cAAc,YAAY;AAC5B,yCAAqC,QAAQ;KAC3C;KACA,eAAe,YAAY,YAAY,iBAAiB,oBAAoB;KAC5E,gBAAgB;KACjB,CAAC;AACF,UAAM,MAAM,QAAQ,YAAY,OAAO,OAAO;;IAEhD;IACD;EAAC;EAA2B;EAAO;EAAY,CAAC;AAGnD,iBAAgB;AACd,uBAAqB,IAAI,OAAO,WAAW;AAEzC,OADiB,uCAAuC,OAAO,CACjD;GAEd,MAAM,aAAa,OAAO,eACtB,YAAY,MAAM,iBAAe,OAAO,iBAAiBA,aAAW,GAAG,GACvE;GAGJ,MAAM,kBACJ,CAAC,cAAc,OAAO,iBAClB,MAAM,MAAM,QAAQ,UAAU,2BAA2B,OAAO,eAAe,GAC/E;GAEN,MAAM,aAAa,MAAM,MAAM,QAAQ,OAAO,cAAc,OAAO,GAAG;GACtE,MAAM,UAAU,WAAW,SAAS,aAAa,WAAW,SAAS;AAGrE,OAAI,CAAC,QAAS;GAEd,MAAM,eAAe,YAAY,cAAc,iBAAiB,oBAAoB;GACpF,MAAM,YAAY,QAAQ;AAG1B,OAAI,gBAAgB,WAAW;AAC7B,oCAAgC,QAAQ;KACtC;KACA,iBAAiB,YAAY,YAAY,iBAAiB,oBAAoB;KAC9E;KACD,CAAC;AACF,UAAM,MAAM,QAAQ,OAAO,OAAO,OAAO;;IAE3C;IACD;EAAC;EAAsB;EAAO;EAAY,CAAC;;;;;AC1FhD,MAAa,yCAAyC,EAAE,OAAO,eAAyC;AACtG,iCAAgC,EAAE,OAAO,CAAC;AAE1C,QAAO,gCAAG,WAAY;;;;;ACCxB,MAAM,eAAe,cAAiC,OAAU;;;;;;;AAehE,MAAa,iBAAuF;CAClG,MAAM,eAAe,WAAW,aAAa;AAE7C,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAO,EACL,OAAO,cACR;;AAGH,MAAa,iBAAiB,EAAE,OAAO,WAAW,eAAsD;CACtG,MAAM,mBAAmB,cAAc;AACrC,SAAO;GACL,MAAM,QAAQ,UAAU,MAAM,QAAQ,eACjC,EAAE,2BACD,oBAAC;IAA6C;cAAQC;KAAiD,GAEzG;GACJ,MAAM,QAAQ,cAAc,6BAA6B;GACzD,MAAM,QAAQ,SAAS,wBAAwB;GAC/C,MAAM,QAAQ,cAAc,qBAAqB;GAClD,CAAC,QAAQ,MAAyC,MAAM,OAAU;IAClE,CAAC,MAAM,CAAC;CAGX,MAAM,YAAY,cAAc;AAC9B,SAAO,iBAAiB,QACrB,aAAa,UAAU,UAEtB,oBAAC;GAA4B;aAC1B;KADY,MAEJ,EAEb,oBAAC;GAAmC;aAClC,oBAAC;IAA6B;cAC5B,oBAAC;KAA0B;eACzB,oBAAC;MAAmC;MAAkB;MACnD;OACuB;MACP;KACC;IACI,CAC/B;IACA;EAAC;EAAkB;EAAO;EAAU;EAAU,CAAC;AAElD,QAAO,oBAAC,aAAa;EAAS,OAAO;YAAQ;GAAkC;;;;;ACpEjF,SAAgB,4BAA4B,UAA6C;CACvF,MAAM,EAAE,UAAU,UAAwB;CAE1C,MAAM,EAAE,aAAa,0BAA0B,QAAQ,iBAAiB,YAAY;EAClF,aAAa,CAAC,2BAA2B,UAAU,oBAAoB,GAAG;EAC1E,YAAY,YAAY;AACtB,OAAI,CAAC,SAAU,OAAM,IAAI,MAAM,+BAA+B;AAG9D,UADe,MAAM,0BAA0B,OAAO,SAAS,qBAAqB,SAAS,SAAS;;EAGzG,CAAC;AAMF,QAAO;EACL,kBAAkB;EAClB,mBANwB,kBAAkB,IAEzC,EAAE,CAAC;EAKJ;EACA,SAAS,EACP,YAAY;GACV,MAAM,UAAU,qBAEZ,SAAS,oBAAoB,SAAS,SAAS,oBAAoB,cAAc,8BAEjF,UAAU,oBAAoB,SAAS;GAC3C,MAAM,EACJ,KAAK,UAAU,qBACX,UAAU,mBAAmB,WAC7B,UAAU,oBAAoB,UACnC;GACF,EACF;EACF;;;;;;CCXH,MAAM,SAAqC,EAAE;CAE7C,SAAS,cAAc,OAA0C;AAG/D,SAAO,OAAO,KAAK,MAAM;;CAG3B,SAASC,eAAa,SAA4C;AAChE,SAAO,OAAO,UAAU;;AAG1B,QAAO,UAAU;EAAC;EAAe;EAAa;;;;;;AC1C9C,QAAO,UAAU;;;;;;ACGjB,SAAS,mBAAmB,OAAO;CAC/B,MAAM,QAAQ,oBAAoB,UAAU,MAAM,QAAQ,WAAW,KAAK,CAAC;CAC3E,MAAM,cAAc,UAAU,IAAI,KAAK,MAAM,QAAQ;CACrD,MAAM,OAAO,CAAC,MAAM,OAAO,KAAK,IAAI,MAAM;AAC1C,KAAI,QACA,QAAO,MAAM,qBAAqB,MAAM,MAAM,OAAO,cAAc;KAGnE,QAAO,MAAM,mBAAmB,QAAQ,WAAW,IAAI,GAAG,MAAM,MAAM,OAAO,cAAc;;AAGnG,IAAqB,sBAArB,MAAqB,oBAAoB;CACrC;CAIA;CAEA;CACA,YAAY,WAAW,aAAa,OAAO;AACvC,OAAK,YAAY,aAAa;AAC9B,OAAK,cAAc;AACnB,OAAK,QAAQ;;CAGjB,qBAAqB;AACjB,SAAO;;CAGX,yBAAyB;AACrB,SAAO;;CAEX,eAAe;AACX,SAAO,KAAK,gBAAgB;;;;;CAKhC,iBAAiB;EACb,MAAM,UAAU,IAAI,IAAI,mBAAmB,KAAK,MAAM,EAAE,KAAK,UAAU;AACvE,UAAQ,aAAa,IAAI,YAAYC,oCAAS,GAAG;AACjD,UAAQ,aAAa,IAAI,QAAQ,KAAK,MAAM,KAAK;AACjD,SAAO,KAAK,WAEZ,QAAQ,UAAU,CAAC,QAAQ,QAAQ,QAAQ,GAAG,CAAC;;CAEnD,WAAW,QAAQ;AACf,SAAO;GACH,kBAAkB;GAClB,OAAO,KAAK,MAAM,SAAS;GAC3B,QAAQ,KAAK,MAAM,UAAU;GAC7B,KAAK;GACL,OAAO,oBAAoB,UAAU,KAAK,MAAM,QAAQ,WAAW,KAAK,CAAC;GAC5E;;CAEL,OAAO,UAAU,QAAQ,aAAa;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IAC/B,KAAI,OAAO,MAAM,YACb,QAAO,OAAO;AAGtB,SAAO,OAAO,OAAO,SAAS,MAAM;;;;;;AChE5C,IAAW;CACV,SAAU,gBAAc;;;;;AAKrB,gBAAa,UAAU;GACxB,iBAAiB,eAAe,EAAE,EAAE;AAEvC,IAAW;CACV,SAAU,wBAAsB;AAC7B,wBAAqB,UAAU;AAC/B,wBAAqB,gBAAgB;AACrC,wBAAqB,iBAAiB;GACvC,yBAAyB,uBAAuB,EAAE,EAAE;;;;;AAMvD,IAAW;CACV,SAAU,sBAAoB;AAC3B,sBAAmB,aAAa;AAChC,sBAAmB,YAAY;AAC/B,sBAAmB,aAAa;AAChC,sBAAmB,QAAQ;AAC3B,sBAAmB,iBAAiB;GACrC,uBAAuB,qBAAqB,EAAE,EAAE;;;;;AC1BnD,4FAA2C,oBAAoB;;;;;ACI/D,IAAI,CAACC,0BACD,SAAQ,KAAK,yGAAyG;AAE1H,MAAMC,4EAA0C,cAAc;AAC9D,IAAI,qBAAqB;AAEzB,IAAIA,eAAa;CACb,IAAI;AACJ,KAAIA,cAAY,SACZ,mBAAkBA,cAAY;UAEzBA,cAAY,eACjB,mBAAkB,KAAK,MAAMA,cAAY,eAAe;AAE5D,KAAI,mBAAmB,OAAO,KAAK,gBAAgB,CAAC,SAAS,EACzD,sBAAqB;;AAI7B,IAAI,yBAAyB;AAC7B,IAAI,cAAc,eAAe;CAC7B,IAAI;AACJ,KAAI,cAAc,cAAc,eAC5B,uBAAsB,KAAK,MAAM,cAAc,cAAc,eAAe;AAEhF,KAAI,uBAAuB,OAAO,KAAK,oBAAoB,CAAC,SAAS,EACjE,0BAAyB;;AAIjC,IAAI,eAAe;AACnB,IAAID,6BAAqBA,0BAAkB,UAAU;CACjD,MAAM,YAAYA,0BAAkB;AAEpC,KAAI,OAAO,cAAc,SACrB,gBAAe,KAAK,MAAM,UAAU;KAGpC,gBAAe;;AAGvB,IAAI,cAAc,sBAAsB,0BAA0B;AAClE,MAAM,EAAE,MAAM,aAAc,GAAG,oBAAqBA,6BAAqB,EAAE;AAC3E,MAAM,YAAY;CACd,GAAG;CAEH,cAAc,gBAAgB;CACjC;AACD,OAAO,iBAAiB,WAAW;CAO/B,wBAAwB;EACpB,MAAM;GACF,MAAM,gBAAgB,YAAY,KAAK;AACvC,OAAI,CAAC,iBAAiB,CAAC,mBAAmB,cAAc,CACpD,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,yBAAyB;EACrB,MAAM;GACF,MAAM,gBAAgB,YAAY,KAAK;AACvC,OAAI,CAAC,iBAAiB,CAAC,sBAAsB,cAAc,CACvD,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,UAAU;EACN,MAAM;GACF,MAAM,gBAAgB,aAAa;AACnC,OAAI,CAAC,iBAAiB,CAAC,mBAAmB,cAAc,CACpD,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,WAAW;EACP,MAAM;GACF,MAAM,gBAAgB,aAAa;AACnC,OAAI,CAAC,iBAAiB,CAAC,sBAAsB,cAAc,CACvD,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,YAAY;EACR,MAAM;GACF,MAAM,gBAAgB,YAAY,KAAK;AACvC,OAAI,CAAC,cACD,QAAO;AAIX,OAAIC,iBAAeA,cAAY,iBAC3B,QAAO;AAEX,OAAI,sBAAsB,cAAc,CACpC,QAAO,cAAc,OAAO,cAAc;YAErC,mBAAmB,cAAc,CACtC,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,cAAc;EACV,MAAM;GACF,MAAM,gBAAgB,YAAY,KAAK;AACvC,OAAI,CAAC,cACD,QAAO;AAEX,OAAI,sBAAsB,cAAc,CACpC,QAAO,cAAc,OAAO,UAAU;YAEjC,mBAAmB,cAAc,CACtC,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,WAAW;EACP,MAAM;GACF,MAAM,gBAAgB,YAAY,KAAK;AACvC,OAAI,CAAC,cACD,QAAO;AAEX,OAAI,sBAAsB,cAAc,CACpC,QAAO,cAAc,OAAO,OAAO;YAE9B,mBAAmB,cAAc,CACtC,QAAO;AAEX,UAAO;;EAEX,YAAY;EACf;CACD,oBAAoB;EAChB,MAAM;AACF,UAAO;;EAEX,IAAI,OAAO;AACP,iBAAc;;EAElB,YAAY;EACf;CACJ,CAAC;AACF,SAAS,mBAAmB,UAAU;AAClC,QAAO,CAAC,sBAAsB,SAAS;;AAE3C,SAAS,sBAAsB,UAAU;AACrC,QAAO,cAAc;;AAEzB,SAAS,YAAY,kBAAkB,OAAO;AAC1C,KAAI,CAAC,aAAa;EACd,MAAM,sBAAsB,gBAAgB,OAAO,SAAS;AAC5D,MAAI,gBAAgB,yBAAyB,qBAAqB,QAC9D,SAAS,OAAO,OAChB;OAAI,CAAC,gBACD,SAAQ,KAAK,yBAAyB,oBAAoB,kKAAkK;aAG3N,gBAAgB,yBAAyB,qBAAqB,eACnE,gBAAgB,yBAAyB,qBAAqB,WAG9D,OAAM,IAAIC,sCAAW,sCAAsC,yBAAyB,oBAAoB,sBAAsB;;AAGtI,QAAO;;AAEX,wBAAe;;;;AC3Lf,SAAgB,YAAY,KAAK;CAC7B,MAAM,EAAE,UAAU,iBAAiB,IAAI,IAAI,KAAK,YAAY;AAK5D,KAAI,SACA;MAAI,aAAa,IAAI,gBAAgB,CAEjC,QAAO,YADiB,mBAAmB,aAAa,IAAI,gBAAgB,CAAC,CAC1C;;AAG3C,QAAO,YAAY,SAAS;;AAEhC,SAAS,YAAY,UAAU;AAC3B,QAAO,SAAS,UAAU,SAAS,YAAY,IAAI,GAAG,EAAE;;AAE5D,SAAgB,iBAAiB,KAAK;CAClC,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,WAAW,SAAS,YAAY,IAAI;AAE1C,QAAO,WAAW,IAAI,SAAS,UAAU,SAAS,GAAG;;;;;;;;;;;;;AAazD,SAAgB,mBAAmB,aAAa;CAC5C,MAAM,YAAY,IAAI,IAAI,YAAY;CACtC,IAAI,eAAe,UAAU;AAE7B,KAAI,iBAAiB,OACjB,gBAAe;UAEV,iBAAiB,QACtB,gBAAe;AAEnB,WAAU,WAAW;AAGrB,WAAU,WADQ,UAAU,SAAS,UAAU,GAAG,UAAU,SAAS,YAAY,IAAI,GAAG,EAAE;AAE1F,WAAU,SAAS;AACnB,WAAU,OAAO;AAGjB,QAAO,UAAU,aAAa,eACxB,UAAU,KAAK,QAAQ,UAAU,UAAU,aAAa,GACxD,UAAU;;;;;;ACnDpB,MAAM,0EAA0C,cAAc;AAC9D,MAAM,4BAA4B;AAC9B,KAAI;AACA,6DAA2B,SAAS;SAElC;AACF,SAAO;;IAEX;AACJ,SAAS,oBAAoB;AACzB,QAAO,sBAAsB;;AAIjC,MAAM,mCAAmC,CAAC,CAAC,aAAa;AACxD,MAAM,mCAAmC,aAAa;AAGtD,MAAM,kCAAkC,oCAAoC,CAAC;AAG7E,MAAa,2BAA2B,mBAAmB,IAAI;AAG/D,SAAgB,iBAAiB;AAC7B,QAAO,aAAa,eAAe,EAAE;;AAEzC,SAAgB,eAAe;AAC3B,QAAOC,kBAAU;;AAGrB,MAAa,kBAAkBA,kBAAU,gBACnC,mBAAmBA,kBAAU,cAAc,GAC3C;;;;;;;;;;;AC1BN,SAAgB,kBAAkB,MAAM;CAGpC,MAAM,QAAQ,oBAAoB,UAAU,KAAK,QAAQ,WAAW,KAAK,CAAC;CAC1E,MAAM,QAAQ,KAAK,OAAO,WAAW,MAAM,MAAM,MAAM;CACvD,MAAM,OAAO,KAAK,aAAc,KAAK,WAAW,UAAU,KAAK,WAAW,KAAM,KAAK;CAErF,MAAM,MAAM,KAAK,WAAY,KAAK,SAAS,UAAU,KAAK,SAAS,KAAM,KAAK;AAC9E,KAAI,IACA,QAAO;EAAE,KAAK,WAAW,IAAI;EAAE;EAAM;CAEzC,MAAM,YAAY,UAAU,IAAI,KAAK,IAAI,MAAM;CAC/C,MAAM,gBAAgB,KAAK,OAAO,IAAI,mBAAmB,KAAK,KAAK,KAAK;CACxE,MAAM,SAAS,IAAI,mBAAmB,KAAK,KAAK,GAAG,YAAY;CAC/D,MAAM,SAAS,IAAI,gBAAgB;EAC/B,UAAUC,oCAAS;EACnB,MAAM,KAAK;EACd,CAAC;AAGF,KAAI,eAAe,KAAK,KAAK,mBAAmB,CAE5C,QAAO;EAAE,KADG,KAAK,qBAAqB,SAAS,MAAM;EACvC;EAAM;CAGxB,MAAM,YAAY,cAAc;CAChC,MAAM,eAAe,WAAW,OAAO,QAAQ,YACzC,YAAY,UAAU,MAAM,OAAO,eACnC;AACN,KAAI,cAAc;EACd,MAAM,UAAU,IAAI,IAAI,KAAK,qBAAqB,QAAQ,aAAa;AACvE,UAAQ,aAAa,IAAI,YAAYA,oCAAS,GAAG;AACjD,UAAQ,aAAa,IAAI,QAAQ,KAAK,KAAK;AAC3C,SAAO;GACH,KAAK,QAAQ;GACb;GACH;;AAGL,KAAI,cAAc,kBACd,QAAO;EAAE,KAAK,6CAA6C,mBAAmB,KAAK;EAAI;EAAM;AAMjG,QAAO;EAAE,KAAK;EAAI;EAAM;;;;;;;AAO5B,SAAgB,WAAW,KAAK;AAE5B,QAAO,kBAAkB,IAAI,IAAI,KAAK,gBAAgB,CAAC,OAAO;;;;;;AChElE,MAAM,kEAAkC,YAAY;;;;;;;;;;AAUpD,eAAsB,cAAc,KAAK,SAAS,MAAM;AACpD,QAAO,YAAY,cAAc,KAAK,SAAS,KAAK;;;;;ACVxD,SAAgB,YAAY,MAAM;AAC9B,QAAO,sCAAsC,KAAK,KAAK;;AAE3D,SAAgB,kBAAkB,KAAK;AACnC,KAAI,OAAO,WAAW,YAClB,QAAO,QAAQ,QAAQ;EAAE,MAAM,YAAY,IAAI;EAAE,OAAO;EAAG,QAAQ;EAAG,CAAC;AAE3E,QAAO,IAAI,SAAS,SAAS,WAAW;EACpC,MAAM,MAAM,IAAI,OAAO;AACvB,MAAI,UAAU;AACd,MAAI,eAAe;AACf,WAAQ;IACJ,MAAM,YAAY,IAAI;IACtB,OAAO,IAAI;IACX,QAAQ,IAAI;IACf,CAAC;;AAEN,MAAI,MAAM;GACZ;;;;;AClBN,MAAM,cAAc,gBAAgB;;;;AAIpC,SAAgB,iBAAiB,MAAM,MAAM;CACzC,MAAM,iBAAiB;CACvB,MAAM,uBAAuB,GAAG,KAAK,GAAG,QAAQ;AAChD,SAAQ,MAAR;EACI,KAAK,kBAAkB,YACnB,QAAO,YAAY;EAEvB,KAAK,wBAAwB,YAEzB,QAAO,YAAY;EAEvB,QACI,QAAO;;;;;;;AChBnB,IAAI;AACJ,SAAgB,2BAA2B,aAAa;AACpD,4BAA2B;;;;;;AAM/B,SAAS,mBAAmB,QAAQ;AAChC,KAAI,OAAO,WAAW,SAClB,QAAO;CAEX,MAAM,4CAAqB,OAAO;AAClC,KAAI,CAAC,MACD,QAAO;CAEX,MAAM,WAAW,IAAI,oBAErB,oBAAoB,MAAM,MAAM;AAChC,KAAI,yBACA,QAAO,yBAAyB,SAAS;AAE7C,QAAO,SAAS,cAAc;;AAElC,OAAO,eAAe,oBAAoB,8BAA8B,EACpE,MAAM;AACF,QAAO;GAEd,CAAC;AACF,iCAAe;AACf,MAAa,EAAE,cAAc;;;;;;;;;;ACnB7B,MAAa,qCAAqC;;;;;AAKlD,IAAa,QAAb,MAAa,MAAM;CACf,OAAO,SAAS,EAAE;CAClB,OAAO,QAAQ,EAAE;;;;;CAKjB;;;;CAIA;;;;CAIA,OAAO;;;;;;;;;CASP;;;;;CAKA,WAAW;;;;;CAKX,QAAQ;;;;CAIR,SAAS;CACT,cAAc;;;;CAId,aAAa;CACb,qBAAqB,EAAE;CACvB,YAAY,EAAE,cAAM,MAAM,OAAO,MAAM,KAAK,OAAO,UAAU;AACzD,OAAK,OAAOC;AACZ,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,MAAM;AACX,MAAI,OAAO,UAAU,SACjB,MAAK,QAAQ;AAEjB,MAAI,OAAO,WAAW,SAClB,MAAK,SAAS;AAElB,MAAI,MAAM;AACN,QAAK,WAAW,iBAAiB,MAAM,KAAK;AAC5C,OAAI,KAAK,UAAU,WAAW,mCAAmC,EAAE;AAE/D,SAAK,MAAM,KAAK;AAChB,SAAK,WAAW;cAEX,KAAK,SACV,MAAK,aAAa;;AAG1B,MAAIC,kCAAS,OAAO,OAAO;AACvB,OAAI,CAACD,OACD,MAAK,OAAOE,YAAsB,IAAI;AAE1C,OAAI,CAAC,KACD,MAAK,OAAOC,iBAA2B,IAAI;;;;;;;;;;;;;;CAgBvD,OAAO,UAAU,UAAU;EACvB,MAAM,YAAY,MAAM,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS;AACjE,SAAO,QAAQ,IAAI,UAAU,KAAK,eAAa,MAAM,WAAWC,WAAS,CAAC,eAAe,CAAC,CAAC;;;;;;;;CAS/F,OAAO,WAAW,oBAAoB;AAClC,MAAI,OAAO,uBAAuB,SAC9B,QAAO,MAAM,QAAQ,mBAAmB;AAE5C,MAAI,OAAO,uBAAuB,YAC9B,SAAS,sBACT,OAAO,mBAAmB,QAAQ,UAAU;GAC5C,MAAM,YAAYD,iBAA2B,mBAAmB,IAAI;AACpE,UAAO,IAAI,MAAM;IACb,MAAM;IACN,MAAM,UAAU,WAAW,IAAI,GAAG,UAAU,UAAU,EAAE,GAAG;IAC3D,MAAM;IACN,KAAK,mBAAmB;IACxB,OAAO,mBAAmB;IAC1B,QAAQ,mBAAmB;IAC9B,CAAC;;EAEN,MAAM,yCAAoB,mBAAmB;AAC7C,MAAI,CAAC,KACD,OAAM,IAAI,MAAM,WAAW,mBAAmB,sCAAsC;AAIxF,MAAI,CAAC,0BAA0B;GAE3B,MAAM,EAAE,QAAQE,2BAAmB,mBAAmB;GACtD,MAAM,QAAQ,IAAI,MAAM;IACpB,MAAM,KAAK;IACX,MAAM,KAAK;IACX,MAAM,KAAK;IACX;IACA,OAAO,KAAK;IACZ,QAAQ,KAAK;IAChB,CAAC;AAIF,OAAIJ,kCAAS,OAAO,aAAa,CAAC,IAAI,SAAS,IAAI,KAAK,KAAK,SAAS,KAAK,SAAS;AAChF,UAAM,WAAW,MAAM;AACvB,UAAM,aAAa;;AAEvB,SAAM,OAAO,KAAK,QAAQ;AAC1B,UAAO;;AAEX,SAAO,MAAM,aAAa,KAAK;;CAGnC,OAAO,aAAa,MAAM;EAGtB,MAAM,WAAW,KAAK;AACtB,MAAI,MAAM,OAAO,UACb,QAAO,MAAM,OAAO;EAExB,MAAM,EAAE,KAAK,SAAS,kBAAkB,KAAK;EAC7C,MAAM,QAAQ,IAAI,MAAM;GACpB,MAAM,KAAK;GACX,MAAM,KAAK;GACX;GACA;GACA,OAAO,KAAK;GACZ,QAAQ,KAAK;GAChB,CAAC;AACF,QAAM,OAAO,YAAY;AACzB,SAAO;;CAGX,OAAO,QAAQ,KAAK;AAChB,MAAI,MAAM,MAAM,KACZ,QAAO,MAAM,MAAM;EAGvB,IAAI,OAAO;AACX,MAAI,IAAI,QAAQ,UAAU,GAAG,GACzB,QAAO,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;OAEnC;GACD,MAAM,YAAYE,iBAA2B,IAAI;AACjD,UAAO,UAAU,WAAW,IAAI,GAAG,UAAU,UAAU,EAAE,GAAG;;EAEhE,MAAM,QAAQ,IAAI,MAAM;GACpB,MAAM;GACN;GACA,MAAM;GACN;GACH,CAAC;AACF,QAAM,MAAM,OAAO;AACnB,SAAO;;;;;;;;;;CAWX,MAAM,gBAAgB;AAClB,MAAI,KAAK,WACL,QAAO;AAEX,MAAI,KAAK,aAAa;AAClB,SAAM,IAAI,SAAS,SAAS,WAAW;AACnC,SAAK,mBAAmB,KAAK;KAAE;KAAS;KAAQ,CAAC;KACnD;AACF,UAAO;;AAEX,OAAK,cAAc;AACnB,MAAI;AACA,OAAIF,kCAAS,OAAO,MAChB,KAAIK,YAAwB,KAAK,KAAK,EAAE;IACpC,MAAM,EAAE,OAAO,QAAQ,iBAAS,MAAMC,kBAA8B,KAAK,IAAI;AAC7E,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,OAAOP;SAGZ,MAAK,OAAOE,YAAsB,KAAK,IAAI;AAGnD,QAAK,WAAW,MAAM,cAAc,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK;AACnE,QAAK,aAAa;AAClB,QAAK,mBAAmB,SAAS,EAAE,cAAc,SAAS,CAAC;WAExD,GAAG;AACN,QAAK,mBAAmB,SAAS,EAAE,aAAa,OAAO,EAAE,CAAC;AAC1D,SAAM;YAEF;AACJ,QAAK,cAAc;AACnB,QAAK,qBAAqB,EAAE;;AAEhC,SAAO;;;;;;AC3Of,eAAsB,cAAc,OAAkB,cAAiE;AACrH,KAAI,aAAa,WAAW,kBAAkB,EAAE;EAC9C,MAAM,kBAAkB,aAAa,QAAQ,mBAAmB,GAAG;AACnE,SAAO,MAAM,eAAe,wBAAwB,gBAAgB;;AAGtE,KAAI,aAAa,WAAW,YAAY,EAAE;EACxC,MAAM,YAAY,aAAa,QAAQ,cAAc,GAAG;AACxD,SAAO,MAAM,QAAQ,QAAQ,UAAU;;AAGzC,KAAI,aAAa,WAAW,QAAQ,EAAE;EACpC,MAAM,SAAS,aAAa,QAAQ,SAAS,GAAG;AAChD,SAAO,MAAM,KAAK,QAAQ,OAAO;;AAGnC,OAAM,IAAI,MAAM,0BAA0B;;AAG5C,eAAsB,iBAAiB,OAAkB,kBAAoC;AAC3F,KAAI,4BAA4B,oBAC9B,OAAM,MAAM,kBAAkB,QAAQ,wBAAwB,CAAC,OAAO,MAAM,SAAS,iBAAiB;UAC7F,4BAA4B,WACrC,OAAM,MAAM,kBAAkB,QAAQ,eAAe,CAAC,OAAO,MAAM,SAAS,iBAAiB;KAE7F,OAAM,MAAM,kBAAkB,QAAQ,kBAAkB,CAAC,OAAO,MAAM,SAAS,iBAAiB;AAIlG,OAAM,4BAA4B,MAAM;;AAG1C,eAAsB,gBAAgB,SAA2B,kBAAoC;AACnG,KAAI,4BAA4B,oBAC9B,OAAM,QAAQ,MAAM,kBAAkB,QAAQ,wBAAwB,CAAC,KAAK,QAAQ,MAAM,SAAS,iBAAiB;UAC3G,4BAA4B,WACrC,OAAM,QAAQ,MAAM,kBAAkB,QAAQ,eAAe,CAAC,KAAK,QAAQ,MAAM,SAAS,iBAAiB;KAE3G,OAAM,QAAQ,MAAM,kBAAkB,QAAQ,kBAAkB,CAAC,KAAK,QAAQ,MAAM,SAAS,iBAAiB;AAIhH,OAAM,4BAA4B,QAAQ,MAAM;;AAGlD,eAAsB,iBAAiB,OAAkB,cAAsC;AAC7F,KAAI,aAAa,WAAW,kBAAkB,EAAE;EAC9C,MAAM,kBAAkB,aAAa,QAAQ,mBAAmB,GAAG;AACnE,QAAM,MAAM,eAAe,uBAAuB,gBAAgB;YACzD,aAAa,WAAW,YAAY,EAAE;EAC/C,MAAM,YAAY,aAAa,QAAQ,cAAc,GAAG;AACxD,QAAM,MAAM,QAAQ,WAAW,UAAU;YAChC,aAAa,WAAW,QAAQ,EAAE;EAC3C,MAAM,SAAS,aAAa,QAAQ,SAAS,GAAG;AAChD,QAAM,MAAM,KAAK,WAAW,OAAO;;AAIrC,OAAM,4BAA4B,MAAM;;;;;;;;;;;;AChD1C,eAAsB,sBACpB,OACA,kBACA,8BACoC;CACpC,MAAM,gBAAgB,2BAA2B,iBAAiB;AAClE,KAAI,CAAC,cAAe,QAAO;CAI3B,MAAM,kBAAkB,cAAc,sBAAsB,KAAK;AAIjE,KAAI,gBAAiB,OAAM,iBAAiB,OAAO,iBAAiB;CAEpE,MAAM,kBAAkB,6BAA6B,iBAAiB;AAEtE,KAAI,gCAAgC,cAAc,sBAAsB,WAAW,KAAK,gBACtF,QAAO,MAAM,6BAA6B;EAAE;EAAO;EAAkB;EAAiB,CAAC;AAGzF,KAAI,iBAAiB;AACnB,MAAI,4BAA4B,WAC9B,QAAO,IAAI,WAAW,EACpB,MAAM,KAAK,cAAc,gBAA0B,EACpD,CAAC;AAEJ,MAAI,4BAA4B,cAC9B,QAAO,IAAI,cAAc,EACvB,gBAAgB,iBACjB,CAAC;AAEJ,MAAI,4BAA4B,oBAC9B,QAAO,IAAI,oBAAoB;GAC7B,MAAM,EAAE,eAAe,EAAE,EAAE;GAC3B,YAAY,oBAAoB,gBAAgB;GACjD,CAAC;;AAIN,QAAO;;;;;AC7DT,MAAa,+BAA+B,0BAAuD;AACjG,KAAI,CAAC,sBAAuB,QAAO;CAEnC,MAAM,kBAAkB,sBAAsB;AAE9C,KAAI,CAAC,mBAAmB,gBAAgB,WAAW,EAAG,QAAO;AAG7D,KAAI,gBAAgB,SAAS,EAAG,OAAM,IAAI,MAAM,+CAA+C;CAE/F,MAAM,uBAAuB,gBAAgB;AAG7C,KAAI,qBAAqB,MAAM,gBAAgB,SAAS,oBACtD,OAAM,IAAI,MAAM,mDAAmD;CAGrE,MAAM,mBAAmB,qBAAqB,qBAAqB,MAAM,OACvE,sBAAsB,oBAAoB,QAAQ,MAAM,MAAM,EAAE,sBAAsB,GAAG,CAC1F;AAED,QAAO;EACL,MAAM,qBAAqB,MAAM,gBAAgB;EACjD,cAAe,qBAAqB,MAAM,gBAAgB,gBAA6C,GAAG;EAC1G,MAAM,sBAAsB;EAC5B;EACD;;;;;AChBH,MAAa,aAAa,OAAO,EAC/B,iBACA,qBACA,uBACA,8BACA,cAQI;CACJ,MAAM,EAAE,yBAAyB;AACjC,KACE,CAAC,gBAAgB,uBAAuB,4BACxC,CAAC,gBAAgB,aAAa,eAE9B,OAAM,IAAI,MAAM,oDAAoD;CAMtE,MAAM,kCAAkC,gBAAgB,wBACpD,OAAO,YACL,MAAM,QAAQ,IACZ,gBAAgB,sBAAsB,aAAa,SAAS,gBAC1D,YAAY,gBAAgB,MAAM,GAAG,YAAY,WAAW,CAAC,IAAI,OAAO,UAAU;EAChF,MAAM,eAAe,oBAAoB,MAAM;EAC/C,MAAM,aACJ,MAAM,sBAAsB,MAAM,OAAO,GAAG,iBAAiB,OAAO,aAAa,IACjF,MAAM,sBAAsB;EAG9B,MAAM,mBAAmB,MAAM,sBAC7B,QAAQ,OACR,WAAW,kBACX,6BACD;AAED,SAAO,CAAC,MAAM,mBAAmB,CAAC;GAAE,GAAG;GAAY;GAAkB,CAAC,CAAC;GACvE,CACH,CACF,CACF,GACD;CAEJ,MAAM,kBAAkB,gBAAgB,cACpC,OAAO,YACL,MAAM,QAAQ,IACZ,OAAO,QACL,OAAO,KAAK,oBAAoB,CAAC,SAAS,IACtC,iCAAiC,gBAAgB,aAAa,oBAAoB,GAClF,QAAQ,MAAM,QAAQ,gBAAgB,gCAAgC,gBAAgB,YAAY,CACvG,CAAC,IAAI,OAAO,CAAC,mBAAmB,gBAAgB;EAE/C,MAAM,mBAAmB,MAAM,sBAC7B,QAAQ,OACR,WAAW,kBACX,6BACD;AAED,SAAO,CAAC,mBAAmB;GAAE,GAAG;GAAY;GAAkB,CAAC;GAC/D,CACH,CACF,GACD;CAEJ,MAAM,mBAAmB,4BAA4B,gBAAgB,EAAE;AAEvE,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,oCAAoC;GAC7F,6BAA6B;GAC7B,sBAAsB,kCAClB,EACE,aAAa,iCACd,GACD;GACJ,MAAM,kBACF,EACE,aAAa,iBACd,GACD;GACJ,iBACE,gBAAgB,mBAAmB,yBAAyB,mBACxD,CAAC,EAAE,cAAc,kBAAkB,CAAC,GACpC;GACN,QAAQ,gBAAgB;GACzB,CAAC;AAIF,MAAI,OAAO,YACT,OAAM,QAAQ,QAAQ,OAAO,YAAY;AAG3C,MAAI,OAAO,mBAAmB,OAAO,eAAe,SAAS,OAAO,OAAO,eAAe,SAAS,MAAM;AACvG,WAAQ,OAAO,MAAM,+CAA+C;IAClE;IACA,UAAU,OAAO;IACjB,iBAAiB,OAAO;IACzB,CAAC;AACF,SAAM,IAAI,MACR,gDAAgD,KAAK,UAAU,OAAO,eAAe,MAAM,MAAM,EAAE,GACpG;;AAGH,SAAO;UACA,OAAO;AAEd,QAAM,MAAM,OAAO;;;;;;;AAQvB,SAAS,iCACP,iBACA,qBAC2B;AAC3B,KAAI,CAAC,gBAAgB,eACnB,OAAM,IAAI,MAAM,mGAAmG;CAGrH,MAAMM,cAAyC,EAAE;AAEjD,MAAK,MAAM,CAAC,mBAAmB,uBAAuB,OAAO,QAAQ,oBAAoB,EAAE;EACzF,MAAM,4BAA4B,gBAAgB,mBAAmB;AACrE,MAAI,0BAA0B,SAAS;GAWrC,MAAM,kBAVQ,0BAA0B,IACrC,KAAK,eACJ,WAAW,MAAM,aACf,UAAU,WAAW,YAAY,YAAa,SAAS,OAAsB,OAAO,qBAChF,WACA,OACL,CACF,CACA,MAAM,MAAM,MAAM,OAAU;AAI/B,OACE,iBAAiB,WACjB,gBAAgB,OAAO,SAAS,gBAChC,gBAAgB,OAAO,sBAAsB,WAE7C,aAAY,qBAAqB;IAC/B,aAAa,YAAY;IACzB,kBAAkB,gBAAgB;IAClC,kBAAkB,gBAAgB,OAAO;IAC1C;YAED,iBAAiB,WACjB,gBAAgB,OAAO,SAAS,oBAC/B,gBAAgB,OAAO,sBAAsB,eAC5C,gBAAgB,OAAO,sBAAsB,aAE/C,aAAY,qBAAqB;IAC/B,aAAa,YAAY;IACzB,kBAAkB,gBAAgB;IAClC,kBAAkB,gBAAgB,OAAO;IAC1C;;;AAKP,QAAO;;;;;ACjKT,SAAS,kBAAkB,YAA4B;AACrD,QAAO,OAAO,YACZ,OAAO,QAAQ,WAAW,CAAC,KAAK,CAAC,WAAW,YAAY,CACtD,WACA,OAAO,YACL,OAAO,QAAQ,OAAO,CAAC,KAAK,CAAC,KAAK,WAAW;AAC3C,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,OAAO,UAAU,SAC9E,QAAO,CAAC,KAAK,MAAM;AAGrB,MAAI,iBAAiB,QAAQ,iBAAiB,SAC5C,QAAO,CAAC,KAAK,MAAM,aAAa,CAAC;AAInC,SAAO,CAAC,KAAK,KAAK;GAClB,CACH,CACF,CAAC,CACH;;AAGH,SAAS,gCAAgC,YAA4B;AACnE,QAAO,OAAO,QAAQ,WAAW,CAAC,SAAS,CAAC,WAAW,YACrD,OAAO,KAAK,OAAO,CAAC,KAAK,SAAS;EAChC,MAAM,CAAC,WAAW,IAAI;EAKtB,aAAa,eAAe,IAAI;EACjC,EAAE,CACJ;;AAGH,SAAS,iCAAiC,QAAgB,OAAiB,EAAE,EAA4B;AACvG,QAAO,OAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,WAAW,WAAW;EAC5D,MAAM,eACJ,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,GACvD,iCAAiC,OAAO,CAAC,GAAG,MAAM,UAAU,CAAC,GAC7D,EAAE;AAER,SAAO,CACL;GACE,MAAM,CAAC,GAAG,MAAM,UAAU;GAK1B,aAAa,eAAe,UAAU;GACvC,EACD,GAAG,aACJ;GACD;;;;;AAMJ,eAAe,2BAA2B,UAAgB,OAAwB;AAChF,KAAI;AAEF,MAAI,CAAC,MAAM,SACT,OAAM,MAAM,eAAe;AAG7B,MAAI,CAAC,MAAM,SACT;EAGF,MAAM,QAAQ,MAAMC,QAAM,UAAU,MAAM,SAAS;EAGnD,IAAIC;EACJ,IAAIC;AACJ,MAAI,MAAM,SAAS,MAAM,QAAQ;AAE/B,WAAQ;AACR,YAAS,KAAK,MAAO,MAAM,SAAS,MAAM,QAAS,GAAG;SACjD;AAEL,YAAS;AACT,WAAQ,KAAK,MAAO,MAAM,QAAQ,MAAM,SAAU,GAAG;;EAKvD,MAAM,cAAc,OADC,MAAM,iBAAiB,WAAW,MAAM,CAAC,OAAO;GAAE;GAAO;GAAQ,CAAC,CAAC,aAAa,EAC9D,UAAU;GAC/C,QAAQ;GACR,QAAQ,WAAW;GACnB,UAAU;GACX,CAAC;AAEF,MAAI,CAAC,YAAY,OACf;AAGF,SAAO,yBAAyB,YAAY;UACrC,OAAO;AACd,WAAO,MAAM,yBAAyB,EACpC,OACD,CAAC;AACF,QAAM;;;AAIV,eAAe,+BAA+B,UAAgB,KAAa;CACzE,IAAIC;AAEJ,KAAI;AAEF,MAAI,IAAI,WAAW,UAAU,IAAI,IAAI,WAAW,WAAW,EAAE;GAC3D,MAAM,YAAY,MAAMH,QAAM,kBAAkB,IAAI;AACpD,OAAI,CAAC,UAAW,QAAO;AAEvB,WAAQ,YAAsB,QAAQ,UAAU,YAAY,CAAC,eAAe;QAI5E,eAAwB,WAAW,IAAI;AAGzC,SAAO,MAAM,2BAA2BI,UAAQ,MAAM;UAC/C,OAAO;AAEd,WAAO,MAAM,yDAAyD,EACpE,OACD,CAAC;;;AAKN,eAAsB,4BAA4B,OAAkB;AAClE,KAAI,SAAS,OAAO,MAAO;CAE3B,MAAM,cAAc,MAAM,MAAM,KAAK,QAAQ;CAC7C,MAAM,iBAAiB,MAAM,MAAM,QAAQ,QAAQ;CAEnD,MAAM,kBAAkB,YAAY,IAAI,OAAO,WAAoC;EACjF,MAAM,OAAO,OAAO;EACpB,MAAM,EAAE,YAAY,wBAAwB,OAAO;EAEnD,MAAM,cAAc,QAAQ,iBAAiB,MACzC,MAAM,+BAA+B,MAAM,OAAO,QAAQ,QAAQ,iBAAiB,IAAI,GACvF,QAAQ,OAAO,MAAM,MACnB,MAAM,+BAA+B,MAAM,OAAO,QAAQ,QAAQ,OAAO,KAAK,IAAI,GAClF;AAEN,SAAO;GACL,IAAI,OAAO;GACX,YAAY;IACV,SAAS,KAAK;IACd,QAAQ;IACR,YAAY,kBAAkB,KAAK,uBAAuB;IAC3D;GACD,SAAS;IACP,OAAO,QAAQ;IACf,UAAU,aAAa,QAAQ,OAAO;IACtC,QAAQ,gCAAgC,KAAK,uBAAuB;IACpE;IACD;GACF;GACD;CAEF,MAAM,mBAAmB,eAAe,IAAI,OAAO,WAAoC;EACrF,MAAM,UAAU,OAAO;EACvB,MAAM,EAAE,YAAY,wBAAwB,OAAO;EAEnD,MAAM,cAAc,QAAQ,iBAAiB,MACzC,MAAM,+BAA+B,MAAM,OAAO,QAAQ,QAAQ,iBAAiB,IAAI,GACvF,QAAQ,OAAO,MAAM,MACnB,MAAM,+BAA+B,MAAM,OAAO,QAAQ,QAAQ,OAAO,KAAK,IAAI,GAClF;AAEN,SAAO;GACL,IAAI,OAAO;GACX,YAAY;IACV,KAAK,OAAO,SAAS,CAAC;IACtB,QAAQ;IAER,QAAQ,QAAQ;IACjB;GACD,SAAS;IACP,OAAO,QAAQ;IACf,UAAU,aAAa,QAAQ,OAAO;IACtC,QAAQ,iCAAiC,QAAQ,aAAa;IAC9D;IACD;GACF;GACD;CAEF,MAAM,cAAc,MAAM,QAAQ,IAAI,CAAC,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAChF,OAAM,OAAO,OAAO,MAAM,sDAAsD;AAEhF,OAAM,oBAAoB;EACxB;EACA,SAAS;EACV,CAAC;;;;;;;;ACtNJ,eAAsB,uBAAuB,OAAqB;AAGhE,QAFwB,MAAM,MAAM,QAAQ,mBAAmB,qBAAqB,KAEzD;;;;;;;AAQ7B,eAAsB,sBAAsB,OAAqB,aAAqB;CAEpF,MAAM,kBAAkB,MAAM,MAAM,QAAQ,UAAU,2BAA2B,YAAY;CAC7F,IAAI,CAAC,cAAc,kBAAkB,MAAM,MAAM,QAAQ,YAAY,qBAAqB,gBAAgB,GAAG,GAAG,EAAE;AAElH,KAAI,CAAC,YAAY;AACf,QAAM,OAAO,OAAO,MAAM,2DAA2D;EAErF,MAAM,UAAU,MAAM,MAAM,QAAQ,mBAAmB,WAAW,EAAE,oBAAoB,OAAO,CAAC;AAEhG,QAAM,OAAO,OAAO,MAAM,mBAAmB,QAAQ;EACrD,MAAM,EAAE,kBAAkB,kBAAkB,MAAM,MAAM,QAAQ,UAAU,0BAA0B;GAClG,KAAK;GACL;GACD,CAAC;AACF,QAAM,OAAO,OAAO,MAAM,kCAAkC,EAAE,aAAa,CAAC;AAE5E,MAAI,CAAC,cACH,OAAM,IAAI,WAAW,+CAA+C;AAGtE,eAAa;;CAGf,MAAM,kBAAkB,WAAW,UAC/B,aACA,MAAM,MAAM,QAAQ,YAAY,sBAAsB,WAAW,GAAG;AAExE,QAAO,MAAM,QAAQ,mBAAmB,UAAU,gBAAgB;;;;;AAMpE,eAAsB,sBAAsB,OAAqB;AAC/D,OAAM,OAAO,OAAO,KAAK,0CAA0C;AAGnE,OAAM,MAAM,QAAQ,mBAAmB,sBAAsB,QAAW,uBAAuB,SAAS;;;;;AAM1G,eAAsB,kBAAkB,OAAqB;AAC3D,OAAM,OAAO,OAAO,KAAK,wCAAwC;AAGjE,OAAM,MAAM,QAAQ,mBAAmB,mBAAmB;;;;;;;;;;;ACxD5D,SAAgB,wBAAwB,EACtC,YAAY,MACZ,WAIC;AACD,iBAAgB;AAEd,MAAI,CAAC,aAAa,CAAC,QAAS;AAE5B,UAAQ,OAAO,MAAM,6BAA6B;AAElD,EAAK,sBAAsB,QAAQ,MAAM;AAGzC,eAAa;AACX,GAAK,kBAAkB,QAAQ,MAAM;;IAEtC,CAAC,WAAW,QAAQ,CAAC;;;;;ACvB1B,SAAgB,wBAAwB,EACtC,aACA,WAIC;CACD,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,MAAM;CACvE,MAAM,CAAC,uBAAuB,4BAA4B,SAAS,MAAM;AAGzE,yBAAwB,EACtB,WAAW,uBACZ,CAAC;AAEF,iBAAgB;AACd,MAAI,CAAC,QAAS;AACd,MAAI,sBAAuB;AAC3B,MAAI,qBAAsB;AAE1B,0BAAwB,KAAK;AAE7B,UAAQ,OAAO,MAAM,sCAAsC;AAE3D,EAAK,uBAAuB,QAAQ,MAAM,CACvC,KAAK,OAAO,wBAAwB;AACnC,OAAI,CAAC,qBAAqB;AACxB,YAAQ,OAAO,MAAM,+BAA+B;AACpD,QAAI,CAAC,YAAa,OAAM,IAAI,yCAAyC;AACrE,UAAM,sBAAsB,QAAQ,OAAO,YAAY;;AAGzD,WAAQ,OAAO,KAAK,uBAAuB;AAC3C,4BAAyB,KAAK;IAC9B,CACD,cAAc;AACb,2BAAwB,MAAM;IAC9B;IACH;EAAC;EAAuB;EAAsB;EAAa;EAAQ,CAAC;AAEvE,QAAO;EAAE;EAAuB;EAAsB;;;;;ACYxD,SAAgB,WAAW,aAAmD;CAC5E,MAAM,SAAS,iBAAiB;AAEhC,yBAAwB,EAAE,SAAS,OAAO,UAAU,aAAa,OAAO,UAAU,QAAW,CAAC;AAE9F,KAAI,eAAe,OAAO,UAAU,YAClC,OAAM,IAAI,MAAM,iBAAiB,OAAO,MAAM,yCAAyC,YAAY,GAAG;AAGxG,KAAI,OAAO,UAAU,eACnB,QAAO;AAGT,KAAI,OAAO,UAAU,iBACnB,QAAO;AAGT,KAAI,OAAO,UAAU,sBACnB,QAAO;AAGT,KAAI,OAAO,UAAU,SACnB,QAAO;AAGT,KAAI,OAAO,UAAU,YAAY;AAE/B,EAAK,4BAA4B,OAAO,QAAQ,MAAM;AACtD,SAAO;;AAGT,OAAM,IAAI,MAAM,0BAA0B,KAAK,UAAU,OAAO,CAAC,GAAG;;;;;AChEtE,SAAS,mBAAmB,sBAA8B;CACxD,MAAM,EAAE,UAAU,UAAwB;CAE1C,MAAM,EAAE,MAAM,WAAW,SAAS;EAChC,UAAU,CAAC,oCAAoC,qBAAqB;EACpE,SAAS,YAAY;GACnB,MAAM,aAAa,MAAM,MAAM,QAAQ,YAAY,cAAc,qBAAqB;GACtF,MAAM,QAAQ,WAAW,OAAO,aAAa,WAAW,OAAO;GAC/D,MAAM,kBAAkB,WAAW;AAEnC,OAAI,CAAC,SAAS,CAAC,gBACb,OAAM,IAAI,MAAM,2BAA2B;AAG7C,UAAO;IACL,YAAY,OAAO,YAAY,gBAAgB,KAAK,EAAE,cAAM,YAAY,CAACC,QAAM,MAAM,CAAC,CAAC;IACvF,UAAU,MAAM;IACjB;;EAEJ,CAAC;AAEF,QAAO;EACL;EACA;EACD;;AAGH,SAAgB,4BAA4B,sBAA8B;CACxE,MAAM,EAAE,YAAY,WAAW,WAAW;CAE1C,MAAM,qBAAqBC,oBAAkB,qBAAqB;CAClE,MAAM,EAAE,SAAS,mBAAmB,qBAAqB;CAEzD,MAAM,EAAE,aAAa,0BAA0B,QAAQ,iBAAiB,YAAY;EAClF,aAAa,CAAC,2BAA2B,qBAAqB;EAC9D,YAAY,OAAO,UAAmC,EAAE,iBAAiB,MAAM,KAAK;AAClF,OAAI,CAAC,mBAAoB;GAgBzB,MAAM,wBAAwB,eAdN,QAAQ,MAAM,OACnC,WAAwC,qBAAqB,uBAAuB,CACpF,KAEC,QACG,UACC,MAAM,QAAQ,iBAAiB,OAAO,wBACtC,CAAC,gBAAgB,oBAAoB,gBAAgB,KAAK,CAAC,SAAS,MAAM,QAAQ,iBAAiB,MAAM,CAC5G,EAED,QAAQ,IAAM,EACd,OAAO,CACR,CAE0D;AAE7D,SAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,oBAAoB,sBAAsB,CAAC;GACjG,MAAM,YAAY,MAAM;GAExB,MAAM,wBAAwB,UAAU,QAAQ,iBAAiB,YAAY,MAC1E,MAAM,EAAE,yBAAyB,MACnC,EAAE;GACH,MAAM,yBAAyB,4CAA4C,UAAU,QAAQ,iBAAiB;AAG9G,OAAI,yBAAyB,wBAAwB;IAGnD,MAAM,YAAY,MAAM,QAAQ,MAAM,eAAe,wBAAwB,sBAAsB;AAInG,mCACE,WACA,8DACE,UAAU,QAAQ,kBAClB,uBACD,CACF;AAGD,UADgC,QAAQ,MAAM,kBAAkB,QAAQ,wBAAwB,CAClE,OAAO,QAAQ,MAAM,SAAS,UAAU;AAEtE,QAAI,QAAQ,gBACV,OAAM,oBAAoB,SAAS;KACjC,UAAU,oBAAoB;KAC9B,MAAM,wBAAwB,cAAc;KAC5C,MAAM,EAAE,KAAK,wBAAwB,eAAe;KACpD,iBAAiB;KACjB,eAAe,CAAC,kBAAkB,WAAW,KAAK;KACnD,CAAC;AAGJ,WAAO;;;EAGZ,CAAC;CACF,MAAM,EAAE,aAAa,2BAA2B,QAAQ,kBAAkB,YAAY;EACpF,aAAa,CAAC,4BAA4B,qBAAqB;EAC/D,YAAY,OAAO,UAAoC,EAAE,kBAAkB,MAAM,KAAK;AACpF,OAAI,CAAC,mBAAoB;GAgBzB,MAAM,wBAAwB,eAdN,QAAQ,MAAM,OACnC,WAAwC,qBAAqB,uBAAuB,CACpF,KAEC,QACG,UACC,MAAM,QAAQ,iBAAiB,OAAO,wBACtC,MAAM,QAAQ,iBAAiB,UAAU,gBAAgB,SAC5D,EAED,QAAQ,IAAM,EACd,OAAO,CACR,CAE0D;AAE7D,SAAM,QAAQ,MAAM,QAAQ,YAAY,aAAa,sBAAsB,EACzE,mBAAmB,MACpB,CAAC;AAEF,OAAI,QAAQ,iBACV,OAAM,QAAQ,MAAM,QAAQ,YAAY,WAAW,qBAAqB;AAG1E,SAAM;;EAET,CAAC;CAEF,MAAM,yBAAyB,qBAC3B,4CAA4C,mBAAmB,GAC/D;AAEJ,QAAO;EACL,mBAAmB,YAAsC,yBAAyB,QAAQ;EAC1F,oBAAoB,YAAuC,0BAA0B,QAAQ;EAC7F;EACA;EACA;EACA,SAAS;GACP,QAAQ;IACN,MAAM,wBAAwB;IAC9B,MAAM,EACJ,KAAK,wBAAwB,eAC9B;IACF;GACD,MAAM,wBAAwB;GAC/B;EACD,YAAY,MAAM;EACnB;;;;;AC3IH,SAAgB,8BAA8B,iBAAyB;CACrE,MAAM,EAAE,YAAY,WAAW,WAAW;CAE1C,MAAM,gBAAgB,aAAa,gBAAgB;CACnD,MAAM,aAAa,kBAAkB,eAAe,gBAAgB,GAAG;CAEvE,MAAM,EAAE,SAAS,SAAS;EACxB,UAAU,CAAC,iCAAiC,gBAAgB;EAC5D,SAAS,YAAY;GACnB,MAAM,aAAa,MAAM,QAAQ,MAAM,QAAQ,OAAO,cAAc,gBAAgB;GAEpF,MAAM,eAAe,WAAW,SAAS,aAAa,WAAW,SAAS;GAE1E,MAAM,wBAAwB,MAAM,QAAQ,MAAM,QAAQ,OAAO,yBAAyB,EACxF,eAAe,iBAChB,CAAC;GAEF,MAAM,YAAY,WAAW,SAAS,cAAc,SAAY,cAAc;GAC9E,MAAM,uBACJ,sBAAsB,aAAa,aAAa,sBAAsB,aAAa;AACrF,OAAI,CAAC,wBAAwB,CAAC,aAC5B,OAAM,IAAI,WAAW,yBAAyB;GAGhD,MAAM,0BAAU,IAAI,KAUjB;GAEH,MAAM,mBACJ,MACA,WACA,yBACA,YACG;IAIH,MAAM,YAAY,UAAU,SAAS,iBAAiB,GAClD,UAAU,MAAM,iBAAiB,CAAC,KAClC,QAAQ,SAAS,IACf,QACG,KAAK,MAAM,EAAE,aAAa,CAC1B,MAAM,CACN,KAAK,IAAI,GACZ;IAEN,MAAM,QAAQ,QAAQ,IAAI,UAAU;AAEpC,QAAI,CAAC,OAAO;AACV,aAAQ,IAAI,WAAW;MACrB,YAAY;OACV,YAAY,SAAS,cAAc,CAAC,UAAU,GAAG,EAAE;OACnD,YAAY,SAAS,cAAc,CAAC,UAAU,GAAG,EAAE;OACpD;MACD;MACA,qBAAqB,IAAI,IAAI,wBAAwB;MACtD,CAAC;AACF;;AAGF,QAAI,SAAS,YACX,OAAM,WAAW,WAAW,KAAK,UAAU;QAE3C,OAAM,WAAW,WAAW,KAAK,UAAU;AAG7C,UAAM,sBAAsB,IAAI,IAAI,CAAC,GAAG,yBAAyB,GAAG,MAAM,oBAAoB,CAAC;AAK/F,UAAM,UAAU,MAAM,QAAQ,QAAQ,UACpC,QAAQ,MAAM,eAAe,MAAM,iBAAiB,WAAW,aAAa,CAC7E;;AAGH,QAAK,MAAM,CAAC,WAAW,mBAAmB,OAAO,QAAQ,qBAAqB,WAAW,EAAE;IACzF,MAAM,qBAAqB,aAAa,qBAAqB;AAC7D,QAAI,CAAC,mBAAoB,OAAM,IAAI,MAAM,+BAA+B;AAGxE,oBAAgB,aAAa,WAFI,mBAAmB,SAAS,CAAC,mBAAmB,KAAe,EAE9B,eAAe;;AAGnF,QAAK,MAAM,CAAC,WAAW,mBAAmB,OAAO,QAAQ,qBAAqB,WAAW,EAAE;AAEzF,QAAI,CADuB,aAAa,qBAAqB,WACpC,OAAM,IAAI,MAAM,+BAA+B;AAExE,oBAAgB,aAAa,WAAW,CAAC,OAAO,EAAE,eAAe;;GAGnE,MAAM,eAAe,MAAM,QAAQ,IACjC,MAAM,KAAK,QAAQ,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,WAAW,WAA8C;AACjG,QAAI,MAAM,QAAQ,WAAW,EAC3B,QAAO;KACL,mBAAmB;KACnB,aAAa;KAEb,MAAM;KACN,yBAAyB,MAAM,KAAK,MAAM,oBAAoB,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;KAC/E;IAGH,MAAM,cAAe,MAAM,QAAQ,IACjC,MAAM,QAAQ,IAAI,OAAO,UAAgE;KAEvF,MAAM,uBAAuB,wBADV,MAAM,cAAc,QAAQ,OAAO,kBAAkB,MAAM,eAAe,CAC7B;KAEhE,MAAM,gCAAgC,OAAO,QAAQ,qBAAqB,WAAW,CAClF,QAAQ,CAAC,SAAS,MAAM,oBAAoB,IAAI,IAAI,CAAC,CACrD,QAAQ,KAAK,CAAC,KAAK,YAAY;MAAE,GAAG;OAAM,MAAM;MAAO,GAAG,EAAE,CAAC;KAEhE,MAAM,gCAAgC,OAAO,QAAQ,qBAAqB,WAAW,CAAC,QACnF,KAAK,CAAC,eAAe;MACpB,MAAM,qBAAqB,aAAa,qBAAqB;AAC7D,aAAO;OACL,GAAG;QACF,mBAAmB,OAAO;QACzB,MAAM,mBAAmB;QACzB,OAAO,mBAAmB;QAC3B;OACF;QAEH,EAAE,CACH;AAED,YAAO;MACL,YAAY;MACZ,WAAW;OACT,YAAY;QACV,GAAG;QACH,GAAG;QACJ;OACD,UAAU,qBAAqB;OAC/B,OAAO,MAAM,KAAK,MAAM,oBAAoB,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;OAC7D;MACF;MACD,CACH;AAED,WAAO;KACL,mBAAmB;KACnB;KACA,aAAa;KACb,MAAM,YAAY,GAAG,WAAW,QAAQ;KACzC;KACD,CACH;GACD,MAAM,iBAAiB,MAAM,QAAQ,MAAM,QAAQ,OAAO,mBAAmB,gBAAgB;GAC7F,MAAM,UACJ,gBAAgB,YACf,0BAA0B,+BAA+B,eAAe,OAAO;AASlF,UAAO;IAAE,YAP+B;KACtC,iBAAiB,aAAa,OAAO,UAAU,MAAM,YAAY;KACjE,SAAS;KACT,MAAM,cAAc,QAAQ;KAC5B;KACD;IAEoB;IAAW;IAAS;;EAE5C,CAAC;CAEF,MAAM,EAAE,aAAa,mBAAmB,QAAQ,iBAAiB,YAAY;EAC3E,aAAa,CAAC,6BAA6B,gBAAgB;EAC3D,YAAY,OAAO,UAAqC,EAAE,iBAAiB,MAAM,KAAK;AACpF,OAAI;IACF,IAAIC,cACF;AAEF,QAAI,SAAS,uBAAuB,OAAO,KAAK,QAAQ,oBAAoB,CAAC,SAAS,GAAG;AACvF,SAAI,CAAC,MAAM,aAAa,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,oDAAoD;KAE3G,MAAMC,qBAAuE,EAAE;KAC/E,MAAMC,qBAAuE,EAAE;AAE/E,UAAK,MAAM,CAAC,mBAAmB,UAAU,MAAM,KAAK,KAAK,QAAQ,SAAS,CAAC,EAAE;MAC3E,MAAM,eAAe,QAAQ,oBAAoB;MACjD,MAAM,QAAQ,MAAM,QAAQ,MAAM,YAAUC,QAAM,iBAAiB,aAAa,IAAI,MAAM,QAAQ;AAElG,WAAK,MAAM,aAAa,MAAM,WAAW,WACvC,oBAAmB,aAAa;OAC9B,GAAG;OACH,UAAU;OACX;AAGH,WAAK,MAAM,aAAa,MAAM,WAAW,WACvC,oBAAmB,aAAa;;AAIpC,mBAAc,GACX,KAAK,YAAY;MAChB,YAAY;MACZ,YAAY;MACZ,wBAAwB,EAAE;MAC3B,EACF;;IAiBH,MAAM,0BAA0B,eAdN,QAAQ,MAAM,OACrC,WAAmC,gBAAgB,kBAAkB,CACrE,KAEC,QACG,UACC,MAAM,QAAQ,YAAY,OAAO,mBACjC,CAAC,WAAW,kBAAkB,WAAW,KAAK,CAAC,SAAS,MAAM,QAAQ,YAAY,MAAM,CAC3F,EAED,QAAQ,IAAM,EACd,OAAO,CACR,CAE8D;AACjE,UAAM,QAAQ,MAAM,QAAQ,OAAO,cAAc;KAC/C,eAAe;KACf,cAAc;KACf,CAAC;AACF,UAAM;AAEN,QAAI,QAAQ,mBAAmB,KAC7B,OAAM,+BACJ,SACA,KAAK,YACL;KACE,IAAI;KACJ,MAAM,YAAY;KAClB,MAAM,EACJ,KAAK,YAAY,UAClB;KACF,EACD,UACD;WAEG;AACN,QAAI,QAAQ,mBAAmB,KAC7B,OAAM,+BACJ,SACA,KAAK,YACL;KACE,IAAI;KACJ,MAAM,YAAY;KAClB,MAAM,EACJ,KAAK,YAAY,UAClB;KACF,EACD,SACD;;;EAIR,CAAC;CAEF,MAAM,EAAE,aAAa,oBAAoB,QAAQ,kBAAkB,YAAY;EAC7E,aAAa,CAAC,8BAA8B,gBAAgB;EAC5D,YAAY,OAAO,UAAsC;GAAE,oBAAoB;GAAM,iBAAiB;GAAM,KAAK;GAe/G,MAAM,6BAA6B,eAdL,QAAQ,MAAM,OACzC,WAAmC,gBAAgB,kBAAkB,CACrE,KAEC,QACG,UACC,MAAM,QAAQ,YAAY,OAAO,mBACjC,CAAC,WAAW,SAAS,CAAC,SAAS,MAAM,QAAQ,YAAY,MAAM,CAClE,EAED,QAAQ,IAAM,EACd,OAAO,CACR,CAEqE;AACxE,SAAM,QAAQ,MAAM,QAAQ,OAAO,eAAe;IAAE,eAAe;IAAiB,mBAAmB;IAAM,CAAC;AAC9G,SAAM;AAEN,OAAI,QAAQ,mBACV,CAAK,QAAQ,MAAM,QAAQ,OAAO,WAAW,gBAAgB;AAG/D,OAAI,QAAQ,mBAAmB,KAC7B,OAAM,+BACJ,SACA,KAAK,YACL;IACE,IAAI;IACJ,MAAM,YAAY;IAClB,MAAM,EACJ,KAAK,YAAY,UAClB;IACF,EACD,UACD;;EAGN,CAAC;AAEF,QAAO;EACL,qBAAqB,YAAwC,kBAAkB,QAAQ;EACvF,sBAAsB,YAAyC,mBAAmB,QAAQ;EAC1F;EACA;EACA;EACA,YAAY,MAAM;EAClB,cAAc,YAAY;EAC1B,MAAM,EACJ,KAAK,YAAY,UAClB;EACF;;;;;;;;;;;AC5VH,MAAa,wBAAwB;CACnC,MAAM,EAAE,UAAU,UAAwB;AAC1C,oBAAmB,MAAM;AACzB,QAAO,EAAE,OAAO;;;;;ACHlB,MAAa,0BAA0B;CACrC,MAAM,EAAE,UAAU,UAA0B;AAC5C,sBAAqB,MAAM;AAC3B,QAAO,EAAE,OAAO;;;;;ACDlB,MAAa,6BAA6B;CACxC,MAAM,EAAE,sBAAsB,WAAW,iBAAiB,yBAAyB;CACnF,MAAM,EAAE,gBAAgB,WAAW,mBAAmB,mBAAmB;CACzE,MAAM,EAAE,aAAa,WAAW,kBAAkB,gBAAgB;AAWlE,QAAO;EACL,aAVkB,cAAc;AAMhC,UALmB;IAAC,GAAG;IAAsB,GAAG;IAAa,GAAG;IAAe,CAG9C,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC;KAG7F;GAAC;GAAsB;GAAgB;GAAY,CAAC;EAIrD,WAAW,kBAAkB,gBAAgB;EAC9C;;;;;ACpBH,MAAa,2BAA2B,OAAe;CACrD,MAAM,EAAE,WAAW,gBAAgB,sBAAsB;AAEzD,QAAO;EACL;EACA,YAAY,YAAY,MAAM,eAAe,WAAW,OAAO,GAAG;EACnE;;;;;;ACPH,QAAO,WAAU,QAAO,mBAAmB,IAAI,CAAC,QAAQ,aAAY,MAAK,IAAI,EAAE,WAAW,EAAE,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG;;;;;;CCA1H,IAAI,QAAQ;CACZ,IAAI,gBAAgB,IAAI,OAAO,MAAM,QAAQ,cAAc,KAAK;CAChE,IAAI,eAAe,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK;CAEvD,SAAS,iBAAiB,YAAY,OAAO;AAC5C,MAAI;AAEH,UAAO,CAAC,mBAAmB,WAAW,KAAK,GAAG,CAAC,CAAC;WACxC,KAAK;AAId,MAAI,WAAW,WAAW,EACzB,QAAO;AAGR,UAAQ,SAAS;EAGjB,IAAI,OAAO,WAAW,MAAM,GAAG,MAAM;EACrC,IAAI,QAAQ,WAAW,MAAM,MAAM;AAEnC,SAAO,MAAM,UAAU,OAAO,KAAK,EAAE,EAAE,iBAAiB,KAAK,EAAE,iBAAiB,MAAM,CAAC;;CAGxF,SAASC,SAAO,OAAO;AACtB,MAAI;AACH,UAAO,mBAAmB,MAAM;WACxB,KAAK;GACb,IAAI,SAAS,MAAM,MAAM,cAAc,IAAI,EAAE;AAE7C,QAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,YAAQ,iBAAiB,QAAQ,EAAE,CAAC,KAAK,GAAG;AAE5C,aAAS,MAAM,MAAM,cAAc,IAAI,EAAE;;AAG1C,UAAO;;;CAIT,SAAS,yBAAyB,OAAO;EAExC,IAAI,aAAa;GAChB,UAAU;GACV,UAAU;GACV;EAED,IAAI,QAAQ,aAAa,KAAK,MAAM;AACpC,SAAO,OAAO;AACb,OAAI;AAEH,eAAW,MAAM,MAAM,mBAAmB,MAAM,GAAG;YAC3C,KAAK;IACb,IAAI,SAASA,SAAO,MAAM,GAAG;AAE7B,QAAI,WAAW,MAAM,GACpB,YAAW,MAAM,MAAM;;AAIzB,WAAQ,aAAa,KAAK,MAAM;;AAIjC,aAAW,SAAS;EAEpB,IAAI,UAAU,OAAO,KAAK,WAAW;AAErC,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;GAExC,IAAI,MAAM,QAAQ;AAClB,WAAQ,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,WAAW,KAAK;;AAG7D,SAAO;;AAGR,QAAO,UAAU,SAAU,YAAY;AACtC,MAAI,OAAO,eAAe,SACzB,OAAM,IAAI,UAAU,wDAAwD,OAAO,aAAa,IAAI;AAGrG,MAAI;AACH,gBAAa,WAAW,QAAQ,OAAO,IAAI;AAG3C,UAAO,mBAAmB,WAAW;WAC7B,KAAK;AAEb,UAAO,yBAAyB,WAAW;;;;;;;;ACzF7C,QAAO,WAAW,QAAQ,cAAc;AACvC,MAAI,EAAE,OAAO,WAAW,YAAY,OAAO,cAAc,UACxD,OAAM,IAAI,UAAU,gDAAgD;AAGrE,MAAI,cAAc,GACjB,QAAO,CAAC,OAAO;EAGhB,MAAM,iBAAiB,OAAO,QAAQ,UAAU;AAEhD,MAAI,mBAAmB,GACtB,QAAO,CAAC,OAAO;AAGhB,SAAO,CACN,OAAO,MAAM,GAAG,eAAe,EAC/B,OAAO,MAAM,iBAAiB,UAAU,OAAO,CAC/C;;;;;;;ACnBF,QAAO,UAAU,SAAU,KAAK,WAAW;EAC1C,IAAI,MAAM,EAAE;EACZ,IAAI,OAAO,OAAO,KAAK,IAAI;EAC3B,IAAI,QAAQ,MAAM,QAAQ,UAAU;AAEpC,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACrC,IAAI,MAAM,KAAK;GACf,IAAI,MAAM,IAAI;AAEd,OAAI,QAAQ,UAAU,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,KAAK,IAAI,CACnE,KAAI,OAAO;;AAIb,SAAO;;;;;;;CCdR,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CAEN,MAAM,qBAAoB,UAAS,UAAU,QAAQ,UAAU;CAE/D,MAAM,2BAA2B,OAAO,2BAA2B;CAEnE,SAAS,sBAAsB,SAAS;AACvC,UAAQ,QAAQ,aAAhB;GACC,KAAK,QACJ,SAAO,SAAQ,QAAQ,UAAU;IAChC,MAAM,QAAQ,OAAO;AAErB,QACC,UAAU,UACT,QAAQ,YAAY,UAAU,QAC9B,QAAQ,mBAAmB,UAAU,GAEtC,QAAO;AAGR,QAAI,UAAU,KACb,QAAO,CAAC,GAAG,QAAQ;KAAC,OAAO,KAAK,QAAQ;KAAE;KAAK;KAAO;KAAI,CAAC,KAAK,GAAG,CAAC;AAGrE,WAAO,CACN,GAAG,QACH;KAAC,OAAO,KAAK,QAAQ;KAAE;KAAK,OAAO,OAAO,QAAQ;KAAE;KAAM,OAAO,OAAO,QAAQ;KAAC,CAAC,KAAK,GAAG,CAC1F;;GAGH,KAAK,UACJ,SAAO,SAAQ,QAAQ,UAAU;AAChC,QACC,UAAU,UACT,QAAQ,YAAY,UAAU,QAC9B,QAAQ,mBAAmB,UAAU,GAEtC,QAAO;AAGR,QAAI,UAAU,KACb,QAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;AAG1D,WAAO,CAAC,GAAG,QAAQ;KAAC,OAAO,KAAK,QAAQ;KAAE;KAAO,OAAO,OAAO,QAAQ;KAAC,CAAC,KAAK,GAAG,CAAC;;GAGpF,KAAK,uBACJ,SAAO,SAAQ,QAAQ,UAAU;AAChC,QACC,UAAU,UACT,QAAQ,YAAY,UAAU,QAC9B,QAAQ,mBAAmB,UAAU,GAEtC,QAAO;AAGR,QAAI,UAAU,KACb,QAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC;AAG9D,WAAO,CAAC,GAAG,QAAQ;KAAC,OAAO,KAAK,QAAQ;KAAE;KAAU,OAAO,OAAO,QAAQ;KAAC,CAAC,KAAK,GAAG,CAAC;;GAGvF,KAAK;GACL,KAAK;GACL,KAAK,qBAAqB;IACzB,MAAM,cAAc,QAAQ,gBAAgB,sBAC3C,QACA;AAED,YAAO,SAAQ,QAAQ,UAAU;AAChC,SACC,UAAU,UACT,QAAQ,YAAY,UAAU,QAC9B,QAAQ,mBAAmB,UAAU,GAEtC,QAAO;AAIR,aAAQ,UAAU,OAAO,KAAK;AAE9B,SAAI,OAAO,WAAW,EACrB,QAAO,CAAC;MAAC,OAAO,KAAK,QAAQ;MAAE;MAAa,OAAO,OAAO,QAAQ;MAAC,CAAC,KAAK,GAAG,CAAC;AAG9E,YAAO,CAAC,CAAC,QAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC,KAAK,QAAQ,qBAAqB,CAAC;;;GAI9E,QACC,SAAO,SAAQ,QAAQ,UAAU;AAChC,QACC,UAAU,UACT,QAAQ,YAAY,UAAU,QAC9B,QAAQ,mBAAmB,UAAU,GAEtC,QAAO;AAGR,QAAI,UAAU,KACb,QAAO,CAAC,GAAG,QAAQ,OAAO,KAAK,QAAQ,CAAC;AAGzC,WAAO,CAAC,GAAG,QAAQ;KAAC,OAAO,KAAK,QAAQ;KAAE;KAAK,OAAO,OAAO,QAAQ;KAAC,CAAC,KAAK,GAAG,CAAC;;;;CAKpF,SAAS,qBAAqB,SAAS;EACtC,IAAI;AAEJ,UAAQ,QAAQ,aAAhB;GACC,KAAK,QACJ,SAAQ,KAAK,OAAO,gBAAgB;AACnC,aAAS,aAAa,KAAK,IAAI;AAE/B,UAAM,IAAI,QAAQ,YAAY,GAAG;AAEjC,QAAI,CAAC,QAAQ;AACZ,iBAAY,OAAO;AACnB;;AAGD,QAAI,YAAY,SAAS,OACxB,aAAY,OAAO,EAAE;AAGtB,gBAAY,KAAK,OAAO,MAAM;;GAGhC,KAAK,UACJ,SAAQ,KAAK,OAAO,gBAAgB;AACnC,aAAS,UAAU,KAAK,IAAI;AAC5B,UAAM,IAAI,QAAQ,SAAS,GAAG;AAE9B,QAAI,CAAC,QAAQ;AACZ,iBAAY,OAAO;AACnB;;AAGD,QAAI,YAAY,SAAS,QAAW;AACnC,iBAAY,OAAO,CAAC,MAAM;AAC1B;;AAGD,gBAAY,OAAO,EAAE,CAAC,OAAO,YAAY,MAAM,MAAM;;GAGvD,KAAK,uBACJ,SAAQ,KAAK,OAAO,gBAAgB;AACnC,aAAS,WAAW,KAAK,IAAI;AAC7B,UAAM,IAAI,QAAQ,UAAU,GAAG;AAE/B,QAAI,CAAC,QAAQ;AACZ,iBAAY,OAAO;AACnB;;AAGD,QAAI,YAAY,SAAS,QAAW;AACnC,iBAAY,OAAO,CAAC,MAAM;AAC1B;;AAGD,gBAAY,OAAO,EAAE,CAAC,OAAO,YAAY,MAAM,MAAM;;GAGvD,KAAK;GACL,KAAK,YACJ,SAAQ,KAAK,OAAO,gBAAgB;IACnC,MAAM,UAAU,OAAO,UAAU,YAAY,MAAM,SAAS,QAAQ,qBAAqB;IACzF,MAAM,iBAAkB,OAAO,UAAU,YAAY,CAAC,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS,QAAQ,qBAAqB;AAC9H,YAAQ,iBAAiB,OAAO,OAAO,QAAQ,GAAG;AAElD,gBAAY,OADK,WAAW,iBAAiB,MAAM,MAAM,QAAQ,qBAAqB,CAAC,KAAI,SAAQ,OAAO,MAAM,QAAQ,CAAC,GAAG,UAAU,OAAO,QAAQ,OAAO,OAAO,QAAQ;;GAI7K,KAAK,oBACJ,SAAQ,KAAK,OAAO,gBAAgB;IACnC,MAAM,UAAU,UAAU,KAAK,IAAI;AACnC,UAAM,IAAI,QAAQ,SAAS,GAAG;AAE9B,QAAI,CAAC,SAAS;AACb,iBAAY,OAAO,QAAQ,OAAO,OAAO,QAAQ,GAAG;AACpD;;IAGD,MAAM,aAAa,UAAU,OAC5B,EAAE,GACF,MAAM,MAAM,QAAQ,qBAAqB,CAAC,KAAI,SAAQ,OAAO,MAAM,QAAQ,CAAC;AAE7E,QAAI,YAAY,SAAS,QAAW;AACnC,iBAAY,OAAO;AACnB;;AAGD,gBAAY,OAAO,EAAE,CAAC,OAAO,YAAY,MAAM,WAAW;;GAG5D,QACC,SAAQ,KAAK,OAAO,gBAAgB;AACnC,QAAI,YAAY,SAAS,QAAW;AACnC,iBAAY,OAAO;AACnB;;AAGD,gBAAY,OAAO,EAAE,CAAC,OAAO,YAAY,MAAM,MAAM;;;;CAKzD,SAAS,6BAA6B,OAAO;AAC5C,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EACjD,OAAM,IAAI,UAAU,uDAAuD;;CAI7E,SAAS,OAAO,OAAO,SAAS;AAC/B,MAAI,QAAQ,OACX,QAAO,QAAQ,SAAS,gBAAgB,MAAM,GAAG,mBAAmB,MAAM;AAG3E,SAAO;;CAGR,SAAS,OAAO,OAAO,SAAS;AAC/B,MAAI,QAAQ,OACX,QAAO,gBAAgB,MAAM;AAG9B,SAAO;;CAGR,SAAS,WAAW,OAAO;AAC1B,MAAI,MAAM,QAAQ,MAAM,CACvB,QAAO,MAAM,MAAM;AAGpB,MAAI,OAAO,UAAU,SACpB,QAAO,WAAW,OAAO,KAAK,MAAM,CAAC,CACnC,MAAM,GAAG,MAAM,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CACrC,KAAI,QAAO,MAAM,KAAK;AAGzB,SAAO;;CAGR,SAAS,WAAW,OAAO;EAC1B,MAAM,YAAY,MAAM,QAAQ,IAAI;AACpC,MAAI,cAAc,GACjB,SAAQ,MAAM,MAAM,GAAG,UAAU;AAGlC,SAAO;;CAGR,SAAS,QAAQ,KAAK;EACrB,IAAI,OAAO;EACX,MAAM,YAAY,IAAI,QAAQ,IAAI;AAClC,MAAI,cAAc,GACjB,QAAO,IAAI,MAAM,UAAU;AAG5B,SAAO;;CAGR,SAAS,QAAQ,OAAO;AACvB,UAAQ,WAAW,MAAM;EACzB,MAAM,aAAa,MAAM,QAAQ,IAAI;AACrC,MAAI,eAAe,GAClB,QAAO;AAGR,SAAO,MAAM,MAAM,aAAa,EAAE;;CAGnC,SAAS,WAAW,OAAO,SAAS;AACnC,MAAI,QAAQ,gBAAgB,CAAC,OAAO,MAAM,OAAO,MAAM,CAAC,IAAK,OAAO,UAAU,YAAY,MAAM,MAAM,KAAK,GAC1G,SAAQ,OAAO,MAAM;WACX,QAAQ,iBAAiB,UAAU,SAAS,MAAM,aAAa,KAAK,UAAU,MAAM,aAAa,KAAK,SAChH,SAAQ,MAAM,aAAa,KAAK;AAGjC,SAAO;;CAGR,SAAS,MAAM,OAAO,SAAS;AAC9B,YAAU,OAAO,OAAO;GACvB,QAAQ;GACR,MAAM;GACN,aAAa;GACb,sBAAsB;GACtB,cAAc;GACd,eAAe;GACf,EAAE,QAAQ;AAEX,+BAA6B,QAAQ,qBAAqB;EAE1D,MAAM,YAAY,qBAAqB,QAAQ;EAG/C,MAAM,MAAM,OAAO,OAAO,KAAK;AAE/B,MAAI,OAAO,UAAU,SACpB,QAAO;AAGR,UAAQ,MAAM,MAAM,CAAC,QAAQ,UAAU,GAAG;AAE1C,MAAI,CAAC,MACJ,QAAO;AAGR,OAAK,MAAM,SAAS,MAAM,MAAM,IAAI,EAAE;AACrC,OAAI,UAAU,GACb;GAGD,IAAI,CAAC,KAAK,SAAS,aAAa,QAAQ,SAAS,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,IAAI;AAIxF,WAAQ,UAAU,SAAY,OAAO;IAAC;IAAS;IAAa;IAAoB,CAAC,SAAS,QAAQ,YAAY,GAAG,QAAQ,OAAO,OAAO,QAAQ;AAC/I,aAAU,OAAO,KAAK,QAAQ,EAAE,OAAO,IAAI;;AAG5C,OAAK,MAAM,OAAO,OAAO,KAAK,IAAI,EAAE;GACnC,MAAM,QAAQ,IAAI;AAClB,OAAI,OAAO,UAAU,YAAY,UAAU,KAC1C,MAAK,MAAM,KAAK,OAAO,KAAK,MAAM,CACjC,OAAM,KAAK,WAAW,MAAM,IAAI,QAAQ;OAGzC,KAAI,OAAO,WAAW,OAAO,QAAQ;;AAIvC,MAAI,QAAQ,SAAS,MACpB,QAAO;AAGR,UAAQ,QAAQ,SAAS,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC,KAAK,QAAQ,KAAK,EAAE,QAAQ,QAAQ,QAAQ;GACtH,MAAM,QAAQ,IAAI;AAClB,OAAI,QAAQ,MAAM,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,CAEvE,QAAO,OAAO,WAAW,MAAM;OAE/B,QAAO,OAAO;AAGf,UAAO;KACL,OAAO,OAAO,KAAK,CAAC;;AAGxB,SAAQ,UAAU;AAClB,SAAQ,QAAQ;AAEhB,SAAQ,aAAa,QAAQ,YAAY;AACxC,MAAI,CAAC,OACJ,QAAO;AAGR,YAAU,OAAO,OAAO;GACvB,QAAQ;GACR,QAAQ;GACR,aAAa;GACb,sBAAsB;GACtB,EAAE,QAAQ;AAEX,+BAA6B,QAAQ,qBAAqB;EAE1D,MAAM,gBAAe,QACnB,QAAQ,YAAY,kBAAkB,OAAO,KAAK,IAClD,QAAQ,mBAAmB,OAAO,SAAS;EAG7C,MAAM,YAAY,sBAAsB,QAAQ;EAEhD,MAAM,aAAa,EAAE;AAErB,OAAK,MAAM,OAAO,OAAO,KAAK,OAAO,CACpC,KAAI,CAAC,aAAa,IAAI,CACrB,YAAW,OAAO,OAAO;EAI3B,MAAM,OAAO,OAAO,KAAK,WAAW;AAEpC,MAAI,QAAQ,SAAS,MACpB,MAAK,KAAK,QAAQ,KAAK;AAGxB,SAAO,KAAK,KAAI,QAAO;GACtB,MAAM,QAAQ,OAAO;AAErB,OAAI,UAAU,OACb,QAAO;AAGR,OAAI,UAAU,KACb,QAAO,OAAO,KAAK,QAAQ;AAG5B,OAAI,MAAM,QAAQ,MAAM,EAAE;AACzB,QAAI,MAAM,WAAW,KAAK,QAAQ,gBAAgB,oBACjD,QAAO,OAAO,KAAK,QAAQ,GAAG;AAG/B,WAAO,MACL,OAAO,UAAU,IAAI,EAAE,EAAE,CAAC,CAC1B,KAAK,IAAI;;AAGZ,UAAO,OAAO,KAAK,QAAQ,GAAG,MAAM,OAAO,OAAO,QAAQ;IACzD,CAAC,QAAO,MAAK,EAAE,SAAS,EAAE,CAAC,KAAK,IAAI;;AAGvC,SAAQ,YAAY,KAAK,YAAY;AACpC,YAAU,OAAO,OAAO,EACvB,QAAQ,MACR,EAAE,QAAQ;EAEX,MAAM,CAAC,MAAM,QAAQ,aAAa,KAAK,IAAI;AAE3C,SAAO,OAAO,OACb;GACC,KAAK,KAAK,MAAM,IAAI,CAAC,MAAM;GAC3B,OAAO,MAAM,QAAQ,IAAI,EAAE,QAAQ;GACnC,EACD,WAAW,QAAQ,2BAA2B,OAAO,EAAC,oBAAoB,OAAO,MAAM,QAAQ,EAAC,GAAG,EAAE,CACrG;;AAGF,SAAQ,gBAAgB,QAAQ,YAAY;AAC3C,YAAU,OAAO,OAAO;GACvB,QAAQ;GACR,QAAQ;IACP,2BAA2B;GAC5B,EAAE,QAAQ;EAEX,MAAM,MAAM,WAAW,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;EACpD,MAAM,eAAe,QAAQ,QAAQ,OAAO,IAAI;EAChD,MAAM,qBAAqB,QAAQ,MAAM,cAAc,EAAC,MAAM,OAAM,CAAC;EAErE,MAAM,QAAQ,OAAO,OAAO,oBAAoB,OAAO,MAAM;EAC7D,IAAIC,gBAAc,QAAQ,UAAU,OAAO,QAAQ;AACnD,MAAIA,cACH,iBAAc,IAAIA;EAGnB,IAAI,OAAO,QAAQ,OAAO,IAAI;AAC9B,MAAI,OAAO,mBACV,QAAO,IAAI,QAAQ,4BAA4B,OAAO,OAAO,oBAAoB,QAAQ,GAAG,OAAO;AAGpG,SAAO,GAAG,MAAMA,gBAAc;;AAG/B,SAAQ,QAAQ,OAAO,UAAQ,YAAY;AAC1C,YAAU,OAAO,OAAO;GACvB,yBAAyB;IACxB,2BAA2B;GAC5B,EAAE,QAAQ;EAEX,MAAM,EAAC,KAAK,OAAO,uBAAsB,QAAQ,SAAS,OAAO,QAAQ;AACzE,SAAO,QAAQ,aAAa;GAC3B;GACA,OAAO,aAAa,OAAOC,SAAO;GAClC;GACA,EAAE,QAAQ;;AAGZ,SAAQ,WAAW,OAAO,UAAQ,YAAY;EAC7C,MAAM,kBAAkB,MAAM,QAAQA,SAAO,IAAG,QAAO,CAACA,SAAO,SAAS,IAAI,IAAI,KAAK,UAAU,CAACA,SAAO,KAAK,MAAM;AAElH,SAAO,QAAQ,KAAK,OAAO,iBAAiB,QAAQ;;;;;;;ACxZrD;AACE;AAOA;AAIA;;;;;AC9EF,eAAsB,uBACpB,SACA,SACgC;CAEhC,MAAM,kBAAkB,IAAI,iBAAiB;CAC7C,MAAMC,YAAU,iBAAiB,gBAAgB,OAAO,EAAE,IAAM;AAEhE,KAAI;EAEF,MAAM,WAAW,MAAM,MAAM,SAAS,EACpC,SAAS,EAIP,QAAQ,qCACT,EACF,CAAC;AACF,eAAaA,UAAQ;AAErB,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,uCAAuC;AAInD,MADoB,SAAS,QAAQ,IAAI,eAAe,EACvC,SAAS,mBAAmB,CAE3C,QAAO,mBADe,MAAM,SAAS,MAAM,CACZ;AAIjC,SAAO,mBAAmB,SADb,MAAM,SAAS,MAAM,CACM;UACjC,OAAO;AACd,eAAaA,UAAQ;AACrB,QAAM,IAAI,uCAAuC;;;AAKrD,SAAS,mBAAmB,MAAsC;AAEhE,KAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAC1D,OAAM,IAAI,2CAA2C;AAGvD,KAAI,WAAW,KACb,OAAM,IAAI,0CAA0C,oBAAoB;AAG1E,KAAI,uBAAuB,KACzB,OAAM,IAAI,0CAA0C,oBAAoB;AAG1E,OAAM,IAAI,2CAA2C;;AAGvD,eAAe,mBAAmB,SAA2B,MAA8C;AAEzG,KAAI,KAAK,WAAW,KAAK,EAAE;EACzB,MAAM,EAAE,IAAI,wBAAwB,MAAM,yCAAyC,SAAS,KAAK;AACjG,SAAO;GACL,YAAY,EACV,IACD;GACD,8BAA8B,EAC5B,qBACD;GACF;;AAIH,QAAO,mBADM,KAAK,MAAM,KAAK,CACE;;;;;AC9CjC,IAAY,kEAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;;;AAGF,MAAa,2BAA2B,QAAgB;AACtD,KACE,IAAI,WAAW,kBAAkB,yBAAyB,IAC1D,IAAI,WAAW,kBAAkB,wBAAwB,CAEzD,QAAO;AAGT,KAAI,IAAI,SAAS,wBAAwB,IAAI,IAAI,SAAS,oBAAoB,CAC5E,QAAO;AAGT,QAAO;;AAGT,MAAa,+BAA+B,QAAgB;AAC1D,KACE,IAAI,WAAW,kBAAkB,UAAU,IAC3C,IAAI,WAAW,kBAAkB,UAAU,IAC3C,IAAI,WAAW,kBAAkB,eAAe,IAChD,IAAI,WAAW,kBAAkB,eAAe,CAEhD,QAAO;AAGT,KAAI,IAAI,SAAS,eAAe,IAAI,IAAI,SAAS,WAAW,CAC1D,QAAO;AAGT,QAAO;;AAGT,MAAa,uBAAuB,QAAgB;AAClD,KAAI,IAAI,WAAW,kBAAkB,QAAQ,CAC3C,QAAO;AAGT,KAAI,IAAI,SAAS,OAAO,IAAI,IAAI,SAAS,OAAO,IAAI,IAAI,SAAS,UAAU,IAAI,IAAI,SAAS,OAAO,CACjG,QAAO;AAGT,QAAO;;AAGT,eAAsB,uBAAuB,SAA2B,YAA8C;AACpH,KAAI,OAAO,eAAe,UAAU;EAElC,MAAM,2CADwB,SAAS,WAAW,CACV,MAAM,UAAiC;EAO/E,MAAM,mBAAmB,MAAM,QAAQ,MAAM,QAAQ,UAAU,gBAAgB,qBAAqB;AACpG,UAAQ,OAAO,MAAM,qCAAqC,iBAAiB,KAAK;AAChF,SAAO;;AAET,QAAO,oBAAoB,WAAW;;AAGxC,eAAsB,qCAAqC,SAA2B,eAAuB;CAC3G,MAAM,EAAE,4BAA4B,MAAM,uBAAuB;EAC/D;EACA,OAAO,EAAE,KAAK,eAAe;EAC9B,CAAC;CACF,MAAM,gBAAgB,MAAM,gCAAgC;EAAE,OAAO,QAAQ;EAAO;EAAyB,CAAC;CAO9G,MAAM,CAAC,EAAE,gBANmB,MAAM,qCAAqC;EACrE,OAAO,QAAQ;EACf;EACA,aAAa;EACd,CAAC;CAIF,MAAM,UAAU,wBAAwB,WAAW;AAEnD,QAAO;EACL,IAAI,WAAW;EACf;EACD;;AAGH,eAAsB,yCAAyC,SAA2B,eAAuB;AAO/G,QAAO;EACL,IAAI;EACJ,qBAN0B,uBAFX,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,qCAAqC,cAAc,CAEpD;EAO3D;;AAIH,eAAsB,mBAAmB,SAA2B,eAAkD;AACpH,KAAI,wBAAwB,cAAc,EAAE;EAC1C,MAAM,WAAW,MAAM,qCAAqC,SAAS,cAAc;AAEnF,SAAO;GACL,YAAY,EAAE,IAAI,SAAS,IAAI;GAC/B,0BAA0B,EACxB,SAAS,SAAS,SACnB;GACF;;AAGH,KAAI,4BAA4B,cAAc,EAAE;EAC9C,MAAM,EAAE,qBAAqB,OAAO,MAAM,yCAAyC,SAAS,cAAc;AAE1G,SAAO;GACL,YAAY,EAAE,IAAI;GAClB,8BAA8B,EAAE,qBAAqB;GACtD;;AAGH,KAAI,oBAAoB,cAAc,EAAE;EACtC,MAAM,sBAAsB,MAAM,uBAAuB,SAAS,cAAc;AAEhF,SAAO;GACL,YAAY,EAAE,IAAI,oBAAoB,IAAI;GAC1C,SAAS;IACP,UAAU,oBAAoB;IAC9B,OAAO,oBAAoB;IAC5B;GACF;;AAKH,KAAI,cAAc,WAAW,WAAW,CACtC,QAAO,MAAM,uBAAuB,SAAS,cAAc;AAG7D,OAAM,IAAI,2CAA2C;;;;;AC/JvD,MAAa,sBAAsB,OAAO,YAAuC;CAW/E,MAAM,oBAVsB,MAAM,qCAAqC;EACrE,OAAO,QAAQ,QAAQ;EACvB,yBAAyB,QAAQ;EACjC,qCAAqC,CAAC,QAAQ,gBAAgB;EAC9D,aAAa,QAAQ;EACrB,UAAU,QAAQ,gBAAgB,QAAQ,eAAe,WAAW;EAEpE,cAAc;EACf,CAAC,EAE2C,GAAG;AAChD,QAAO,wBAAwB,iBAAiB;;;;;ACpBlD,MAAa,yBAAyB,OAAO,YAA2C;CACtF,MAAM,kBAAkB,OAAO,KAAK,QAAQ,wBAAwB,gCAAgC,CAAC;CAErG,MAAM,gBAAgB,MAAM,QAAQ,QAAQ,MAAM,QAAQ,gBAAgB,aAAa;EACrF,yBAAyB,QAAQ;EACjC,aAAa,QAAQ,cAAc;EACnC,MAAM,QAAQ;EACd,UAAU,QAAQ,cAAc;EAChC,cACE,kBAAkB,QAAQ,+BACtB,QAAQ,6BAA6B,eACrC;EACP,CAAC;AAWF,QATmB,MAAM,oBAAoB;EAC3C,yBAAyB,QAAQ;EACjC,eAAe,QAAQ;EACvB,SAAS,QAAQ;EACjB;EACA;EACA,8BAA8B,QAAQ;EACvC,CAAC;;;;;ACvBJ,MAAa,mDAAmD,OAC9D,YACG;CACH,MAAM,EAAE,sCAAsC,MAAM,WAAW;EAC7D,SAAS,QAAQ;EACjB,iBAAiB,QAAQ;EACzB,qBAAqB,EAAE;EACvB,8BAA8B,QAAQ;EACvC,CAAC;AAEF,KAAI,EAAE,iBAAiB,QAAQ,8BAC7B,OAAM,IAAI,MAAM,sEAAsE;CAGxF,MAAM,EAAE,sBACN,MAAM,QAAQ,QAAQ,MAAM,QAAQ,gBAAgB,2CAA2C;EAC7F,aAAa,QAAQ,6BAA6B;EAClD,yBAAyB,QAAQ;EACjC;EACD,CAAC;AAEJ,QAAO,MAAM,uBAAuB;EAAE,GAAG;EAAS;EAAmB,CAAC;;;;;ACxBxE,MAAa,4BAA4B,OAAO,YAA8C;CAG5F,MAAM,kBAAkB,QAAQ,yBAAyB,kCACrD,OAAO,KAAK,QAAQ,wBAAwB,gCAAgC,CAAC,KAC7E;AAEJ,KAAI,CAAC,gBACH,OAAM,IAAI,MAAM,2CAA2C;CAG7D,MAAM,gBAAgB,MAAM,gCAAgC;EAC1D,OAAO,QAAQ,QAAQ;EACvB,yBAAyB,QAAQ;EAClC,CAAC;AAEF,QAAO,MAAM,oBAAoB;EAC/B,SAAS,QAAQ;EACjB;EACA,yBAAyB,QAAQ;EACjC;EACD,CAAC;;;;;ACpBJ,MAAa,+CAA+C,OAC1D,YACG;CAGH,MAAM,kBAAkB,QAAQ,yBAAyB,kCACrD,OAAO,KAAK,QAAQ,wBAAwB,gCAAgC,CAAC,KAC7E;AAEJ,KAAI,CAAC,gBACH,OAAM,IAAI,MAAM,2CAA2C;CAG7D,MAAM,gBAAgB,MAAM,gCAAgC;EAC1D,OAAO,QAAQ,QAAQ;EACvB,yBAAyB,QAAQ;EAClC,CAAC;AAEF,QAAO,MAAM,oBAAoB;EAC/B,SAAS,QAAQ;EACjB;EACA,yBAAyB,QAAQ;EACjC;EACD,CAAC;;;;;ACfJ,MAAa,qBAAqB,OAAO,YAAuC;AAC9E,KAAI,qBAAqB,QACvB,QAAO,MAAM,6CAA6C,QAAQ;AAGpE,KAAI,2BAA2B,QAC7B,QAAO,MAAM,iDAAiD,QAAQ;AAGxE,KAAI,uBAAuB,QACzB,QAAO,MAAM,uBAAuB,QAAQ;AAG9C,QAAO,MAAM,0BAA0B,QAAQ;;;;;ACjBjD,MAAa,8BAA8B,OAAO,YAAgD;CAChG,MAAM,sBAAsB,0BAA0B,QAAQ,OAAO;CAIrE,MAAM,kBAAkB,QAAQ,yBAAyB,kCACrD,OAAO,KAAK,QAAQ,wBAAwB,gCAAgC,CAAC,KAC7E;CACJ,MAAM,gBAAgB,kBAClB,QAAQ,yBAAyB,gCAAgC,mBACjE;CAEJ,MAAM,iBAAiB,QAAQ,yBAAyB,SAAS;CAEjE,MAAM,oBAAoB,iCACxB,iBAAiB,iBACb,8BACE,mCAAmC,eAAe;EAChD,SAAS,gBAAgB;EACzB,IAAI,gBAAgB;EACrB,CAAC,CACH,GACD,EAAE,CACP;AAED,OAAM,gBAAgB,QAAQ,SAAS,QAAQ,OAAO;AACtD,OAAM,oBAAoB,QAAQ,SAAS;EAGzC,UAAU,QAAQ,yBAAyB,SAAS,iBAAiB;EACrE,MAAM,kBAAkB,OAAO;EAC/B,MAAM,kBAAkB,OAAO;EAC/B,MAAM,kBAAkB,OAAO;EAC/B,iBAAiB;EACjB,eAAe,CAAC,oBAAoB;EACrC,CAAC;;;;;ACQJ,IAAa,mBAAb,MAA8B;CAI5B,AAAO,YAAY,SAAkC;AACnD,OAAK,QAAQ,WAAW,QAAQ;AAChC,OAAK,kBAAkB,QAAQ;;CAGjC,AAAQ,2BAA2B;AACjC,MAAI,CAAC,KAAK,MAAM,cAAe,OAAM,IAAI,qCAAqC;;CAGhF,IAAW,WAAW;AACpB,SAAO,KAAK,MAAM,OAAO,cAAc;;CAGzC,MAAa,QAAQ;AACnB,OAAK,OAAO,MAAM,mBAAmB;AAErC,QAAM,KAAK,MAAM,OAAO,QAAQ;AAChC,QAAM,KAAK,MAAM,UAAU;EAE3B,MAAM,KAAK,IAAI,kBAAkB,YAAY;AAG7C,MAAI,MAAM,GAAG,OAAO,GAAG,UAAU,CAAE,OAAM,GAAG,OAAO,GAAG,UAAU;AAChE,MAAI,MAAM,GAAG,OAAO,GAAG,SAAS,CAAE,OAAM,GAAG,OAAO,GAAG,SAAS;EAE9D,MAAM,kBAAkB,GAAG,GAAG,SAAS,UAAU,KAAK;AAGtD,MAD8B,MAAM,GAAG,OAAO,gBAAgB,EACnC;AACzB,WAAQ,IAAI,oCAAoC;AAChD,SAAM,GAAG,OAAO,gBAAgB;QAEhC,SAAQ,IAAI,kCAAkC;AAMhD,QAAM,gBAAgB,WAAW,gBAAgB,qBAAqB,CAAC;;;;;;;CAQzE,MAAa,aAA8C;AACzD,MAAI;AACF,SAAM,KAAK,MAAM,YAAY;AAC7B,UAAO,EAAE,SAAS,MAAM;WACjB,GAAG;AACV,OAAI,aAAa,sBACf,QAAO;IAAE,SAAS;IAAO,SAAS;IAAe;AAEnD,UAAO;IAAE,SAAS;IAAO,SAAU,EAAY;IAAS;;;;;;;;CAS5D,MAAa,WAAW;AACtB,QAAM,KAAK,MAAM,UAAU;;;;;;;;;CAU7B,IAAW,SAAS;AAClB,SAAO,KAAK,MAAM,OAAO;;;;;;;CAQ3B,IAAW,QAAQ;AACjB,OAAK,0BAA0B;AAE/B,SAAO;GACL;GACA;GACA;GAEA;GACA;GAIA;GACA;GACA;GACD;;;;;;;;;CAUH,IAAW,gBAAgB;AACzB,OAAK,0BAA0B;AAE/B,SAAO;GACL;GACA;GACA;GACA;GACA;GACD;;;;;;;;;;;CAYH,OAAc,eAAe,EAC3B,UACA,iBACqE;AACrE,SAAO,oBAAC;GAAoC;GAAgB;IAAgC;;;;;;;CAQ9F,OAAc,YAAY,EAAE,UAAU,aAAyD;EAC7F,MAAM,EAAE,YAAY,WAAW,WAAW;AAE1C,SACE,oBAAC;GAAc,OAAO,QAAQ;GAAkB;GAC7C;IACa;;CAIpB,MAAa,kBACX,eACuE;AACvE,OAAK,0BAA0B;AAE/B,MAAI;AAEF,UAAO;IAAE,SAAS;IAAM,GADC,MAAM,mBAAmB,MAAM,cAAc;IACzB;WACtC,OAAO;AACd,UAAO;IACL,SAAS;IACT,SAAS,iBAAiB,QAAQ,MAAM,UAAW;IACpD;;;;;;;;CASL,IAAW,cAAc;AACvB,SAAO;GACL,QAAQ,KAAK;GACb,OAAO,KAAK;GACb;;CAGH,MAAc,kBACZ,KACiC;AACjC,MAAI;GACF,MAAM,qBAAqB,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,iBAAiB,KAAK,OAAO,GAAG,CAAC;AAC1G,SAAM,QAAQ,IAAI,kBAAkB;AACpC,UAAO,EAAE,SAAS,MAAM;WACjB,OAAO;AACd,UAAO;IAAE,SAAS;IAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAW;IAAkB;;;CAIlG,MAAc,gBAAgB,QAA2D;AACvF,MAAI;AACF,SAAM,gBAAgB,MAAM,OAAO;AACnC,UAAO,EAAE,SAAS,MAAM;WACjB,OAAO;AACd,UAAO;IAAE,SAAS;IAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAW;IAAkB;;;CAIlG,MAAa,yBACX,YACmE;AACnE,MAAI;GACF,MAAM,mBAAmB,MAAM,uBAAuB,MAAM,WAAW;AACvE,UAAO;IAAE,SAAS;IAAM,GAAI,MAAM,2BAA2B,KAAK,OAAO,iBAAiB;IAAG;WACtF,OAAO;AACd,UAAO;IAAE,SAAS;IAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAU,GAAG;IAAS;;;CAI3F,IAAW,YAAY;AACrB,SAAO;GACL,yBAAyB,YACvB,uBAAuB;IAAE,GAAG;IAAS,SAAS;IAAM,CAAC;GAEvD,qBAAqB,YACnB,mBAAmB;IAAE,GAAG;IAAS,SAAS;IAAM,CAAC;GAEnD,8BAA8B,YAC5B,4BAA4B;IAAE,GAAG;IAAS,SAAS;IAAM,CAAC;GAC7D"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["saltStoreBaseOptions: KeychainOptions","walletKeyStoreBaseOptions: KeychainOptions","walletKey","context","WalletJsonStoreProvider: React.FC<Props>","attributePaths: string[][]","recordMetadata: OpenId4VcCredentialMetadata | null","attributeGroups: Array<[string, unknown]>","value","issuerDisplay: Partial<CredentialIssuerDisplay>","credentialDisplay: Partial<CredentialDisplay>","credentialDisplay: Partial<CredentialDisplay>","credentialMetadata: CredentialMetadata","issuerDisplay: Partial<CredentialIssuerDisplay>","credentialDisplay: Partial<CredentialDisplay>","b","v","Subscription","timeout","Subscriber","ConsumerObserver","SafeSubscriber","Observable","observable","Symbol_observable","OperatorSubscriber","err","Action","timeout","AsyncAction","Scheduler","AsyncScheduler","Symbol_observable","Symbol_iterator","Symbol_observable","config","config","first","addRecord","updateRecord","removeRecord","MdocRecordProvider: React.FC<PropsWithChildren<Props>>","addRecord","updateRecord","removeRecord","SdJwtVcRecordProvider: React.FC<PropsWithChildren<Props>>","addRecord","updateRecord","removeRecord","W3cCredentialRecordProvider: React.FC<PropsWithChildren<Props>>","didMethod: 'key' | 'jwk' | undefined","verificationMethodId: string","credentialSets: NonNullable<DcqlQueryResult['credential_sets']>","entries: FormattedSubmissionEntry[]","disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']","parsedPath: Array<{\n scope: string\n operation: string\n expression: { type: string; value: string; [key: string]: unknown }\n }>","simplified: Array<string | null>","disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']","trustedEntities: TrustedEntity[]","organizationName: string | undefined","logoUri: string | undefined","trustedEntities: TrustedEntity[]","organizationName: string | undefined","logoUri: string | undefined","uri: string | undefined","entityId: string | undefined","formattedSubmission: FormattedSubmission","resolvedAuthorizationRequest: OpenId4VciResolvedAuthorizationRequest | undefined","OpenId4VciAuthorizationFlow","flowType: 'issue' | 'verify' | 'connect'","connectionId: string | undefined","observable: Observable<CredentialStateChangedEvent | ProofStateChangedEvent> | undefined","observable","connectionRecord: ConnectionRecord | undefined","outOfBandRecord: OutOfBandRecord","ConnectionProvider: React.FC<PropsWithChildren<Props>>","useCredentials","useCredentialById","CredentialExchangeProvider: React.FC<PropsWithChildren<Props>>","ProofExchangeProvider: React.FC<PropsWithChildren<Props>>","connection","children","getAssetByID","Platform","ExponentConstants","ExpoUpdates","CodedError","Constants","Platform","name","Platform","AssetUris.getFilename","AssetUris.getFileExtension","moduleId","resolveAssetSource","ImageAssets.isImageType","ImageAssets.getImageInfoAsync","credentials: DcqlCredentialsForRequest","Image","width: number","height: number","asset: ExpoAsset.Asset","logger","name","useCredentialById","formatInput: { indy?: AnonCredsSelectedCredentials; anoncreds?: AnonCredsSelectedCredentials } | undefined","selectedAttributes: Record<string, AnonCredsRequestedAttributeMatch>","selectedPredicates: Record<string, AnonCredsRequestedPredicateMatch>","match","decode","queryString","filter","timeout"],"sources":["../src/error/biometrics.ts","../src/error.ts","../src/logger.ts","../src/secure/error/KeychainError.ts","../src/secure/error/WalletUnlockError.ts","../src/secure/kdf.ts","../src/secure/keychain.ts","../src/secure/secure-wallet-key/walletKeySaltStore.ts","../src/secure/secure-wallet-key/walletKeyStore.ts","../src/secure/secure-wallet-key/secureWalletKey.ts","../src/secure/secure-wallet-key/SecureUnlockProvider.tsx","../src/agent.ts","../src/providers/WalletJsonStoreProvider.tsx","../src/utils/date.ts","../src/display/strings.ts","../src/display/common.ts","../src/storage/walletJsonStore.ts","../src/storage/activities.ts","../src/hooks/useActivities.tsx","../src/hooks/useActivityById.tsx","../src/metadata/credentials.ts","../src/utils/jwkThumbprint.ts","../src/display/mdl.ts","../src/display/docTypeOfVct.ts","../src/utils/image.ts","../src/display/mapAttributes.ts","../src/utils/url.ts","../src/display/openid4vc.ts","../src/display/mdoc.ts","../src/display/sdJwt.ts","../src/display/w3c.ts","../src/display/credential.ts","../../../node_modules/tslib/tslib.es6.mjs","../../../node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../node_modules/rxjs/dist/esm5/internal/config.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../node_modules/rxjs/dist/esm5/internal/NotificationFactories.js","../../../node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../node_modules/rxjs/dist/esm5/internal/Observable.js","../../../node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../node_modules/rxjs/dist/esm5/internal/observable/empty.js","../../../node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../node_modules/rxjs/dist/esm5/internal/util/EmptyError.js","../../../node_modules/rxjs/dist/esm5/internal/firstValueFrom.js","../../../node_modules/rxjs/dist/esm5/internal/util/isDate.js","../../../node_modules/rxjs/dist/esm5/internal/operators/timeout.js","../../../node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../node_modules/rxjs/dist/esm5/internal/operators/defaultIfEmpty.js","../../../node_modules/rxjs/dist/esm5/internal/operators/take.js","../../../node_modules/rxjs/dist/esm5/internal/operators/throwIfEmpty.js","../../../node_modules/rxjs/dist/esm5/internal/operators/first.js","../src/utils/records.ts","../src/providers/MdocProvider.tsx","../src/providers/SdJwtVcProvider.tsx","../src/providers/W3cCredentialsProvider.tsx","../src/hooks/useCredentials.tsx","../src/hooks/useCredentialByCategory.tsx","../src/hooks/useCredentialById.tsx","../src/openid4vc/credentialBindingResolver.ts","../src/openid4vc/func/getCredentialDisplay.ts","../src/format/dcqlRequest.ts","../src/format/presentationExchangeRequest.ts","../src/trust/handlers/did.ts","../src/trust/handlers/x509.ts","../src/trust/handlers/eudiRpAuthentication.ts","../src/trust/handlers/openIdFederation.ts","../src/trust/trustMechanism.ts","../src/openid4vc/getCredentialsForProofRequest.ts","../src/utils/encoding.ts","../src/invitation/resolver.ts","../src/providers/ConnectionProvider.tsx","../src/providers/CredentialExchangeProvider.tsx","../src/providers/ProofExchangeProvider.tsx","../src/hooks/usePreFetchInboxDisplayMetadata.tsx","../src/providers/ExchangeRecordDisplayMetadataProvider.tsx","../src/providers/AgentProvider.tsx","../src/hooks/useDidCommConnectionActions.tsx","../../../node_modules/@react-native/assets-registry/registry.js","../../../node_modules/expo-modules-core/index.js","../../../node_modules/expo-asset/build/AssetSourceResolver.js","../../../node_modules/expo-constants/build/Constants.types.js","../../../node_modules/expo-constants/build/ExponentConstants.js","../../../node_modules/expo-constants/build/Constants.js","../../../node_modules/expo-asset/build/AssetUris.js","../../../node_modules/expo-asset/build/PlatformUtils.js","../../../node_modules/expo-asset/build/AssetSources.js","../../../node_modules/expo-asset/build/ExpoAsset.js","../../../node_modules/expo-asset/build/ImageAssets.js","../../../node_modules/expo-asset/build/LocalAssets.js","../../../node_modules/expo-asset/build/resolveAssetSource.js","../../../node_modules/expo-asset/build/Asset.js","../src/storage/credentials.ts","../src/openid4vc/batch.ts","../src/openid4vc/transaction.ts","../src/invitation/shareProof.ts","../src/openid4vc/dcApi.ts","../src/didcomm/mediation.ts","../src/hooks/useDidCommMessagePickup.tsx","../src/hooks/useDidCommMediatorSetup.tsx","../src/hooks/useParadym.tsx","../src/hooks/useDidCommCredentialActions.tsx","../src/hooks/useDidCommPresentationActions.tsx","../src/hooks/useDidcommAgent.tsx","../src/hooks/useOpenId4VcAgent.tsx","../src/hooks/useCredentialRecords.tsx","../src/hooks/useCredentialRecordById.tsx","../../../node_modules/strict-uri-encode/index.js","../../../node_modules/decode-uri-component/index.js","../../../node_modules/split-on-first/index.js","../../../node_modules/filter-obj/index.js","../../../node_modules/query-string/index.js","../src/format/submission.ts","../src/invitation/fetch.ts","../src/invitation/parser.ts","../src/openid4vc/func/retrieveCredentials.ts","../src/openid4vc/func/acquireCredentialsAuth.ts","../src/openid4vc/func/acquireCredentialsAuthPresentationDuringIssuance.ts","../src/openid4vc/func/acquireCredentialsPreAuth.ts","../src/openid4vc/func/acquireCredentialsPreAuthWithTransactionCode.ts","../src/openid4vc/func/acquireCredentials.ts","../src/openid4vc/func/completeCredentialRetrieval.ts","../src/ParadymWalletSdk.tsx"],"sourcesContent":["const androidErrorCodes = (codes: number[]) => codes.map((code) => `code: ${code},`)\n\nexport const cancelMessages = [\n // From @animo-id/expo-secure-environment\n 'authentication canceled',\n\n // From react-native-keychain\n // https://github.com/oblador/react-native-keychain/issues/609\n // iOS\n 'user canceled the operation',\n\n // Android\n // These error codes probably means the user cancelled\n // https://developer.android.com/reference/androidx/biometric/BiometricPrompt#constants_1\n ...androidErrorCodes([10, 13, -1, 16, 3, 2, 8]),\n]\n\nexport const notEnabledMessages = [\n // From @animo-id/expo-secure-environment\n 'biometry is not available for this app',\n\n // From react-native-keychain\n // iOS\n 'the user name or passphrase you entered is not correct.',\n\n // Android\n // These error codes probably means biometry is not enabled\n // https://developer.android.com/reference/androidx/biometric/BiometricPrompt#constants_1\n ...androidErrorCodes([12, 1, 7, 9, 11, 14, 4, 15]),\n // Happens when no fingerprints are configured\n 'at least one biometric must be enrolled to create keys requiring user authentication for every use',\n]\n","import { cancelMessages, notEnabledMessages } from './error/biometrics'\n\nexport class ParadymWalletSdkError extends Error {\n constructor(message: string = new.target.name) {\n super(message)\n }\n}\n\nexport class ParadymWalletMustBeDidCommAgentError extends ParadymWalletSdkError {}\nexport class ParadymWalletMustBeOpenId4VcAgentError extends ParadymWalletSdkError {}\nexport class ParadymWalletMustBeInitializedError extends ParadymWalletSdkError {}\n\nexport class ParadymWalletUnsupportedCredentialRecordTypeError extends ParadymWalletSdkError {}\n\nexport class ParadymWalletNoMediatorDidProvidedError extends ParadymWalletSdkError {}\n\nexport class ParadymWalletInvitationError extends ParadymWalletSdkError {}\nexport class ParadymWalletInvitationReceiveError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationMultipleRequestsError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationNotRecognizedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationParseError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationRetrievalError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationDidcommHandlerMustBeDefinedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationAlreadyUsedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationDidcommUnsupportedProtocolError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationOpenIdCredentialHandlerMustBeDefinedError extends ParadymWalletInvitationError {}\nexport class ParadymWalletInvitationOpenIdAuthorizationRequestHandlerMustBeDefinedError extends ParadymWalletInvitationError {}\n\nexport class ParadymWalletNoRequestToResolveError extends ParadymWalletInvitationError {}\n\nexport class ParadymWalletInvalidTrustMechnismError extends ParadymWalletSdkError {}\n\n// biome-ignore lint/complexity/noStaticOnlyClass:\nexport class ParadymWalletBiometricAuthenticationError extends ParadymWalletSdkError {\n public static tryParseFromError(error: unknown): ParadymWalletBiometricAuthenticationError | null {\n if (ParadymWalletBiometricAuthenticationCancelledError.isBiometricAuthenticationCancelledError(error)) {\n return new ParadymWalletBiometricAuthenticationError()\n }\n\n if (ParadymWalletBiometricAuthenticationNotEnabledError.isBiometricAuthenticationNotEnabledError(error)) {\n return new ParadymWalletBiometricAuthenticationError()\n }\n\n return null\n }\n}\n\n// biome-ignore lint/complexity/noStaticOnlyClass:\nexport class ParadymWalletBiometricAuthenticationCancelledError extends ParadymWalletBiometricAuthenticationError {\n public static isBiometricAuthenticationCancelledError(error: unknown) {\n return error instanceof Error && cancelMessages.some((m) => error.message.toLowerCase().includes(m))\n }\n}\n\n// biome-ignore lint/complexity/noStaticOnlyClass:\nexport class ParadymWalletBiometricAuthenticationNotEnabledError extends ParadymWalletBiometricAuthenticationError {\n public static isBiometricAuthenticationNotEnabledError(error: unknown) {\n return error instanceof Error && notEnabledMessages.some((m) => error.message.toLowerCase().includes(m))\n }\n}\n","import { ConsoleLogger, LogLevel } from '@credo-ts/core'\n\nexport { LogLevel }\n\ntype LogData = Record<string, unknown>\ntype LogMessage = { level: LogLevel; message: string; data?: LogData }\n\nexport class ParadymWalletSdkLogger extends ConsoleLogger {\n private loggedMessages: LogMessage[] = []\n private loggedMessagesLimit = 0\n\n public trackLoggedMessages(messageLimit = 1000) {\n this.loggedMessagesLimit = messageLimit\n }\n\n public resetLoggedMessages() {\n this.loggedMessages = []\n }\n\n public stopLoggedMessagesTracking() {\n this.loggedMessagesLimit = 0\n this.loggedMessages = []\n }\n\n public get loggedMessageContents() {\n return JSON.stringify(this.loggedMessages)\n }\n\n private addToLoggedMessages(level: LogLevel, message: string, data?: LogData) {\n if (this.loggedMessagesLimit === 0) return\n if (this.loggedMessages.length >= this.loggedMessagesLimit) this.loggedMessages.shift()\n this.loggedMessages.push({\n level,\n message,\n data,\n })\n }\n\n public fatal(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.fatal, message, data)\n super.fatal(message, data)\n }\n public error(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.error, message, data)\n super.error(message, data)\n }\n public warn(message: string, data?: LogData): void {\n if (message.includes('module is experimental')) return\n this.addToLoggedMessages(LogLevel.warn, message, data)\n super.warn(message, data)\n }\n public info(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.info, message, data)\n super.info(message, data)\n }\n public debug(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.debug, message, data)\n super.debug(message, data)\n }\n public trace(message: string, data?: LogData): void {\n this.addToLoggedMessages(LogLevel.trace, message, data)\n super.trace(message, data)\n }\n}\n\nexport const logger = (logLevel: LogLevel = LogLevel.warn) => new ParadymWalletSdkLogger(logLevel)\n","export class KeychainError extends Error {\n public readonly reason: 'userCancelled' | 'unknown'\n\n public constructor(message: string, options: ErrorOptions & { reason?: 'userCancelled' | 'unknown' } = {}) {\n super(message, options)\n this.reason = options.reason ?? 'unknown'\n }\n}\n","export class WalletUnlockError extends Error {}\n","import argon2 from 'react-native-argon2'\n\n/**\n * Derive a hash from pin and salt. (which can be used to seed a key)\n *\n * Configuration based on recommended parameters defined in RFC 9106\n * @see https://www.rfc-editor.org/rfc/rfc9106.html#name-parameter-choice\n *\n * returns a hex-encoded derived hash\n *\n */\nconst derive = async (pin: string, salt: string): Promise<string> => {\n // Takes about 1.5 second on iPhone 14 Pro\n // TODO: Need to test on Android/different devices as well\n const { rawHash } = await argon2(pin, salt, {\n hashLength: 32,\n mode: 'argon2id',\n parallelism: 4,\n iterations: 8,\n memory: 64 * 1024,\n })\n\n return rawHash\n}\n\n/**\n * Generate 32 byte key crypto getRandomValues.\n *\n * @see https://github.com/LinusU/react-native-get-random-values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues\n */\nconst generateSalt = () => crypto.getRandomValues(new Uint8Array(32)).join('')\n\n/**\n * Derive key from pin and salt.\n *\n * Configuration based on recommended parameters defined in RFC 9106\n * @see https://www.rfc-editor.org/rfc/rfc9106.html#name-parameter-choice\n */\nexport const kdf = { derive, generateSalt }\n","import { ParadymWalletBiometricAuthenticationError } from '@paradym/wallet-sdk/error'\nimport * as Keychain from 'react-native-keychain'\nimport { KeychainError } from './error/KeychainError'\n\nexport type KeychainOptions = Omit<Keychain.Options, 'service'>\n\n/**\n * Store the value with id in the keychain.\n *\n * @throws {KeychainError} if an unexpected error occurs\n */\nexport async function storeKeychainItem(id: string, value: string, options: KeychainOptions): Promise<void> {\n const result = await Keychain.setGenericPassword(id, value, {\n ...options,\n service: id,\n }).catch((error) => {\n throw (\n ParadymWalletBiometricAuthenticationError.tryParseFromError(error) ??\n new KeychainError(`Error storing value for id '${id}' in keychain`, {\n cause: error,\n })\n )\n })\n\n if (!result) {\n throw new KeychainError(`Error storing value for id '${id}' in keychain`)\n }\n}\n\n/**\n * Retrieve a value by id from the keychain\n *\n * @returns {string | null} the value or null if it doesn't exist\n * @throws {KeychainError} if an unexpected error occurs\n * @throws {BiometricAuthenticationError} if biometric authentication failed\n */\nexport async function getKeychainItemById(id: string, options: KeychainOptions): Promise<string | null> {\n const result = await Keychain.getGenericPassword({\n ...options,\n service: id,\n }).catch((error) => {\n throw (\n ParadymWalletBiometricAuthenticationError.tryParseFromError(error) ??\n new KeychainError(`Error retrieving value with id '${id}' from keychain`, {\n cause: error,\n reason: 'unknown',\n })\n )\n })\n\n if (!result) {\n return null\n }\n\n return result.password\n}\n\n/**\n * Remove a value by id from the keychain\n *\n * @returns {boolean} Whether the keychain item was removed\n * @throws {KeychainError} if an unexpected error occurs\n */\nexport async function removeKeychainItemById(id: string, options: KeychainOptions): Promise<boolean> {\n const result = await Keychain.resetGenericPassword({\n ...options,\n service: id,\n }).catch((error) => {\n throw new KeychainError(`Error removing value with id '${id}' from keychain`, {\n cause: error,\n })\n })\n\n return result\n}\n","import * as Keychain from 'react-native-keychain'\nimport { kdf } from '../kdf'\nimport { type KeychainOptions, getKeychainItemById, removeKeychainItemById, storeKeychainItem } from '../keychain'\n\nconst saltStoreBaseOptions: KeychainOptions = {\n /* Salt can be accessed on this device */\n accessible: Keychain.ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n}\n\nconst SALT_ID = (version: number) => `PARADYM_WALLET_SALT_${version}`\n\n/**\n * Store the salt in the keychain.\n *\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function storeSalt(salt: string, version: number): Promise<void> {\n const saltId = SALT_ID(version)\n\n await storeKeychainItem(saltId, salt, saltStoreBaseOptions)\n}\n\n/**\n * Retrieve the salt from the keychain.\n *\n * @returns {string | null} the salt or null if it doesn't exist\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function getSalt(version: number): Promise<string | null> {\n const saltId = SALT_ID(version)\n\n // TODO: should probably throw error if not found\n const salt = await getKeychainItemById(saltId, saltStoreBaseOptions)\n\n return salt\n}\n\n/*\n * Generate and store a salt. Optionally returning the existing one if it exists\n */\nasync function createAndStoreSalt(returnExisting: boolean, version: number) {\n if (returnExisting) {\n const existingSalt = await getSalt(version)\n if (existingSalt) return existingSalt\n }\n\n const salt = kdf.generateSalt()\n await storeSalt(salt, version)\n\n return salt\n}\n\nasync function removeSalt(version: number) {\n const saltId = SALT_ID(version)\n return await removeKeychainItemById(saltId, saltStoreBaseOptions)\n}\n\nexport const walletKeySaltStore = {\n getSalt,\n storeSalt,\n createAndStoreSalt,\n removeSalt,\n}\n","import { Platform } from 'react-native'\nimport * as Keychain from 'react-native-keychain'\nimport { type KeychainOptions, getKeychainItemById, removeKeychainItemById, storeKeychainItem } from '../keychain'\n\nconst walletKeyStoreBaseOptions: KeychainOptions = {\n /* Only allow the current set of enrolled biometrics to access the wallet key */\n accessControl: Keychain.ACCESS_CONTROL.BIOMETRY_CURRENT_SET,\n\n // TODO: might want to use WHEN_UNLOCKED_THIS_DEVICE_ONLY, to allow devices without a passcode (as we have our own passcode and extra biometrics check)\n // Not sure how it works if you have no passcode, but you do have biometrics (i think that is not possible?)\n /* Only allow access to the wallet key on the device is was created on, is unlocked, and has a passcode set */\n accessible: Keychain.ACCESSIBLE.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY,\n\n // TODO: internationalization\n authenticationPrompt: {\n title: 'Unlock wallet',\n description: 'Access to your wallet is locked behind a biometric verification.',\n },\n\n /* Android Only. Ensure wallet key is protected by hardware. Wil results in error if hardware is not available. Hardware is either StrongBox or TEE */\n securityLevel: Keychain.SECURITY_LEVEL.SECURE_HARDWARE,\n\n /* Android Only. Ensure wallet key is protected using RSA storage type, this is the only storage type supporting biometrics. */\n storage: Keychain.STORAGE_TYPE.RSA,\n\n /* Ensure wallet key is protected by biometrics. It is not possible to fallback to the device passcode if the biometric authentication failed. */\n authenticationType: Keychain.AUTHENTICATION_TYPE.BIOMETRICS,\n}\n\nconst WALLET_KEY_ID = (version: number) => `PARADYM_WALLET_KEY_${version}`\n\n/**\n * Returns whether biometry backed wallet key can be used. Can be called before trying to access\n * or store the wallet key in the keychain.\n */\nasync function canUseBiometryBackedWalletKey(): Promise<boolean> {\n if (Platform.OS === 'android') {\n /**\n * `setUserAuthenticationParameters` is only available on Android API 30+, and is needed to ensure\n * the key can only be accessed using biometry. React Native Keychain will fallback to allowing keys\n * to be accessed by the device passcode. For this reason we only allow biometry to be used on devices\n * running Android API 30 or higher.\n */\n if (Platform.Version < 30) {\n return false\n }\n\n /**\n * Android Only API. We only allow hardware secured key storage for unlocking with biometrics\n */\n const securityLevel = await Keychain.getSecurityLevel(walletKeyStoreBaseOptions)\n if (!securityLevel || securityLevel !== Keychain.SECURITY_LEVEL.SECURE_HARDWARE) {\n return false\n }\n }\n\n if (Platform.OS === 'ios') {\n /**\n * Checks whether the key can be authenticated using only biometrics (no passcode fallback)\n */\n const canUseAuthentication = await Keychain.canImplyAuthentication(walletKeyStoreBaseOptions)\n if (!canUseAuthentication) return false\n }\n\n const supportedBiometryType = await Keychain.getSupportedBiometryType(walletKeyStoreBaseOptions)\n\n /**\n * We only support biometrics secured storage of the wallet key\n */\n return supportedBiometryType !== null\n}\n\n/**\n * Store the wallet key in hardware backed, biometric protected storage.\n *\n * Will use Secure Enclave on iOS and StrongBox/TEE on Android. If biometrics is not enabled/available,\n * or when hardware backed storage.\n *\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function storeWalletKey(walletKey: string, version: number): Promise<void> {\n const walletKeyId = WALLET_KEY_ID(version)\n await storeKeychainItem(walletKeyId, walletKey, walletKeyStoreBaseOptions)\n}\n\n/**\n * Retrieve the wallet key from hardware backed, biometric protected storage.\n *\n * @returns {string | null} the wallet key or null if it doesn't exist\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function getWalletKeyUsingBiometrics(version: number): Promise<string | null> {\n const walletKeyId = WALLET_KEY_ID(version)\n return await getKeychainItemById(walletKeyId, walletKeyStoreBaseOptions)\n}\n\n/**\n * Delete the wallet key from hardware backed, biometric protected storage.\n *\n * @returns {boolean} whether the wallet key was removed (false if the wallet key wasn't stored)\n * @throws {KeychainError} if an unexpected error occurs\n */\nasync function removeWalletKey(version: number): Promise<boolean> {\n const walletKeyId = WALLET_KEY_ID(version)\n return await removeKeychainItemById(walletKeyId, walletKeyStoreBaseOptions)\n}\n\nexport const walletKeyStore = {\n removeWalletKey,\n getWalletKeyUsingBiometrics,\n storeWalletKey,\n canUseBiometryBackedWalletKey,\n}\n","import { TypedArrayEncoder } from '@credo-ts/core'\nimport { askar } from '@openwallet-foundation/askar-react-native'\nimport { MMKV, useMMKVNumber } from 'react-native-mmkv'\nimport { WalletUnlockError } from '../error/WalletUnlockError'\nimport { kdf } from '../kdf'\nimport { walletKeySaltStore } from './walletKeySaltStore'\nimport { walletKeyStore } from './walletKeyStore'\n\nconst mmkv = new MMKV()\n\nasync function getWalletKeyUsingPin(pin: string, version: number) {\n const salt = await walletKeySaltStore.getSalt(version)\n if (!salt) {\n throw new WalletUnlockError('Error unlocking wallet. No salt configured')\n }\n\n const walletKeySeed = await kdf.derive(pin, salt)\n\n // The wallet key needs to be a xchaca key, so we use the derived key based on pin and salt as\n // the seed for the actual key\n const walletKey = askar.storeGenerateRawKey({ seed: TypedArrayEncoder.fromString(walletKeySeed) })\n\n return walletKey\n}\n\nexport function useWalletKeyVersion() {\n return useMMKVNumber('walletKeyVersion', mmkv)\n}\n\nexport function getWalletKeyVersion() {\n return mmkv.getNumber('walletKeyVersion') ?? 1\n}\n\nexport function setWalletKeyVersion(version: number) {\n mmkv.set('walletKeyVersion', version)\n}\n\nexport const secureWalletKey = {\n getWalletKeyUsingPin,\n ...walletKeyStore,\n ...walletKeySaltStore,\n\n getWalletKeyVersion,\n setWalletKeyVersion,\n}\n","import { WalletInvalidKeyError } from '@credo-ts/core'\nimport { ParadymWalletSdk, type SetupParadymWalletSdkOptions } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { type PropsWithChildren, createContext, useContext, useEffect, useState } from 'react'\nimport { KeychainError } from '../error/KeychainError'\nimport { secureWalletKey } from './secureWalletKey'\n\ntype UnlockOptions = {\n /**\n *\n * When setting up the agent for the first time, the app might want to prompt the biometrics to make sure\n * the user has access\n *\n * This should be set on the unlock call during the onboarding of the user, but not during authentication afterwards\n *\n */\n enableBiometrics: boolean\n}\n\nexport type SecureUnlockState = 'initializing' | 'not-configured' | 'acquired-wallet-key' | 'locked' | 'unlocked'\n\nexport type UnlockMethod = 'pin' | 'biometrics'\n\nexport type SecureUnlockReturnInitializing = {\n state: 'initializing'\n}\n\nexport type SecureUnlockReturnNotConfigured = {\n state: 'not-configured'\n setPin: (pin: string) => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturnWalletKeyAcquired = {\n state: 'acquired-wallet-key'\n unlockMethod: UnlockMethod\n unlock: (options?: UnlockOptions) => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturnLocked = {\n state: 'locked'\n canTryUnlockingUsingBiometrics: boolean\n isUnlocking: boolean\n tryUnlockingUsingBiometrics: () => Promise<void>\n unlockUsingPin: (pin: string) => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturnUnlocked = {\n state: 'unlocked'\n paradym: ParadymWalletSdk\n unlockMethod: UnlockMethod\n lock: () => Promise<void>\n reset: () => Promise<void>\n reinitialize: () => void\n}\n\nexport type SecureUnlockReturn =\n | SecureUnlockReturnInitializing\n | SecureUnlockReturnNotConfigured\n | SecureUnlockReturnWalletKeyAcquired\n | SecureUnlockReturnLocked\n | SecureUnlockReturnUnlocked\n\nconst SecureUnlockContext = createContext<SecureUnlockReturn>({\n state: 'initializing',\n})\n\nexport function useSecureUnlock(): SecureUnlockReturn {\n const value = useContext(SecureUnlockContext)\n if (!value) {\n throw new Error('useSecureUnlock must be wrapped in a <SecureUnlockProvider />')\n }\n\n return value\n}\n\nexport function SecureUnlockProvider({\n children,\n configuration,\n}: PropsWithChildren<{ configuration: SetupParadymWalletSdkOptions }>) {\n const secureUnlockState = _useSecureUnlockState(configuration)\n\n return <SecureUnlockContext.Provider value={secureUnlockState}>{children}</SecureUnlockContext.Provider>\n}\n\nfunction _useSecureUnlockState(configuration: SetupParadymWalletSdkOptions): SecureUnlockReturn {\n const [state, setState] = useState<SecureUnlockState>('initializing')\n const [canTryUnlockingUsingBiometrics, setCanTryUnlockingUsingBiometrics] = useState<boolean>(true)\n const [canUseBiometrics, setCanUseBiometrics] = useState<boolean>()\n const [biometricsUnlockAttempts, setBiometricsUnlockAttempts] = useState(0)\n const [unlockMethod, setUnlockMethod] = useState<UnlockMethod>()\n const [isUnlocking, setIsUnlocking] = useState(false)\n const [paradym, setParadym] = useState<ParadymWalletSdk>()\n const [walletKey, setWalletKey] = useState<string>()\n\n useQuery({\n queryFn: async () => {\n const salt = await secureWalletKey.getSalt(secureWalletKey.getWalletKeyVersion())\n // TODO: is salt the best way to test this?\n\n // We have two params. If e.g. unlocking using biometrics failed, we will\n // set setCanTryUnlockingUsingBiometrics to false, but `setCanUseBiometrics`\n // will still be true (so we can store it)\n const cub = await secureWalletKey.canUseBiometryBackedWalletKey()\n setCanUseBiometrics(cub)\n setCanTryUnlockingUsingBiometrics(cub)\n\n setState(salt ? 'locked' : 'not-configured')\n return salt\n },\n queryKey: ['wallet_unlock_salt'],\n enabled: state === 'initializing',\n })\n\n useEffect(() => {\n console.log('secure unlock state: ', state)\n }, [state])\n\n const reinitialize = () => {\n setState('initializing')\n setCanTryUnlockingUsingBiometrics(true)\n setBiometricsUnlockAttempts(0)\n setUnlockMethod(undefined)\n setCanUseBiometrics(undefined)\n setIsUnlocking(false)\n }\n\n if (state === 'not-configured') {\n return {\n state,\n reinitialize,\n setPin: async (pin) => {\n await secureWalletKey.createAndStoreSalt(true, secureWalletKey.getWalletKeyVersion())\n const walletKey = await secureWalletKey.getWalletKeyUsingPin(pin, secureWalletKey.getWalletKeyVersion())\n\n setWalletKey(walletKey)\n setUnlockMethod('pin')\n setState('acquired-wallet-key')\n },\n }\n }\n\n if (state === 'acquired-wallet-key') {\n if (!walletKey || !unlockMethod) {\n throw new Error('Missing walletKey or unlockMethod')\n }\n\n return {\n state,\n unlockMethod,\n reinitialize,\n unlock: async (options) => {\n try {\n const walletKeyVersion = secureWalletKey.getWalletKeyVersion()\n // TODO: need extra option to know whether user wants to use biometrics?\n // TODO: do we need to check whether already stored?\n if (canUseBiometrics && options?.enableBiometrics) {\n await secureWalletKey.storeWalletKey(walletKey, walletKeyVersion)\n await secureWalletKey.getWalletKeyUsingBiometrics(secureWalletKey.getWalletKeyVersion())\n }\n\n const id = `easypid-wallet-${walletKeyVersion}`\n const key = walletKey\n\n // TODO: let the user provide an id? Or should we create one by default\n const pws = new ParadymWalletSdk({\n ...configuration,\n id,\n key,\n })\n pws.initialize().then((result) => {\n if (result.success) {\n setState('unlocked')\n setParadym(pws)\n } else {\n console.error(result.message)\n throw Error(result.message)\n }\n })\n } catch (error) {\n if (error instanceof WalletInvalidKeyError) {\n if (unlockMethod === 'biometrics') {\n setCanTryUnlockingUsingBiometrics(false)\n }\n\n setState('locked')\n setWalletKey(undefined)\n setUnlockMethod(undefined)\n }\n throw error\n }\n },\n }\n }\n\n if (state === 'locked') {\n return {\n state,\n isUnlocking,\n canTryUnlockingUsingBiometrics,\n reinitialize,\n tryUnlockingUsingBiometrics: async () => {\n // TODO: need to somehow inform user that the unlocking went wrong\n if (!canTryUnlockingUsingBiometrics) return\n\n setIsUnlocking(true)\n setBiometricsUnlockAttempts((attempts) => attempts + 1)\n try {\n const walletKey = await secureWalletKey.getWalletKeyUsingBiometrics(secureWalletKey.getWalletKeyVersion())\n if (walletKey) {\n setWalletKey(walletKey)\n setUnlockMethod('biometrics')\n setState('acquired-wallet-key')\n }\n } catch (error) {\n // If use cancelled we won't allow trying using biometrics again\n if (error instanceof KeychainError && error.reason === 'userCancelled') {\n setCanTryUnlockingUsingBiometrics(false)\n }\n // If other error, we will allow up to three attempts\n else if (biometricsUnlockAttempts > 3) {\n setCanTryUnlockingUsingBiometrics(false)\n }\n } finally {\n setIsUnlocking(false)\n }\n },\n unlockUsingPin: async (pin: string) => {\n setIsUnlocking(true)\n try {\n const walletKey = await secureWalletKey.getWalletKeyUsingPin(pin, secureWalletKey.getWalletKeyVersion())\n\n setWalletKey(walletKey)\n setUnlockMethod('pin')\n setState('acquired-wallet-key')\n } finally {\n setIsUnlocking(false)\n }\n },\n }\n }\n\n if (state === 'unlocked') {\n if (!unlockMethod || !paradym) {\n throw new Error(`unlockMethod (${!!unlockMethod}) or paradym (${!!paradym})`)\n }\n\n return {\n state,\n unlockMethod,\n paradym,\n reset: paradym.reset,\n reinitialize,\n lock: async () => {\n await paradym.shutdown()\n setParadym(undefined)\n setState('locked')\n setUnlockMethod(undefined)\n },\n }\n }\n\n return {\n state,\n }\n}\n","import {\n AnonCredsCredentialFormatService,\n AnonCredsModule,\n AnonCredsProofFormatService,\n LegacyIndyCredentialFormatService,\n LegacyIndyProofFormatService,\n V1CredentialProtocol,\n V1ProofProtocol,\n} from '@credo-ts/anoncreds'\nimport { AskarModule } from '@credo-ts/askar'\nimport { CheqdAnonCredsRegistry, CheqdModule, CheqdModuleConfig } from '@credo-ts/cheqd'\nimport { Agent, DidsModule, KeyDerivationMethod, X509Module, type X509ModuleConfigOptions } from '@credo-ts/core'\nimport {\n AutoAcceptCredential,\n AutoAcceptProof,\n ConnectionsModule,\n CredentialsModule,\n DidCommModule,\n DiscoverFeaturesModule,\n HttpOutboundTransport,\n MediationRecipientModule,\n MessagePickupModule,\n OutOfBandModule,\n ProofsModule,\n V2CredentialProtocol,\n V2ProofProtocol,\n WsOutboundTransport,\n} from '@credo-ts/didcomm'\nimport { OpenId4VcHolderModule } from '@credo-ts/openid4vc'\nimport { agentDependencies } from '@credo-ts/react-native'\nimport { anoncreds } from '@hyperledger/anoncreds-react-native'\nimport { askar } from '@openwallet-foundation/askar-react-native'\nimport { DidWebAnonCredsRegistry } from 'credo-ts-didweb-anoncreds'\nimport { ParadymWalletMustBeDidCommAgentError, ParadymWalletMustBeOpenId4VcAgentError } from './error'\nimport { type LogLevel, logger } from './logger'\nimport { secureWalletKey } from './secure'\n\nexport type SetupAgentOptions = {\n /**\n *\n * Unique identifier of your wallet storage\n *\n */\n id?: string\n\n /**\n *\n * Key that will be used to securely open your wallet\n *\n * @security\n * This property must dealt with in great care, such as receiving it from a biometrics check\n *\n */\n key: string\n\n /**\n *\n * Configuration regarding logging with the Paradym Wallet SDK\n *\n */\n logging?: {\n /**\n *\n * Loglevel to be used. Set to `trace` to log everything and `off` for nothing\n *\n */\n level: LogLevel\n\n /**\n *\n * Whether to trace the logs. Later, this can be exported\n *\n * exporting the logs can be done with the following:\n *\n * ```typescript\n * const { paradym } = useParadym('unlocked')\n * const logs = paradym.logger.loggedMessageContents\n * ```\n *\n */\n trace?: boolean\n\n /**\n *\n * Number of logs to be traced.\n *\n */\n traceLimit?: number\n }\n\n /**\n *\n * Configuration for when OpenId4Vc is used\n *\n * @note by default, openid4vc is configured on the agent\n *\n * @note to disable openid4vc, pass in `false`\n *\n */\n openId4VcConfiguration?: ({} & X509ModuleConfigOptions) | false\n\n /**\n *\n * Configuration for when DidComm is used\n *\n * @note by default, DIDComm is *not* configured on the agent\n *\n * @note to disable didcomm explicitly, pass in `false`\n *\n */\n didcommConfiguration?:\n | {\n /**\n *\n * Label used for DIDComm connections to convey who you are to the other agent\n *\n */\n label: string\n }\n | false\n}\n\n/**\n *\n * Function that sets up everything needed for the functionality required in a wallet.\n *\n */\nexport const setupAgent = (options: SetupAgentOptions) => {\n const openId4VcConfiguration = options.openId4VcConfiguration ?? {}\n\n const didcommConfiguration = options.didcommConfiguration ?? false\n\n const modules = {\n askar: new AskarModule({\n askar,\n }),\n\n ...(openId4VcConfiguration ? getOpenid4VcModules(openId4VcConfiguration) : {}),\n ...(didcommConfiguration ? getDidCommModules(didcommConfiguration) : {}),\n }\n\n const walletKeyVersion = secureWalletKey.getWalletKeyVersion()\n\n const paradymWalletSdkLogger = options.logging ? logger(options.logging.level) : undefined\n\n if (options.logging?.trace) {\n paradymWalletSdkLogger?.trackLoggedMessages(options.logging.traceLimit)\n }\n\n const agent = new Agent({\n config: {\n label: didcommConfiguration ? didcommConfiguration.label : '',\n walletConfig: {\n id: `${options.id ?? 'paradym-wallet'}-${walletKeyVersion}`,\n key: options.key,\n keyDerivationMethod: KeyDerivationMethod.Raw,\n },\n logger: paradymWalletSdkLogger,\n },\n dependencies: agentDependencies,\n modules,\n })\n\n if (didcommConfiguration) {\n const didcommAgent = agent as DidCommAgent\n didcommAgent.modules.didcomm.registerOutboundTransport(new HttpOutboundTransport())\n didcommAgent.modules.didcomm.registerOutboundTransport(new WsOutboundTransport())\n }\n\n return agent\n}\n\nconst getOpenid4VcModules = (openId4VcConfiguration: Exclude<SetupAgentOptions['openId4VcConfiguration'], false>) => ({\n openId4VcHolder: new OpenId4VcHolderModule(),\n x509: new X509Module({\n trustedCertificates: openId4VcConfiguration?.trustedCertificates as undefined | [string, ...string[]],\n getTrustedCertificatesForVerification: openId4VcConfiguration?.getTrustedCertificatesForVerification,\n }),\n})\n\n// TODO: configure, or allow the user, to configure these modules\nconst getDidCommModules = (_didcommConfiguration: Exclude<SetupAgentOptions['didcommConfiguration'], false>) => ({\n connections: new ConnectionsModule(),\n messagePickup: new MessagePickupModule(),\n discovery: new DiscoverFeaturesModule(),\n dids: new DidsModule(),\n outOfBand: new OutOfBandModule(),\n didcomm: new DidCommModule(),\n mediationRecipient: new MediationRecipientModule(),\n credentials: new CredentialsModule({\n autoAcceptCredentials: AutoAcceptCredential.ContentApproved,\n credentialProtocols: [\n new V1CredentialProtocol({\n indyCredentialFormat: new LegacyIndyCredentialFormatService(),\n }),\n new V2CredentialProtocol({\n credentialFormats: [new LegacyIndyCredentialFormatService(), new AnonCredsCredentialFormatService()],\n }),\n ],\n }),\n proofs: new ProofsModule({\n autoAcceptProofs: AutoAcceptProof.ContentApproved,\n proofProtocols: [\n new V1ProofProtocol({\n indyProofFormat: new LegacyIndyProofFormatService(),\n }),\n new V2ProofProtocol({\n proofFormats: [new LegacyIndyProofFormatService(), new AnonCredsProofFormatService()],\n }),\n ],\n }),\n anoncreds: new AnonCredsModule({\n registries: [new CheqdAnonCredsRegistry(), new DidWebAnonCredsRegistry()],\n anoncreds,\n }),\n cheqd: new CheqdModule(\n new CheqdModuleConfig({\n networks: [\n {\n network: 'testnet',\n },\n {\n network: 'mainnet',\n },\n ],\n })\n ),\n})\n\nexport type BaseAgent = Agent\nexport type DidCommAgent = Agent<ReturnType<typeof getDidCommModules>>\nexport type OpenId4VcAgent = Agent<ReturnType<typeof getOpenid4VcModules>>\nexport type FullAgent = DidCommAgent & OpenId4VcAgent\n\nexport const isDidcommAgent = (agent: DidCommAgent | OpenId4VcAgent): boolean => 'didcomm' in agent.modules\nexport const assertDidcommAgent = (agent: DidCommAgent | OpenId4VcAgent): DidCommAgent => {\n if (!isDidcommAgent(agent)) {\n throw new ParadymWalletMustBeDidCommAgentError()\n }\n\n return agent as DidCommAgent\n}\n\nexport const isOpenId4VcAgent = (agent: DidCommAgent | OpenId4VcAgent): boolean => 'openId4VcHolder' in agent.modules\nexport const assertOpenId4VcAgent = (agent: DidCommAgent | OpenId4VcAgent): OpenId4VcAgent => {\n if (!isOpenId4VcAgent(agent)) {\n throw new ParadymWalletMustBeOpenId4VcAgentError()\n }\n\n return agent as OpenId4VcAgent\n}\n","import {\n type Agent,\n type RecordDeletedEvent,\n type RecordSavedEvent,\n type RecordUpdatedEvent,\n RepositoryEventTypes,\n} from '@credo-ts/core'\nimport type { GenericRecord } from '@credo-ts/core/build/modules/generic-records/repository/GenericRecord'\nimport { createContext, useContext, useEffect, useState } from 'react'\n\ntype WalletJsonStoreState = {\n jsonRecords: GenericRecord[]\n isLoading: boolean\n}\n\nconst WalletJsonStoreContext = createContext<WalletJsonStoreState | undefined>(undefined)\n\nexport const useWalletJsonRecord = <T,>(id: string): { isLoading: boolean; record: T | undefined } => {\n const context = useContext(WalletJsonStoreContext)\n if (!context) {\n throw new Error('useWalletJsonRecord must be used within a WalletJsonStoreProvider')\n }\n\n const record = context.jsonRecords.find((r) => r.id === id)\n return {\n isLoading: context.isLoading,\n record: record?.content as T | undefined,\n }\n}\n\ninterface Props {\n agent: Agent\n children: React.ReactNode\n recordIds: string[]\n}\n\nexport const WalletJsonStoreProvider: React.FC<Props> = ({ agent, children, recordIds }) => {\n const [state, setState] = useState<WalletJsonStoreState>({\n jsonRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n const fetchRecords = async () => {\n const records = await Promise.all(recordIds.map((id) => agent.genericRecords.findById(id)))\n const validRecords = records.filter((record): record is GenericRecord => record !== null)\n setState({ jsonRecords: validRecords, isLoading: false })\n }\n void fetchRecords()\n }, [agent, recordIds])\n\n useEffect(() => {\n if (!state.isLoading) {\n const updateEvent = (event: RecordUpdatedEvent<GenericRecord>) => {\n if (recordIds.includes(event.payload.record.id)) {\n setState((prevState) => ({\n ...prevState,\n jsonRecords: prevState.jsonRecords.map((r) =>\n r.id === event.payload.record.id ? event.payload.record : r\n ),\n }))\n }\n }\n\n const addEvent = (event: RecordSavedEvent<GenericRecord>) => {\n if (recordIds.includes(event.payload.record.id)) {\n setState((prevState) => ({\n ...prevState,\n jsonRecords: [...prevState.jsonRecords, event.payload.record],\n }))\n }\n }\n\n const removeEvent = (event: RecordDeletedEvent<GenericRecord>) => {\n if (recordIds.includes(event.payload.record.id)) {\n setState((prevState) => ({\n ...prevState,\n jsonRecords: prevState.jsonRecords.filter((r) => r.id !== event.payload.record.id),\n }))\n }\n }\n\n agent.events.on<RecordUpdatedEvent<GenericRecord>>(RepositoryEventTypes.RecordUpdated, updateEvent)\n agent.events.on<RecordSavedEvent<GenericRecord>>(RepositoryEventTypes.RecordSaved, addEvent)\n agent.events.on<RecordDeletedEvent<GenericRecord>>(RepositoryEventTypes.RecordDeleted, removeEvent)\n\n return () => {\n agent.events.off(RepositoryEventTypes.RecordUpdated, updateEvent)\n agent.events.off(RepositoryEventTypes.RecordSaved, addEvent)\n agent.events.off(RepositoryEventTypes.RecordDeleted, removeEvent)\n }\n }\n }, [state.isLoading, agent, recordIds])\n\n return <WalletJsonStoreContext.Provider value={state}>{children}</WalletJsonStoreContext.Provider>\n}\n","export function isDateString(value: string) {\n // We do the length check first to avoid unnecesary regex\n return value.length === 'yyyy-mm-dd'.length && value.match(/^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$/)\n}\n\nexport function formatDate(input: string | Date, options?: { includeTime?: boolean }): string {\n const date = input instanceof Date ? input : new Date(input)\n\n const hasTime = date.getUTCHours() !== 0 || date.getUTCMinutes() !== 0\n const includeTime = options?.includeTime ?? hasTime\n\n const timeOptions = includeTime\n ? ({\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h24',\n } as const)\n : {}\n\n return date.toLocaleString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n ...timeOptions,\n })\n}\n","export function sanitizeString(\n str: string,\n { startWithCapitalLetter = true }: { startWithCapitalLetter?: boolean } = {}\n) {\n const result = str.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace('_', ' ')\n let words = result.split(' ')\n words = words.map((word, index) => {\n if (startWithCapitalLetter && (index === 0 || word.toUpperCase() === word)) {\n return word.charAt(0).toUpperCase() + word.slice(1)\n }\n return word.charAt(0).toLowerCase() + word.slice(1)\n })\n return words.join(' ')\n}\n","import { ClaimFormat } from '@credo-ts/core'\nimport type { FormattedSubmissionEntrySatisfiedCredential } from '../format/submission'\nimport { formatDate } from '../utils/date'\nimport type { CredentialDisplay, CredentialMetadata } from './credential'\nimport { sanitizeString } from './strings'\n\nexport function findDisplay<Display extends { locale?: string; lang?: string }>(\n display?: Display[]\n): Display | undefined {\n if (!display) return undefined\n\n let item = display.find((d) => d.locale?.startsWith('en-') || d.lang?.startsWith('en-'))\n if (!item) item = display.find((d) => !d.locale && !d.lang)\n if (!item) item = display[0]\n\n return item\n}\n\nexport function getDisclosedAttributePathArrays(\n payload: object,\n maxDepth: number | undefined = undefined,\n prefix: string[] = []\n): string[][] {\n let attributePaths: string[][] = []\n\n for (const [key, value] of Object.entries(payload)) {\n if (!value) continue\n\n // TODO: handle arrays\n const newPath = [...prefix, key]\n if (value && typeof value === 'object' && maxDepth !== 0) {\n // If the value is a nested object, recurse\n attributePaths = [\n ...attributePaths,\n ...getDisclosedAttributePathArrays(value, maxDepth !== undefined ? maxDepth - 1 : undefined, newPath),\n ]\n } else {\n // If the value is a primitive or maxDepth is reached, add the key to the list\n attributePaths.push(newPath)\n }\n }\n\n return attributePaths\n}\n\nexport function getDisclosedAttributeNamesForDisplay(credential: FormattedSubmissionEntrySatisfiedCredential) {\n // FIXME: this implementation in still too naive\n // TODO: use the credential claim metadata (sd-jwt / oid4vc) to get labels for attribute paths\n // TODO: we miss e.g. showing age_equal_or_over.21 as Age Over 21, but with the display metadata\n // from bdr we can at least show it as: Age verification. If there is a key for a nested path we can\n // also decide to include it\n\n // For mdoc we remove the namespaces\n if (credential.credential.claimFormat === ClaimFormat.MsoMdoc) {\n return Array.from(new Set(credential.disclosed.paths.map((path) => sanitizeString(path[1]))))\n }\n\n // Otherwise we take the top-level keys\n return Array.from(\n new Set(\n credential.disclosed.paths\n .filter((path): path is [string] => typeof path[0] === 'string')\n .map((path) => sanitizeString(path[0]))\n )\n )\n}\n\nexport function getUnsatisfiedAttributePathsForDisplay(paths: Array<string | number | null>[]) {\n const nonRenderedPaths = ['iss', 'vct']\n return Array.from(\n new Set(\n paths\n .filter(\n (path): path is [string] =>\n typeof path[0] === 'string' && !path.some((p) => nonRenderedPaths.includes(p as string))\n )\n .map((path) => sanitizeString(path[0]))\n )\n )\n}\nexport function getCredentialDisplayWithDefaults(credentialDisplay?: Partial<CredentialDisplay>): CredentialDisplay {\n return {\n ...credentialDisplay,\n name: credentialDisplay?.name ?? 'Credential',\n issuer: {\n ...credentialDisplay?.issuer,\n name: credentialDisplay?.issuer?.name ?? 'Unknown',\n },\n }\n}\nexport function metadataForDisplay(metadata: CredentialMetadata) {\n const { type, holder, issuedAt, issuer, validFrom, validUntil } = metadata\n\n return {\n type,\n issuer,\n holder,\n issuedAt: issuedAt ? formatDate(new Date(issuedAt)) : undefined,\n validFrom: validFrom ? formatDate(new Date(validFrom)) : undefined,\n validUntil: validUntil ? formatDate(new Date(validUntil)) : undefined,\n }\n}\n","import type { Agent } from '@credo-ts/core'\nimport { GenericRecord } from '@credo-ts/core/build/modules/generic-records/repository/GenericRecord'\n\nconst store = async (agent: Agent, id: string, value: Record<string, unknown>) => {\n const record = new GenericRecord({ id, content: value })\n await agent.genericRecords.save(record)\n}\n\nconst update = async (agent: Agent, id: string, value: Record<string, unknown>) => {\n const record = new GenericRecord({ id, content: value })\n await agent.genericRecords.update(record)\n}\n\nconst getById = async <T>(agent: Agent, id: string): Promise<T | undefined> => {\n const record = await agent.genericRecords.findById(id)\n\n if (!record) {\n return undefined\n }\n\n return record.content as T\n}\n\nexport const walletJsonStore = {\n store,\n getById,\n update,\n}\n\nexport function getWalletJsonStore<Content extends Record<string, unknown>>(recordId: string) {\n return {\n recordId,\n store: async (agent: Agent, content: Content) => walletJsonStore.store(agent, recordId, content),\n update: async (agent: Agent, content: Content) => walletJsonStore.update(agent, recordId, content),\n get: async (agent: Agent) => walletJsonStore.getById<Content>(agent, recordId),\n }\n}\n","import { utils } from '@credo-ts/core'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { BaseAgent } from '../agent'\nimport { getDisclosedAttributeNamesForDisplay, getUnsatisfiedAttributePathsForDisplay } from '../display/common'\nimport type { DisplayImage } from '../display/credential'\nimport type { FormattedSubmission } from '../format/submission'\nimport type { CredentialId } from '../hooks/useCredentialById'\nimport type { CredentialsForProofRequest } from '../openid4vc/getCredentialsForProofRequest'\nimport type { FormattedTransactionData } from '../openid4vc/transaction'\nimport { getWalletJsonStore } from './walletJsonStore'\n\nexport type ActivityType = 'shared' | 'received' | 'signed'\nexport type ActivityStatus = 'success' | 'failed' | 'stopped'\nexport type SharingFailureReason = 'missing_credentials' | 'unknown'\n\ninterface BaseActivity {\n id: string\n type: ActivityType\n status: ActivityStatus\n date: string\n entity: {\n // FIXME: we need to avoid id collisions. So we should\n // add a prefix probably. So\n // didcomm-connection:\n //\n // entity id can either be: did or https url or connection id\n id?: string\n host?: string\n name?: string\n logo?: DisplayImage\n backgroundColor?: string\n }\n}\n\nexport interface PresentationActivityCredentialNotFound {\n attributeNames: string[]\n name?: string\n}\n\nexport interface PresentationActivityCredential {\n id: CredentialId\n name?: string\n attributeNames: string[]\n attributes: Record<string, unknown>\n metadata: Record<string, unknown>\n}\n\nexport interface PresentationActivity extends BaseActivity {\n type: 'shared'\n request: {\n credentials: Array<PresentationActivityCredential | PresentationActivityCredentialNotFound>\n name?: string\n purpose?: string\n failureReason?: SharingFailureReason\n }\n}\n\nexport interface IssuanceActivity extends BaseActivity {\n type: 'received'\n credentialIds: CredentialId[]\n}\n\nexport interface SignedActivity extends Omit<PresentationActivity, 'type'> {\n type: 'signed'\n transaction: FormattedTransactionData\n}\n\nexport type Activity = PresentationActivity | IssuanceActivity | SignedActivity\n\nexport type ActivityRecord = {\n activities: Activity[]\n}\n\nconst internalActivityStorage = getWalletJsonStore<ActivityRecord>('EASYPID_ACTIVITY_RECORD')\n// const internalActivityStorage = getWalletJsonStore<ActivityRecord>('PARADYM_WALLET_SDK_ACTIVITY_RECORD')\nexport const activityStorage = {\n recordId: internalActivityStorage.recordId,\n addActivity: async (agent: BaseAgent, activity: Activity) => {\n // get activity and then add this activity\n const record = await internalActivityStorage.get(agent)\n if (!record) {\n await internalActivityStorage.store(agent, {\n activities: [activity],\n })\n } else {\n record.activities.push(activity)\n await internalActivityStorage.update(agent, record)\n }\n },\n}\n\nexport const addReceivedActivity = async (\n paradym: ParadymWalletSdk,\n input: {\n entityId?: string\n name: string\n host?: string\n logo?: DisplayImage\n backgroundColor?: string\n credentialIds: CredentialId[]\n }\n) => {\n await activityStorage.addActivity(paradym.agent, {\n id: utils.uuid(),\n date: new Date().toISOString(),\n type: 'received',\n status: 'success',\n entity: {\n id: input.entityId,\n name: input.name,\n host: input.host,\n logo: input.logo,\n backgroundColor: input.backgroundColor,\n },\n credentialIds: input.credentialIds,\n })\n}\n\nexport const addSharedOrSignedActivity = async (\n paradym: ParadymWalletSdk,\n input: Omit<PresentationActivity, 'type' | 'date' | 'id'> | Omit<SignedActivity, 'type' | 'date' | 'id'>\n) => {\n if ('transaction' in input && input.transaction) {\n await activityStorage.addActivity(paradym.agent, {\n ...input,\n id: utils.uuid(),\n date: new Date().toISOString(),\n type: 'signed',\n })\n } else {\n await activityStorage.addActivity(paradym.agent, {\n ...input,\n id: utils.uuid(),\n date: new Date().toISOString(),\n type: 'shared',\n })\n }\n}\n\nexport function addSharedActivityForCredentialsForRequest(\n paradym: ParadymWalletSdk,\n credentialsForRequest: Pick<CredentialsForProofRequest, 'formattedSubmission'> & {\n verifier: Omit<CredentialsForProofRequest['verifier'], 'entityId'> & { entityId?: string }\n },\n status: ActivityStatus,\n transaction?: FormattedTransactionData\n) {\n return addSharedOrSignedActivity(paradym, {\n status,\n entity: {\n id: credentialsForRequest.verifier.entityId,\n host: credentialsForRequest.verifier.hostName,\n name: credentialsForRequest?.verifier.name,\n logo: credentialsForRequest.verifier.logo,\n },\n request: {\n name: credentialsForRequest.formattedSubmission.name,\n purpose: credentialsForRequest.formattedSubmission.purpose,\n credentials: getDisclosedCredentialForSubmission(credentialsForRequest.formattedSubmission),\n failureReason:\n status === 'failed'\n ? !credentialsForRequest.formattedSubmission.areAllSatisfied\n ? 'missing_credentials'\n : 'unknown'\n : undefined,\n },\n transaction,\n })\n}\n\nexport function addSharedActivityForSubmission(\n paradym: ParadymWalletSdk,\n submission: FormattedSubmission,\n verifier: {\n id: string\n name?: string\n logo?: DisplayImage\n },\n status: ActivityStatus\n) {\n return addSharedOrSignedActivity(paradym, {\n status,\n entity: {\n id: verifier.id,\n name: verifier.name,\n logo: verifier.logo,\n },\n request: {\n name: submission.name,\n purpose: submission.purpose,\n credentials: getDisclosedCredentialForSubmission(submission),\n failureReason:\n status === 'failed' ? (!submission.areAllSatisfied ? 'missing_credentials' : 'unknown') : undefined,\n },\n })\n}\n\nexport function getDisclosedCredentialForSubmission(\n formattedSubmission: FormattedSubmission\n): Array<PresentationActivityCredentialNotFound | PresentationActivityCredential> {\n return formattedSubmission.entries.map((entry) => {\n if (!entry.isSatisfied) {\n return {\n name: entry.name,\n attributeNames: getUnsatisfiedAttributePathsForDisplay(entry.requestedAttributePaths),\n } satisfies PresentationActivityCredentialNotFound\n }\n\n // TODO: once we support selection we should update [0] to the selected credential\n const credential = entry.credentials[0]\n\n return {\n id: credential.credential.id,\n attributeNames: getDisclosedAttributeNamesForDisplay(credential),\n attributes: credential.disclosed.attributes,\n metadata: credential.disclosed.metadata as unknown as Record<string, unknown>,\n } satisfies PresentationActivityCredential\n })\n}\n","import { useMemo } from 'react'\nimport { useWalletJsonRecord } from '../providers/WalletJsonStoreProvider'\nimport { type ActivityRecord, activityStorage } from '../storage/activities'\n\nexport const useActivities = ({ filters }: { filters?: { entityId?: string } } = {}) => {\n const { record, isLoading } = useWalletJsonRecord<ActivityRecord>(activityStorage.recordId)\n\n const activities = useMemo(() => {\n if (!record?.activities) return []\n\n return [...record.activities]\n .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())\n .filter((activity) => !filters?.entityId || activity.entity.id === filters?.entityId)\n }, [record?.activities, filters?.entityId])\n\n return {\n activities,\n isLoading,\n }\n}\n","import { useMemo } from 'react'\nimport { useActivities } from './useActivities'\n\nexport const useActivityById = (id: string) => {\n const { isLoading, activities } = useActivities()\n\n return {\n isLoading,\n activity: useMemo(() => activities.find((c) => c.id === id), [activities, id]),\n }\n}\n","import type { JwaSignatureAlgorithm, JwkJson, MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'\nimport type { CredentialExchangeRecord, ProofExchangeRecord } from '@credo-ts/didcomm'\nimport type {\n OpenId4VciCredentialConfigurationSupported,\n OpenId4VciCredentialConfigurationSupportedWithFormats,\n OpenId4VciCredentialIssuerMetadataDisplay,\n} from '@credo-ts/openid4vc'\n\nexport interface DidCommCredentialExchangeDisplayMetadata {\n issuerName?: string\n issuerLogoUri?: string\n credentialName?: string\n}\n\nexport interface DidCommProofExchangeDisplayMetadata {\n verifierName?: string\n verifierLogoUri?: string\n proofName?: string\n}\n\nexport interface BatchCredentialMetadata {\n /**\n * Additional credentials that can be used for presentation\n */\n additionalCredentials: Array<string> | Array<Record<string, unknown>>\n}\n\nexport interface RefreshCredentialMetadata {\n refreshToken: string\n dpop?: { alg: JwaSignatureAlgorithm; jwk: JwkJson }\n}\n\nexport type CredentialDisplayClaims =\n | (OpenId4VciCredentialConfigurationSupportedWithFormats & {\n format: 'vc+sd-jwt'\n })['claims']\n | (OpenId4VciCredentialConfigurationSupportedWithFormats & {\n format: 'dc+sd-jwt'\n })['claims']\n\nexport interface OpenId4VcCredentialMetadata {\n credential: {\n display?: OpenId4VciCredentialConfigurationSupported['display']\n claims?: CredentialDisplayClaims\n order?: OpenId4VciCredentialConfigurationSupportedWithFormats['order']\n }\n issuer: {\n display?: OpenId4VciCredentialIssuerMetadataDisplay[]\n id: string\n }\n}\n\nexport interface BatchCredentialMetadata {\n /**\n * Additional credentials that can be used for presentation\n */\n additionalCredentials: Array<string> | Array<Record<string, unknown>>\n}\n\nexport interface CredentialCategoryMetadata {\n /**\n *\n */\n credentialCategory: 'DE-PID' | (string & {})\n\n /**\n * Whether this instance of the canonical records should be displayed by default\n */\n displayPriority?: boolean\n\n /**\n * @default true\n */\n canDeleteCredential?: boolean\n\n // TODO: we can also store here the key binding requirements, and whether we need to sign\n // locally or remotely (so we can show PIN)\n}\n\nconst openId4VcCredentialMetadataKey = '_paradym/openId4VcCredentialMetadata'\nconst batchCredentialMetadataKey = '_paradym/batchCredentialMetadata'\nconst credentialCategoryMetadataKey = '_paradym/credentialCategoryMetadata'\nconst refreshCredentialMetadataKey = '_paradym/refreshCredentialMetadata'\nconst didCommCredentialExchangeDisplayMetadataKey = '_paradym/credentialDisplayMetadata'\nconst didCommProofExchangeDisplayMetadataKey = '_paradym/proofDisplayMetadata'\n\nexport function setOpenId4VcCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: OpenId4VcCredentialMetadata\n) {\n credentialRecord.metadata.set(openId4VcCredentialMetadataKey, metadata)\n}\n\nexport function extractOpenId4VcCredentialMetadata(\n credentialMetadata: OpenId4VciCredentialConfigurationSupportedWithFormats,\n serverMetadata: { display?: OpenId4VciCredentialIssuerMetadataDisplay[]; id: string }\n): OpenId4VcCredentialMetadata {\n return {\n credential: {\n display: credentialMetadata.display,\n order: credentialMetadata.order,\n claims: credentialMetadata.claims ? (credentialMetadata.claims as CredentialDisplayClaims) : undefined,\n },\n issuer: {\n display: serverMetadata.display,\n id: serverMetadata.id,\n },\n }\n}\n\nexport function getBatchCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): BatchCredentialMetadata | null {\n return credentialRecord.metadata.get(batchCredentialMetadataKey)\n}\n\nexport function getCredentialCategoryMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): CredentialCategoryMetadata | null {\n return credentialRecord.metadata.get(credentialCategoryMetadataKey)\n}\n\nexport function getRefreshCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): RefreshCredentialMetadata | null {\n return credentialRecord.metadata.get(refreshCredentialMetadataKey)\n}\n\nexport function setRefreshCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: RefreshCredentialMetadata\n) {\n credentialRecord.metadata.set(refreshCredentialMetadataKey, metadata)\n}\n\nexport function getOpenId4VcCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): OpenId4VcCredentialMetadata | null {\n const recordMetadata: OpenId4VcCredentialMetadata | null =\n credentialRecord.metadata.get(openId4VcCredentialMetadataKey)\n\n if (!recordMetadata) return null\n\n return {\n issuer: {\n ...recordMetadata.issuer,\n display: recordMetadata.issuer.display?.map(({ logo, ...displayRest }) => ({\n ...displayRest,\n // We need to map the url values to uri\n logo: logo ? { ...logo, uri: logo.uri ?? (logo.url as string) } : undefined,\n })),\n },\n credential: {\n ...recordMetadata.credential,\n display: recordMetadata.credential.display?.map(({ background_image, logo, ...displayRest }) => ({\n ...displayRest,\n // We need to map the url values to uri\n background_image: background_image\n ? { ...background_image, uri: background_image.uri ?? (background_image.url as string) }\n : undefined,\n // We need to map the url values to uri\n logo: logo ? { ...logo, uri: logo.uri ?? (logo.url as string) } : undefined,\n })),\n },\n }\n}\n\nexport function setBatchCredentialMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: BatchCredentialMetadata\n) {\n credentialRecord.metadata.set(batchCredentialMetadataKey, metadata)\n}\n\n/**\n * Gets the display metadata for the credential exchange from the given CredentialExchangeRecord.\n */\nexport function getDidCommCredentialExchangeDisplayMetadata(\n credentialExchangeRecord: CredentialExchangeRecord\n): DidCommCredentialExchangeDisplayMetadata | null {\n return credentialExchangeRecord.metadata.get(didCommCredentialExchangeDisplayMetadataKey)\n}\n\n/**\n * Sets the display metadata for the credential exchange on the given CredentialExchangeRecord.\n *\n * NOTE: this does not save the record.\n */\nexport function setDidCommCredentialExchangeMetadata(\n credentialExchangeRecord: CredentialExchangeRecord,\n metadata: DidCommCredentialExchangeDisplayMetadata\n) {\n credentialExchangeRecord.metadata.set(didCommCredentialExchangeDisplayMetadataKey, metadata)\n}\n\n/**\n * Gets the display metadata for the proof exchange from the given ProofExchangeRecord.\n */\nexport function getDidCommProofExchangeDisplayMetadata(\n proofExchangeRecord: ProofExchangeRecord\n): DidCommProofExchangeDisplayMetadata | null {\n return proofExchangeRecord.metadata.get(didCommProofExchangeDisplayMetadataKey)\n}\n\n/**\n * Sets the display metadata for the proof exchange on the given ProofExchangeRecord.\n *\n * NOTE: this does not save the record.\n */\nexport function setDidCommProofExchangeMetadata(\n proofExchangeRecord: ProofExchangeRecord,\n metadata: DidCommProofExchangeDisplayMetadata\n) {\n proofExchangeRecord.metadata.set(didCommProofExchangeDisplayMetadataKey, metadata)\n}\n\nexport function openIdCredentialMetadataFromDidCommCredentialExchangeMetadata(\n credentialExchangeRecord: CredentialExchangeRecord,\n didcommMetadata: DidCommCredentialExchangeDisplayMetadata\n): OpenId4VcCredentialMetadata {\n return {\n credential: {\n display: didcommMetadata.credentialName\n ? [\n {\n name: didcommMetadata?.credentialName,\n },\n ]\n : undefined,\n },\n issuer: {\n id: credentialExchangeRecord.connectionId ?? credentialExchangeRecord.id,\n display: didcommMetadata.issuerName\n ? [\n {\n name: didcommMetadata?.issuerName,\n logo: didcommMetadata.issuerLogoUri\n ? {\n uri: didcommMetadata.issuerLogoUri,\n }\n : undefined,\n },\n ]\n : undefined,\n },\n }\n}\n\nexport function setCredentialCategoryMetadata(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord,\n metadata: CredentialCategoryMetadata\n) {\n credentialRecord.metadata.set(credentialCategoryMetadataKey, metadata)\n}\n","import { Hasher, type JwkJson, TypedArrayEncoder } from '@credo-ts/core'\n\nexport function safeCalculateJwkThumbprint(jwk: JwkJson): string | undefined {\n try {\n const thumbprint = TypedArrayEncoder.toBase64URL(\n Hasher.hash(\n JSON.stringify({ k: jwk.k, e: jwk.e, crv: jwk.crv, kty: jwk.kty, n: jwk.n, x: jwk.x, y: jwk.y }),\n 'sha-256'\n )\n )\n return `urn:ietf:params:oauth:jwk-thumbprint:sha-256:${thumbprint}`\n } catch (e) {\n return undefined\n }\n}\n","import { sanitizeString } from './strings'\n\ntype DrivingPrivilege = {\n codes: string[]\n expiry_date: string\n issue_date: string\n vehicle_category_code: string\n}\n\ntype MdlAttributes = {\n birth_date: string\n document_number: string\n driving_privileges: Array<DrivingPrivilege>\n expiry_date: string\n family_name: string\n given_name: string\n issue_date: string\n issuing_authority: string\n issuing_country: string\n portrait: string\n un_distinguishing_sign: string\n\n // There can be multiple and random age_over_XX attributes\n [key: string]: unknown\n}\n\nconst attributeNameMapping = {\n family_name: 'Family name',\n given_name: 'Given name',\n birth_date: 'Birth date',\n document_number: 'Document number',\n portrait: 'Portrait',\n un_distinguishing_sign: 'UN sign',\n issuing_authority: 'Issuing authority',\n issuing_country: 'Issuing country',\n expiry_date: 'Expiry date',\n issue_date: 'Issue date',\n driving_privileges: 'Driving privileges',\n codes: 'Codes',\n code: 'Code',\n vehicle_category_code: 'Vehicle category code',\n} as Record<string, string>\n\nconst mapMdlAttributeName = (key: string) => {\n return attributeNameMapping[key] ?? sanitizeString(key)\n}\n\nexport function getMdlAttributesForDisplay(attributes: Partial<MdlAttributes>) {\n const attributeGroups: Array<[string, unknown]> = []\n\n const { driving_privileges, ...remainingAttributes } = attributes\n\n const ageOverEntries = Object.entries(remainingAttributes).filter(([key]) => key.startsWith('age_over_'))\n\n const remainingWithoutAgeEntries = Object.fromEntries(\n Object.entries(remainingAttributes).filter(([key]) => !key.startsWith('age_over_'))\n )\n\n if (driving_privileges) {\n attributeGroups.push([\n 'Driving privileges',\n Object.fromEntries(Object.entries(driving_privileges).map(([key, value]) => [mapMdlAttributeName(key), value])),\n ])\n }\n\n if (ageOverEntries.length > 0) {\n attributeGroups.push(['Age over', Object.fromEntries(ageOverEntries)])\n }\n\n return Object.fromEntries([\n ...Object.entries(remainingWithoutAgeEntries).map(([key, value]) => [mapMdlAttributeName(key), value]),\n ...attributeGroups,\n ])\n}\n","import { getMdlAttributesForDisplay } from './mdl'\n\nconst docTypeOrVctDisplay = {\n 'https://example.eudi.ec.europa.eu/mdl/1': (attributes: Record<string, unknown>) => {\n return getMdlAttributesForDisplay(attributes)\n },\n\n 'org.iso.18013.5.1.mDL': (attributes: Record<string, unknown>) => {\n return getMdlAttributesForDisplay(attributes)\n },\n}\n\nexport const getAttributesForDocTypeOrVct = ({\n type,\n attributes,\n}: {\n type: string\n attributes: Record<string, unknown>\n}) => docTypeOrVctDisplay[type as keyof typeof docTypeOrVctDisplay]?.(attributes)\n","export function detectImageMimeType(data: Uint8Array): 'image/jpeg' | 'image/jp2' | null {\n // Check if array is too short to contain magic numbers\n if (data.length < 12) {\n return null\n }\n\n // JPEG starts with FF D8 FF\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return 'image/jpeg'\n }\n\n // JPEG2000 has two possible signatures:\n // 1) 00 00 00 0C 6A 50 20 20 0D 0A 87 0A\n // 2) FF 4F FF 51\n\n // Check first signature\n if (\n data[0] === 0x00 &&\n data[1] === 0x00 &&\n data[2] === 0x00 &&\n data[3] === 0x0c &&\n data[4] === 0x6a && // 'j'\n data[5] === 0x50 && // 'P'\n data[6] === 0x20 &&\n data[7] === 0x20 &&\n data[8] === 0x0d &&\n data[9] === 0x0a &&\n data[10] === 0x87 &&\n data[11] === 0x0a\n ) {\n return 'image/jp2'\n }\n\n // Check second signature\n if (data[0] === 0xff && data[1] === 0x4f && data[2] === 0xff && data[3] === 0x51) {\n return 'image/jp2'\n }\n\n return null\n}\n","import { DateOnly, TypedArrayEncoder } from '@credo-ts/core'\nimport { formatDate, isDateString } from '../utils/date'\nimport { detectImageMimeType } from '../utils/image'\n\ntype MappedAttributesReturnType =\n | string\n | number\n | boolean\n | { [key: string]: MappedAttributesReturnType }\n | null\n | undefined\n | Array<MappedAttributesReturnType>\n\nexport function recursivelyMapMdocAttributes(value: unknown): MappedAttributesReturnType {\n if (value instanceof Uint8Array) {\n const imageMimeType = detectImageMimeType(value)\n if (imageMimeType) {\n return `data:${imageMimeType};base64,${TypedArrayEncoder.toBase64(value)}`\n }\n\n // TODO: what to do with a buffer that is not an image?\n return TypedArrayEncoder.toUtf8String(value)\n }\n if (value === null || value === undefined || typeof value === 'number' || typeof value === 'boolean') return value\n\n if (value instanceof Date || value instanceof DateOnly || (typeof value === 'string' && isDateString(value))) {\n return formatDate(value instanceof DateOnly ? value.toISOString() : value)\n }\n if (typeof value === 'string') return value\n if (value instanceof Map) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)])\n )\n }\n if (Array.isArray(value)) return value.map(recursivelyMapMdocAttributes)\n\n return Object.fromEntries(Object.entries(value).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)]))\n}\n","const urlRegex = /^(.*:)\\/\\/([A-Za-z0-9-.]+)(:[0-9]+)?(.*)$/\n\nexport function getHostNameFromUrl(url: string) {\n const parts = urlRegex.exec(url)\n return parts ? parts[2] : undefined\n}\n","import type { OpenId4VcCredentialMetadata } from '../metadata/credentials'\nimport { getHostNameFromUrl } from '../utils/url'\nimport { findDisplay } from './common'\nimport type { CredentialDisplay, CredentialIssuerDisplay } from './credential'\n\nexport function getOpenId4VcIssuerDisplay(\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null\n): CredentialIssuerDisplay {\n const issuerDisplay: Partial<CredentialIssuerDisplay> = {}\n\n // Try to extract from openid metadata first\n if (openId4VcMetadata) {\n const openidIssuerDisplay = findDisplay(openId4VcMetadata.issuer.display)\n\n if (openidIssuerDisplay) {\n issuerDisplay.name = openidIssuerDisplay.name\n\n if (openidIssuerDisplay.logo) {\n issuerDisplay.logo = {\n url: openidIssuerDisplay.logo?.uri,\n altText: openidIssuerDisplay.logo?.alt_text,\n }\n }\n }\n\n // If the credentialDisplay contains a logo, and the issuerDisplay does not, use the logo from the credentialDisplay\n const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)\n if (openidCredentialDisplay && !issuerDisplay.logo && openidCredentialDisplay.logo) {\n issuerDisplay.logo = {\n url: openidCredentialDisplay.logo?.uri,\n altText: openidCredentialDisplay.logo?.alt_text,\n }\n }\n }\n\n // Last fallback: use issuer id from openid4vc\n if (!issuerDisplay.name && openId4VcMetadata?.issuer.id) {\n issuerDisplay.name = getHostNameFromUrl(openId4VcMetadata.issuer.id)\n }\n\n if (openId4VcMetadata?.issuer.id) {\n issuerDisplay.domain = getHostNameFromUrl(openId4VcMetadata.issuer.id)\n }\n\n return {\n ...issuerDisplay,\n name: issuerDisplay.name ?? 'Unknown',\n }\n}\n\nexport function getOpenId4VcCredentialDisplay(openId4VcMetadata: OpenId4VcCredentialMetadata) {\n const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)\n\n const credentialDisplay: Omit<CredentialDisplay, 'name'> & { name?: string } = {\n name: openidCredentialDisplay?.name,\n description: openidCredentialDisplay?.description,\n textColor: openidCredentialDisplay?.text_color,\n backgroundColor: openidCredentialDisplay?.background_color,\n backgroundImage: openidCredentialDisplay?.background_image\n ? {\n url: openidCredentialDisplay.background_image.uri,\n }\n : undefined,\n issuer: getOpenId4VcIssuerDisplay(openId4VcMetadata),\n }\n\n // NOTE: logo is used in issuer display (not sure if that's right though)\n\n return credentialDisplay\n}\n","import { ClaimFormat, type Mdoc, type MdocNameSpaces, type MdocRecord, getJwkFromKey } from '@credo-ts/core'\nimport {\n type CredentialCategoryMetadata,\n type OpenId4VcCredentialMetadata,\n getOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { safeCalculateJwkThumbprint } from '../utils/jwkThumbprint'\nimport type { CredentialDisplay, CredentialForDisplay, CredentialForDisplayId, CredentialMetadata } from './credential'\nimport { getAttributesForDocTypeOrVct } from './docTypeOfVct'\nimport { recursivelyMapMdocAttributes } from './mapAttributes'\nimport { getOpenId4VcCredentialDisplay, getOpenId4VcIssuerDisplay } from './openid4vc'\n\nexport function getDisplayInformationForMdocCredential(\n credentialRecord: MdocRecord,\n credentialForDisplayId: CredentialForDisplayId,\n hasRefreshToken: boolean,\n credentialCategoryMetadata: CredentialCategoryMetadata | null\n): CredentialForDisplay {\n const mdocInstance = credentialRecord.credential\n\n const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)\n const credentialDisplay = getMdocCredentialDisplay(mdocInstance, openId4VcMetadata)\n const issuerDisplay = getOpenId4VcIssuerDisplay(openId4VcMetadata)\n const { attributes, metadata } = getAttributesAndMetadataForMdocPayload(\n mdocInstance.issuerSignedNamespaces,\n mdocInstance\n )\n const customAttributesForDisplay =\n getAttributesForDocTypeOrVct({\n type: mdocInstance.docType,\n attributes,\n }) ?? attributes\n\n return {\n id: credentialForDisplayId,\n createdAt: credentialRecord.createdAt,\n display: {\n ...credentialDisplay,\n issuer: issuerDisplay,\n },\n attributes: customAttributesForDisplay,\n rawAttributes: attributes,\n metadata,\n claimFormat: ClaimFormat.MsoMdoc,\n record: credentialRecord,\n category: credentialCategoryMetadata ?? undefined,\n hasRefreshToken,\n }\n}\n\nfunction getMdocCredentialDisplay(mdoc: Mdoc, openId4VcMetadata: OpenId4VcCredentialMetadata | null) {\n let credentialDisplay: Partial<CredentialDisplay> = {}\n\n if (openId4VcMetadata) {\n credentialDisplay = getOpenId4VcCredentialDisplay(openId4VcMetadata)\n }\n\n return {\n ...credentialDisplay,\n // If there's no name for the credential, we extract it from the doctype\n name: credentialDisplay.name ?? mdoc.docType,\n }\n}\n\nexport function getAttributesAndMetadataForMdocPayload(namespaces: MdocNameSpaces, mdocInstance: Mdoc) {\n const attributes: CredentialForDisplay['attributes'] = Object.fromEntries(\n Object.values(namespaces).flatMap((v) => {\n return Object.entries(v).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)])\n })\n )\n\n // FIXME: Date should be fixed in Mdoc library\n // The problem is that mdocInstance.validityInfo.validFrom and validUntil are already Date objects that contain NaN, not just NaN values.\n // When you call toISOString() on a Date containing NaN, it will throw an error.\n const mdocMetadata: CredentialMetadata = {\n type: mdocInstance.docType,\n holder: mdocInstance.deviceKey\n ? safeCalculateJwkThumbprint(getJwkFromKey(mdocInstance.deviceKey).toJson())\n : undefined,\n issuedAt: mdocInstance.validityInfo.signed.toISOString(),\n validFrom:\n mdocInstance.validityInfo.validFrom instanceof Date &&\n !Number.isNaN(mdocInstance.validityInfo.validFrom.getTime())\n ? mdocInstance.validityInfo.validFrom.toISOString()\n : undefined,\n validUntil:\n mdocInstance.validityInfo.validUntil instanceof Date &&\n !Number.isNaN(mdocInstance.validityInfo.validUntil.getTime())\n ? mdocInstance.validityInfo.validUntil.toISOString()\n : undefined,\n }\n\n return {\n attributes,\n metadata: mdocMetadata,\n }\n}\n","import { ClaimFormat, type JwkJson, type SdJwtVcRecord, type SdJwtVcTypeMetadata } from '@credo-ts/core'\nimport {\n type CredentialCategoryMetadata,\n type OpenId4VcCredentialMetadata,\n getOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { safeCalculateJwkThumbprint } from '../utils/jwkThumbprint'\nimport { findDisplay } from './common'\nimport type { CredentialDisplay, CredentialForDisplay, CredentialForDisplayId, CredentialMetadata } from './credential'\nimport { getAttributesForDocTypeOrVct } from './docTypeOfVct'\nimport { recursivelyMapMdocAttributes } from './mapAttributes'\nimport { getOpenId4VcCredentialDisplay, getOpenId4VcIssuerDisplay } from './openid4vc'\nimport { sanitizeString } from './strings'\n\nexport function getDisplayInformationForSdJwtCredential(\n credentialRecord: SdJwtVcRecord,\n credentialForDisplayId: CredentialForDisplayId,\n hasRefreshToken: boolean,\n credentialCategoryMetadata: CredentialCategoryMetadata | null\n): CredentialForDisplay {\n const sdJwtVc = credentialRecord.credential\n\n const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)\n const sdJwtTypeMetadata = credentialRecord.typeMetadata\n const issuerDisplay = getOpenId4VcIssuerDisplay(openId4VcMetadata)\n\n const credentialDisplay = getSdJwtCredentialDisplay(sdJwtVc.prettyClaims, openId4VcMetadata, sdJwtTypeMetadata)\n const { attributes, metadata } = getAttributesAndMetadataForSdJwtPayload(sdJwtVc.prettyClaims)\n\n // FIXME: For now, we map attributes to our custom attributes for PID and MDL\n // We should add support for attributes from Type Metadata and OID4VC Metadata\n\n // Order of precedence should be:\n // 1. Custom attributes for PID and MDL using category\n // 2. Attributes from SD JWT Type Metadata\n // 3. Attributes from OID4VC Metadata\n\n const customAttributesForDisplay =\n getAttributesForDocTypeOrVct({\n type: sdJwtVc.payload.vct as string,\n attributes,\n }) ?? attributes\n\n return {\n id: credentialForDisplayId,\n createdAt: credentialRecord.createdAt,\n display: {\n ...credentialDisplay,\n issuer: issuerDisplay,\n },\n attributes: customAttributesForDisplay,\n rawAttributes: attributes,\n metadata,\n claimFormat: ClaimFormat.SdJwtVc,\n record: credentialRecord,\n category: credentialCategoryMetadata ?? undefined,\n hasRefreshToken,\n }\n}\n\nfunction getSdJwtTypeMetadataCredentialDisplay(\n sdJwtTypeMetadata: SdJwtVcTypeMetadata\n): Omit<CredentialDisplay, 'issuer' | 'name'> & { name?: string } {\n const typeMetadataDisplay = findDisplay(sdJwtTypeMetadata.display)\n\n // TODO: support SVG rendering method\n\n const credentialDisplay = {\n name: typeMetadataDisplay?.name,\n description: typeMetadataDisplay?.description,\n textColor: typeMetadataDisplay?.rendering?.simple?.text_color,\n backgroundColor: typeMetadataDisplay?.rendering?.simple?.background_color,\n backgroundImage: typeMetadataDisplay?.rendering?.simple?.logo\n ? {\n url: typeMetadataDisplay?.rendering?.simple?.logo.uri,\n altText: typeMetadataDisplay?.rendering?.simple?.logo.alt_text,\n }\n : undefined,\n }\n\n return credentialDisplay\n}\n\nfunction getSdJwtCredentialDisplay(\n credentialPayload: Record<string, unknown>,\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null,\n typeMetadata?: SdJwtVcTypeMetadata | null\n) {\n let credentialDisplay: Partial<CredentialDisplay> = {}\n\n // TODO: should we combine them? I think not really needed if you have one of them\n // Type metadata takes precendence.\n if (typeMetadata) {\n credentialDisplay = getSdJwtTypeMetadataCredentialDisplay(typeMetadata)\n } else if (openId4VcMetadata) {\n credentialDisplay = getOpenId4VcCredentialDisplay(openId4VcMetadata)\n }\n\n // If there's no name for the credential, we extract it from the last type\n // and sanitize it. This is not optimal. But provides at least something.\n if (!credentialDisplay.name && typeof credentialPayload.vct === 'string') {\n credentialDisplay.name = sanitizeString(credentialPayload.vct)\n }\n\n return {\n ...credentialDisplay,\n // Last fallback, if there's really no name for the credential, we use a generic name\n // TODO: use on-device AI to determine a name for the credential based on the credential data\n name: credentialDisplay.name ?? 'Credential',\n }\n}\n\nexport function getAttributesAndMetadataForSdJwtPayload(sdJwtVcPayload: Record<string, unknown>) {\n type SdJwtVcPayload = {\n iss: string\n cnf: Record<string, unknown>\n vct: string\n iat?: number\n nbf?: number\n exp?: number\n [key: string]: unknown\n }\n const { _sd_alg, _sd_hash, iss, vct, cnf, iat, exp, nbf, status, ...visibleProperties } =\n sdJwtVcPayload as SdJwtVcPayload\n\n const holder = cnf ? (cnf.kid ?? cnf.jwk ? safeCalculateJwkThumbprint(cnf.jwk as JwkJson) : undefined) : undefined\n const credentialMetadata: CredentialMetadata = {\n type: vct,\n issuer: iss,\n holder,\n issuedAt: iat ? new Date(iat * 1000).toISOString() : undefined,\n validUntil: exp ? new Date(exp * 1000).toISOString() : undefined,\n validFrom: nbf ? new Date(nbf * 1000).toISOString() : undefined,\n status,\n }\n\n return {\n attributes: Object.fromEntries(\n Object.entries(visibleProperties).map(([key, value]) => [key, recursivelyMapMdocAttributes(value)])\n ),\n metadata: credentialMetadata,\n }\n}\n","import { ClaimFormat, JsonTransformer, type SingleOrArray, type W3cCredentialRecord } from '@credo-ts/core'\nimport {\n type CredentialCategoryMetadata,\n type OpenId4VcCredentialMetadata,\n getOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { getHostNameFromUrl } from '../utils/url'\nimport { findDisplay } from './common'\nimport type {\n CredentialDisplay,\n CredentialForDisplay,\n CredentialForDisplayId,\n CredentialIssuerDisplay,\n} from './credential'\nimport { getOpenId4VcCredentialDisplay } from './openid4vc'\nimport { sanitizeString } from './strings'\n\nexport type W3cIssuerJson = {\n id: string\n}\n\nexport type W3cCredentialSubjectJson = {\n id?: string\n [key: string]: unknown\n}\n\nexport type W3cCredentialJson = {\n type: Array<string>\n issuer: W3cIssuerJson\n issuanceDate: string\n expiryDate?: string\n credentialSubject: W3cCredentialSubjectJson | W3cCredentialSubjectJson[]\n}\n\nexport type JffW3cCredentialJson = W3cCredentialJson & {\n name?: string\n description?: string\n credentialBranding?: {\n backgroundColor?: string\n }\n\n issuer:\n | string\n | (W3cIssuerJson & {\n name?: string\n iconUrl?: string\n logoUrl?: string\n image?: string | { id?: string; type?: 'Image' }\n })\n}\n\nexport function getDisplayInformationForW3cCredential(\n credentialRecord: W3cCredentialRecord,\n credentialForDisplayId: CredentialForDisplayId,\n hasRefreshToken: boolean,\n credentialCategoryMetadata: CredentialCategoryMetadata | null\n): CredentialForDisplay {\n const credential = JsonTransformer.toJSON(\n credentialRecord.credential.claimFormat === ClaimFormat.JwtVc\n ? credentialRecord.credential.credential\n : credentialRecord.credential.toJson()\n ) as W3cCredentialJson\n\n // TODO why is this casted to `any`?\n // biome-ignore lint/suspicious/noExplicitAny:\n const proof = (credential as any).proof as SingleOrArray<{\n type: string\n cryptosuite?: string\n verificationMethod?: string\n }>\n const firstProof = Array.isArray(proof) ? proof[0] : proof\n const isAnonCreds = firstProof.cryptosuite === 'anoncreds-2023'\n\n let type = credentialRecord.credential.type[credentialRecord.credential.type.length - 1]\n if (isAnonCreds) {\n type = firstProof.verificationMethod ?? type\n }\n\n const openId4VcMetadata = getOpenId4VcCredentialMetadata(credentialRecord)\n const issuerDisplay = getW3cIssuerDisplay(credential, openId4VcMetadata)\n const credentialDisplay = getW3cCredentialDisplay(credential, openId4VcMetadata)\n\n // FIXME: support credential with multiple subjects\n const credentialAttributes = Array.isArray(credential.credentialSubject)\n ? credential.credentialSubject[0] ?? {}\n : credential.credentialSubject\n\n return {\n id: credentialForDisplayId,\n createdAt: credentialRecord.createdAt,\n display: {\n ...credentialDisplay,\n issuer: issuerDisplay,\n },\n attributes: credentialAttributes,\n rawAttributes: credentialAttributes,\n metadata: {\n holder: credentialRecord.credential.credentialSubjectIds[0],\n issuer: credentialRecord.credential.issuerId,\n type,\n issuedAt: new Date(credentialRecord.credential.issuanceDate).toISOString(),\n validUntil: credentialRecord.credential.expirationDate\n ? new Date(credentialRecord.credential.expirationDate).toISOString()\n : undefined,\n validFrom: new Date(credentialRecord.credential.issuanceDate).toISOString(),\n },\n claimFormat: credentialRecord.credential.claimFormat,\n record: credentialRecord,\n category: credentialCategoryMetadata ?? undefined,\n hasRefreshToken,\n }\n}\n\nfunction getW3cIssuerDisplay(\n credential: W3cCredentialJson,\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null\n): CredentialIssuerDisplay {\n const issuerDisplay: Partial<CredentialIssuerDisplay> = {}\n\n // Try to extract from openid metadata first\n if (openId4VcMetadata) {\n const openidIssuerDisplay = findDisplay(openId4VcMetadata.issuer.display)\n\n if (openidIssuerDisplay) {\n issuerDisplay.name = openidIssuerDisplay.name\n\n if (openidIssuerDisplay.logo) {\n issuerDisplay.logo = {\n url: openidIssuerDisplay.logo?.uri,\n altText: openidIssuerDisplay.logo?.alt_text,\n }\n }\n }\n\n // If the credentialDisplay contains a logo, and the issuerDisplay does not, use the logo from the credentialDisplay\n const openidCredentialDisplay = findDisplay(openId4VcMetadata.credential.display)\n if (openidCredentialDisplay && !issuerDisplay.logo && openidCredentialDisplay.logo) {\n issuerDisplay.logo = {\n url: openidCredentialDisplay.logo?.uri,\n altText: openidCredentialDisplay.logo?.alt_text,\n }\n }\n }\n\n // If openid metadata is not available, try to extract display metadata from the credential based on JFF metadata\n const jffCredential = credential as JffW3cCredentialJson\n const issuerJson = typeof jffCredential.issuer === 'string' ? undefined : jffCredential.issuer\n\n // Issuer Display from JFF\n if (!issuerDisplay.logo || !issuerDisplay.logo.url) {\n if (issuerJson?.logoUrl) {\n issuerDisplay.logo = {\n url: issuerJson?.logoUrl,\n }\n } else if (issuerJson?.image) {\n issuerDisplay.logo = {\n url: typeof issuerJson.image === 'string' ? issuerJson.image : issuerJson.image.id,\n }\n }\n }\n\n // Issuer name from JFF\n if (!issuerDisplay.name) {\n issuerDisplay.name = issuerJson?.name\n }\n\n // Last fallback: use issuer id from openid4vc\n if (!issuerDisplay.name && openId4VcMetadata?.issuer.id) {\n issuerDisplay.name = getHostNameFromUrl(openId4VcMetadata.issuer.id)\n }\n\n return {\n ...issuerDisplay,\n name: issuerDisplay.name ?? 'Unknown',\n }\n}\n\nfunction getW3cCredentialDisplay(\n credential: W3cCredentialJson,\n openId4VcMetadata?: OpenId4VcCredentialMetadata | null\n) {\n let credentialDisplay: Partial<CredentialDisplay> = {}\n\n if (openId4VcMetadata) {\n credentialDisplay = getOpenId4VcCredentialDisplay(openId4VcMetadata)\n }\n\n // If openid metadata is not available, try to extract display metadata from the credential based on JFF metadata\n const jffCredential = credential as JffW3cCredentialJson\n\n if (!credentialDisplay.name) {\n credentialDisplay.name = jffCredential.name\n }\n\n // If there's no name for the credential, we extract it from the last type\n // and sanitize it. This is not optimal. But provides at least something.\n if (!credentialDisplay.name && jffCredential.type.length > 1) {\n const lastType = jffCredential.type[jffCredential.type.length - 1]\n if (lastType && !lastType.startsWith('http')) {\n credentialDisplay.name = sanitizeString(lastType)\n }\n }\n\n // Use background color from the JFF credential if not provided by the OID4VCI metadata\n if (!credentialDisplay.backgroundColor && jffCredential.credentialBranding?.backgroundColor) {\n credentialDisplay.backgroundColor = jffCredential.credentialBranding.backgroundColor\n }\n\n return {\n ...credentialDisplay,\n issuer: getW3cIssuerDisplay(credential, openId4VcMetadata),\n // Last fallback, if there's really no name for the credential, we use a generic name\n // TODO: use on-device AI to determine a name for the credential based on the credential data\n name: credentialDisplay.name ?? 'Credential',\n }\n}\n","import { type ClaimFormat, MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'\nimport { ParadymWalletUnsupportedCredentialRecordTypeError } from '../error'\nimport {\n type CredentialCategoryMetadata,\n getCredentialCategoryMetadata,\n getRefreshCredentialMetadata,\n} from '../metadata/credentials'\nimport { getDisplayInformationForMdocCredential } from './mdoc'\nimport { getDisplayInformationForSdJwtCredential } from './sdJwt'\nimport { getDisplayInformationForW3cCredential } from './w3c'\n\nexport type CredentialForDisplayId = `w3c-credential-${string}` | `sd-jwt-vc-${string}` | `mdoc-${string}`\n\nexport interface DisplayImage {\n url?: string\n altText?: string\n}\n\nexport interface CredentialDisplay {\n name: string\n locale?: string\n description?: string\n textColor?: string\n backgroundColor?: string\n backgroundImage?: DisplayImage\n issuer: CredentialIssuerDisplay\n}\n\nexport interface CredentialIssuerDisplay {\n name: string\n domain?: string\n locale?: string\n logo?: DisplayImage\n}\n\nexport interface CredentialMetadata {\n /**\n * vct (sd-jwt) or doctype (mdoc) or last type entry (w3c)\n */\n type: string\n\n /**\n * issuer identifier. did or https url\n */\n issuer?: string\n\n /**\n * Holder identifier. did or jwk thubmprint\n */\n holder?: string\n\n validUntil?: string\n validFrom?: string\n issuedAt?: string\n\n hasRefreshToken?: boolean\n\n // TODO: define and render\n status?: unknown\n}\n\nexport interface CredentialForDisplay {\n id: CredentialForDisplayId\n createdAt: Date\n display: CredentialDisplay\n attributes: Record<string, unknown>\n rawAttributes: Record<string, unknown>\n metadata: CredentialMetadata\n claimFormat: ClaimFormat.SdJwtVc | ClaimFormat.MsoMdoc | ClaimFormat.JwtVc | ClaimFormat.LdpVc\n record: W3cCredentialRecord | MdocRecord | SdJwtVcRecord\n\n category?: CredentialCategoryMetadata\n hasRefreshToken: boolean\n}\n\nexport function getCredentialForDisplayId(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): CredentialForDisplayId {\n if (credentialRecord instanceof SdJwtVcRecord) {\n return `sd-jwt-vc-${credentialRecord.id}`\n }\n if (credentialRecord instanceof W3cCredentialRecord) {\n return `w3c-credential-${credentialRecord.id}`\n }\n if (credentialRecord instanceof MdocRecord) {\n return `mdoc-${credentialRecord.id}`\n }\n\n throw new ParadymWalletUnsupportedCredentialRecordTypeError()\n}\n\nexport function getCredentialForDisplay(\n credentialRecord: W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n): CredentialForDisplay {\n const credentialCategoryMetadata = getCredentialCategoryMetadata(credentialRecord)\n const credentialForDisplayId = getCredentialForDisplayId(credentialRecord)\n const hasRefreshToken = getRefreshCredentialMetadata(credentialRecord) !== null\n\n if (credentialRecord instanceof SdJwtVcRecord) {\n return getDisplayInformationForSdJwtCredential(\n credentialRecord,\n credentialForDisplayId,\n hasRefreshToken,\n credentialCategoryMetadata\n )\n }\n if (credentialRecord instanceof MdocRecord) {\n return getDisplayInformationForMdocCredential(\n credentialRecord,\n credentialForDisplayId,\n hasRefreshToken,\n credentialCategoryMetadata\n )\n }\n if (credentialRecord instanceof W3cCredentialRecord) {\n return getDisplayInformationForW3cCredential(\n credentialRecord,\n credentialForDisplayId,\n hasRefreshToken,\n credentialCategoryMetadata\n )\n }\n\n throw new ParadymWalletUnsupportedCredentialRecordTypeError()\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export function isFunction(value) {\n return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","export function createErrorClass(createImpl) {\n var _super = function (instance) {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n var ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n return function UnsubscriptionErrorImpl(errors) {\n _super(this);\n this.message = errors\n ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n ')\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function arrRemove(arr, item) {\n if (arr) {\n var index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n function Subscription(initialTeardown) {\n this.initialTeardown = initialTeardown;\n this.closed = false;\n this._parentage = null;\n this._finalizers = null;\n }\n Subscription.prototype.unsubscribe = function () {\n var e_1, _a, e_2, _b;\n var errors;\n if (!this.closed) {\n this.closed = true;\n var _parentage = this._parentage;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n try {\n for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n var parent_1 = _parentage_1_1.value;\n parent_1.remove(this);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else {\n _parentage.remove(this);\n }\n }\n var initialFinalizer = this.initialTeardown;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n }\n catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n var _finalizers = this._finalizers;\n if (_finalizers) {\n this._finalizers = null;\n try {\n for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n var finalizer = _finalizers_1_1.value;\n try {\n execFinalizer(finalizer);\n }\n catch (err) {\n errors = errors !== null && errors !== void 0 ? errors : [];\n if (err instanceof UnsubscriptionError) {\n errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n };\n Subscription.prototype.add = function (teardown) {\n var _a;\n if (teardown && teardown !== this) {\n if (this.closed) {\n execFinalizer(teardown);\n }\n else {\n if (teardown instanceof Subscription) {\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n }\n }\n };\n Subscription.prototype._hasParent = function (parent) {\n var _parentage = this._parentage;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n };\n Subscription.prototype._addParent = function (parent) {\n var _parentage = this._parentage;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n };\n Subscription.prototype._removeParent = function (parent) {\n var _parentage = this._parentage;\n if (_parentage === parent) {\n this._parentage = null;\n }\n else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n };\n Subscription.prototype.remove = function (teardown) {\n var _finalizers = this._finalizers;\n _finalizers && arrRemove(_finalizers, teardown);\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n };\n Subscription.EMPTY = (function () {\n var empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n return (value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n if (isFunction(finalizer)) {\n finalizer();\n }\n else {\n finalizer.unsubscribe();\n }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n setTimeout: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = timeoutProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearTimeout: function (handle) {\n var delegate = timeoutProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n timeoutProvider.setTimeout(function () {\n var onUnhandledError = config.onUnhandledError;\n if (onUnhandledError) {\n onUnhandledError(err);\n }\n else {\n throw err;\n }\n });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","export var COMPLETE_NOTIFICATION = (function () { return createNotification('C', undefined, undefined); })();\nexport function errorNotification(error) {\n return createNotification('E', undefined, error);\n}\nexport function nextNotification(value) {\n return createNotification('N', value, undefined);\n}\nexport function createNotification(kind, value, error) {\n return {\n kind: kind,\n value: value,\n error: error,\n };\n}\n//# sourceMappingURL=NotificationFactories.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n var isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n }\n else {\n cb();\n }\n}\nexport function captureError(err) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n//# sourceMappingURL=errorContext.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n function Subscriber(destination) {\n var _this = _super.call(this) || this;\n _this.isStopped = false;\n if (destination) {\n _this.destination = destination;\n if (isSubscription(destination)) {\n destination.add(_this);\n }\n }\n else {\n _this.destination = EMPTY_OBSERVER;\n }\n return _this;\n }\n Subscriber.create = function (next, error, complete) {\n return new SafeSubscriber(next, error, complete);\n };\n Subscriber.prototype.next = function (value) {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n }\n else {\n this._next(value);\n }\n };\n Subscriber.prototype.error = function (err) {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n }\n else {\n this.isStopped = true;\n this._error(err);\n }\n };\n Subscriber.prototype.complete = function () {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n }\n else {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (!this.closed) {\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n this.destination = null;\n }\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n try {\n this.destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n };\n Subscriber.prototype._complete = function () {\n try {\n this.destination.complete();\n }\n finally {\n this.unsubscribe();\n }\n };\n return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n function ConsumerObserver(partialObserver) {\n this.partialObserver = partialObserver;\n }\n ConsumerObserver.prototype.next = function (value) {\n var partialObserver = this.partialObserver;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n ConsumerObserver.prototype.error = function (err) {\n var partialObserver = this.partialObserver;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n else {\n handleUnhandledError(err);\n }\n };\n ConsumerObserver.prototype.complete = function () {\n var partialObserver = this.partialObserver;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n }\n catch (error) {\n handleUnhandledError(error);\n }\n }\n };\n return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(observerOrNext, error, complete) {\n var _this = _super.call(this) || this;\n var partialObserver;\n if (isFunction(observerOrNext) || !observerOrNext) {\n partialObserver = {\n next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n error: error !== null && error !== void 0 ? error : undefined,\n complete: complete !== null && complete !== void 0 ? complete : undefined,\n };\n }\n else {\n var context_1;\n if (_this && config.useDeprecatedNextContext) {\n context_1 = Object.create(observerOrNext);\n context_1.unsubscribe = function () { return _this.unsubscribe(); };\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context_1),\n error: observerOrNext.error && bind(observerOrNext.error, context_1),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n };\n }\n else {\n partialObserver = observerOrNext;\n }\n }\n _this.destination = new ConsumerObserver(partialObserver);\n return _this;\n }\n return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n }\n else {\n reportUnhandledError(error);\n }\n}\nfunction defaultErrorHandler(err) {\n throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n var onStoppedNotification = config.onStoppedNotification;\n onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n return x;\n}\n//# sourceMappingURL=identity.js.map","import { identity } from './identity';\nexport function pipe() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n if (fns.length === 0) {\n return identity;\n }\n if (fns.length === 1) {\n return fns[0];\n }\n return function piped(input) {\n return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n };\n}\n//# sourceMappingURL=pipe.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n function Observable(subscribe) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var _this = this;\n var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n errorContext(function () {\n var _a = _this, operator = _a.operator, source = _a.source;\n subscriber.add(operator\n ?\n operator.call(subscriber, source)\n : source\n ?\n _this._subscribe(subscriber)\n :\n _this._trySubscribe(subscriber));\n });\n return subscriber;\n };\n Observable.prototype._trySubscribe = function (sink) {\n try {\n return this._subscribe(sink);\n }\n catch (err) {\n sink.error(err);\n }\n };\n Observable.prototype.forEach = function (next, promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n _this.subscribe(subscriber);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n var _a;\n return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n };\n Observable.prototype[Symbol_observable] = function () {\n return this;\n };\n Observable.prototype.pipe = function () {\n var operations = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n operations[_i] = arguments[_i];\n }\n return pipeFromArray(operations)(this);\n };\n Observable.prototype.toPromise = function (promiseCtor) {\n var _this = this;\n promiseCtor = getPromiseCtor(promiseCtor);\n return new promiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n };\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n var _a;\n return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n return function (source) {\n if (hasLift(source)) {\n return source.lift(function (liftedSource) {\n try {\n return init(liftedSource, this);\n }\n catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n//# sourceMappingURL=lift.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n __extends(OperatorSubscriber, _super);\n function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n var _this = _super.call(this, destination) || this;\n _this.onFinalize = onFinalize;\n _this.shouldUnsubscribe = shouldUnsubscribe;\n _this._next = onNext\n ? function (value) {\n try {\n onNext(value);\n }\n catch (err) {\n destination.error(err);\n }\n }\n : _super.prototype._next;\n _this._error = onError\n ? function (err) {\n try {\n onError(err);\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._error;\n _this._complete = onComplete\n ? function () {\n try {\n onComplete();\n }\n catch (err) {\n destination.error(err);\n }\n finally {\n this.unsubscribe();\n }\n }\n : _super.prototype._complete;\n return _this;\n }\n OperatorSubscriber.prototype.unsubscribe = function () {\n var _a;\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n var closed_1 = this.closed;\n _super.prototype.unsubscribe.call(this);\n !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n }\n };\n return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","export var dateTimestampProvider = {\n now: function () {\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n return _super.call(this) || this;\n }\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n setInterval: function (handler, timeout) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var delegate = intervalProvider.delegate;\n if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n }\n return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n },\n clearInterval: function (handle) {\n var delegate = intervalProvider.delegate;\n return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n },\n delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n var _this = _super.call(this, scheduler, work) || this;\n _this.scheduler = scheduler;\n _this.work = work;\n _this.pending = false;\n return _this;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n var _a;\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n this.state = state;\n var id = this.id;\n var scheduler = this.scheduler;\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.pending = true;\n this.delay = delay;\n this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n if (delay === void 0) { delay = 0; }\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n return undefined;\n };\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, _delay) {\n var errored = false;\n var errorValue;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype.unsubscribe = function () {\n if (!this.closed) {\n var _a = this, id = _a.id, scheduler = _a.scheduler;\n var actions = scheduler.actions;\n this.work = this.state = this.scheduler = null;\n this.pending = false;\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n this.delay = null;\n _super.prototype.unsubscribe.call(this);\n }\n };\n return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n function Scheduler(schedulerActionCtor, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.schedulerActionCtor = schedulerActionCtor;\n this.now = now;\n }\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n };\n Scheduler.now = dateTimestampProvider.now;\n return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n var _this = _super.call(this, SchedulerAction, now) || this;\n _this.actions = [];\n _this._active = false;\n return _this;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this._active) {\n actions.push(action);\n return;\n }\n var error;\n this._active = true;\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()));\n this._active = false;\n if (error) {\n while ((action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { Observable } from '../Observable';\nexport var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });\nexport function empty(scheduler) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator';\n }\n return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n var reader, _a, value, done;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n reader = readableStream.getReader();\n _b.label = 1;\n case 1:\n _b.trys.push([1, , 9, 10]);\n _b.label = 2;\n case 2:\n if (!true) return [3, 8];\n return [4, __await(reader.read())];\n case 3:\n _a = _b.sent(), value = _a.value, done = _a.done;\n if (!done) return [3, 5];\n return [4, __await(void 0)];\n case 4: return [2, _b.sent()];\n case 5: return [4, __await(value)];\n case 6: return [4, _b.sent()];\n case 7:\n _b.sent();\n return [3, 2];\n case 8: return [3, 10];\n case 9:\n reader.releaseLock();\n return [7];\n case 10: return [2];\n }\n });\n });\n}\nexport function isReadableStreamLike(obj) {\n return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n if (input instanceof Observable) {\n return input;\n }\n if (input != null) {\n if (isInteropObservable(input)) {\n return fromInteropObservable(input);\n }\n if (isArrayLike(input)) {\n return fromArrayLike(input);\n }\n if (isPromise(input)) {\n return fromPromise(input);\n }\n if (isAsyncIterable(input)) {\n return fromAsyncIterable(input);\n }\n if (isIterable(input)) {\n return fromIterable(input);\n }\n if (isReadableStreamLike(input)) {\n return fromReadableStreamLike(input);\n }\n }\n throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n return new Observable(function (subscriber) {\n var obs = obj[Symbol_observable]();\n if (isFunction(obs.subscribe)) {\n return obs.subscribe(subscriber);\n }\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n });\n}\nexport function fromArrayLike(array) {\n return new Observable(function (subscriber) {\n for (var i = 0; i < array.length && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n });\n}\nexport function fromPromise(promise) {\n return new Observable(function (subscriber) {\n promise\n .then(function (value) {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) { return subscriber.error(err); })\n .then(null, reportUnhandledError);\n });\n}\nexport function fromIterable(iterable) {\n return new Observable(function (subscriber) {\n var e_1, _a;\n try {\n for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n var value = iterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriber.complete();\n });\n}\nexport function fromAsyncIterable(asyncIterable) {\n return new Observable(function (subscriber) {\n process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n });\n}\nexport function fromReadableStreamLike(readableStream) {\n return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n var asyncIterable_1, asyncIterable_1_1;\n var e_2, _a;\n return __awaiter(this, void 0, void 0, function () {\n var value, e_2_1;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 5, 6, 11]);\n asyncIterable_1 = __asyncValues(asyncIterable);\n _b.label = 1;\n case 1: return [4, asyncIterable_1.next()];\n case 2:\n if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n value = asyncIterable_1_1.value;\n subscriber.next(value);\n if (subscriber.closed) {\n return [2];\n }\n _b.label = 3;\n case 3: return [3, 1];\n case 4: return [3, 11];\n case 5:\n e_2_1 = _b.sent();\n e_2 = { error: e_2_1 };\n return [3, 11];\n case 6:\n _b.trys.push([6, , 9, 10]);\n if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n return [4, _a.call(asyncIterable_1)];\n case 7:\n _b.sent();\n _b.label = 8;\n case 8: return [3, 10];\n case 9:\n if (e_2) throw e_2.error;\n return [7];\n case 10: return [7];\n case 11:\n subscriber.complete();\n return [2];\n }\n });\n });\n}\n//# sourceMappingURL=innerFrom.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n if (delay === void 0) { delay = 0; }\n if (repeat === void 0) { repeat = false; }\n var scheduleSubscription = scheduler.schedule(function () {\n work();\n if (repeat) {\n parentSubscription.add(this.schedule(null, delay));\n }\n else {\n this.unsubscribe();\n }\n }, delay);\n parentSubscription.add(scheduleSubscription);\n if (!repeat) {\n return scheduleSubscription;\n }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { createErrorClass } from './createErrorClass';\nexport var EmptyError = createErrorClass(function (_super) {\n return function EmptyErrorImpl() {\n _super(this);\n this.name = 'EmptyError';\n this.message = 'no elements in sequence';\n };\n});\n//# sourceMappingURL=EmptyError.js.map","import { EmptyError } from './util/EmptyError';\nimport { SafeSubscriber } from './Subscriber';\nexport function firstValueFrom(source, config) {\n var hasConfig = typeof config === 'object';\n return new Promise(function (resolve, reject) {\n var subscriber = new SafeSubscriber({\n next: function (value) {\n resolve(value);\n subscriber.unsubscribe();\n },\n error: reject,\n complete: function () {\n if (hasConfig) {\n resolve(config.defaultValue);\n }\n else {\n reject(new EmptyError());\n }\n },\n });\n source.subscribe(subscriber);\n });\n}\n//# sourceMappingURL=firstValueFrom.js.map","export function isValidDate(value) {\n return value instanceof Date && !isNaN(value);\n}\n//# sourceMappingURL=isDate.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { isValidDate } from '../util/isDate';\nimport { operate } from '../util/lift';\nimport { innerFrom } from '../observable/innerFrom';\nimport { createErrorClass } from '../util/createErrorClass';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { executeSchedule } from '../util/executeSchedule';\nexport var TimeoutError = createErrorClass(function (_super) {\n return function TimeoutErrorImpl(info) {\n if (info === void 0) { info = null; }\n _super(this);\n this.message = 'Timeout has occurred';\n this.name = 'TimeoutError';\n this.info = info;\n };\n});\nexport function timeout(config, schedulerArg) {\n var _a = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;\n if (first == null && each == null) {\n throw new TypeError('No timeout provided.');\n }\n return operate(function (source, subscriber) {\n var originalSourceSubscription;\n var timerSubscription;\n var lastValue = null;\n var seen = 0;\n var startTimer = function (delay) {\n timerSubscription = executeSchedule(subscriber, scheduler, function () {\n try {\n originalSourceSubscription.unsubscribe();\n innerFrom(_with({\n meta: meta,\n lastValue: lastValue,\n seen: seen,\n })).subscribe(subscriber);\n }\n catch (err) {\n subscriber.error(err);\n }\n }, delay);\n };\n originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();\n seen++;\n subscriber.next((lastValue = value));\n each > 0 && startTimer(each);\n }, undefined, undefined, function () {\n if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {\n timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();\n }\n lastValue = null;\n }));\n !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);\n });\n}\nfunction timeoutErrorFactory(info) {\n throw new TimeoutError(info);\n}\n//# sourceMappingURL=timeout.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n subscriber.next(project.call(thisArg, value, index++));\n }));\n });\n}\n//# sourceMappingURL=map.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n return operate(function (source, subscriber) {\n var index = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n });\n}\n//# sourceMappingURL=filter.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function defaultIfEmpty(defaultValue) {\n return operate(function (source, subscriber) {\n var hasValue = false;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n hasValue = true;\n subscriber.next(value);\n }, function () {\n if (!hasValue) {\n subscriber.next(defaultValue);\n }\n subscriber.complete();\n }));\n });\n}\n//# sourceMappingURL=defaultIfEmpty.js.map","import { EMPTY } from '../observable/empty';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function take(count) {\n return count <= 0\n ?\n function () { return EMPTY; }\n : operate(function (source, subscriber) {\n var seen = 0;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n if (++seen <= count) {\n subscriber.next(value);\n if (count <= seen) {\n subscriber.complete();\n }\n }\n }));\n });\n}\n//# sourceMappingURL=take.js.map","import { EmptyError } from '../util/EmptyError';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function throwIfEmpty(errorFactory) {\n if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }\n return operate(function (source, subscriber) {\n var hasValue = false;\n source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n hasValue = true;\n subscriber.next(value);\n }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));\n });\n}\nfunction defaultErrorFactory() {\n return new EmptyError();\n}\n//# sourceMappingURL=throwIfEmpty.js.map","import { EmptyError } from '../util/EmptyError';\nimport { filter } from './filter';\nimport { take } from './take';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { throwIfEmpty } from './throwIfEmpty';\nimport { identity } from '../util/identity';\nexport function first(predicate, defaultValue) {\n var hasDefaultValue = arguments.length >= 2;\n return function (source) {\n return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));\n };\n}\n//# sourceMappingURL=first.js.map","import type {\n Agent,\n BaseEvent,\n BaseRecord,\n RecordDeletedEvent,\n RecordSavedEvent,\n RecordUpdatedEvent,\n} from '@credo-ts/core'\nimport type { Constructor } from '@credo-ts/core/build/utils/mixins'\n\nimport { RepositoryEventTypes } from '@credo-ts/core'\nimport { useMemo } from 'react'\nimport { filter, map, pipe } from 'rxjs'\n\n// BaseRecordAny makes sure we allow any type to be used for the generic\n// properties of the BaseRecord. The default BaseRecord type uses Empty objects\n// which means if you have a ConnectionRecord and BaseRecord with default properties\n// their types are incompatible.\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport type BaseRecordAny = BaseRecord<any, any, any>\ntype RecordClass<R extends BaseRecordAny> = Constructor<R> & { type: string }\nexport interface RecordsState<R extends BaseRecordAny> {\n loading: boolean\n records: R[]\n}\n\nexport const addRecord = <R extends BaseRecordAny>(record: R, state: RecordsState<R>): RecordsState<R> => {\n const newRecordsState = [...state.records]\n newRecordsState.unshift(record)\n return {\n loading: state.loading,\n records: newRecordsState,\n }\n}\n\nexport const updateRecord = <R extends BaseRecordAny>(record: R, state: RecordsState<R>): RecordsState<R> => {\n const newRecordsState = [...state.records]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n loading: state.loading,\n records: newRecordsState,\n }\n}\n\nexport const removeRecord = <R extends BaseRecordAny>(\n record: R | { id: string; type: R['type'] },\n state: RecordsState<R>\n): RecordsState<R> => {\n const newRecordsState = state.records.filter((r) => r.id !== record.id)\n return {\n loading: state.loading,\n records: newRecordsState,\n }\n}\n\nconst filterByType = <R extends BaseRecordAny>(recordClass: RecordClass<R>) => {\n return pipe(\n map((event: BaseEvent) => (event.payload as Record<string, R>).record),\n filter((record: R) => record.type === recordClass.type)\n )\n}\n\nexport const recordsAddedByType = <R extends BaseRecordAny>(agent: Agent | undefined, recordClass: RecordClass<R>) => {\n if (!agent) {\n throw new Error('Agent is required to check record type')\n }\n\n if (!recordClass) {\n throw new Error(\"The recordClass can't be undefined\")\n }\n\n return agent?.events.observable<RecordSavedEvent<R>>(RepositoryEventTypes.RecordSaved).pipe(filterByType(recordClass))\n}\n\nexport const recordsUpdatedByType = <R extends BaseRecordAny>(\n agent: Agent | undefined,\n recordClass: RecordClass<R>\n) => {\n if (!agent) {\n throw new Error('Agent is required to update record type')\n }\n\n if (!recordClass) {\n throw new Error(\"The recordClass can't be undefined\")\n }\n\n return agent?.events\n .observable<RecordUpdatedEvent<R>>(RepositoryEventTypes.RecordUpdated)\n .pipe(filterByType(recordClass))\n}\n\nexport const recordsRemovedByType = <R extends BaseRecordAny>(\n agent: Agent | undefined,\n recordClass: RecordClass<R>\n) => {\n if (!agent) {\n throw new Error('Agent is required to remove records by type')\n }\n\n if (!recordClass) {\n throw new Error(\"The recordClass can't be undefined\")\n }\n\n return agent?.events\n .observable<RecordDeletedEvent<R>>(RepositoryEventTypes.RecordDeleted)\n .pipe(filterByType(recordClass))\n}\n\nexport const isModuleRegistered = (agent: Agent, ModuleClass: Constructor) => {\n if (!agent) {\n throw new Error('Agent is required to check if a module is enabled')\n }\n\n const foundModule = Object.values(agent.dependencyManager.registeredModules).find(\n (module: unknown) => module instanceof ModuleClass\n )\n\n return foundModule !== undefined\n}\n\nexport const useIsModuleRegistered = (agent: Agent, ModuleClass: Constructor) => {\n return useMemo(() => isModuleRegistered(agent, ModuleClass), [agent, ModuleClass])\n}\n","import { type Agent, MdocRecord } from '@credo-ts/core'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport type * as React from 'react'\nimport { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from '../utils/records'\n\nexport { Mdoc, MdocRecord } from '@credo-ts/core'\n\ntype MdocRecordState = {\n mdocRecords: Array<MdocRecord>\n isLoading: boolean\n}\n\nconst addRecord = (record: MdocRecord, state: MdocRecordState): MdocRecordState => {\n const newRecordsState = [...state.mdocRecords]\n newRecordsState.unshift(record)\n return {\n isLoading: state.isLoading,\n mdocRecords: newRecordsState,\n }\n}\n\nconst updateRecord = (record: MdocRecord, state: MdocRecordState): MdocRecordState => {\n const newRecordsState = [...state.mdocRecords]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n isLoading: state.isLoading,\n mdocRecords: newRecordsState,\n }\n}\n\nconst removeRecord = (record: MdocRecord, state: MdocRecordState): MdocRecordState => {\n const newRecordsState = state.mdocRecords.filter((r) => r.id !== record.id)\n return {\n isLoading: state.isLoading,\n mdocRecords: newRecordsState,\n }\n}\n\nconst MdocRecordContext = createContext<MdocRecordState | undefined>(undefined)\n\nexport const useMdocRecords = (): MdocRecordState => {\n const mdocRecordContext = useContext(MdocRecordContext)\n if (!mdocRecordContext) {\n throw new Error('useMdocRecord must be used within a MdocRecordContextProvider')\n }\n\n return mdocRecordContext\n}\n\nexport const useMdocRecordById = (id: string): MdocRecord | undefined => {\n const { mdocRecords } = useMdocRecords()\n return mdocRecords.find((c) => c.id === id)\n}\n\ninterface Props {\n agent: Agent\n}\n\nexport const MdocRecordProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<MdocRecordState>({\n mdocRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n void agent.mdoc.getAll().then((mdocRecords) => setState({ mdocRecords, isLoading: false }))\n }, [agent.mdoc.getAll])\n\n useEffect(() => {\n if (!state.isLoading && agent) {\n const credentialAdded$ = recordsAddedByType(agent, MdocRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdate$ = recordsUpdatedByType(agent, MdocRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemove$ = recordsRemovedByType(agent, MdocRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$.unsubscribe()\n credentialUpdate$.unsubscribe()\n credentialRemove$.unsubscribe()\n }\n }\n }, [state, agent])\n\n return <MdocRecordContext.Provider value={state}>{children}</MdocRecordContext.Provider>\n}\n","import { type Agent, SdJwtVcRecord } from '@credo-ts/core'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from '../utils/records'\n\nexport { SdJwtVc, SdJwtVcRecord } from '@credo-ts/core'\n\ntype SdJwtVcRecordState = {\n sdJwtVcRecords: Array<SdJwtVcRecord>\n isLoading: boolean\n}\n\nconst addRecord = (record: SdJwtVcRecord, state: SdJwtVcRecordState): SdJwtVcRecordState => {\n const newRecordsState = [...state.sdJwtVcRecords]\n newRecordsState.unshift(record)\n return {\n isLoading: state.isLoading,\n sdJwtVcRecords: newRecordsState,\n }\n}\n\nconst updateRecord = (record: SdJwtVcRecord, state: SdJwtVcRecordState): SdJwtVcRecordState => {\n const newRecordsState = [...state.sdJwtVcRecords]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n isLoading: state.isLoading,\n sdJwtVcRecords: newRecordsState,\n }\n}\n\nconst removeRecord = (record: SdJwtVcRecord, state: SdJwtVcRecordState): SdJwtVcRecordState => {\n const newRecordsState = state.sdJwtVcRecords.filter((r) => r.id !== record.id)\n return {\n isLoading: state.isLoading,\n sdJwtVcRecords: newRecordsState,\n }\n}\n\nconst SdJwtVcRecordContext = createContext<SdJwtVcRecordState | undefined>(undefined)\n\nexport const useSdJwtVcRecords = (): SdJwtVcRecordState => {\n const sdJwtVcRecordContext = useContext(SdJwtVcRecordContext)\n if (!sdJwtVcRecordContext) {\n throw new Error('useSdJwtVcRecord must be used within a SdJwtVcRecordContextProvider')\n }\n\n return sdJwtVcRecordContext\n}\n\nexport const useSdJwtVcRecordById = (id: string): SdJwtVcRecord | undefined => {\n const { sdJwtVcRecords } = useSdJwtVcRecords()\n return sdJwtVcRecords.find((c) => c.id === id)\n}\n\ninterface Props {\n agent: Agent\n}\n\nexport const SdJwtVcRecordProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<SdJwtVcRecordState>({\n sdJwtVcRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n void agent.sdJwtVc.getAll().then((sdJwtVcRecords) => setState({ sdJwtVcRecords, isLoading: false }))\n }, [agent.sdJwtVc.getAll])\n\n useEffect(() => {\n if (!state.isLoading && agent) {\n const credentialAdded$ = recordsAddedByType(agent, SdJwtVcRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdate$ = recordsUpdatedByType(agent, SdJwtVcRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemove$ = recordsRemovedByType(agent, SdJwtVcRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$.unsubscribe()\n credentialUpdate$.unsubscribe()\n credentialRemove$.unsubscribe()\n }\n }\n }, [state, agent])\n\n return <SdJwtVcRecordContext.Provider value={state}>{children}</SdJwtVcRecordContext.Provider>\n}\n","import { type Agent, W3cCredentialRecord } from '@credo-ts/core'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from '../utils/records'\n\nexport { W3cCredentialRecord, W3cVerifiableCredential } from '@credo-ts/core'\n\ntype W3cCredentialRecordState = {\n w3cCredentialRecords: Array<W3cCredentialRecord>\n isLoading: boolean\n}\n\nconst addRecord = (record: W3cCredentialRecord, state: W3cCredentialRecordState): W3cCredentialRecordState => {\n const newRecordsState = [...state.w3cCredentialRecords]\n newRecordsState.unshift(record)\n return {\n isLoading: state.isLoading,\n w3cCredentialRecords: newRecordsState,\n }\n}\n\nconst updateRecord = (record: W3cCredentialRecord, state: W3cCredentialRecordState): W3cCredentialRecordState => {\n const newRecordsState = [...state.w3cCredentialRecords]\n const index = newRecordsState.findIndex((r) => r.id === record.id)\n if (index > -1) {\n newRecordsState[index] = record\n }\n return {\n isLoading: state.isLoading,\n w3cCredentialRecords: newRecordsState,\n }\n}\n\nconst removeRecord = (record: W3cCredentialRecord, state: W3cCredentialRecordState): W3cCredentialRecordState => {\n const newRecordsState = state.w3cCredentialRecords.filter((r) => r.id !== record.id)\n return {\n isLoading: state.isLoading,\n w3cCredentialRecords: newRecordsState,\n }\n}\n\nconst W3cCredentialRecordContext = createContext<W3cCredentialRecordState | undefined>(undefined)\n\nexport const useW3cCredentialRecords = (): W3cCredentialRecordState => {\n const w3cCredentialRecordContext = useContext(W3cCredentialRecordContext)\n if (!w3cCredentialRecordContext) {\n throw new Error('useW3cCredentialRecord must be used within a W3cCredentialRecordContextProvider')\n }\n\n return w3cCredentialRecordContext\n}\n\nexport const useW3cCredentialRecordById = (id: string): W3cCredentialRecord | undefined => {\n const { w3cCredentialRecords } = useW3cCredentialRecords()\n return w3cCredentialRecords.find((c) => c.id === id)\n}\n\ninterface Props {\n agent: Agent\n}\n\nexport const W3cCredentialRecordProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<W3cCredentialRecordState>({\n w3cCredentialRecords: [],\n isLoading: true,\n })\n\n useEffect(() => {\n void agent.w3cCredentials\n .getAllCredentialRecords()\n .then((w3cCredentialRecords) => setState({ w3cCredentialRecords, isLoading: false }))\n }, [agent])\n\n useEffect(() => {\n if (!state.isLoading && agent) {\n const credentialAdded$ = recordsAddedByType(agent, W3cCredentialRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdate$ = recordsUpdatedByType(agent, W3cCredentialRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemove$ = recordsRemovedByType(agent, W3cCredentialRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$.unsubscribe()\n credentialUpdate$.unsubscribe()\n credentialRemove$.unsubscribe()\n }\n }\n }, [state, agent])\n\n return <W3cCredentialRecordContext.Provider value={state}>{children}</W3cCredentialRecordContext.Provider>\n}\n","import { useMemo } from 'react'\nimport { type CredentialForDisplay, getCredentialForDisplay } from '../display/credential'\nimport type { CredentialCategoryMetadata } from '../metadata/credentials'\nimport { useMdocRecords } from '../providers/MdocProvider'\nimport { useSdJwtVcRecords } from '../providers/SdJwtVcProvider'\nimport { useW3cCredentialRecords } from '../providers/W3cCredentialsProvider'\n\nexport const useCredentials = ({\n removeCanonicalRecords = true,\n credentialCategory,\n}: {\n removeCanonicalRecords?: boolean\n credentialCategory?: CredentialCategoryMetadata['credentialCategory']\n} = {}) => {\n const { w3cCredentialRecords, isLoading: isLoadingW3c } = useW3cCredentialRecords()\n const { sdJwtVcRecords, isLoading: isLoadingSdJwt } = useSdJwtVcRecords()\n const { mdocRecords, isLoading: isLoadingMdoc } = useMdocRecords()\n\n const credentials = useMemo((): CredentialForDisplay[] => {\n // Map into common structure that can be rendered\n const uniformW3cCredentialRecords = w3cCredentialRecords.map(getCredentialForDisplay)\n const uniformSdJwtVcRecords = sdJwtVcRecords.map(getCredentialForDisplay)\n const uniformMdocRecords = mdocRecords.map(getCredentialForDisplay)\n\n const presentCategories = new Set<string>()\n\n const allRecords = [...uniformW3cCredentialRecords, ...uniformSdJwtVcRecords, ...uniformMdocRecords]\n\n // Make sure only one for each category is present\n const finalRecords =\n removeCanonicalRecords || credentialCategory\n ? allRecords.filter((record, index) => {\n if (credentialCategory && record.category?.credentialCategory !== credentialCategory) return false\n\n if (removeCanonicalRecords) {\n if (!record.category) return true\n if (presentCategories.has(record.category.credentialCategory)) return false\n\n const shouldAddForCategory =\n record.category.displayPriority ||\n allRecords\n .slice(index + 1)\n .find(\n (r) =>\n r.category?.credentialCategory === record.category?.credentialCategory &&\n r.category?.displayPriority\n ) === undefined\n\n if (shouldAddForCategory) {\n presentCategories.add(record.category.credentialCategory)\n return true\n }\n }\n\n return true\n })\n : allRecords\n\n // Sort by creation date\n const sortedRecords = finalRecords.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n\n return sortedRecords\n }, [w3cCredentialRecords, sdJwtVcRecords, mdocRecords, removeCanonicalRecords, credentialCategory])\n\n return {\n credentials,\n isLoading: isLoadingSdJwt || isLoadingW3c || isLoadingMdoc,\n }\n}\n","import { type ClaimFormat, MdocRecord, SdJwtVcRecord } from '@credo-ts/core'\nimport type { CredentialForDisplay } from '../display/credential'\nimport { useCredentials } from './useCredentials'\n\nexport function useCredentialByCategory(credentialCategory?: string) {\n if (!credentialCategory) {\n return {\n credentials: [],\n isLoading: false,\n } as const\n }\n\n const { isLoading, credentials } = useCredentials({\n removeCanonicalRecords: false,\n credentialCategory,\n })\n\n if (isLoading) {\n return {\n credentials: undefined,\n isLoading: true,\n } as const\n }\n\n const credential =\n credentials.find((c) => c.category?.displayPriority) ?? (credentials[0] as CredentialForDisplay | undefined)\n\n return {\n isLoading: false,\n credential,\n credentials,\n mdoc: credentials.find(\n (c): c is typeof c & { record: MdocRecord; claimFormat: ClaimFormat.MsoMdoc } => c.record instanceof MdocRecord\n ),\n sdJwt: credentials.find(\n (c): c is typeof c & { record: SdJwtVcRecord; claimFormat: ClaimFormat.SdJwtVc } =>\n c.record instanceof SdJwtVcRecord\n ),\n } as const\n}\n","import { useMemo } from 'react'\nimport { useCredentials } from './useCredentials'\n\nexport type CredentialId = `w3c-credential-${string}` | `sd-jwt-vc-${string}` | `mdoc-${string}`\n\nexport const useCredentialById = (credentialId: CredentialId) => {\n const { credentials, isLoading } = useCredentials({ removeCanonicalRecords: false })\n\n return {\n isLoading,\n credential: useMemo(() => credentials.find((c) => c.id === credentialId), [credentials, credentialId]),\n }\n}\n","import {\n DidJwk,\n DidKey,\n DidsApi,\n type JwkDidCreateOptions,\n KeyBackend,\n type KeyDidCreateOptions,\n getJwkFromKey,\n} from '@credo-ts/core'\nimport { type OpenId4VciCredentialBindingResolver, OpenId4VciCredentialFormatProfile } from '@credo-ts/openid4vc'\n\nexport function getCredentialBindingResolver({\n pidSchemes,\n requestBatch,\n}: {\n pidSchemes?: { sdJwtVcVcts: Array<string>; msoMdocDoctypes: Array<string> }\n requestBatch?: boolean | number\n}): OpenId4VciCredentialBindingResolver {\n return async ({\n supportedDidMethods,\n credentialConfiguration,\n issuerMaxBatchSize,\n proofTypes,\n supportsAllDidMethods,\n supportsJwk,\n credentialFormat,\n agentContext,\n }) => {\n // First, we try to pick a did method\n // Prefer did:jwk, otherwise use did:key, otherwise use undefined\n let didMethod: 'key' | 'jwk' | undefined =\n supportsAllDidMethods || supportedDidMethods?.includes('did:jwk')\n ? 'jwk'\n : supportedDidMethods?.includes('did:key')\n ? 'key'\n : undefined\n\n // If supportedDidMethods is undefined, and supportsJwk is false, we will default to did:key\n // this is important as part of MATTR launchpad support which MUST use did:key but doesn't\n // define which did methods they support\n if (!supportedDidMethods && !supportsJwk) {\n didMethod = 'key'\n }\n\n const shouldKeyBeHardwareBackedForMsoMdoc =\n credentialConfiguration?.format === OpenId4VciCredentialFormatProfile.MsoMdoc &&\n pidSchemes?.msoMdocDoctypes.includes(credentialConfiguration.doctype)\n\n const shouldKeyBeHardwareBackedForSdJwtVc =\n (credentialConfiguration?.format === 'vc+sd-jwt' || credentialConfiguration.format === 'dc+sd-jwt') &&\n pidSchemes?.sdJwtVcVcts.includes(credentialConfiguration.vct)\n\n const shouldKeyBeHardwareBacked = shouldKeyBeHardwareBackedForSdJwtVc || shouldKeyBeHardwareBackedForMsoMdoc\n\n // We don't want to request more than 10 credentials\n const batchSize =\n requestBatch === true\n ? Math.min(issuerMaxBatchSize, 10)\n : typeof requestBatch === 'number'\n ? Math.min(issuerMaxBatchSize, requestBatch)\n : 1\n\n // TODO: support key attestations\n if (!proofTypes.jwt || proofTypes.jwt.keyAttestationsRequired) {\n throw new Error('Unable to request credentials. Only jwt proof type without key attestations supported')\n }\n\n const keyType = proofTypes.jwt.supportedKeyTypes[0]\n const keys = await Promise.all(\n new Array(batchSize).fill(0).map(() =>\n agentContext.wallet.createKey({\n keyType,\n keyBackend: shouldKeyBeHardwareBacked ? KeyBackend.SecureElement : KeyBackend.Software,\n })\n )\n )\n\n if (didMethod) {\n const dm = didMethod\n const didsApi = agentContext.dependencyManager.resolve(DidsApi)\n const didResults = await Promise.all(\n keys.map(async (key) => {\n const didResult = await didsApi.create<JwkDidCreateOptions | KeyDidCreateOptions>({\n method: dm,\n options: {\n key,\n },\n })\n\n if (didResult.didState.state !== 'finished') {\n throw new Error('DID creation failed.')\n }\n\n let verificationMethodId: string\n if (didMethod === 'jwk') {\n const didJwk = DidJwk.fromDid(didResult.didState.did)\n verificationMethodId = didJwk.verificationMethodId\n } else {\n const didKey = DidKey.fromDid(didResult.didState.did)\n verificationMethodId = `${didKey.did}#${didKey.key.fingerprint}`\n }\n\n return verificationMethodId\n })\n )\n\n return {\n method: 'did',\n didUrls: didResults,\n }\n }\n\n // Otherwise we also support plain jwk for sd-jwt only\n if (\n supportsJwk &&\n (credentialFormat === OpenId4VciCredentialFormatProfile.SdJwtVc ||\n credentialFormat === OpenId4VciCredentialFormatProfile.SdJwtDc ||\n credentialFormat === OpenId4VciCredentialFormatProfile.MsoMdoc)\n ) {\n return {\n method: 'jwk',\n keys: keys.map((key) => getJwkFromKey(key)),\n }\n }\n\n throw new Error(\n `No supported binding method could be found. Supported methods are did:key and did:jwk, or plain jwk for sd-jwt/mdoc. Issuer supports ${\n supportsJwk ? 'jwk, ' : ''\n }${supportedDidMethods?.join(', ') ?? 'Unknown'}`\n )\n }\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport { getCredentialDisplayWithDefaults } from '@paradym/wallet-sdk/display/common'\nimport { getOpenId4VcCredentialDisplay } from '@paradym/wallet-sdk/display/openid4vc'\nimport { extractOpenId4VcCredentialMetadata } from '@paradym/wallet-sdk/metadata/credentials'\n\nexport const getCredentialDisplay = (resolvedCredentialOffer?: OpenId4VciResolvedCredentialOffer) => {\n // TODO: where to transform?\n // Combine oid4vci issuer metadata and openid fed into one pipeline. If openid it's trusted\n const issuerMetadata = resolvedCredentialOffer?.metadata.credentialIssuer\n // We want the first supported configuration id\n // TODO: handle empty configuration ids\n const configurationId = resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n const configuration = configurationId\n ? resolvedCredentialOffer?.offeredCredentialConfigurations[configurationId]\n : undefined\n\n const credentialDisplay = getCredentialDisplayWithDefaults(\n configuration && issuerMetadata\n ? getOpenId4VcCredentialDisplay(\n extractOpenId4VcCredentialMetadata(configuration, {\n display: issuerMetadata?.display,\n id: issuerMetadata?.credential_issuer,\n })\n )\n : {}\n )\n\n return credentialDisplay\n}\n","import { ClaimFormat, type DcqlQueryResult } from '@credo-ts/core'\nimport { getDisclosedAttributePathArrays } from '../display/common'\nimport { getCredentialForDisplay } from '../display/credential'\nimport { getAttributesAndMetadataForMdocPayload } from '../display/mdoc'\nimport { getAttributesAndMetadataForSdJwtPayload } from '../display/sdJwt'\nimport type {\n FormattedSubmission,\n FormattedSubmissionEntry,\n FormattedSubmissionEntrySatisfiedCredential,\n} from './submission'\n\nfunction extractCredentialPlaceholderFromQueryCredential(credential: DcqlQueryResult['credentials'][number]) {\n if (credential.format === 'mso_mdoc') {\n return {\n claimFormat: ClaimFormat.MsoMdoc,\n credentialName: credential.meta?.doctype_value ?? 'Unknown',\n requestedAttributePaths: credential.claims?.map((c) => ('path' in c ? [c.path[1]] : [c.claim_name])),\n }\n }\n\n if (credential.format === 'vc+sd-jwt' || credential.format === 'dc+sd-jwt') {\n return {\n claimFormat: ClaimFormat.SdJwtVc,\n credentialName: credential.meta?.vct_values?.[0].replace('https://', ''),\n requestedAttributePaths: credential.claims?.map((c) => c.path),\n }\n }\n\n return {\n claimFormat: ClaimFormat.JwtVc,\n requestedAttributePaths: credential.claims?.map((c) => c.path),\n }\n}\n\nexport function formatDcqlCredentialsForRequest(dcqlQueryResult: DcqlQueryResult): FormattedSubmission {\n const credentialSets: NonNullable<DcqlQueryResult['credential_sets']> = dcqlQueryResult.credential_sets ?? [\n // If no credential sets are defined we create a default one with just all the credential options\n {\n required: true,\n options: [dcqlQueryResult.credentials.map((c) => c.id)],\n matching_options: dcqlQueryResult.canBeSatisfied ? [dcqlQueryResult.credentials.map((c) => c.id)] : undefined,\n },\n ]\n\n const entries: FormattedSubmissionEntry[] = []\n for (const credentialSet of credentialSets) {\n // Take first matching option, otherwise take first option\n for (const credentialId of credentialSet.matching_options?.[0] ?? credentialSet.options[0]) {\n const match = dcqlQueryResult.credential_matches[credentialId]\n const queryCredential = dcqlQueryResult.credentials.find((c) => c.id === credentialId)\n if (!queryCredential) {\n throw new Error(`Credential '${credentialId}' not found in dcql query`)\n }\n\n if (!match || !match.success) {\n const placeholderCredential = extractCredentialPlaceholderFromQueryCredential(queryCredential)\n entries.push({\n isSatisfied: false,\n inputDescriptorId: credentialId,\n name: placeholderCredential.credentialName,\n requestedAttributePaths: placeholderCredential.requestedAttributePaths ?? [],\n })\n continue\n }\n\n const credentialForDisplay = getCredentialForDisplay(match.record)\n\n let disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']\n if (match.output.credential_format === 'vc+sd-jwt' || match.output.credential_format === 'dc+sd-jwt') {\n if (match.record.type !== 'SdJwtVcRecord') throw new Error('Expected SdJwtRecord')\n\n if (queryCredential.format !== 'vc+sd-jwt' && queryCredential.format !== 'dc+sd-jwt') {\n throw new Error(`Expected queryr credential format ${queryCredential.format} to be vc+sd-jwt or dc+sd-jwt`)\n }\n\n // Creod already applied selective disclosure on payload\n const { attributes, metadata } = getAttributesAndMetadataForSdJwtPayload(match.output.claims)\n disclosed = {\n attributes,\n metadata,\n paths: getDisclosedAttributePathArrays(attributes, 2),\n }\n } else if (match.output.credential_format === 'mso_mdoc') {\n if (match.record.type !== 'MdocRecord') throw new Error('Expected MdocRecord')\n\n // TODO: check if fixed now\n // FIXME: the disclosed payload here doesn't have the correct encoding anymore\n // once we serialize input??\n disclosed = {\n ...getAttributesAndMetadataForMdocPayload(match.output.namespaces, match.record.credential),\n paths: getDisclosedAttributePathArrays(match.output.namespaces, 2),\n }\n } else {\n if (match.record.type !== 'W3cCredentialRecord') throw new Error('Expected W3cCredentialRecord')\n\n // All paths disclosed for W3C\n disclosed = {\n attributes: credentialForDisplay.attributes,\n metadata: credentialForDisplay.metadata,\n paths: getDisclosedAttributePathArrays(credentialForDisplay.attributes, 2),\n }\n }\n\n entries.push({\n inputDescriptorId: credentialId,\n credentials: [\n {\n credential: credentialForDisplay,\n disclosed,\n },\n ],\n isSatisfied: true,\n name: credentialForDisplay.display.name,\n })\n }\n }\n\n return {\n areAllSatisfied: entries.every((entry) => entry.isSatisfied),\n purpose: credentialSets.map((s) => s.purpose).find((purpose): purpose is string => typeof purpose === 'string'),\n entries,\n }\n}\n","import { JSONPath } from '@astronautlabs/jsonpath'\nimport { ClaimFormat, type DifPexCredentialsForRequest, type DifPresentationExchangeDefinitionV2 } from '@credo-ts/core'\nimport { getDisclosedAttributePathArrays } from '../display/common'\nimport { getCredentialForDisplay } from '../display/credential'\nimport { getAttributesAndMetadataForMdocPayload } from '../display/mdoc'\nimport { getAttributesAndMetadataForSdJwtPayload } from '../display/sdJwt'\nimport type { NonEmptyArray } from '../types'\nimport type {\n FormattedSubmission,\n FormattedSubmissionEntry,\n FormattedSubmissionEntrySatisfiedCredential,\n} from './submission'\n\nfunction simplifyJsonPath(path: string, format?: ClaimFormat, filterKeys: string[] = []) {\n try {\n const parsedPath: Array<{\n scope: string\n operation: string\n expression: { type: string; value: string; [key: string]: unknown }\n }> = JSONPath.parse(path)\n\n if (!Array.isArray(parsedPath)) {\n return null\n }\n\n const simplified: Array<string | null> = []\n\n if (format === ClaimFormat.MsoMdoc) {\n if (parsedPath.length === 3) {\n simplified.push(parsedPath[2].expression.value)\n }\n } else {\n for (const entry of parsedPath) {\n // Skip entries we want to remove\n const value = entry.expression.value\n if (['vc', 'vp', 'credentialSubject'].includes(value)) {\n continue\n }\n\n // Remove root\n if (entry.expression.type === 'root') {\n continue\n }\n\n if (\n entry.expression.type === 'wildcard' ||\n (entry.expression.type === 'numeric_literal' && !Number.isNaN(value))\n ) {\n // Replace wildcards and numeric indices with null\n simplified.push(null)\n }\n\n if (entry.expression.type === 'identifier' || entry.expression.type === 'string_literal') {\n // Return the identifier value for normal entries\n simplified.push(value)\n }\n }\n }\n\n if (filterKeys.some((key) => simplified.includes(key))) {\n return null\n }\n\n return simplified\n } catch (error) {\n return null\n }\n}\n\nexport function formatDifPexCredentialsForRequest(\n credentialsForRequest: DifPexCredentialsForRequest,\n definition: DifPresentationExchangeDefinitionV2\n): FormattedSubmission {\n const entries = credentialsForRequest.requirements.flatMap((requirement) => {\n // We take the first needsCount entries. Even if not satisfied we will just show these first entries as missing (otherwise it becomes too complex)\n // If selection is possible they can choose alternatives within that (otherwise it becomes too complex)\n const submissionEntries = requirement.submissionEntry.slice(0, requirement.needsCount)\n\n return submissionEntries.map((submission): FormattedSubmissionEntry => {\n if (submission.verifiableCredentials.length >= 1) {\n return {\n inputDescriptorId: submission.inputDescriptorId,\n name: submission.name,\n description: submission.purpose,\n isSatisfied: true,\n credentials: submission.verifiableCredentials.map(\n (verifiableCredential): FormattedSubmissionEntrySatisfiedCredential => {\n const credentialForDisplay = getCredentialForDisplay(verifiableCredential.credentialRecord)\n\n // By default the whole credential is disclosed\n let disclosed: FormattedSubmissionEntrySatisfiedCredential['disclosed']\n if (verifiableCredential.claimFormat === ClaimFormat.SdJwtVc) {\n const { attributes, metadata } = getAttributesAndMetadataForSdJwtPayload(\n verifiableCredential.disclosedPayload\n )\n disclosed = {\n attributes,\n metadata,\n paths: getDisclosedAttributePathArrays(attributes, 2),\n }\n } else if (verifiableCredential.claimFormat === ClaimFormat.MsoMdoc) {\n disclosed = {\n ...getAttributesAndMetadataForMdocPayload(\n verifiableCredential.disclosedPayload,\n verifiableCredential.credentialRecord.credential\n ),\n paths: getDisclosedAttributePathArrays(verifiableCredential.disclosedPayload, 2),\n }\n } else {\n disclosed = {\n attributes: credentialForDisplay.attributes,\n metadata: credentialForDisplay.metadata,\n paths: getDisclosedAttributePathArrays(credentialForDisplay.attributes, 2),\n }\n }\n\n return {\n credential: credentialForDisplay,\n disclosed,\n }\n }\n ) as NonEmptyArray<FormattedSubmissionEntrySatisfiedCredential>,\n }\n }\n\n // Try to determine requested attributes for credential\n const inputDescriptor = definition.input_descriptors.find(({ id }) => id === submission.inputDescriptorId)\n const requestedAttributePaths =\n inputDescriptor?.constraints?.fields\n ?.map((a) =>\n simplifyJsonPath(a.path[0], inputDescriptor.format?.mso_mdoc ? ClaimFormat.MsoMdoc : undefined)?.filter(\n (entry): entry is string => entry !== null\n )\n )\n .filter((path): path is string[] => path !== undefined) ?? []\n\n const docType = inputDescriptor?.format?.mso_mdoc ? inputDescriptor.id : undefined\n const vctField = inputDescriptor?.format?.['vc+sd-jwt']\n ? inputDescriptor.constraints.fields?.find((field) => field.path.includes('$.vct'))\n : undefined\n const vct = (vctField?.filter?.const ?? vctField?.filter?.enum?.[0]) as string | undefined\n\n return {\n inputDescriptorId: submission.inputDescriptorId,\n name: requirement.name ?? docType ?? vct?.replace('https://', ''),\n description: requirement.purpose,\n isSatisfied: false,\n requestedAttributePaths: requestedAttributePaths,\n }\n })\n })\n\n return {\n areAllSatisfied: entries.every((entry) => entry.isSatisfied),\n name: credentialsForRequest.name,\n purpose: credentialsForRequest.purpose,\n entries,\n }\n}\n","import type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\n\nexport type GetTrustedEntitiesForDidOptions = {\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n}\n\nexport const getTrustedEntitiesForDid = async (options: GetTrustedEntitiesForDidOptions) => {\n const clientMetadata = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata\n const entityId = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_id\n const organizationName = clientMetadata?.client_name\n const logoUri = clientMetadata?.logo_uri\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n entityId,\n },\n trustedEntities: [],\n }\n}\n","import { X509Certificate, X509ModuleConfig } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '../../ParadymWalletSdk'\nimport type { TrustedEntity, X509TrustMechanismConfiguration } from '../trustMechanism'\n\nexport type TrustedX509Entity = {\n certificate: string\n name: string\n logoUri: string\n url: string\n demo?: boolean\n entityId: string\n}\n\nexport type GetTrustedEntitiesForX509CertificateOptions = {\n paradym: ParadymWalletSdk\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n trustMechanismConfiguration: X509TrustMechanismConfiguration\n walletTrustedEntity?: TrustedEntity\n}\n\nexport const getTrustedEntitiesForX509Certificate = async ({\n resolvedAuthorizationRequest,\n paradym,\n walletTrustedEntity,\n trustMechanismConfiguration,\n}: GetTrustedEntitiesForX509CertificateOptions) => {\n const trustedEntities: TrustedEntity[] = []\n let organizationName: string | undefined\n let logoUri: string | undefined\n const uri =\n typeof resolvedAuthorizationRequest.authorizationRequestPayload.response_uri === 'string'\n ? new URL(resolvedAuthorizationRequest.authorizationRequestPayload.response_uri).origin\n : undefined\n let entityId = resolvedAuthorizationRequest.authorizationRequestPayload.client_id\n\n const x509Config = paradym.agent.dependencyManager.resolve(X509ModuleConfig)\n const signer = resolvedAuthorizationRequest.signedAuthorizationRequest?.signer\n\n try {\n if (signer && signer.method === 'x5c') {\n // FIXME: we should return the x509 cert that was matched, then we can just see if it's in\n // the list of hardcoded trusted certificates\n const chain = await paradym.agent.x509\n .validateCertificateChain({\n certificateChain: signer.x5c,\n certificate: signer.x5c[0],\n trustedCertificates: x509Config.trustedCertificates,\n })\n .catch(() => null)\n\n const trustedEntity = chain\n ? trustMechanismConfiguration.trustedX509Entities.find((e) =>\n X509Certificate.fromEncodedCertificate(e.certificate).equal(chain[0])\n )\n : null\n if (trustedEntity) {\n organizationName = trustedEntity.name\n logoUri = trustedEntity.logoUri\n entityId = trustedEntity.entityId\n\n trustedEntities.push({\n entityId: trustedEntity.entityId,\n organizationName: trustedEntity.name,\n logoUri: trustedEntity.logoUri,\n uri: trustedEntity.url,\n demo: trustedEntity.demo,\n })\n\n if (walletTrustedEntity) trustedEntities.push(walletTrustedEntity)\n } else {\n organizationName = resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata?.client_name\n logoUri = resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata?.logo_uri\n }\n }\n } catch (error) {\n // no-op\n }\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n uri,\n entityId,\n },\n trustedEntities,\n }\n}\n","import { X509Certificate } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport type {\n AuthorizationRequestVerificationResult,\n EudiRpAuthenticationTrustMechanismConfiguration,\n TrustedEntity,\n} from '../trustMechanism'\nimport { type GetTrustedEntitiesForX509CertificateOptions, getTrustedEntitiesForX509Certificate } from './x509'\n\nexport type TrustList = TrustedEntity & {\n trustList: Array<TrustedEntity & { trustedRelyingPartyRegistrars: Array<TrustedEntity> }>\n}\n\nexport type GetTrustedEntitiesForEudiRpAuthenticationOptions = {\n paradym: ParadymWalletSdk\n authorizationRequestVerificationResult?: AuthorizationRequestVerificationResult\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n trustMechanismConfiguration: EudiRpAuthenticationTrustMechanismConfiguration\n}\n\nexport const getTrustedEntitiesForEudiRpAuthentication = async (\n options: GetTrustedEntitiesForEudiRpAuthenticationOptions\n) => {\n const trustedEntities: TrustedEntity[] = []\n let organizationName: string | undefined\n let logoUri: string | undefined\n let uri: string | undefined\n let entityId: string | undefined\n\n // We can take the first entry as it only allows 1 entry for now\n // This is the certificate of the relying party\n const [entry] = options.authorizationRequestVerificationResult ?? []\n\n const matchedCert = options.trustMechanismConfiguration.trustedX509Entities.find(\n (t) => X509Certificate.fromEncodedCertificate(t.certificate).subject === entry.x509RegistrationCertificate.issuer\n )\n\n if (matchedCert) {\n const dnsName = entry.x509RegistrationCertificate.sanDnsNames[0]\n const uriName = entry.x509RegistrationCertificate.sanUriNames[0]\n\n organizationName = dnsName\n logoUri = matchedCert.logoUri\n uri = uriName\n entityId = dnsName\n\n // FIXME: why do we match the SAN dnsName of the registration certificate\n // to the entity-id of the trusted relying party? Shouldn't it be the IAN\n const country = options.trustMechanismConfiguration.trustList.trustList.find(({ trustedRelyingPartyRegistrars }) =>\n trustedRelyingPartyRegistrars.some((rpr) => rpr.entityId === dnsName)\n )\n\n if (country) {\n const registrar = country.trustedRelyingPartyRegistrars.find((rpr) => rpr.entityId === dnsName) as TrustedEntity\n trustedEntities.push(registrar)\n trustedEntities.push(country)\n trustedEntities.push(options.trustMechanismConfiguration.trustList)\n }\n }\n\n // Casting works here as eudi_rp_authentication trust mechanism configuration extends\n // x509 trust mechanism configuration\n const { trustedEntities: x509TrustedEntities, relyingParty } = await getTrustedEntitiesForX509Certificate(\n options as unknown as GetTrustedEntitiesForX509CertificateOptions\n )\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n uri,\n entityId: entityId ?? relyingParty.entityId,\n },\n trustedEntities: [...x509TrustedEntities, ...trustedEntities],\n }\n}\n","import type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport type { OpenIdFederationTrustMechanismConfiguration } from '../trustMechanism'\n\nexport type GetTrustedEntitiesForOpenIdFederationOptions = {\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n paradym: ParadymWalletSdk\n origin?: string\n trustMechanismConfiguration: OpenIdFederationTrustMechanismConfiguration\n}\n\nexport const getTrustedEntitiesForOpenIdFederation = async (options: GetTrustedEntitiesForOpenIdFederationOptions) => {\n const clientMetadata = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_metadata\n const entityId = options.resolvedAuthorizationRequest.authorizationRequestPayload.client_id\n const organizationName = clientMetadata?.client_name\n const logoUri = clientMetadata?.logo_uri\n\n const resolvedChains = entityId\n ? await options.paradym.agent.modules.openId4VcHolder.resolveOpenIdFederationChains({\n entityId,\n trustAnchorEntityIds: options.trustMechanismConfiguration.trustedEntityIds as [string, ...string[]],\n })\n : undefined\n\n const uri =\n typeof options.resolvedAuthorizationRequest.authorizationRequestPayload.response_uri === 'string'\n ? new URL(options.resolvedAuthorizationRequest.authorizationRequestPayload.response_uri).origin\n : undefined\n\n const trustedEntities =\n resolvedChains\n ?.map((chain) => ({\n entityId: chain.trustAnchorEntityConfiguration.sub,\n organizationName:\n chain.trustAnchorEntityConfiguration.metadata?.federation_entity?.organization_name ?? 'Unknown organization',\n logoUri: chain.trustAnchorEntityConfiguration.metadata?.federation_entity?.logo_uri,\n }))\n .filter((entity, index, self) => self.findIndex((e) => e.entityId === entity.entityId) === index) ?? []\n\n return {\n relyingParty: {\n organizationName,\n logoUri,\n entityId,\n uri,\n },\n trustedEntities,\n }\n}\n","import type { X509Certificate } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { type GetTrustedEntitiesForDidOptions, getTrustedEntitiesForDid } from './handlers/did'\nimport {\n type GetTrustedEntitiesForEudiRpAuthenticationOptions,\n type TrustList,\n getTrustedEntitiesForEudiRpAuthentication,\n} from './handlers/eudiRpAuthentication'\nimport {\n type GetTrustedEntitiesForOpenIdFederationOptions,\n getTrustedEntitiesForOpenIdFederation,\n} from './handlers/openIdFederation'\nimport {\n type GetTrustedEntitiesForX509CertificateOptions,\n type TrustedX509Entity,\n getTrustedEntitiesForX509Certificate,\n} from './handlers/x509'\n\nexport type TrustedEntity = {\n entityId: string\n organizationName: string\n logoUri?: string\n uri?: string\n demo?: boolean\n}\n\nexport type TrustMechanism = 'eudi_rp_authentication' | 'openid_federation' | 'x509' | 'did'\n\nexport type EudiRpAuthenticationTrustMechanismConfiguration = {\n trustMechanism: 'eudi_rp_authentication'\n trustList: TrustList\n trustedX509Entities: TrustedX509Entity[]\n}\n\nexport type OpenIdFederationTrustMechanismConfiguration = {\n trustMechanism: 'openid_federation'\n trustedEntityIds: string[]\n}\n\nexport type X509TrustMechanismConfiguration = {\n trustMechanism: 'x509'\n trustedX509Entities: TrustedX509Entity[]\n}\n\nexport type DidTrustMechanismConfiguration = {\n trustMechanism: 'did'\n}\n\nexport type TrustMechanismConfiguration =\n | EudiRpAuthenticationTrustMechanismConfiguration\n | OpenIdFederationTrustMechanismConfiguration\n | X509TrustMechanismConfiguration\n | DidTrustMechanismConfiguration\n\nexport type AuthorizationRequestVerificationResult = {\n isValidButUntrusted: boolean\n isValidAndTrusted: boolean\n x509RegistrationCertificate: X509Certificate\n}[]\n\nexport type GetTrustedEntitiesOptions = Omit<\n { paradym: ParadymWalletSdk } & GetTrustedEntitiesForEudiRpAuthenticationOptions &\n GetTrustedEntitiesForOpenIdFederationOptions &\n GetTrustedEntitiesForDidOptions &\n GetTrustedEntitiesForX509CertificateOptions,\n 'trustMechanismConfiguration'\n>\n\nexport const detectTrustMechanism = (options: {\n resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest\n authorizationRequestVerificationResult?: AuthorizationRequestVerificationResult\n}): TrustMechanism => {\n if (options.authorizationRequestVerificationResult && options.authorizationRequestVerificationResult.length > 0) {\n return 'eudi_rp_authentication'\n }\n\n if (options.resolvedAuthorizationRequest.verifier.clientIdScheme === 'https') {\n return 'openid_federation'\n }\n\n if (options.resolvedAuthorizationRequest.signedAuthorizationRequest?.signer.method === 'x5c') {\n return 'x509'\n }\n\n if (options.resolvedAuthorizationRequest.verifier.clientIdScheme === 'did') {\n return 'did'\n }\n\n throw new Error('Could not infer trust mechanism for authorization request')\n}\n\nexport const getTrustedEntities = async (\n options: GetTrustedEntitiesOptions\n): Promise<{\n trustMechanism: TrustMechanism\n relyingParty: { logoUri?: string; uri?: string; organizationName?: string; entityId: string }\n trustedEntities: Array<TrustedEntity>\n}> => {\n const trustMechanism = detectTrustMechanism(options)\n\n const trustMechanismConfiguration = options.paradym.trustMechanisms.find((tm) => tm.trustMechanism === trustMechanism)\n\n // TODO(sdk): what do we want to do when a trust mechanism is used, but not configured? Ignore or error?\n if (!trustMechanismConfiguration) {\n throw new Error(`Found '${trustMechanism}', but without any configuration`)\n }\n\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n let trustedEntities\n switch (trustMechanism) {\n case 'eudi_rp_authentication':\n trustedEntities = await getTrustedEntitiesForEudiRpAuthentication({\n ...options,\n trustMechanismConfiguration: trustMechanismConfiguration as EudiRpAuthenticationTrustMechanismConfiguration,\n })\n break\n case 'openid_federation':\n trustedEntities = await getTrustedEntitiesForOpenIdFederation({\n ...options,\n trustMechanismConfiguration: trustMechanismConfiguration as OpenIdFederationTrustMechanismConfiguration,\n })\n break\n case 'x509':\n trustedEntities = await getTrustedEntitiesForX509Certificate({\n ...options,\n trustMechanismConfiguration: trustMechanismConfiguration as X509TrustMechanismConfiguration,\n })\n break\n case 'did':\n trustedEntities = await getTrustedEntitiesForDid(options)\n break\n default:\n throw new Error(`Could not handle trust mechanism: '${trustMechanism}'`)\n }\n\n let entityId = trustedEntities.relyingParty.entityId\n if (!entityId) {\n if (options.origin) entityId = `web-origin:${options.origin}`\n throw new Error('Missing required client_id in authorization request')\n }\n\n return {\n ...trustedEntities,\n trustMechanism,\n relyingParty: {\n ...trustedEntities.relyingParty,\n entityId,\n },\n }\n}\n","import { verifyOpenid4VpAuthorizationRequest } from '@animo-id/eudi-wallet-functionality'\nimport { type DifPresentationExchangeDefinitionV2, Jwt } from '@credo-ts/core'\nimport { getOpenid4vpClientId } from '@openid4vc/openid4vp'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { ParadymWalletNoRequestToResolveError } from '../error'\nimport { formatDcqlCredentialsForRequest } from '../format/dcqlRequest'\nimport { formatDifPexCredentialsForRequest } from '../format/presentationExchangeRequest'\nimport type { FormattedSubmission } from '../format/submission'\nimport { getTrustedEntities } from '../trust/trustMechanism'\n\nexport type GetCredentialsForProofRequestOptions = {\n paradym: ParadymWalletSdk\n requestPayload?: Record<string, unknown>\n uri?: string\n allowUntrusted?: boolean\n origin?: string\n}\n\nconst extractEntityIdFromPayload = (payload: Record<string, unknown>, origin?: string): string | null => {\n const { clientId, clientIdScheme } = getOpenid4vpClientId({\n clientId: payload.client_id as string,\n legacyClientIdScheme: payload.client_id_scheme,\n responseMode: payload.response_mode,\n origin,\n })\n\n if (clientIdScheme === 'https') return clientId\n return null\n}\n\nconst extractEntityIdFromJwt = (jwt: string, origin?: string): string | null => {\n const jwtPayload = Jwt.fromSerializedJwt(jwt).payload\n\n return extractEntityIdFromPayload(jwtPayload.additionalClaims, origin)\n}\n\nexport const getCredentialsForProofRequest = async ({\n paradym,\n uri,\n allowUntrusted = true,\n requestPayload,\n origin,\n}: GetCredentialsForProofRequestOptions) => {\n const requestToResolve = uri ?? requestPayload\n\n if (!requestToResolve) {\n throw new ParadymWalletNoRequestToResolveError(\n 'Either supply a uri or requestPayload to get the credentials for a proof request'\n )\n }\n\n const resolved = await paradym.agent.modules.openId4VcHolder.resolveOpenId4VpAuthorizationRequest(requestToResolve, {\n origin,\n trustedFederationEntityIds: paradym.trustMechanisms.find((tm) => tm.trustMechanism === 'openid_federation')\n ?.trustedEntityIds,\n })\n\n // TODO(sdk): will this still work if no eudi is used?\n const authorizationRequestVerificationResult = await verifyOpenid4VpAuthorizationRequest(paradym.agent.context, {\n resolvedAuthorizationRequest: resolved,\n allowUntrustedSigned: allowUntrusted,\n })\n\n // TODO(sdk): wallet trusted entity, how to manage this?\n const { trustMechanism, trustedEntities, relyingParty } = await getTrustedEntities({\n paradym,\n resolvedAuthorizationRequest: resolved,\n origin,\n authorizationRequestVerificationResult,\n })\n\n let formattedSubmission: FormattedSubmission\n if (resolved.presentationExchange) {\n formattedSubmission = formatDifPexCredentialsForRequest(\n resolved.presentationExchange.credentialsForRequest,\n resolved.presentationExchange.definition as DifPresentationExchangeDefinitionV2\n )\n } else if (resolved.dcql) {\n formattedSubmission = formatDcqlCredentialsForRequest(resolved.dcql.queryResult)\n } else {\n throw new Error('No presentation exchange or dcql found in authorization request.')\n }\n\n return {\n ...resolved.presentationExchange,\n ...resolved.dcql,\n origin,\n authorizationRequest: resolved.authorizationRequestPayload,\n formattedSubmission,\n transactionData: resolved.transactionData,\n trustMechanism,\n verifier: {\n hostName: relyingParty.uri,\n entityId: relyingParty.entityId,\n logo: relyingParty.logoUri\n ? {\n url: relyingParty.logoUri,\n }\n : undefined,\n name: relyingParty.organizationName,\n trustedEntities,\n },\n } as const\n}\n\nexport type CredentialsForProofRequest = Awaited<ReturnType<typeof getCredentialsForProofRequest>>\n","import {\n ClaimFormat,\n MdocRecord,\n SdJwtVcRecord,\n type VerifiableCredential,\n W3cCredentialRecord,\n W3cJsonLdVerifiableCredential,\n W3cJwtVerifiableCredential,\n type W3cVerifiableCredential,\n} from '@credo-ts/core'\n\nexport function decodeW3cCredential(credential: Record<string, unknown> | string): W3cVerifiableCredential {\n return typeof credential === 'string'\n ? W3cJwtVerifiableCredential.fromSerializedJwt(credential)\n : W3cJsonLdVerifiableCredential.fromJson(credential)\n}\n\nexport function encodeCredential(credential: VerifiableCredential): Record<string, unknown> | string {\n return credential.encoded\n}\n\nexport function credentialRecordFromCredential(credential: VerifiableCredential) {\n if (credential.claimFormat === ClaimFormat.SdJwtVc) {\n return new SdJwtVcRecord({\n compactSdJwtVc: credential.compact,\n typeMetadata: credential.typeMetadata,\n })\n }\n\n if (credential.claimFormat === ClaimFormat.MsoMdoc) {\n return new MdocRecord({\n mdoc: credential,\n })\n }\n\n return new W3cCredentialRecord({\n credential,\n // We don't support expanded types right now, but would become problem when we support JSON-LD\n tags: {},\n })\n}\n","import { V1OfferCredentialMessage, V1RequestPresentationMessage } from '@credo-ts/anoncreds'\nimport { JwaSignatureAlgorithm } from '@credo-ts/core'\nimport {\n type ConnectionRecord,\n CredentialEventTypes,\n CredentialState,\n type CredentialStateChangedEvent,\n type OutOfBandInvitation,\n type OutOfBandRecord,\n OutOfBandRepository,\n type PlaintextMessage,\n ProofEventTypes,\n ProofState,\n type ProofStateChangedEvent,\n V2OfferCredentialMessage,\n V2RequestPresentationMessage,\n parseMessageType,\n} from '@credo-ts/didcomm'\nimport { supportsIncomingMessageType } from '@credo-ts/didcomm/build/util/messageType'\nimport {\n OpenId4VciAuthorizationFlow,\n type OpenId4VciCredentialConfigurationSupportedWithFormats,\n type OpenId4VciRequestTokenResponse,\n type OpenId4VciResolvedAuthorizationRequest,\n type OpenId4VciResolvedCredentialOffer,\n getOfferedCredentials,\n getScopesFromCredentialConfigurationsSupported,\n} from '@credo-ts/openid4vc'\nimport { type Observable, filter, first, firstValueFrom, timeout } from 'rxjs'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { DidCommAgent, OpenId4VcAgent } from '../agent'\nimport type { CredentialDisplay } from '../display/credential'\nimport {\n ParadymWalletInvitationAlreadyUsedError,\n ParadymWalletInvitationDidcommUnsupportedProtocolError,\n ParadymWalletInvitationError,\n ParadymWalletInvitationMultipleRequestsError,\n ParadymWalletInvitationParseError,\n ParadymWalletInvitationReceiveError,\n} from '../error'\nimport {\n extractOpenId4VcCredentialMetadata,\n setBatchCredentialMetadata,\n setOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { getCredentialBindingResolver } from '../openid4vc/credentialBindingResolver'\nimport { getCredentialDisplay } from '../openid4vc/func/getCredentialDisplay'\nimport {\n type CredentialsForProofRequest,\n getCredentialsForProofRequest,\n} from '../openid4vc/getCredentialsForProofRequest'\nimport { credentialRecordFromCredential, encodeCredential } from '../utils/encoding'\n\nexport type AcceptOutOfBandInvitationResult<FlowType extends 'issue' | 'verify' | 'connect'> = Promise<\n FlowType extends 'issue'\n ? { flowType: 'issue'; credentialExchangeId: string; connectionId?: string }\n : FlowType extends 'verify'\n ? { flowType: 'verify'; proofExchangeId: string; connectionId?: string }\n : FlowType extends 'connect'\n ? { flowType: 'connect'; connectionId: string }\n : never\n>\n\nexport type ResolveOutOfBandInvitationResult = {\n outOfBandInvitation: OutOfBandInvitation\n\n /**\n * Whether an existing connection already exists based on this invitation\n */\n existingConnection?: ConnectionRecord\n\n /**\n * Whether a connection will be created as part of the exchange.\n *\n * When `existingConnection` is defined this will always be `false` as\n * the existing connection will be reused.\n *\n * If `createConnection` is `false` and `existingConnection` is undefined\n * it means the exchange will be connectionless.\n */\n createConnection: boolean\n\n /**\n * The flow type as indicated by the invitation.\n *\n * - `issue` when the goal code indicates the goal of the invitation is to issue, or a credential offer is attached\n * - `verify` when the goal code indicates the goal of the invittion is to verify, or a presentation request is attached\n * - `connect` in all other cases\n */\n flowType: 'issue' | 'verify' | 'connect'\n}\n\nexport type ResolveCredentialOfferOptions = {\n paradym: ParadymWalletSdk\n offer: { uri: string }\n authorization?: { clientId: string; redirectUri: string }\n fetchAuthorization?: boolean\n}\n\n// TODO: export from openid4vc\nexport type TransactionCodeInfo = {\n description?: string\n length?: number\n input_mode?: 'numeric' | 'text'\n}\n\ntype OpenId4VciResolvedAuthRequestPresentationDuringIssuance = Extract<\n OpenId4VciResolvedAuthorizationRequest,\n { authorizationFlow: OpenId4VciAuthorizationFlow.PresentationDuringIssuance }\n>\n\ntype OpenId4VciResolvedAuthRequestOauth2Redirect = Extract<\n OpenId4VciResolvedAuthorizationRequest,\n { authorizationFlow: OpenId4VciAuthorizationFlow.Oauth2Redirect }\n>\n\ntype ResolveCredentialOfferPreAuthReturn = {\n flow: 'pre-auth'\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n credentialDisplay: CredentialDisplay\n}\n\ntype ResolveCredentialOfferPreAuthWithTxCodeReturn = {\n flow: 'pre-auth-with-tx-code'\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n credentialDisplay: CredentialDisplay\n txCodeInfo: {\n description?: string\n length?: number\n input_mode?: 'numeric' | 'text'\n }\n}\n\ntype ResolveCredentialOfferAuthReturn = {\n flow: 'auth'\n credentialDisplay: CredentialDisplay\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n resolvedAuthorizationRequest: OpenId4VciResolvedAuthRequestOauth2Redirect\n}\n\ntype ResolveCredentialOfferAuthPresentationDuringIssuanceReturn = {\n flow: 'auth-presentation-during-issuance'\n credentialDisplay: CredentialDisplay\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n resolvedAuthorizationRequest: OpenId4VciResolvedAuthRequestPresentationDuringIssuance\n credentialsForProofRequest: CredentialsForProofRequest\n}\n\nexport type ResolveCredentialOfferReturn =\n | ResolveCredentialOfferPreAuthReturn\n | ResolveCredentialOfferPreAuthWithTxCodeReturn\n | ResolveCredentialOfferAuthReturn\n | ResolveCredentialOfferAuthPresentationDuringIssuanceReturn\n\nexport async function resolveCredentialOffer({\n paradym,\n offer,\n authorization,\n fetchAuthorization = true,\n}: ResolveCredentialOfferOptions): Promise<ResolveCredentialOfferReturn> {\n paradym.logger.info(`Receiving openid uri ${offer.uri}`, {\n uri: offer.uri,\n })\n\n const resolvedCredentialOffer = await paradym.agent.modules.openId4VcHolder.resolveCredentialOffer(offer.uri)\n let resolvedAuthorizationRequest: OpenId4VciResolvedAuthorizationRequest | undefined = undefined\n\n const preAuthGrant =\n resolvedCredentialOffer.credentialOfferPayload.grants?.['urn:ietf:params:oauth:grant-type:pre-authorized_code']\n\n const txCodeInfo = preAuthGrant?.tx_code\n\n const credentialDisplay = getCredentialDisplay(resolvedCredentialOffer)\n\n if (preAuthGrant) {\n if (txCodeInfo) {\n return {\n flow: 'pre-auth-with-tx-code',\n credentialDisplay,\n resolvedCredentialOffer,\n txCodeInfo,\n }\n }\n return {\n flow: 'pre-auth',\n credentialDisplay,\n resolvedCredentialOffer,\n }\n }\n\n // NOTE: we always assume scopes are used at the moment\n if (fetchAuthorization && resolvedCredentialOffer.credentialOfferPayload.grants?.authorization_code) {\n // If only authorization_code grant is valid and user didn't provide authorization details we can't continue\n if (!authorization) {\n throw new Error(\n \"Missing 'authorization' parameter with 'clientId' and 'redirectUri' and authorization code flow is only allowed grant type on offer.\"\n )\n }\n\n // TODO: authorization should only be initiated after we know which credentials we're going to request\n resolvedAuthorizationRequest = await paradym.agent.modules.openId4VcHolder.resolveOpenId4VciAuthorizationRequest(\n resolvedCredentialOffer,\n {\n redirectUri: authorization.redirectUri,\n clientId: authorization.clientId,\n scope: getScopesFromCredentialConfigurationsSupported(resolvedCredentialOffer.offeredCredentialConfigurations),\n }\n )\n\n if (resolvedAuthorizationRequest.authorizationFlow === OpenId4VciAuthorizationFlow.PresentationDuringIssuance) {\n const credentialsForProofRequest = await getCredentialsForProofRequest({\n paradym,\n uri: resolvedAuthorizationRequest.openid4vpRequestUrl,\n })\n\n return {\n flow: 'auth-presentation-during-issuance',\n credentialDisplay,\n resolvedCredentialOffer,\n resolvedAuthorizationRequest,\n credentialsForProofRequest,\n }\n }\n\n return {\n flow: 'auth',\n credentialDisplay,\n resolvedCredentialOffer,\n resolvedAuthorizationRequest,\n }\n }\n\n throw new Error(\n `Unable to determine whether it is the auth of pre-auth flow with the following grants: [${Object.keys(resolvedCredentialOffer.credentialOfferPayload.grants ?? {}).join(', ')}]`\n )\n}\n\nexport async function acquirePreAuthorizedAccessToken({\n agent,\n resolvedCredentialOffer,\n txCode,\n}: {\n agent: OpenId4VcAgent\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n txCode?: string\n}) {\n return await agent.modules.openId4VcHolder.requestToken({\n resolvedCredentialOffer,\n txCode,\n })\n}\n\n/**\n *\n * @todo how do we want to deal with the `pid` credential here?\n *\n */\nexport const receiveCredentialFromOpenId4VciOffer = async ({\n agent,\n resolvedCredentialOffer,\n credentialConfigurationIdsToRequest,\n accessToken,\n clientId,\n pidSchemes,\n requestBatch,\n}: {\n agent: OpenId4VcAgent\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n credentialConfigurationIdsToRequest?: string[]\n clientId?: string\n pidSchemes?: { sdJwtVcVcts: Array<string>; msoMdocDoctypes: Array<string> }\n requestBatch?: boolean | number\n\n // TODO: cNonce should maybe be provided separately (multiple calls can have different c_nonce values)\n accessToken: OpenId4VciRequestTokenResponse\n}) => {\n const offeredCredentialsToRequest = getOfferedCredentials(\n credentialConfigurationIdsToRequest ?? [\n resolvedCredentialOffer.credentialOfferPayload.credential_configuration_ids[0],\n ],\n resolvedCredentialOffer.offeredCredentialConfigurations\n ) as OpenId4VciCredentialConfigurationSupportedWithFormats\n\n if (Object.keys(offeredCredentialsToRequest).length === 0) {\n throw new Error(\n `Parameter 'credentialConfigurationIdsToRequest' with values ${credentialConfigurationIdsToRequest} is not a credential_configuration_id in the credential offer.`\n )\n }\n\n const credentials = await agent.modules.openId4VcHolder.requestCredentials({\n resolvedCredentialOffer,\n ...accessToken,\n clientId,\n credentialConfigurationIds: Object.keys(offeredCredentialsToRequest),\n verifyCredentialStatus: false,\n allowedProofOfPossessionSignatureAlgorithms: [JwaSignatureAlgorithm.ES256, JwaSignatureAlgorithm.EdDSA],\n credentialBindingResolver: getCredentialBindingResolver({\n pidSchemes,\n requestBatch,\n }),\n })\n\n return credentials.credentials.map(({ credentials, ...credentialResponse }) => {\n const configuration = resolvedCredentialOffer.offeredCredentialConfigurations[\n credentialResponse.credentialConfigurationId\n ] as OpenId4VciCredentialConfigurationSupportedWithFormats\n\n const firstCredential = credentials[0]\n\n const record = credentialRecordFromCredential(firstCredential)\n\n // OpenID4VC metadata\n const openId4VcMetadata = extractOpenId4VcCredentialMetadata(configuration, {\n id: resolvedCredentialOffer.metadata.credentialIssuer.credential_issuer,\n display: resolvedCredentialOffer.metadata.credentialIssuer.display,\n })\n setOpenId4VcCredentialMetadata(record, openId4VcMetadata)\n\n // Batch metadata\n if (credentials.length > 1) {\n setBatchCredentialMetadata(record, {\n additionalCredentials: credentials.slice(1).map(encodeCredential) as\n | Array<string>\n | Array<Record<string, unknown>>,\n })\n }\n\n return {\n ...credentialResponse,\n configuration,\n credential: record,\n }\n })\n}\n\nexport async function resolveOutOfBandInvitation(\n agent: DidCommAgent,\n invitation: OutOfBandInvitation\n): Promise<ResolveOutOfBandInvitationResult> {\n const requestMessages = invitation.getRequests() ?? []\n\n let flowType: 'issue' | 'verify' | 'connect'\n\n if (requestMessages.length > 1) {\n const message = 'Message contains multiple requests. Invitation should only contain a single request.'\n agent.config.logger.error(message)\n throw new ParadymWalletInvitationMultipleRequestsError(message)\n }\n\n // In this case we probably need to create a connection first. We will do this here, as we don't allow to just\n // create a connection\n if (requestMessages.length === 0) {\n if (!invitation.handshakeProtocols || invitation.handshakeProtocols.length === 0) {\n const message = 'No requests and no handshake protocols found in invitation.'\n agent.config.logger.error(message)\n throw new ParadymWalletInvitationParseError(message)\n }\n\n if (invitation.goalCode === 'issue-vc' || invitation.goalCode === 'aries.vc.issue') {\n flowType = 'issue'\n } else if (invitation.goalCode === 'request-proof' || invitation.goalCode === 'aries.vc.verify') {\n flowType = 'verify'\n } else {\n flowType = 'connect'\n }\n }\n // Validate the type of the request message\n else {\n const requestMessage = requestMessages[0] as PlaintextMessage\n const parsedMessageType = parseMessageType(requestMessage['@type'])\n const isValidOfferMessage =\n supportsIncomingMessageType(parsedMessageType, V1OfferCredentialMessage.type) ||\n supportsIncomingMessageType(parsedMessageType, V2OfferCredentialMessage.type)\n\n const isValidRequestMessage =\n supportsIncomingMessageType(parsedMessageType, V1RequestPresentationMessage.type) ||\n supportsIncomingMessageType(parsedMessageType, V2RequestPresentationMessage.type)\n\n if (isValidRequestMessage) {\n flowType = 'verify'\n } else if (isValidOfferMessage) {\n flowType = 'issue'\n } else {\n throw new ParadymWalletInvitationDidcommUnsupportedProtocolError()\n }\n }\n\n try {\n // Check if invitation already exists\n const receivedInvite = await agent.modules.outOfBand.findByReceivedInvitationId(invitation.id)\n if (receivedInvite) {\n throw new ParadymWalletInvitationAlreadyUsedError()\n }\n\n const existingConnection = (await findExistingDidcommConnectionForInvitation(agent, invitation)) ?? undefined\n\n return {\n outOfBandInvitation: invitation,\n createConnection: existingConnection ? false : !!invitation.handshakeProtocols?.length,\n existingConnection,\n flowType,\n }\n } catch (error) {\n agent.config.logger.error(`Error while receiving invitation: ${error as string}`)\n throw new ParadymWalletInvitationError(error as string)\n }\n}\n\nasync function findExistingDidcommConnectionForInvitation(\n agent: DidCommAgent,\n outOfBandInvitation: OutOfBandInvitation\n): Promise<ConnectionRecord | null> {\n for (const invitationDid of outOfBandInvitation.invitationDids) {\n const [connection] = await agent.modules.connections.findByInvitationDid(invitationDid)\n if (connection) return connection\n }\n\n return null\n}\n\n/**\n * NOTE: this method assumes `resolveOutOfBandInvitation` was called previously and thus no additional checks are performed.\n */\nexport async function acceptOutOfBandInvitation<FlowType extends 'issue' | 'verify' | 'connect'>(\n agent: DidCommAgent,\n invitation: OutOfBandInvitation,\n flowType: FlowType\n): AcceptOutOfBandInvitationResult<FlowType> {\n // The value is reassigned, but eslint doesn't know this.\n let connectionId: string | undefined\n\n let observable: Observable<CredentialStateChangedEvent | ProofStateChangedEvent> | undefined = undefined\n\n if (flowType === 'issue') {\n observable = agent.events.observable<CredentialStateChangedEvent>(CredentialEventTypes.CredentialStateChanged).pipe(\n filter((event) => event.payload.credentialRecord.state === CredentialState.OfferReceived),\n filter((event) => event.payload.credentialRecord.connectionId === connectionId)\n )\n } else if (flowType === 'verify') {\n observable = agent.events.observable<ProofStateChangedEvent>(ProofEventTypes.ProofStateChanged).pipe(\n filter((event) => event.payload.proofRecord.state === ProofState.RequestReceived),\n filter((event) => event.payload.proofRecord.connectionId === connectionId)\n )\n }\n\n const eventPromise = observable\n ? firstValueFrom(\n observable.pipe(\n first(),\n // We allow 15 seconds to receive a credential offer or proof request\n timeout(15 * 1000)\n )\n )\n : undefined\n\n let connectionRecord: ConnectionRecord | undefined\n let outOfBandRecord: OutOfBandRecord\n\n try {\n const receiveInvitationResult = await agent.modules.outOfBand.receiveInvitation(invitation, {\n reuseConnection: true,\n })\n connectionRecord = receiveInvitationResult.connectionRecord\n outOfBandRecord = receiveInvitationResult.outOfBandRecord\n\n // Assign connectionId so it can be used in the observables.\n connectionId = connectionRecord?.id\n } catch (error) {\n agent.config.logger.error(`Error while receiving invitation: ${error as string}`)\n throw new ParadymWalletInvitationReceiveError((error as Error).message)\n }\n\n try {\n const event = await eventPromise\n agent.config.logger.debug(`Received event ${event?.type}`)\n\n if (!event) {\n return {\n connectionId: connectionId as string,\n flowType: 'connect',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n } as any\n }\n\n if (event.type === CredentialEventTypes.CredentialStateChanged) {\n return {\n credentialExchangeId: event.payload.credentialRecord.id,\n connectionId,\n flowType: 'issue',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n } as any\n }\n if (event.type === ProofEventTypes.ProofStateChanged) {\n return {\n proofExchangeId: event.payload.proofRecord.id,\n connectionId,\n flowType: 'verify',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n } as any\n }\n } catch (error) {\n agent.config.logger.error('Error while accepting out of band invitation.')\n\n // Delete OOB record\n const outOfBandRepository = agent.dependencyManager.resolve(OutOfBandRepository)\n await outOfBandRepository.deleteById(agent.context, outOfBandRecord.id)\n\n // Delete connection record\n // TODO: delete did and mediation stuff\n if (connectionRecord) {\n await agent.modules.connections.deleteById(connectionRecord.id)\n }\n\n throw new ParadymWalletInvitationError((error as Error).message)\n }\n\n throw new ParadymWalletInvitationError()\n}\n","import type { ConnectionType, DidExchangeState } from '@credo-ts/didcomm'\nimport { ConnectionRecord } from '@credo-ts/didcomm'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport type { RecordsState } from '../utils/records'\nimport {\n addRecord,\n recordsAddedByType,\n recordsRemovedByType,\n recordsUpdatedByType,\n removeRecord,\n updateRecord,\n} from '../utils/records'\n\nexport type UseConnectionsOptions = {\n excludedTypes?: Array<ConnectionType | string>\n connectionState?: DidExchangeState\n}\n\nconst ConnectionContext = createContext<RecordsState<ConnectionRecord> | undefined>(undefined)\n\n/**\n * This method retrieves the connection context for the current agent.\n * From this you can access all connection records for the agent.\n * @param options options for useConnections hook, lets us filter out specific types and limit states\n * @returns a connection context containing information about the agents connections\n */\nexport const useConnections = (options: UseConnectionsOptions = {}) => {\n const connectionContext = useContext(ConnectionContext)\n\n let connections = connectionContext?.records\n connections = useMemo(() => {\n if (!connections) {\n throw new Error('useConnections must be used within a ConnectionContextProvider')\n }\n // do not filter if not filter options are provided to save on a loop\n if (!options.connectionState && !options.excludedTypes) return connections\n\n return connections.filter((record: ConnectionRecord) => {\n // By default we include this connection\n // Filter by state (if connectionState is defined)\n if (options.connectionState && options.connectionState !== record.state) return false\n\n // Exclude records with certain connection types (if defined)\n const recordTypes = record.connectionTypes as Array<ConnectionType | string> | null\n if (options.excludedTypes && recordTypes && recordTypes.length !== 0) {\n return recordTypes.some((connectionType) => !options.excludedTypes?.includes(connectionType))\n }\n return true\n })\n }, [connections, options.connectionState, options.excludedTypes])\n\n return { ...connectionContext, records: connections }\n}\n\nexport const useConnectionById = (id: string): ConnectionRecord | undefined => {\n const { records: connections } = useConnections()\n return connections.find((c: ConnectionRecord) => c.id === id)\n}\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const ConnectionProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<RecordsState<ConnectionRecord>>({\n records: [],\n loading: true,\n })\n\n useEffect(() => {\n agent.modules.connections.getAll().then((records) => setState({ records, loading: false }))\n }, [agent])\n\n useEffect(() => {\n if (state.loading) return\n\n const connectionAdded$ = recordsAddedByType(agent, ConnectionRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const connectionUpdated$ = recordsUpdatedByType(agent, ConnectionRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const connectionRemoved$ = recordsRemovedByType(agent, ConnectionRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n connectionAdded$.unsubscribe()\n connectionUpdated$.unsubscribe()\n connectionRemoved$.unsubscribe()\n }\n }, [state, agent])\n\n return <ConnectionContext.Provider value={state}>{children}</ConnectionContext.Provider>\n}\n","import type { CredentialState } from '@credo-ts/didcomm'\nimport { CredentialExchangeRecord } from '@credo-ts/didcomm'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport type { RecordsState } from '../utils/records'\nimport {\n addRecord,\n recordsAddedByType,\n recordsRemovedByType,\n recordsUpdatedByType,\n removeRecord,\n updateRecord,\n} from '../utils/records'\n\nconst CredentialContext = createContext<RecordsState<CredentialExchangeRecord> | undefined>(undefined)\n\nexport const useCredentials = () => {\n const credentialContext = useContext(CredentialContext)\n if (!credentialContext) {\n throw new Error('useCredentials must be used within a CredentialContextProvider')\n }\n return credentialContext\n}\n\nexport const useCredentialsByConnectionId = (connectionId: string): CredentialExchangeRecord[] => {\n const { records: credentials } = useCredentials()\n return useMemo(\n () => credentials.filter((credential: CredentialExchangeRecord) => credential.connectionId === connectionId),\n [credentials, connectionId]\n )\n}\n\nexport const useCredentialById = (id: string): CredentialExchangeRecord | undefined => {\n const { records: credentials } = useCredentials()\n return credentials.find((c: CredentialExchangeRecord) => c.id === id)\n}\n\nexport const useCredentialByState = (state: CredentialState | CredentialState[]): CredentialExchangeRecord[] => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: credentials } = useCredentials()\n\n const filteredCredentials = useMemo(\n () => credentials.filter((r: CredentialExchangeRecord) => states.includes(r.state)),\n [credentials, states]\n )\n return filteredCredentials\n}\n\nexport const useCredentialNotInState = (state: CredentialState | CredentialState[]) => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: credentials } = useCredentials()\n\n const filteredCredentials = useMemo(\n () => credentials.filter((r: CredentialExchangeRecord) => !states.includes(r.state)),\n [credentials, states]\n )\n\n return filteredCredentials\n}\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const CredentialExchangeProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<RecordsState<CredentialExchangeRecord>>({\n records: [],\n loading: true,\n })\n\n useEffect(() => {\n agent.modules.credentials.getAll().then((records) => setState({ records, loading: false }))\n }, [agent])\n\n useEffect(() => {\n if (state.loading) return\n\n const credentialAdded$ = recordsAddedByType(agent, CredentialExchangeRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const credentialUpdated$ = recordsUpdatedByType(agent, CredentialExchangeRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const credentialRemoved$ = recordsRemovedByType(agent, CredentialExchangeRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n credentialAdded$?.unsubscribe()\n credentialUpdated$?.unsubscribe()\n credentialRemoved$?.unsubscribe()\n }\n }, [state, agent])\n\n return <CredentialContext.Provider value={state}>{children}</CredentialContext.Provider>\n}\n","import type { ProofState } from '@credo-ts/didcomm'\nimport { ProofExchangeRecord } from '@credo-ts/didcomm'\nimport type { PropsWithChildren } from 'react'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport type { RecordsState } from '../utils/records'\nimport {\n addRecord,\n recordsAddedByType,\n recordsRemovedByType,\n recordsUpdatedByType,\n removeRecord,\n updateRecord,\n} from '../utils/records'\n\nconst ProofContext = createContext<RecordsState<ProofExchangeRecord> | undefined>(undefined)\n\nexport const useProofs = () => {\n const proofContext = useContext(ProofContext)\n if (!proofContext) {\n throw new Error('useProofs must be used within a ProofContextProvider')\n }\n return proofContext\n}\n\nexport const useProofsByConnectionId = (connectionId: string): ProofExchangeRecord[] => {\n const { records: proofs } = useProofs()\n return useMemo(\n () => proofs.filter((proof: ProofExchangeRecord) => proof.connectionId === connectionId),\n [proofs, connectionId]\n )\n}\n\nexport const useProofById = (id: string): ProofExchangeRecord | undefined => {\n const { records: proofs } = useProofs()\n return proofs.find((c: ProofExchangeRecord) => c.id === id)\n}\n\nexport const useProofByState = (state: ProofState | ProofState[]): ProofExchangeRecord[] => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: proofs } = useProofs()\n\n const filteredProofs = useMemo(\n () => proofs.filter((r: ProofExchangeRecord) => states.includes(r.state)),\n [proofs, states]\n )\n return filteredProofs\n}\n\nexport const useProofNotInState = (state: ProofState | ProofState[]) => {\n const states = useMemo(() => (typeof state === 'string' ? [state] : state), [state])\n\n const { records: proofs } = useProofs()\n\n const filteredProofs = useMemo(\n () => proofs.filter((r: ProofExchangeRecord) => !states.includes(r.state)),\n [proofs, states]\n )\n\n return filteredProofs\n}\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const ProofExchangeProvider: React.FC<PropsWithChildren<Props>> = ({ agent, children }) => {\n const [state, setState] = useState<RecordsState<ProofExchangeRecord>>({\n records: [],\n loading: true,\n })\n\n useEffect(() => {\n agent.modules.proofs.getAll().then((records) => setState({ records, loading: false }))\n }, [agent])\n\n useEffect(() => {\n if (state.loading) return\n\n const proofAdded$ = recordsAddedByType(agent, ProofExchangeRecord).subscribe((record) =>\n setState(addRecord(record, state))\n )\n\n const proofUpdated$ = recordsUpdatedByType(agent, ProofExchangeRecord).subscribe((record) =>\n setState(updateRecord(record, state))\n )\n\n const proofRemoved$ = recordsRemovedByType(agent, ProofExchangeRecord).subscribe((record) =>\n setState(removeRecord(record, state))\n )\n\n return () => {\n proofAdded$?.unsubscribe()\n proofUpdated$?.unsubscribe()\n proofRemoved$?.unsubscribe()\n }\n }, [state, agent])\n\n return <ProofContext.Provider value={state}>{children}</ProofContext.Provider>\n}\n","import { CredentialState, ProofState } from '@credo-ts/didcomm'\nimport { useEffect } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport {\n getDidCommCredentialExchangeDisplayMetadata,\n getDidCommProofExchangeDisplayMetadata,\n setDidCommCredentialExchangeMetadata,\n setDidCommProofExchangeMetadata,\n} from '../metadata/credentials'\nimport { useConnections } from '../providers/ConnectionProvider'\nimport { useCredentialByState } from '../providers/CredentialExchangeProvider'\nimport { useProofByState } from '../providers/ProofExchangeProvider'\n\n/**\n * This hooks listens to all the credential and proof exchange records in the inbox and\n * will fetch the needed metadata for the records and add it to the metadata.\n *\n * This can be used on the main app, so it's is automatically triggered whenever an item\n * is added to the inbox.\n */\nexport const usePreFetchInboxDisplayMetadata = ({ agent }: { agent: DidCommAgent }) => {\n const credentialExchangeRecords = useCredentialByState([CredentialState.OfferReceived])\n const proofExchangeRecords = useProofByState([ProofState.RequestReceived])\n const { records: connections } = useConnections()\n // Fetch associated metadata for each record\n useEffect(() => {\n credentialExchangeRecords.map(async (record) => {\n const metadata = getDidCommCredentialExchangeDisplayMetadata(record)\n if (metadata) return\n\n const connection = record.connectionId\n ? connections.find((connection) => record.connectionId === connection.id)\n : undefined\n\n // Extract label from out-of-band invitation if no connection associated\n const outOfBandRecord =\n !connection && record.parentThreadId\n ? await agent.modules.outOfBand.findByReceivedInvitationId(record.parentThreadId)\n : undefined\n\n const formatData = await agent.modules.credentials.getFormatData(record.id)\n const offer = formatData.offer?.anoncreds ?? formatData.offer?.indy\n // We just return here, so the rest can still continue\n if (!offer) return\n\n const schemaId = offer.schema_id\n\n const issuerName = connection?.theirLabel ?? outOfBandRecord?.outOfBandInvitation.label\n const schemaResult = await agent.modules.anoncreds.getSchema(schemaId)\n const schemaName = schemaResult.schema?.name\n\n // Update the metadata on the record for future use\n if (issuerName || schemaName) {\n setDidCommCredentialExchangeMetadata(record, {\n issuerName,\n issuerLogoUri: connection?.imageUrl ?? outOfBandRecord?.outOfBandInvitation.imageUrl,\n credentialName: schemaName,\n })\n await agent.modules.credentials.update(record)\n }\n })\n }, [credentialExchangeRecords, agent, connections])\n\n // Fetch associated metadata for each record\n useEffect(() => {\n proofExchangeRecords.map(async (record) => {\n const metadata = getDidCommProofExchangeDisplayMetadata(record)\n if (metadata) return\n\n const connection = record.connectionId\n ? connections.find((connection) => record.connectionId === connection.id)\n : undefined\n\n // Extract label from out-of-band invitation if no connection associated\n const outOfBandRecord =\n !connection && record.parentThreadId\n ? await agent.modules.outOfBand.findByReceivedInvitationId(record.parentThreadId)\n : undefined\n\n const formatData = await agent.modules.proofs.getFormatData(record.id)\n const request = formatData.request?.anoncreds ?? formatData.request?.indy\n\n // We just return here, so the rest can still continue\n if (!request) return\n\n const verifierName = connection?.theirLabel ?? outOfBandRecord?.outOfBandInvitation.label\n const proofName = request.name\n\n // Update the metadata on the record for future use\n if (verifierName || proofName) {\n setDidCommProofExchangeMetadata(record, {\n proofName,\n verifierLogoUri: connection?.imageUrl ?? outOfBandRecord?.outOfBandInvitation.imageUrl,\n verifierName,\n })\n await agent.modules.proofs.update(record)\n }\n })\n }, [proofExchangeRecords, agent, connections])\n}\n","import type { PropsWithChildren } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport { usePreFetchInboxDisplayMetadata } from '../hooks/usePreFetchInboxDisplayMetadata'\n\ninterface Props {\n agent: DidCommAgent\n}\n\nexport const ExchangeRecordDisplayMetadataProvider = ({ agent, children }: PropsWithChildren<Props>) => {\n usePreFetchInboxDisplayMetadata({ agent })\n\n return <>{children}</>\n}\n","import type { Agent } from '@credo-ts/core'\nimport { type PropsWithChildren, createContext, useContext, useMemo } from 'react'\nimport type { setupAgent } from '../agent'\nimport { ConnectionProvider } from './ConnectionProvider'\nimport { CredentialExchangeProvider } from './CredentialExchangeProvider'\nimport { ExchangeRecordDisplayMetadataProvider } from './ExchangeRecordDisplayMetadataProvider'\nimport { MdocRecordProvider } from './MdocProvider'\nimport { ProofExchangeProvider } from './ProofExchangeProvider'\nimport { SdJwtVcRecordProvider } from './SdJwtVcProvider'\nimport { W3cCredentialRecordProvider } from './W3cCredentialsProvider'\nimport { WalletJsonStoreProvider } from './WalletJsonStoreProvider'\n\nconst AgentContext = createContext<Agent | undefined>(undefined)\n\nexport type AgentProviderProps = {\n agent: Agent\n\n // TODO: can we remove this? Why not just ignore specific record ids and use em all?\n recordIds: Array<string>\n}\n\n/**\n *\n *\n * Hook to retrieve the agent.\n *\n */\nexport const useAgent = <ProvidedAgent extends Agent = Awaited<ReturnType<typeof setupAgent>>>() => {\n const agentContext = useContext(AgentContext)\n\n if (!agentContext) {\n throw new Error('useAgent must be used within a AgentContextProvider')\n }\n\n return {\n agent: agentContext as ProvidedAgent,\n }\n}\n\nexport const AgentProvider = ({ agent, recordIds, children }: PropsWithChildren<AgentProviderProps>) => {\n const DynamicProviders = useMemo(() => {\n return [\n agent.modules.proofs || agent.modules.credentials\n ? ({ children }: PropsWithChildren<{ agent: Agent }>) => (\n <ExchangeRecordDisplayMetadataProvider agent={agent}>{children}</ExchangeRecordDisplayMetadataProvider>\n )\n : undefined,\n agent.modules.credentials ? CredentialExchangeProvider : undefined,\n agent.modules.proofs ? ProofExchangeProvider : undefined,\n agent.modules.connections ? ConnectionProvider : undefined,\n ].filter((p): p is Exclude<typeof p, undefined> => p !== undefined)\n }, [agent])\n\n // Memoize the nested providers structure to prevent recreation on each render\n const providers = useMemo(() => {\n return DynamicProviders.reduce(\n (accChildren, Provider, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Provider key={index} agent={agent}>\n {accChildren}\n </Provider>\n ),\n <W3cCredentialRecordProvider agent={agent}>\n <SdJwtVcRecordProvider agent={agent}>\n <MdocRecordProvider agent={agent}>\n <WalletJsonStoreProvider recordIds={recordIds} agent={agent}>\n {children}\n </WalletJsonStoreProvider>\n </MdocRecordProvider>\n </SdJwtVcRecordProvider>\n </W3cCredentialRecordProvider>\n )\n }, [DynamicProviders, agent, children, recordIds])\n\n return <AgentContext.Provider value={agent}>{providers}</AgentContext.Provider>\n}\n","import { useMutation } from '@tanstack/react-query'\nimport { useCallback } from 'react'\nimport type { DidCommAgent } from '../agent'\nimport { type ResolveOutOfBandInvitationResult, acceptOutOfBandInvitation } from '../invitation/resolver'\nimport { useAgent } from '../providers/AgentProvider'\n\nexport function useDidCommConnectionActions(resolved?: ResolveOutOfBandInvitationResult) {\n const { agent } = useAgent<DidCommAgent>()\n\n const { mutateAsync: acceptConnectionMutation, status: acceptStatus } = useMutation({\n mutationKey: ['acceptDidCommConnection', resolved?.outOfBandInvitation.id],\n mutationFn: async () => {\n if (!resolved) throw new Error(\"Missing 'resolved' parameter\")\n\n const result = await acceptOutOfBandInvitation(agent, resolved.outOfBandInvitation, resolved.flowType)\n return result\n },\n })\n\n const declineConnection = useCallback(() => {\n // no-op\n }, [])\n\n return {\n acceptConnection: acceptConnectionMutation,\n declineConnection,\n acceptStatus,\n display: {\n connection: {\n name: resolved?.existingConnection\n ? // TODO: translations used\n resolved.existingConnection?.alias ?? resolved.existingConnection?.theirLabel ?? 't(commonMessages.unknown)'\n : // TODO: translations used\n resolved?.outOfBandInvitation.label ?? 't(commonMessages.unknown)',\n logo: {\n url: resolved?.existingConnection\n ? resolved?.existingConnection.imageUrl\n : resolved?.outOfBandInvitation.imageUrl,\n },\n },\n },\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @flow strict\n * @format\n */\n\n'use strict';\n\n/*::\nexport type AssetDestPathResolver = 'android' | 'generic';\n\nexport type PackagerAsset = {\n +__packager_asset: boolean,\n +fileSystemLocation: string,\n +httpServerLocation: string,\n +width: ?number,\n +height: ?number,\n +scales: Array<number>,\n +hash: string,\n +name: string,\n +type: string,\n +resolver?: AssetDestPathResolver,\n ...\n};\n*/\n\nconst assets /*: Array<PackagerAsset> */ = [];\n\nfunction registerAsset(asset /*: PackagerAsset */) /*: number */ {\n // `push` returns new array length, so the first asset will\n // get id 1 (not 0) to make the value truthy\n return assets.push(asset);\n}\n\nfunction getAssetByID(assetId /*: number */) /*: PackagerAsset */ {\n return assets[assetId - 1];\n}\n\nmodule.exports = {registerAsset, getAssetByID};\n","module.exports = null;\n","import { Platform } from 'expo-modules-core';\nimport { PixelRatio } from 'react-native';\n// Returns the Metro dev server-specific asset location.\nfunction getScaledAssetPath(asset) {\n const scale = AssetSourceResolver.pickScale(asset.scales, PixelRatio.get());\n const scaleSuffix = scale === 1 ? '' : '@' + scale + 'x';\n const type = !asset.type ? '' : `.${asset.type}`;\n if (__DEV__) {\n return asset.httpServerLocation + '/' + asset.name + scaleSuffix + type;\n }\n else {\n return asset.httpServerLocation.replace(/\\.\\.\\//g, '_') + '/' + asset.name + scaleSuffix + type;\n }\n}\nexport default class AssetSourceResolver {\n serverUrl;\n // where the jsbundle is being run from\n // NOTE(EvanBacon): Never defined on web.\n // @ts-expect-error: Never read locally\n jsbundleUrl;\n // the asset to resolve\n asset;\n constructor(serverUrl, jsbundleUrl, asset) {\n this.serverUrl = serverUrl || 'https://expo.dev';\n this.jsbundleUrl = null;\n this.asset = asset;\n }\n // Always true for web runtimes\n isLoadedFromServer() {\n return true;\n }\n // Always false for web runtimes\n isLoadedFromFileSystem() {\n return false;\n }\n defaultAsset() {\n return this.assetServerURL();\n }\n /**\n * @returns absolute remote URL for the hosted asset.\n */\n assetServerURL() {\n const fromUrl = new URL(getScaledAssetPath(this.asset), this.serverUrl);\n fromUrl.searchParams.set('platform', Platform.OS);\n fromUrl.searchParams.set('hash', this.asset.hash);\n return this.fromSource(\n // Relative on web\n fromUrl.toString().replace(fromUrl.origin, ''));\n }\n fromSource(source) {\n return {\n __packager_asset: true,\n width: this.asset.width ?? undefined,\n height: this.asset.height ?? undefined,\n uri: source,\n scale: AssetSourceResolver.pickScale(this.asset.scales, PixelRatio.get()),\n };\n }\n static pickScale(scales, deviceScale) {\n for (let i = 0; i < scales.length; i++) {\n if (scales[i] >= deviceScale) {\n return scales[i];\n }\n }\n return scales[scales.length - 1] || 1;\n }\n}\n//# sourceMappingURL=AssetSourceResolver.js.map","export var AppOwnership;\n(function (AppOwnership) {\n /**\n * The experience is running inside the Expo Go app.\n * @deprecated Use [`Constants.executionEnvironment`](#executionenvironment) instead.\n */\n AppOwnership[\"Expo\"] = \"expo\";\n})(AppOwnership || (AppOwnership = {}));\n// @docsMissing\nexport var ExecutionEnvironment;\n(function (ExecutionEnvironment) {\n ExecutionEnvironment[\"Bare\"] = \"bare\";\n ExecutionEnvironment[\"Standalone\"] = \"standalone\";\n ExecutionEnvironment[\"StoreClient\"] = \"storeClient\";\n})(ExecutionEnvironment || (ExecutionEnvironment = {}));\n// @needsAudit\n/**\n * Current supported values are `handset`, `tablet`, `desktop` and `tv`. CarPlay will show up\n * as `unsupported`.\n */\nexport var UserInterfaceIdiom;\n(function (UserInterfaceIdiom) {\n UserInterfaceIdiom[\"Handset\"] = \"handset\";\n UserInterfaceIdiom[\"Tablet\"] = \"tablet\";\n UserInterfaceIdiom[\"Desktop\"] = \"desktop\";\n UserInterfaceIdiom[\"TV\"] = \"tv\";\n UserInterfaceIdiom[\"Unsupported\"] = \"unsupported\";\n})(UserInterfaceIdiom || (UserInterfaceIdiom = {}));\n//# sourceMappingURL=Constants.types.js.map","import { requireOptionalNativeModule } from 'expo-modules-core';\nexport default requireOptionalNativeModule('ExponentConstants');\n//# sourceMappingURL=ExponentConstants.js.map","import { CodedError, requireOptionalNativeModule } from 'expo-modules-core';\nimport { Platform, NativeModules } from 'react-native';\nimport { AppOwnership, ExecutionEnvironment, UserInterfaceIdiom, } from './Constants.types';\nimport ExponentConstants from './ExponentConstants';\nexport { AppOwnership, ExecutionEnvironment, UserInterfaceIdiom, };\nif (!ExponentConstants) {\n console.warn(\"No native ExponentConstants module found, are you sure the expo-constants's module is linked properly?\");\n}\nconst ExpoUpdates = requireOptionalNativeModule('ExpoUpdates');\nlet rawUpdatesManifest = null;\n// If expo-updates defines a non-empty manifest, prefer that one\nif (ExpoUpdates) {\n let updatesManifest;\n if (ExpoUpdates.manifest) {\n updatesManifest = ExpoUpdates.manifest;\n }\n else if (ExpoUpdates.manifestString) {\n updatesManifest = JSON.parse(ExpoUpdates.manifestString);\n }\n if (updatesManifest && Object.keys(updatesManifest).length > 0) {\n rawUpdatesManifest = updatesManifest;\n }\n}\n// If dev-launcher defines a non-empty manifest, prefer that one\nlet rawDevLauncherManifest = null;\nif (NativeModules.EXDevLauncher) {\n let devLauncherManifest;\n if (NativeModules.EXDevLauncher.manifestString) {\n devLauncherManifest = JSON.parse(NativeModules.EXDevLauncher.manifestString);\n }\n if (devLauncherManifest && Object.keys(devLauncherManifest).length > 0) {\n rawDevLauncherManifest = devLauncherManifest;\n }\n}\n// Fall back to ExponentConstants.manifest if we don't have one from Updates\nlet rawAppConfig = null;\nif (ExponentConstants && ExponentConstants.manifest) {\n const appConfig = ExponentConstants.manifest;\n // On Android we pass the manifest in JSON form so this step is necessary\n if (typeof appConfig === 'string') {\n rawAppConfig = JSON.parse(appConfig);\n }\n else {\n rawAppConfig = appConfig;\n }\n}\nlet rawManifest = rawUpdatesManifest ?? rawDevLauncherManifest ?? rawAppConfig;\nconst { name, appOwnership, ...nativeConstants } = (ExponentConstants || {});\nconst constants = {\n ...nativeConstants,\n // Ensure this is null in bare workflow\n appOwnership: appOwnership ?? null,\n};\nObject.defineProperties(constants, {\n /**\n * Use `manifest` property by default.\n * This property is only used for internal purposes.\n * It behaves similarly to the original one, but suppresses warning upon no manifest available.\n * `expo-asset` uses it to prevent users from seeing mentioned warning.\n */\n __unsafeNoWarnManifest: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest || !isEmbeddedManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: false,\n },\n __unsafeNoWarnManifest2: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest || !isExpoUpdatesManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: false,\n },\n manifest: {\n get() {\n const maybeManifest = getManifest();\n if (!maybeManifest || !isEmbeddedManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: true,\n },\n manifest2: {\n get() {\n const maybeManifest = getManifest();\n if (!maybeManifest || !isExpoUpdatesManifest(maybeManifest)) {\n return null;\n }\n return maybeManifest;\n },\n enumerable: true,\n },\n expoConfig: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest) {\n return null;\n }\n // if running an embedded update, maybeManifest is a EmbeddedManifest which doesn't have\n // the expo config. Instead, the embedded expo-constants app.config should be used.\n if (ExpoUpdates && ExpoUpdates.isEmbeddedLaunch) {\n return rawAppConfig;\n }\n if (isExpoUpdatesManifest(maybeManifest)) {\n return maybeManifest.extra?.expoClient ?? null;\n }\n else if (isEmbeddedManifest(maybeManifest)) {\n return maybeManifest;\n }\n return null;\n },\n enumerable: true,\n },\n expoGoConfig: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest) {\n return null;\n }\n if (isExpoUpdatesManifest(maybeManifest)) {\n return maybeManifest.extra?.expoGo ?? null;\n }\n else if (isEmbeddedManifest(maybeManifest)) {\n return maybeManifest;\n }\n return null;\n },\n enumerable: true,\n },\n easConfig: {\n get() {\n const maybeManifest = getManifest(true);\n if (!maybeManifest) {\n return null;\n }\n if (isExpoUpdatesManifest(maybeManifest)) {\n return maybeManifest.extra?.eas ?? null;\n }\n else if (isEmbeddedManifest(maybeManifest)) {\n return maybeManifest;\n }\n return null;\n },\n enumerable: true,\n },\n __rawManifest_TEST: {\n get() {\n return rawManifest;\n },\n set(value) {\n rawManifest = value;\n },\n enumerable: false,\n },\n});\nfunction isEmbeddedManifest(manifest) {\n return !isExpoUpdatesManifest(manifest);\n}\nfunction isExpoUpdatesManifest(manifest) {\n return 'metadata' in manifest;\n}\nfunction getManifest(suppressWarning = false) {\n if (!rawManifest) {\n const invalidManifestType = rawManifest === null ? 'null' : 'undefined';\n if (nativeConstants.executionEnvironment === ExecutionEnvironment.Bare &&\n Platform.OS !== 'web') {\n if (!suppressWarning) {\n console.warn(`Constants.manifest is ${invalidManifestType} because the embedded app.config could not be read. Ensure that you have installed the expo-constants build scripts if you need to read from Constants.manifest.`);\n }\n }\n else if (nativeConstants.executionEnvironment === ExecutionEnvironment.StoreClient ||\n nativeConstants.executionEnvironment === ExecutionEnvironment.Standalone) {\n // If we somehow get here, this is a truly exceptional state to be in.\n // Constants.manifest should *always* be defined in those contexts.\n throw new CodedError('ERR_CONSTANTS_MANIFEST_UNAVAILABLE', `Constants.manifest is ${invalidManifestType}, must be an object.`);\n }\n }\n return rawManifest;\n}\nexport default constants;\n//# sourceMappingURL=Constants.js.map","export function getFilename(url) {\n const { pathname, searchParams } = new URL(url, 'https://e');\n // When attached to a dev server, we use `unstable_path` to represent the file path. This ensures\n // the file name is not canonicalized by the browser.\n // NOTE(EvanBacon): This is technically not tied to `__DEV__` as it's possible to use this while bundling in production\n // mode.\n if (__DEV__) {\n if (searchParams.has('unstable_path')) {\n const encodedFilePath = decodeURIComponent(searchParams.get('unstable_path'));\n return getBasename(encodedFilePath);\n }\n }\n return getBasename(pathname);\n}\nfunction getBasename(pathname) {\n return pathname.substring(pathname.lastIndexOf('/') + 1);\n}\nexport function getFileExtension(url) {\n const filename = getFilename(url);\n const dotIndex = filename.lastIndexOf('.');\n // Ignore leading dots for hidden files\n return dotIndex > 0 ? filename.substring(dotIndex) : '';\n}\n/**\n * Returns the base URL from a manifest's URL. For example, given a manifest hosted at\n * https://example.com/app/manifest.json, the base URL would be https://example.com/app/. Query\n * parameters and fragments also are removed.\n *\n * For an Expo-hosted project with a manifest hosted at https://exp.host/@user/project/index.exp, the\n * base URL would be https://exp.host/@user/project.\n *\n * We also normalize the \"exp\" protocol to \"http\" to handle internal URLs with the Expo schemes used\n * to tell the OS to open the URLs in the the Expo client.\n */\nexport function getManifestBaseUrl(manifestUrl) {\n const urlObject = new URL(manifestUrl);\n let nextProtocol = urlObject.protocol;\n // Change the scheme to http(s) if it is exp(s)\n if (nextProtocol === 'exp:') {\n nextProtocol = 'http:';\n }\n else if (nextProtocol === 'exps:') {\n nextProtocol = 'https:';\n }\n urlObject.protocol = nextProtocol;\n // Trim filename, query parameters, and fragment, if any\n const directory = urlObject.pathname.substring(0, urlObject.pathname.lastIndexOf('/') + 1);\n urlObject.pathname = directory;\n urlObject.search = '';\n urlObject.hash = '';\n // The URL spec doesn't allow for changing the protocol to `http` or `https`\n // without a port set so instead, we'll just swap the protocol manually.\n return urlObject.protocol !== nextProtocol\n ? urlObject.href.replace(urlObject.protocol, nextProtocol)\n : urlObject.href;\n}\n//# sourceMappingURL=AssetUris.js.map","import Constants from 'expo-constants';\nimport { requireNativeModule, requireOptionalNativeModule } from 'expo-modules-core';\nimport { getManifestBaseUrl } from './AssetUris';\nconst ExpoUpdates = requireOptionalNativeModule('ExpoUpdates');\nconst NativeExpoGoModule = (() => {\n try {\n return requireNativeModule('ExpoGo');\n }\n catch {\n return null;\n }\n})();\nfunction isRunningInExpoGo() {\n return NativeExpoGoModule != null;\n}\n// expo-updates (and Expo Go expo-updates override) manages assets from updates and exposes\n// the ExpoUpdates.localAssets constant containing information about the assets.\nconst expoUpdatesIsInstalledAndEnabled = !!ExpoUpdates?.isEnabled;\nconst expoUpdatesIsUsingEmbeddedAssets = ExpoUpdates?.isUsingEmbeddedAssets;\n// if expo-updates is installed but we're running directly from the embedded bundle, we don't want\n// to override the AssetSourceResolver.\nconst shouldUseUpdatesAssetResolution = expoUpdatesIsInstalledAndEnabled && !expoUpdatesIsUsingEmbeddedAssets;\n// Expo Go always uses the updates module for asset resolution (local assets) since it\n// overrides the expo-updates module.\nexport const IS_ENV_WITH_LOCAL_ASSETS = isRunningInExpoGo() || shouldUseUpdatesAssetResolution;\n// Get the localAssets property from the ExpoUpdates native module so that we do\n// not need to include expo-updates as a dependency of expo-asset\nexport function getLocalAssets() {\n return ExpoUpdates?.localAssets ?? {};\n}\nexport function getManifest2() {\n return Constants.__unsafeNoWarnManifest2;\n}\n// Compute manifest base URL if available\nexport const manifestBaseUrl = Constants.experienceUrl\n ? getManifestBaseUrl(Constants.experienceUrl)\n : null;\n//# sourceMappingURL=PlatformUtils.js.map","import { Platform } from 'expo-modules-core';\nimport { PixelRatio, NativeModules } from 'react-native';\nimport AssetSourceResolver from './AssetSourceResolver';\nimport { getManifest2, manifestBaseUrl } from './PlatformUtils';\n/**\n * Selects the best file for the given asset (ex: choosing the best scale for images) and returns\n * a { uri, hash } pair for the specific asset file.\n *\n * If the asset isn't an image with multiple scales, the first file is selected.\n */\nexport function selectAssetSource(meta) {\n // This logic is based on that of AssetSourceResolver, with additional support for file hashes and\n // explicitly provided URIs\n const scale = AssetSourceResolver.pickScale(meta.scales, PixelRatio.get());\n const index = meta.scales.findIndex((s) => s === scale);\n const hash = meta.fileHashes ? (meta.fileHashes[index] ?? meta.fileHashes[0]) : meta.hash;\n // Allow asset processors to directly provide the URL to load\n const uri = meta.fileUris ? (meta.fileUris[index] ?? meta.fileUris[0]) : meta.uri;\n if (uri) {\n return { uri: resolveUri(uri), hash };\n }\n const fileScale = scale === 1 ? '' : `@${scale}x`;\n const fileExtension = meta.type ? `.${encodeURIComponent(meta.type)}` : '';\n const suffix = `/${encodeURIComponent(meta.name)}${fileScale}${fileExtension}`;\n const params = new URLSearchParams({\n platform: Platform.OS,\n hash: meta.hash,\n });\n // For assets with a specified absolute URL, we use the existing origin instead of prepending the\n // development server or production CDN URL origin\n if (/^https?:\\/\\//.test(meta.httpServerLocation)) {\n const uri = meta.httpServerLocation + suffix + '?' + params;\n return { uri, hash };\n }\n // For assets during development using manifest2, we use the development server's URL origin\n const manifest2 = getManifest2();\n const devServerUrl = manifest2?.extra?.expoGo?.developer\n ? 'http://' + manifest2.extra.expoGo.debuggerHost\n : null;\n if (devServerUrl) {\n const baseUrl = new URL(meta.httpServerLocation + suffix, devServerUrl);\n baseUrl.searchParams.set('platform', Platform.OS);\n baseUrl.searchParams.set('hash', meta.hash);\n return {\n uri: baseUrl.href,\n hash,\n };\n }\n // Temporary fallback for loading assets in Expo Go home\n if (NativeModules['ExponentKernel']) {\n return { uri: `https://classic-assets.eascdn.net/~assets/${encodeURIComponent(hash)}`, hash };\n }\n // In correctly configured apps, we arrive here if the asset is locally available on disk due to\n // being managed by expo-updates, and `getLocalAssetUri(hash)` must return a local URI for this\n // hash. Since the asset is local, we don't have a remote URL and specify an invalid URL (an empty\n // string) as a placeholder.\n return { uri: '', hash };\n}\n/**\n * Resolves the given URI to an absolute URI. If the given URI is already an absolute URI, it is\n * simply returned. Otherwise, if it is a relative URI, it is resolved relative to the manifest's\n * base URI.\n */\nexport function resolveUri(uri) {\n // `manifestBaseUrl` is always an absolute URL or `null`.\n return manifestBaseUrl ? new URL(uri, manifestBaseUrl).href : uri;\n}\n//# sourceMappingURL=AssetSources.js.map","import { requireNativeModule } from 'expo-modules-core';\nconst AssetModule = requireNativeModule('ExpoAsset');\n/**\n * Downloads the asset from the given URL to a local cache and returns the local URL of the cached\n * file.\n *\n * If there is already a locally cached file and its MD5 hash matches the given `md5Hash` parameter,\n * if present, the remote asset is not downloaded. The `hash` property is included in Metro's asset\n * metadata objects when this module's `hashAssetFiles` plugin is used, which is the typical way the\n * `md5Hash` parameter of this function is provided.\n */\nexport async function downloadAsync(url, md5Hash, type) {\n return AssetModule.downloadAsync(url, md5Hash, type);\n}\n//# sourceMappingURL=ExpoAsset.js.map","/* eslint-env browser */\nimport { getFilename } from './AssetUris';\nexport function isImageType(type) {\n return /^(jpeg|jpg|gif|png|bmp|webp|heic)$/i.test(type);\n}\nexport function getImageInfoAsync(url) {\n if (typeof window === 'undefined') {\n return Promise.resolve({ name: getFilename(url), width: 0, height: 0 });\n }\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = reject;\n img.onload = () => {\n resolve({\n name: getFilename(url),\n width: img.naturalWidth,\n height: img.naturalHeight,\n });\n };\n img.src = url;\n });\n}\n//# sourceMappingURL=ImageAssets.js.map","import { getLocalAssets } from './PlatformUtils';\n// localAssets are provided by the expo-updates module\nconst localAssets = getLocalAssets();\n/**\n * Returns the URI of a local asset from its hash, or null if the asset is not available locally\n */\nexport function getLocalAssetUri(hash, type) {\n const localAssetsKey = hash;\n const legacyLocalAssetsKey = `${hash}.${type ?? ''}`;\n switch (true) {\n case localAssetsKey in localAssets: {\n return localAssets[localAssetsKey];\n }\n case legacyLocalAssetsKey in localAssets: {\n // legacy updates store assets with an extension\n return localAssets[legacyLocalAssetsKey];\n }\n default:\n return null;\n }\n}\n//# sourceMappingURL=LocalAssets.js.map","import { getAssetByID } from '@react-native/assets-registry/registry';\nimport AssetSourceResolver from './AssetSourceResolver';\nlet _customSourceTransformer;\nexport function setCustomSourceTransformer(transformer) {\n _customSourceTransformer = transformer;\n}\n/**\n * `source` is either a number (opaque type returned by require('./foo.png'))\n * or an `ImageSource` like { uri: '<http location || file path>' }\n */\nfunction resolveAssetSource(source) {\n if (typeof source === 'object') {\n return source;\n }\n const asset = getAssetByID(source);\n if (!asset) {\n return null;\n }\n const resolver = new AssetSourceResolver(\n // Doesn't matter since this is removed on web\n 'https://expo.dev', null, asset);\n if (_customSourceTransformer) {\n return _customSourceTransformer(resolver);\n }\n return resolver.defaultAsset();\n}\nObject.defineProperty(resolveAssetSource, 'setCustomSourceTransformer', {\n get() {\n return setCustomSourceTransformer;\n },\n});\nexport default resolveAssetSource;\nexport const { pickScale } = AssetSourceResolver;\n//# sourceMappingURL=resolveAssetSource.js.map","import { getAssetByID } from '@react-native/assets-registry/registry';\nimport { Platform } from 'expo-modules-core';\nimport { selectAssetSource } from './AssetSources';\nimport * as AssetUris from './AssetUris';\nimport { downloadAsync } from './ExpoAsset';\nimport * as ImageAssets from './ImageAssets';\nimport { getLocalAssetUri } from './LocalAssets';\nimport { IS_ENV_WITH_LOCAL_ASSETS } from './PlatformUtils';\nimport resolveAssetSource from './resolveAssetSource';\n/**\n * Android resource URL prefix.\n * @hidden\n */\nexport const ANDROID_EMBEDDED_URL_BASE_RESOURCE = 'file:///android_res/';\n/**\n * The `Asset` class represents an asset in your app. It gives metadata about the asset (such as its\n * name and type) and provides facilities to load the asset data.\n */\nexport class Asset {\n static byHash = {};\n static byUri = {};\n /**\n * The name of the asset file without the extension. Also without the part from `@` onward in the\n * filename (used to specify scale factor for images).\n */\n name;\n /**\n * The extension of the asset filename.\n */\n type;\n /**\n * The MD5 hash of the asset's data.\n */\n hash = null;\n /**\n * A URI that points to the asset's data on the remote server. When running the published version\n * of your app, this refers to the location on Expo's asset server where Expo has stored your\n * asset. When running the app from Expo CLI during development, this URI points to Expo CLI's\n * server running on your computer and the asset is served directly from your computer. If you\n * are not using Classic Updates (legacy), this field should be ignored as we ensure your assets\n * are on device before running your application logic.\n */\n uri;\n /**\n * If the asset has been downloaded (by calling [`downloadAsync()`](#downloadasync)), the\n * `file://` URI pointing to the local file on the device that contains the asset data.\n */\n localUri = null;\n /**\n * If the asset is an image, the width of the image data divided by the scale factor. The scale\n * factor is the number after `@` in the filename, or `1` if not present.\n */\n width = null;\n /**\n * If the asset is an image, the height of the image data divided by the scale factor. The scale factor is the number after `@` in the filename, or `1` if not present.\n */\n height = null;\n downloading = false;\n /**\n * Whether the asset has finished downloading from a call to [`downloadAsync()`](#downloadasync).\n */\n downloaded = false;\n _downloadCallbacks = [];\n constructor({ name, type, hash = null, uri, width, height }) {\n this.name = name;\n this.type = type;\n this.hash = hash;\n this.uri = uri;\n if (typeof width === 'number') {\n this.width = width;\n }\n if (typeof height === 'number') {\n this.height = height;\n }\n if (hash) {\n this.localUri = getLocalAssetUri(hash, type);\n if (this.localUri?.startsWith(ANDROID_EMBEDDED_URL_BASE_RESOURCE)) {\n // Treat Android embedded resources as not downloaded state, because the uri is not direct accessible.\n this.uri = this.localUri;\n this.localUri = null;\n }\n else if (this.localUri) {\n this.downloaded = true;\n }\n }\n if (Platform.OS === 'web') {\n if (!name) {\n this.name = AssetUris.getFilename(uri);\n }\n if (!type) {\n this.type = AssetUris.getFileExtension(uri);\n }\n }\n }\n // @needsAudit\n /**\n * A helper that wraps `Asset.fromModule(module).downloadAsync` for convenience.\n * @param moduleId An array of `require('path/to/file')` or external network URLs. Can also be\n * just one module or URL without an Array.\n * @return Returns a Promise that fulfills with an array of `Asset`s when the asset(s) has been\n * saved to disk.\n * @example\n * ```ts\n * const [{ localUri }] = await Asset.loadAsync(require('./assets/snack-icon.png'));\n * ```\n */\n static loadAsync(moduleId) {\n const moduleIds = Array.isArray(moduleId) ? moduleId : [moduleId];\n return Promise.all(moduleIds.map((moduleId) => Asset.fromModule(moduleId).downloadAsync()));\n }\n // @needsAudit\n /**\n * Returns the [`Asset`](#asset) instance representing an asset given its module or URL.\n * @param virtualAssetModule The value of `require('path/to/file')` for the asset or external\n * network URL\n * @return The [`Asset`](#asset) instance for the asset.\n */\n static fromModule(virtualAssetModule) {\n if (typeof virtualAssetModule === 'string') {\n return Asset.fromURI(virtualAssetModule);\n }\n if (typeof virtualAssetModule === 'object' &&\n 'uri' in virtualAssetModule &&\n typeof virtualAssetModule.uri === 'string') {\n const extension = AssetUris.getFileExtension(virtualAssetModule.uri);\n return new Asset({\n name: '',\n type: extension.startsWith('.') ? extension.substring(1) : extension,\n hash: null,\n uri: virtualAssetModule.uri,\n width: virtualAssetModule.width,\n height: virtualAssetModule.height,\n });\n }\n const meta = getAssetByID(virtualAssetModule);\n if (!meta) {\n throw new Error(`Module \"${virtualAssetModule}\" is missing from the asset registry`);\n }\n // Outside of the managed env we need the moduleId to initialize the asset\n // because resolveAssetSource depends on it\n if (!IS_ENV_WITH_LOCAL_ASSETS) {\n // null-check is performed above with `getAssetByID`.\n const { uri } = resolveAssetSource(virtualAssetModule);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash: meta.hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n // For images backward compatibility,\n // keeps localUri the same as uri for React Native's Image that\n // works fine with drawable resource names.\n if (Platform.OS === 'android' && !uri.includes(':') && (meta.width || meta.height)) {\n asset.localUri = asset.uri;\n asset.downloaded = true;\n }\n Asset.byHash[meta.hash] = asset;\n return asset;\n }\n return Asset.fromMetadata(meta);\n }\n // @docsMissing\n static fromMetadata(meta) {\n // The hash of the whole asset, not to be confused with the hash of a specific file returned\n // from `selectAssetSource`\n const metaHash = meta.hash;\n if (Asset.byHash[metaHash]) {\n return Asset.byHash[metaHash];\n }\n const { uri, hash } = selectAssetSource(meta);\n const asset = new Asset({\n name: meta.name,\n type: meta.type,\n hash,\n uri,\n width: meta.width,\n height: meta.height,\n });\n Asset.byHash[metaHash] = asset;\n return asset;\n }\n // @docsMissing\n static fromURI(uri) {\n if (Asset.byUri[uri]) {\n return Asset.byUri[uri];\n }\n // Possibly a Base64-encoded URI\n let type = '';\n if (uri.indexOf(';base64') > -1) {\n type = uri.split(';')[0].split('/')[1];\n }\n else {\n const extension = AssetUris.getFileExtension(uri);\n type = extension.startsWith('.') ? extension.substring(1) : extension;\n }\n const asset = new Asset({\n name: '',\n type,\n hash: null,\n uri,\n });\n Asset.byUri[uri] = asset;\n return asset;\n }\n // @needsAudit\n /**\n * Downloads the asset data to a local file in the device's cache directory. Once the returned\n * promise is fulfilled without error, the [`localUri`](#localuri) field of this asset points\n * to a local file containing the asset data. The asset is only downloaded if an up-to-date local\n * file for the asset isn't already present due to an earlier download. The downloaded `Asset`\n * will be returned when the promise is resolved.\n * @return Returns a Promise which fulfills with an `Asset` instance.\n */\n async downloadAsync() {\n if (this.downloaded) {\n return this;\n }\n if (this.downloading) {\n await new Promise((resolve, reject) => {\n this._downloadCallbacks.push({ resolve, reject });\n });\n return this;\n }\n this.downloading = true;\n try {\n if (Platform.OS === 'web') {\n if (ImageAssets.isImageType(this.type)) {\n const { width, height, name } = await ImageAssets.getImageInfoAsync(this.uri);\n this.width = width;\n this.height = height;\n this.name = name;\n }\n else {\n this.name = AssetUris.getFilename(this.uri);\n }\n }\n this.localUri = await downloadAsync(this.uri, this.hash, this.type);\n this.downloaded = true;\n this._downloadCallbacks.forEach(({ resolve }) => resolve());\n }\n catch (e) {\n this._downloadCallbacks.forEach(({ reject }) => reject(e));\n throw e;\n }\n finally {\n this.downloading = false;\n this._downloadCallbacks = [];\n }\n return this;\n }\n}\n//# sourceMappingURL=Asset.js.map","import {\n MdocRecord,\n MdocRepository,\n type SdJwtVcRecord,\n SdJwtVcRepository,\n W3cCredentialRecord,\n W3cCredentialRepository,\n} from '@credo-ts/core'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { BaseAgent } from '../agent'\nimport type { CredentialForDisplayId } from '../display/credential'\nimport { registerCredentialsForDcApi } from '../openid4vc/dcApi'\n\nexport type CredentialRecord = W3cCredentialRecord | SdJwtVcRecord | MdocRecord\n\nexport async function getCredential(agent: BaseAgent, credentialId: CredentialForDisplayId): Promise<CredentialRecord> {\n if (credentialId.startsWith('w3c-credential-')) {\n const w3cCredentialId = credentialId.replace('w3c-credential-', '')\n return agent.w3cCredentials.getCredentialRecordById(w3cCredentialId)\n }\n\n if (credentialId.startsWith('sd-jwt-vc')) {\n const sdJwtVcId = credentialId.replace('sd-jwt-vc-', '')\n return agent.sdJwtVc.getById(sdJwtVcId)\n }\n\n if (credentialId.startsWith('mdoc-')) {\n const mdocId = credentialId.replace('mdoc-', '')\n return agent.mdoc.getById(mdocId)\n }\n\n throw new Error('Unsupported record type')\n}\n\nexport async function updateCredential(agent: BaseAgent, credentialRecord: CredentialRecord) {\n if (credentialRecord instanceof W3cCredentialRecord) {\n await agent.dependencyManager.resolve(W3cCredentialRepository).update(agent.context, credentialRecord)\n } else if (credentialRecord instanceof MdocRecord) {\n await agent.dependencyManager.resolve(MdocRepository).update(agent.context, credentialRecord)\n } else {\n await agent.dependencyManager.resolve(SdJwtVcRepository).update(agent.context, credentialRecord)\n }\n\n // Update database when we update a credential\n await registerCredentialsForDcApi(agent)\n}\n\nexport async function storeCredential(paradym: ParadymWalletSdk, credentialRecord: CredentialRecord) {\n if (credentialRecord instanceof W3cCredentialRecord) {\n await paradym.agent.dependencyManager.resolve(W3cCredentialRepository).save(paradym.agent.context, credentialRecord)\n } else if (credentialRecord instanceof MdocRecord) {\n await paradym.agent.dependencyManager.resolve(MdocRepository).save(paradym.agent.context, credentialRecord)\n } else {\n await paradym.agent.dependencyManager.resolve(SdJwtVcRepository).save(paradym.agent.context, credentialRecord)\n }\n\n // Update database when we store a credential\n await registerCredentialsForDcApi(paradym.agent)\n}\n\nexport async function deleteCredential(agent: BaseAgent, credentialId: CredentialForDisplayId) {\n if (credentialId.startsWith('w3c-credential-')) {\n const w3cCredentialId = credentialId.replace('w3c-credential-', '')\n await agent.w3cCredentials.removeCredentialRecord(w3cCredentialId)\n } else if (credentialId.startsWith('sd-jwt-vc')) {\n const sdJwtVcId = credentialId.replace('sd-jwt-vc-', '')\n await agent.sdJwtVc.deleteById(sdJwtVcId)\n } else if (credentialId.startsWith('mdoc-')) {\n const mdocId = credentialId.replace('mdoc-', '')\n await agent.mdoc.deleteById(mdocId)\n }\n\n // Update database when we delete a credential\n await registerCredentialsForDcApi(agent)\n}\n","import { Mdoc, MdocRecord, SdJwtVcRecord, W3cCredentialRecord } from '@credo-ts/core'\nimport type { OpenId4VcAgent } from '../agent'\nimport {\n type RefreshCredentialMetadata,\n getBatchCredentialMetadata,\n getRefreshCredentialMetadata,\n} from '../metadata/credentials'\nimport { updateCredential } from '../storage/credentials'\nimport { decodeW3cCredential } from '../utils/encoding'\n\nexport type BatchableCredentialRecord = W3cCredentialRecord | SdJwtVcRecord | MdocRecord\nexport type FetchBatchCredentialOptions = {\n agent: OpenId4VcAgent\n credentialRecord: BatchableCredentialRecord\n refreshMetadata: RefreshCredentialMetadata\n}\nexport type FetchBatchCredentialCallback = (options: FetchBatchCredentialOptions) => Promise<BatchableCredentialRecord>\n\n/**\n * If available, takes a credential from the batch.\n *\n * @todo what if batch is gone?\n *\n * @todo does not deal with the PID anymore as it is a generic SDK. How do we want to deal with this now?\n */\nexport async function handleBatchCredential(\n agent: OpenId4VcAgent,\n credentialRecord: BatchableCredentialRecord,\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n): Promise<BatchableCredentialRecord> {\n const batchMetadata = getBatchCredentialMetadata(credentialRecord)\n if (!batchMetadata) return credentialRecord\n\n // TODO: maybe we should also store the main credential in the additional credentials (and rename it)\n // As right now the main one is mostly for display\n const batchCredential = batchMetadata.additionalCredentials.pop()\n\n // Store the record with the used credential removed. Even if the presentation fails we remove it, as we want to be careful\n // if the presentation was shared\n if (batchCredential) await updateCredential(agent, credentialRecord)\n\n const refreshMetadata = getRefreshCredentialMetadata(credentialRecord)\n\n if (fetchBatchCredentialCallback && batchMetadata.additionalCredentials.length === 0 && refreshMetadata) {\n return await fetchBatchCredentialCallback({ agent, credentialRecord, refreshMetadata })\n }\n\n if (batchCredential) {\n if (credentialRecord instanceof MdocRecord) {\n return new MdocRecord({\n mdoc: Mdoc.fromBase64Url(batchCredential as string),\n })\n }\n if (credentialRecord instanceof SdJwtVcRecord) {\n return new SdJwtVcRecord({\n compactSdJwtVc: batchCredential as string,\n })\n }\n if (credentialRecord instanceof W3cCredentialRecord) {\n return new W3cCredentialRecord({\n tags: { expandedTypes: [] },\n credential: decodeW3cCredential(batchCredential),\n })\n }\n }\n\n return credentialRecord\n}\n","import type { CredentialsForProofRequest } from './getCredentialsForProofRequest'\n\nexport type FormattedTransactionData = ReturnType<typeof getFormattedTransactionData>\nexport type QtspInfo = CredentialsForProofRequest['verifier']\n\nexport const getFormattedTransactionData = (credentialsForRequest?: CredentialsForProofRequest) => {\n if (!credentialsForRequest) return undefined\n\n const transactionData = credentialsForRequest.transactionData\n\n if (!transactionData || transactionData.length === 0) return undefined\n\n // Only allow one transaction data entry\n if (transactionData.length > 1) throw new Error('Multiple transactions are not supported yet.')\n\n const transactionDataEntry = transactionData[0]\n\n // Only allow qes_authorization is supported at this time\n if (transactionDataEntry.entry.transactionData.type !== 'qes_authorization')\n throw new Error('Only document signing is supported at this time.')\n\n // TODO: this needs to be updated when we support credential selection\n const cardForSigningId = transactionDataEntry.matchedCredentialIds.find((id) =>\n credentialsForRequest.formattedSubmission.entries.find((a) => a.inputDescriptorId === id)\n )\n\n return {\n type: transactionDataEntry.entry.transactionData.type,\n documentName: (transactionDataEntry.entry.transactionData.documentDigests as Array<{ label: string }>)[0].label,\n qtsp: credentialsForRequest.verifier, // Just use RP info for now\n cardForSigningId,\n }\n}\n","import {\n type BaseRecord,\n ClaimFormat,\n type DcqlCredentialsForRequest,\n type DcqlQueryResult,\n type MdocRecord,\n type SdJwtVcRecord,\n type W3cCredentialRecord,\n} from '@credo-ts/core'\nimport { Linking } from 'react-native'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { type FetchBatchCredentialCallback, handleBatchCredential } from '../openid4vc/batch'\nimport type { CredentialsForProofRequest } from '../openid4vc/getCredentialsForProofRequest'\nimport { getFormattedTransactionData } from '../openid4vc/transaction'\n\nexport const shareProof = async ({\n resolvedRequest,\n selectedCredentials,\n acceptTransactionData,\n fetchBatchCredentialCallback,\n paradym,\n}: {\n paradym: ParadymWalletSdk\n resolvedRequest: CredentialsForProofRequest\n selectedCredentials: { [inputDescriptorId: string]: string }\n // FIXME: Should be a more complex structure allowing which credential to use for which entry\n acceptTransactionData?: boolean\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n}) => {\n const { authorizationRequest } = resolvedRequest\n if (\n !resolvedRequest.credentialsForRequest?.areRequirementsSatisfied &&\n !resolvedRequest.queryResult?.canBeSatisfied\n ) {\n throw new Error('Requirements from proof request are not satisfied')\n }\n\n // Map all requirements and entries to a credential record. If a credential record for an\n // input descriptor has been provided in `selectedCredentials` we will use that. Otherwise\n // it will pick the first available credential.\n const presentationExchangeCredentials = resolvedRequest.credentialsForRequest\n ? Object.fromEntries(\n await Promise.all(\n resolvedRequest.credentialsForRequest.requirements.flatMap((requirement) =>\n requirement.submissionEntry.slice(0, requirement.needsCount).map(async (entry) => {\n const credentialId = selectedCredentials[entry.inputDescriptorId]\n const credential =\n entry.verifiableCredentials.find((vc) => vc.credentialRecord.id === credentialId) ??\n entry.verifiableCredentials[0]\n\n // Optionally use a batch credential\n const credentialRecord = await handleBatchCredential(\n paradym.agent,\n credential.credentialRecord,\n fetchBatchCredentialCallback\n )\n\n return [entry.inputDescriptorId, [{ ...credential, credentialRecord }]]\n })\n )\n )\n )\n : undefined\n\n const dcqlCredentials = resolvedRequest.queryResult\n ? Object.fromEntries(\n await Promise.all(\n Object.entries(\n Object.keys(selectedCredentials).length > 0\n ? getSelectedCredentialsForRequest(resolvedRequest.queryResult, selectedCredentials)\n : paradym.agent.modules.openId4VcHolder.selectCredentialsForDcqlRequest(resolvedRequest.queryResult)\n ).map(async ([queryCredentialId, credential]) => {\n // Optionally use a batch credential\n const credentialRecord = await handleBatchCredential(\n paradym.agent,\n credential.credentialRecord,\n fetchBatchCredentialCallback\n )\n\n return [queryCredentialId, { ...credential, credentialRecord }]\n })\n )\n )\n : undefined\n\n const cardForSigningId = getFormattedTransactionData(resolvedRequest)?.cardForSigningId\n\n try {\n const result = await paradym.agent.modules.openId4VcHolder.acceptOpenId4VpAuthorizationRequest({\n authorizationRequestPayload: authorizationRequest,\n presentationExchange: presentationExchangeCredentials\n ? {\n credentials: presentationExchangeCredentials,\n }\n : undefined,\n dcql: dcqlCredentials\n ? {\n credentials: dcqlCredentials,\n }\n : undefined,\n transactionData:\n resolvedRequest.transactionData && acceptTransactionData && cardForSigningId\n ? [{ credentialId: cardForSigningId }]\n : undefined,\n origin: resolvedRequest.origin,\n })\n\n // if redirect_uri is provided, open it in the browser\n // Even if the response returned an error, we must open this uri\n if (result.redirectUri) {\n await Linking.openURL(result.redirectUri)\n }\n\n if (result.serverResponse && (result.serverResponse.status < 200 || result.serverResponse.status > 299)) {\n paradym.logger.error('Error while accepting authorization request', {\n authorizationRequest,\n response: result.authorizationResponse,\n responsePayload: result.authorizationResponsePayload,\n })\n throw new Error(\n `Error while accepting authorization request. ${JSON.stringify(result.serverResponse.body, null, 2)}`\n )\n }\n\n return result\n } catch (error) {\n // TODO\n throw Error('TODO')\n }\n}\n\n/**\n * Selects the credentials to use based on the output from `getCredentialsForRequest`\n * Use this method if you don't want to manually select the credentials yourself.\n */\nfunction getSelectedCredentialsForRequest(\n dcqlQueryResult: DcqlQueryResult,\n selectedCredentials: { [credentialQueryId: string]: string }\n): DcqlCredentialsForRequest {\n if (!dcqlQueryResult.canBeSatisfied) {\n throw new Error('Cannot select the credentials for the dcql query presentation if the request cannot be satisfied')\n }\n\n const credentials: DcqlCredentialsForRequest = {}\n\n for (const [credentialQueryId, credentialRecordId] of Object.entries(selectedCredentials)) {\n const matchesForCredentialQuery = dcqlQueryResult.credential_matches[credentialQueryId]\n if (matchesForCredentialQuery.success) {\n const match = matchesForCredentialQuery.all\n .map((credential) =>\n credential.find((claimSet) =>\n claimSet?.success && 'record' in claimSet && (claimSet.record as BaseRecord).id === credentialRecordId\n ? claimSet\n : undefined\n )\n )\n .find((i) => i !== undefined)\n // TODO: fix the typing, make selection in Credo easier\n const matchWithRecord = match as typeof match & { record: MdocRecord | SdJwtVcRecord | W3cCredentialRecord }\n\n if (\n matchWithRecord?.success &&\n matchWithRecord.record.type === 'MdocRecord' &&\n matchWithRecord.output.credential_format === 'mso_mdoc'\n ) {\n credentials[credentialQueryId] = {\n claimFormat: ClaimFormat.MsoMdoc,\n credentialRecord: matchWithRecord.record,\n disclosedPayload: matchWithRecord.output.namespaces,\n }\n } else if (\n matchWithRecord?.success &&\n matchWithRecord.record.type === 'SdJwtVcRecord' &&\n (matchWithRecord.output.credential_format === 'dc+sd-jwt' ||\n matchWithRecord.output.credential_format === 'vc+sd-jwt')\n ) {\n credentials[credentialQueryId] = {\n claimFormat: ClaimFormat.SdJwtVc,\n credentialRecord: matchWithRecord.record,\n disclosedPayload: matchWithRecord.output.claims,\n }\n }\n }\n }\n\n return credentials\n}\n","import {\n type DigitalCredentialsRequest,\n type RegisterCredentialsOptions,\n registerCredentials,\n sendErrorResponse,\n sendResponse,\n} from '@animo-id/expo-digital-credentials-api'\nimport { DateOnly, type Logger, type MdocNameSpaces } from '@credo-ts/core'\nimport * as ExpoAsset from 'expo-asset'\nimport { Image } from 'expo-image'\nimport { ImageManipulator, SaveFormat } from 'expo-image-manipulator'\nimport { Platform } from 'react-native'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport type { BaseAgent } from '../agent'\nimport { getCredentialForDisplay } from '../display/credential'\nimport { sanitizeString } from '../display/strings'\nimport { shareProof } from '../invitation/shareProof'\nimport { getHostNameFromUrl } from '../utils/url'\nimport type { FetchBatchCredentialCallback } from './batch'\nimport { type CredentialsForProofRequest, getCredentialsForProofRequest } from './getCredentialsForProofRequest'\n\ntype CredentialItem = RegisterCredentialsOptions['credentials'][number]\ntype CredentialDisplayClaim = NonNullable<CredentialItem['display']['claims']>[number]\n\nfunction mapMdocAttributes(namespaces: MdocNameSpaces) {\n return Object.fromEntries(\n Object.entries(namespaces).map(([namespace, values]) => [\n namespace,\n Object.fromEntries(\n Object.entries(values).map(([key, value]) => {\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {\n return [key, value]\n }\n\n if (value instanceof Date || value instanceof DateOnly) {\n return [key, value.toISOString()]\n }\n\n // For all other complex types we don't allow matching based on the value\n return [key, null]\n })\n ),\n ])\n )\n}\n\nfunction mapMdocAttributesToClaimDisplay(namespaces: MdocNameSpaces) {\n return Object.entries(namespaces).flatMap(([namespace, values]) =>\n Object.keys(values).map((key) => ({\n path: [namespace, key],\n // FIXME: we need to integrate with claim based mapping of names.\n // For that we first need to:\n // - use the claims arrays with path syntax in our Wallet instead of the custom mappings\n // - support oid4vci draft 15 claim syntax\n displayName: sanitizeString(key),\n }))\n )\n}\n\nfunction mapSdJwtAttributesToClaimDisplay(claims: object, path: string[] = []): CredentialDisplayClaim[] {\n return Object.entries(claims).flatMap(([claimName, value]) => {\n const nestedClaims =\n value && typeof value === 'object' && !Array.isArray(value)\n ? mapSdJwtAttributesToClaimDisplay(value, [...path, claimName])\n : []\n\n return [\n {\n path: [...path, claimName],\n // FIXME: we need to integrate with claim based mapping of names.\n // For that we first need to:\n // - use the claims arrays with path syntax in our Wallet instead of the custom mappings\n // - support oid4vci draft 15 claim syntax\n displayName: sanitizeString(claimName),\n },\n ...nestedClaims,\n ]\n })\n}\n\n/**\n * Returns base64 data url\n */\nasync function resizeImageWithAspectRatio(logger: Logger, asset: ExpoAsset.Asset) {\n try {\n // Make sure the asset is loaded\n if (!asset.localUri) {\n await asset.downloadAsync()\n }\n\n if (!asset.localUri) {\n return undefined\n }\n\n const image = await Image.loadAsync(asset.localUri)\n\n // Calculate new dimensions maintaining aspect ratio\n let width: number\n let height: number\n if (image.width >= image.height) {\n // If width is the larger dimension\n width = 20\n height = Math.round((image.height / image.width) * 20)\n } else {\n // If height is the larger dimension\n height = 20\n width = Math.round((image.width / image.height) * 20)\n }\n\n // Use the new API to resize the image\n const resizedImage = await ImageManipulator.manipulate(image).resize({ width, height }).renderAsync()\n const savedImages = await resizedImage.saveAsync({\n base64: true,\n format: SaveFormat.PNG,\n compress: 1,\n })\n\n if (!savedImages.base64) {\n return undefined\n }\n\n return `data:image/png;base64,${savedImages.base64}` as const\n } catch (error) {\n logger.error('Error resizing image.', {\n error,\n })\n throw error\n }\n}\n\nasync function loadCachedImageAsBase64DataUrl(logger: Logger, url: string) {\n let asset: ExpoAsset.Asset\n\n try {\n // in case of external image\n if (url.startsWith('data://') || url.startsWith('https://')) {\n const cachePath = await Image.getCachePathAsync(url)\n if (!cachePath) return undefined\n\n asset = await ExpoAsset.Asset.fromURI(`file://${cachePath}`).downloadAsync()\n }\n // In case of local image\n else {\n asset = ExpoAsset.Asset.fromModule(url)\n }\n\n return await resizeImageWithAspectRatio(logger, asset)\n } catch (error) {\n // just ignore it, we don't want to cause issues with registering crednetials\n logger.error('Error resizing and retrieving cached image for DC API', {\n error,\n })\n }\n}\n\n// TODO(sdk): should be a method on the sdk\nexport async function registerCredentialsForDcApi(agent: BaseAgent) {\n if (Platform.OS === 'ios') return\n\n const mdocRecords = await agent.mdoc.getAll()\n const sdJwtVcRecords = await agent.sdJwtVc.getAll()\n\n const mdocCredentials = mdocRecords.map(async (record): Promise<CredentialItem> => {\n const mdoc = record.credential\n const { display } = getCredentialForDisplay(record)\n\n const iconDataUrl = display.backgroundImage?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.backgroundImage?.url)\n : display.issuer.logo?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.issuer.logo.url)\n : undefined\n\n return {\n id: record.id,\n credential: {\n doctype: mdoc.docType,\n format: 'mso_mdoc',\n namespaces: mapMdocAttributes(mdoc.issuerSignedNamespaces),\n },\n display: {\n title: display.name,\n subtitle: `Issued by ${display.issuer.name}`,\n claims: mapMdocAttributesToClaimDisplay(mdoc.issuerSignedNamespaces),\n iconDataUrl,\n },\n } as const\n })\n\n const sdJwtCredentials = sdJwtVcRecords.map(async (record): Promise<CredentialItem> => {\n const sdJwtVc = record.credential\n const { display } = getCredentialForDisplay(record)\n\n const iconDataUrl = display.backgroundImage?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.backgroundImage?.url)\n : display.issuer.logo?.url\n ? await loadCachedImageAsBase64DataUrl(agent.config.logger, display.issuer.logo.url)\n : undefined\n\n return {\n id: record.id,\n credential: {\n vct: record.getTags().vct,\n format: 'dc+sd-jwt',\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n claims: sdJwtVc.prettyClaims as any,\n },\n display: {\n title: display.name,\n subtitle: `Issued by ${display.issuer.name}`,\n claims: mapSdJwtAttributesToClaimDisplay(sdJwtVc.prettyClaims),\n iconDataUrl,\n },\n } as const\n })\n\n const credentials = await Promise.all([...sdJwtCredentials, ...mdocCredentials])\n agent.config.logger.trace('Registering credentials for Digital Credentials API')\n\n await registerCredentials({\n credentials,\n matcher: 'ubique',\n })\n}\n\nexport async function resolveRequestForDcApi({\n paradym,\n request,\n}: { paradym: ParadymWalletSdk; request: DigitalCredentialsRequest }) {\n const providerRequest = request.request.requests\n ? request.request.requests[request.selectedEntry.providerIndex].data\n : request.request.providers[request.selectedEntry.providerIndex].request\n\n const authorizationRequestPayload =\n typeof providerRequest === 'string' ? JSON.parse(providerRequest) : providerRequest\n\n // TODO: should allow limiting it to a specific credential (as we already know the credential id)\n const result = await getCredentialsForProofRequest({\n paradym,\n requestPayload: authorizationRequestPayload,\n origin: request.origin,\n })\n\n if (result.formattedSubmission.entries.length !== 1) {\n throw new Error('Only requests for a single credential supported for digital credentials api')\n }\n\n paradym.logger.debug('Resolved request', {\n result,\n })\n if (result.formattedSubmission.entries[0].isSatisfied) {\n const credential = result.formattedSubmission.entries[0].credentials.find(\n (c) => c.credential.record.id === request.selectedEntry.credentialId\n )\n if (!credential)\n throw new Error(\n `Could not find selected credential with id '${request.selectedEntry.credentialId}' in formatted submission`\n )\n\n // Update to only contain the already selected credential\n result.formattedSubmission.entries[0].credentials = [credential]\n }\n\n return {\n ...result,\n verifier: {\n ...result.verifier,\n hostName: getHostNameFromUrl(request.origin),\n },\n }\n}\n\nexport async function sendResponseForDcApi({\n paradym,\n resolvedRequest,\n dcRequest,\n fetchBatchCredentialCallback,\n}: {\n paradym: ParadymWalletSdk\n resolvedRequest: CredentialsForProofRequest\n dcRequest: DigitalCredentialsRequest\n\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n}) {\n const firstEntry = resolvedRequest.formattedSubmission.entries[0]\n if (!firstEntry.isSatisfied) {\n paradym.logger.debug('Expected one entry for DC API response', {\n resolvedRequest,\n dcRequest,\n })\n throw new Error('Expected one entry for DC API response')\n }\n\n const result = await shareProof({\n paradym,\n resolvedRequest,\n fetchBatchCredentialCallback,\n selectedCredentials: {\n [firstEntry.inputDescriptorId]: dcRequest.selectedEntry.credentialId,\n },\n })\n\n paradym.logger.debug('Sending response for Digital Credentials API', {\n result,\n })\n\n sendResponse({\n response: JSON.stringify(result.authorizationResponse),\n })\n}\n\nexport async function sendErrorResponseForDcApi(errorMessage: string) {\n sendErrorResponse({\n errorMessage,\n })\n}\n","import { CredoError } from '@credo-ts/core'\nimport { MediatorPickupStrategy } from '@credo-ts/didcomm'\nimport type { DidCommAgent } from '../agent'\n\n/**\n * Check whether a default mediator is configued\n */\nexport async function hasMediationConfigured(agent: DidCommAgent) {\n const mediationRecord = await agent.modules.mediationRecipient.findDefaultMediator()\n\n return mediationRecord !== null\n}\n\n/**\n * Create connection to mediator and request mediation.\n *\n * This connects based on a did\n */\nexport async function setupMediationWithDid(agent: DidCommAgent, mediatorDid: string) {\n // If the invitation is a did, the invitation id is the did\n const outOfBandRecord = await agent.modules.outOfBand.findByReceivedInvitationId(mediatorDid)\n let [connection] = outOfBandRecord ? await agent.modules.connections.findAllByOutOfBandId(outOfBandRecord.id) : []\n\n if (!connection) {\n agent.config.logger.debug('Mediation connection does not exist, creating connection')\n // We don't want to use the current default mediator when connecting to another mediator\n const routing = await agent.modules.mediationRecipient.getRouting({ useDefaultMediator: false })\n\n agent.config.logger.debug('Routing created', routing)\n const { connectionRecord: newConnection } = await agent.modules.outOfBand.receiveImplicitInvitation({\n did: mediatorDid,\n routing,\n })\n agent.config.logger.debug('Mediation invitation processed', { mediatorDid })\n\n if (!newConnection) {\n throw new CredoError('No connection record to provision mediation.')\n }\n\n connection = newConnection\n }\n\n const readyConnection = connection.isReady\n ? connection\n : await agent.modules.connections.returnWhenIsConnected(connection.id)\n\n return agent.modules.mediationRecipient.provision(readyConnection)\n}\n\n/**\n * Initiate message pickup from the mediator.\n */\nexport async function initiateMessagePickup(agent: DidCommAgent) {\n agent.config.logger.info('Initiating message pickup from mediator')\n\n // Iniate message pickup from the mediator. Passing no mediator, will use default mediator\n await agent.modules.mediationRecipient.initiateMessagePickup(undefined, MediatorPickupStrategy.Implicit)\n}\n\n/**\n * Stop message pickup from the mediator.\n */\nexport async function stopMessagePickup(agent: DidCommAgent) {\n agent.config.logger.info('Stopping message pickup from mediator')\n\n // Stop message pickup. Will stopp all message pickup, not just from the mediator\n await agent.modules.mediationRecipient.stopMessagePickup()\n}\n","import { useEffect } from 'react'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { initiateMessagePickup, stopMessagePickup } from '../didcomm/mediation'\n\n/**\n * Hook to enable message pickup from the mediator.\n *\n * You can use the `isEnabled` config property to enable/disable message pickup.\n * This is useful if e.g. there's no internet connection, or mediation has not been setup yet\n */\nexport function useDidCommMessagePickup({\n isEnabled = true,\n paradym,\n}: {\n isEnabled?: boolean\n paradym?: ParadymWalletSdk\n}) {\n useEffect(() => {\n // Do not pickup messages if not enabled\n if (!isEnabled || !paradym) return\n\n paradym.logger.debug('Initiating message pickup.')\n\n void initiateMessagePickup(paradym.agent)\n\n // Stop message pickup when component unmounts\n return () => {\n void stopMessagePickup(paradym.agent)\n }\n }, [isEnabled, paradym])\n}\n","import { useEffect, useState } from 'react'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { hasMediationConfigured, setupMediationWithDid } from '../didcomm/mediation'\nimport { ParadymWalletNoMediatorDidProvidedError } from '../error'\nimport { useDidCommMessagePickup } from './useDidCommMessagePickup'\n\nexport function useDidCommMediatorSetup({\n mediatorDid,\n paradym,\n}: {\n mediatorDid?: string\n paradym?: ParadymWalletSdk\n}) {\n const [isSettingUpMediation, setIsSettingUpMediation] = useState(false)\n const [isMediationConfigured, setIsMediationConfigured] = useState(false)\n\n // Enable message pickup when mediation is configured and internet connection is available\n useDidCommMessagePickup({\n isEnabled: isMediationConfigured,\n })\n\n useEffect(() => {\n if (!paradym) return\n if (isMediationConfigured) return\n if (isSettingUpMediation) return\n\n setIsSettingUpMediation(true)\n\n paradym.logger.debug('Checking if mediation is configured')\n\n void hasMediationConfigured(paradym.agent)\n .then(async (mediationConfigured) => {\n if (!mediationConfigured) {\n paradym.logger.debug('Mediation not configured yet')\n if (!mediatorDid) throw new ParadymWalletNoMediatorDidProvidedError()\n await setupMediationWithDid(paradym.agent, mediatorDid)\n }\n\n paradym.logger.info('Mediation configured')\n setIsMediationConfigured(true)\n })\n .finally(() => {\n setIsSettingUpMediation(false)\n })\n }, [isMediationConfigured, isSettingUpMediation, mediatorDid, paradym])\n\n return { isMediationConfigured, isSettingUpMediation }\n}\n","import { registerCredentialsForDcApi } from '../openid4vc/dcApi'\nimport {\n type SecureUnlockReturnInitializing,\n type SecureUnlockReturnLocked,\n type SecureUnlockReturnNotConfigured,\n type SecureUnlockReturnUnlocked,\n type SecureUnlockReturnWalletKeyAcquired,\n useSecureUnlock,\n} from '../secure'\nimport { useDidCommMediatorSetup } from './useDidCommMediatorSetup'\n\ntype ParadymLoadingState = SecureUnlockReturnInitializing /*{\n state: 'loading'\n}*/\n\ntype ParadymNotConfiguredState = SecureUnlockReturnNotConfigured /*{\n state: 'not-configured'\n setup: (pin: string) => Promise<void>\n reinitialize: () => void\n}*/\n\ntype ParadymAcquiredWalletKeyState = SecureUnlockReturnWalletKeyAcquired /*{\n state: 'acquired-wallet-key'\n unlockMethod: UnlockMethod\n unlock: (options?: { enableBiometrics: boolean }) => Promise<void>\n reinitialize: () => void\n}*/\n\ntype ParadymLockedState = SecureUnlockReturnLocked /*{\n state: 'locked'\n canTryUnlockingUsingBiometrics: boolean\n isUnlocking: boolean\n tryUnlockingUsingBiometrics: () => Promise<void>\n unlockUsingPin: (pin: string) => Promise<void>\n reinitialize: () => void\n}*/\n\ntype ParadymUnlockedState = SecureUnlockReturnUnlocked /*{\n state: 'unlocked'\n unlockMethod: UnlockMethod\n lock: () => Promise<void>\n paradym: ParadymWalletSdk\n reinitialize: () => void\n}*/\n\nexport type ParadymState =\n | ParadymLoadingState\n | ParadymNotConfiguredState\n | ParadymAcquiredWalletKeyState\n | ParadymLockedState\n | ParadymUnlockedState\n\nexport function useParadym(): ParadymState\nexport function useParadym(assertState: 'initializing'): ParadymLoadingState\nexport function useParadym(assertState: 'not-configured'): ParadymNotConfiguredState\nexport function useParadym(assertState: 'acquired-wallet-key'): ParadymAcquiredWalletKeyState\nexport function useParadym(assertState: 'locked'): ParadymLockedState\nexport function useParadym(assertState: 'unlocked'): ParadymUnlockedState\nexport function useParadym(assertState?: ParadymState['state']): ParadymState {\n const unlock = useSecureUnlock()\n\n useDidCommMediatorSetup({ paradym: unlock.state === 'unlocked' ? unlock.paradym : undefined })\n\n if (assertState && unlock.state !== assertState) {\n throw new Error(`Unlock state '${unlock.state}' did not match the asserted state of '${assertState}'`)\n }\n\n if (unlock.state === 'initializing') {\n return unlock\n }\n\n if (unlock.state === 'not-configured') {\n return unlock\n }\n\n if (unlock.state === 'acquired-wallet-key') {\n return unlock\n }\n\n if (unlock.state === 'locked') {\n return unlock\n }\n\n if (unlock.state === 'unlocked') {\n // When the state changes to unlocked, we register the credentials for the digital credentials API\n void registerCredentialsForDcApi(unlock.paradym.agent)\n return unlock\n }\n\n throw new Error(`Invalid unlock state: '${JSON.stringify(unlock)}'`)\n}\n","import { W3cCredentialRepository } from '@credo-ts/core'\nimport type { CredentialStateChangedEvent } from '@credo-ts/didcomm'\nimport { CredentialEventTypes, CredentialState } from '@credo-ts/didcomm'\nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { firstValueFrom } from 'rxjs'\nimport { filter, first, timeout } from 'rxjs/operators'\nimport type { DidCommAgent } from '../agent'\nimport {\n getDidCommCredentialExchangeDisplayMetadata,\n openIdCredentialMetadataFromDidCommCredentialExchangeMetadata,\n setOpenId4VcCredentialMetadata,\n} from '../metadata/credentials'\nimport { useAgent } from '../providers/AgentProvider'\nimport { useCredentialById } from '../providers/CredentialExchangeProvider'\nimport { addReceivedActivity } from '../storage/activities'\nimport { useParadym } from './useParadym'\n\ntype AcceptCredentialOptions = {\n storeAsActivity?: boolean\n}\n\ntype DeclineCredentialOptions = {\n deleteCredential?: boolean\n}\n\nfunction useOfferAttributes(credentialExchangeId: string) {\n const { agent } = useAgent<DidCommAgent>()\n\n const { data, status } = useQuery({\n queryKey: ['didCommCredentialOfferAttributes', credentialExchangeId],\n queryFn: async () => {\n const formatData = await agent.modules.credentials.getFormatData(credentialExchangeId)\n const offer = formatData.offer?.anoncreds ?? formatData.offer?.indy\n const offerAttributes = formatData.offerAttributes\n\n if (!offer || !offerAttributes) {\n throw new Error('Invalid credential offer')\n }\n\n return {\n attributes: Object.fromEntries(offerAttributes.map(({ name, value }) => [name, value])),\n schemaId: offer.schema_id,\n }\n },\n })\n\n return {\n data,\n status,\n }\n}\n\nexport function useDidCommCredentialActions(credentialExchangeId: string) {\n const { paradym } = useParadym('unlocked')\n\n const credentialExchange = useCredentialById(credentialExchangeId)\n const { data } = useOfferAttributes(credentialExchangeId)\n\n const { mutateAsync: acceptCredentialMutation, status: acceptStatus } = useMutation({\n mutationKey: ['acceptDidCommCredential', credentialExchangeId],\n mutationFn: async (options: AcceptCredentialOptions = { storeAsActivity: true }) => {\n if (!credentialExchange) return\n\n const credentialDone$ = paradym.agent.events\n .observable<CredentialStateChangedEvent>(CredentialEventTypes.CredentialStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.credentialRecord.id === credentialExchangeId &&\n [CredentialState.CredentialReceived, CredentialState.Done].includes(event.payload.credentialRecord.state)\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const credentialDonePromise = firstValueFrom(credentialDone$)\n\n await paradym.agent.modules.credentials.acceptOffer({ credentialRecordId: credentialExchangeId })\n const doneEvent = await credentialDonePromise\n\n const w3cCredentialRecordId = doneEvent.payload.credentialRecord.credentials.find(\n (c) => c.credentialRecordType === 'w3c'\n )?.credentialRecordId\n const didCommDisplayMetadata = getDidCommCredentialExchangeDisplayMetadata(doneEvent.payload.credentialRecord)\n\n // Update the w3c credential record metadata, based on the didcomm credential exchange display metadata\n if (w3cCredentialRecordId && didCommDisplayMetadata) {\n // NOTE: we store the metadata also in openid4vc format, just because it's simple. In the future\n // we may want to have our own display format we use for all credential types\n const w3cRecord = await paradym.agent.w3cCredentials.getCredentialRecordById(w3cCredentialRecordId)\n\n // TODO: we must somehow link the w3c credential record to a DIDComm connection\n // first in Paradym Wallet, but would alos be nice to do this within Credo\n setOpenId4VcCredentialMetadata(\n w3cRecord,\n openIdCredentialMetadataFromDidCommCredentialExchangeMetadata(\n doneEvent.payload.credentialRecord,\n didCommDisplayMetadata\n )\n )\n\n const w3cCredentialRepository = paradym.agent.dependencyManager.resolve(W3cCredentialRepository)\n await w3cCredentialRepository.update(paradym.agent.context, w3cRecord)\n\n if (options.storeAsActivity) {\n await addReceivedActivity(paradym, {\n entityId: credentialExchange?.connectionId,\n name: didcommDisplayMetadata?.issuerName ?? 'Unknown',\n logo: { url: didcommDisplayMetadata?.issuerLogoUri },\n backgroundColor: '#ffffff', // Default to a white background for now\n credentialIds: [`w3c-credential-${w3cRecord?.id}`],\n })\n }\n\n return w3cRecord\n }\n },\n })\n const { mutateAsync: declineCredentialMutation, status: declineStatus } = useMutation({\n mutationKey: ['declineDidCommCredential', credentialExchangeId],\n mutationFn: async (options: DeclineCredentialOptions = { deleteCredential: true }) => {\n if (!credentialExchange) return\n\n const credentialDone$ = paradym.agent.events\n .observable<CredentialStateChangedEvent>(CredentialEventTypes.CredentialStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.credentialRecord.id === credentialExchangeId &&\n event.payload.credentialRecord.state === CredentialState.Declined\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const credentialDonePromise = firstValueFrom(credentialDone$)\n\n await paradym.agent.modules.credentials.declineOffer(credentialExchangeId, {\n sendProblemReport: true,\n })\n\n if (options.deleteCredential) {\n await paradym.agent.modules.credentials.deleteById(credentialExchangeId)\n }\n\n await credentialDonePromise\n },\n })\n\n const didcommDisplayMetadata = credentialExchange\n ? getDidCommCredentialExchangeDisplayMetadata(credentialExchange)\n : undefined\n\n return {\n acceptCredential: (options?: AcceptCredentialOptions) => acceptCredentialMutation(options),\n declineCredential: (options?: DeclineCredentialOptions) => declineCredentialMutation(options),\n acceptStatus,\n declineStatus,\n credentialExchange,\n display: {\n issuer: {\n name: didcommDisplayMetadata?.issuerName,\n logo: {\n url: didcommDisplayMetadata?.issuerLogoUri,\n },\n },\n name: didcommDisplayMetadata?.credentialName,\n },\n attributes: data?.attributes,\n }\n}\n","import type {\n AnonCredsRequestedAttributeMatch,\n AnonCredsRequestedPredicateMatch,\n AnonCredsSelectedCredentials,\n} from '@credo-ts/anoncreds'\nimport { CredoError } from '@credo-ts/core'\nimport type { ProofStateChangedEvent } from '@credo-ts/didcomm'\nimport { ProofEventTypes, ProofState, V2RequestPresentationMessage } from '@credo-ts/didcomm'\nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { firstValueFrom } from 'rxjs'\nimport { filter, first, timeout } from 'rxjs/operators'\nimport { getCredentialForDisplay } from '../display/credential'\nimport type {\n FormattedSubmission,\n FormattedSubmissionEntry,\n FormattedSubmissionEntrySatisfiedCredential,\n} from '../format/submission'\nimport { useConnectionById } from '../providers/ConnectionProvider'\nimport { useProofById } from '../providers/ProofExchangeProvider'\nimport { addSharedActivityForSubmission } from '../storage/activities'\nimport { getCredential } from '../storage/credentials'\nimport type { NonEmptyArray } from '../types'\nimport { useParadym } from './useParadym'\n\ntype AcceptPresentationOptions = {\n selectedCredentials?: { [inputDescriptorId: string]: string }\n storeAsActivity?: boolean\n}\n\ntype DeclinePresentationOptions = {\n deletePresentation?: boolean\n storeAsActivity?: boolean\n}\n\nexport function useDidCommPresentationActions(proofExchangeId: string) {\n const { paradym } = useParadym('unlocked')\n\n const proofExchange = useProofById(proofExchangeId)\n const connection = useConnectionById(proofExchange?.connectionId ?? '')\n\n const { data } = useQuery({\n queryKey: ['didCommPresentationSubmission', proofExchangeId],\n queryFn: async () => {\n const formatData = await paradym.agent.modules.proofs.getFormatData(proofExchangeId)\n\n const proofRequest = formatData.request?.anoncreds ?? formatData.request?.indy\n\n const credentialsForRequest = await paradym.agent.modules.proofs.getCredentialsForRequest({\n proofRecordId: proofExchangeId,\n })\n\n const formatKey = formatData.request?.anoncreds !== undefined ? 'anoncreds' : 'indy'\n const anonCredsCredentials =\n credentialsForRequest.proofFormats.anoncreds ?? credentialsForRequest.proofFormats.indy\n if (!anonCredsCredentials || !proofRequest) {\n throw new CredoError('Invalid proof request.')\n }\n\n const entries = new Map<\n string,\n {\n groupNames: {\n attributes: string[]\n predicates: string[]\n }\n matches: Array<AnonCredsRequestedPredicateMatch>\n requestedAttributes: Set<string>\n }\n >()\n\n const mergeOrSetEntry = (\n type: 'attribute' | 'predicate',\n groupName: string,\n requestedAttributeNames: string[],\n matches: AnonCredsRequestedAttributeMatch[] | AnonCredsRequestedPredicateMatch[]\n ) => {\n // We create an entry hash. This way we can group all items that have the same credentials\n // available. If no credentials are available for a group, we create a entry hash based\n // on the group name\n const entryHash = groupName.includes('__CREDENTIAL__')\n ? groupName.split('__CREDENTIAL__')[0]\n : matches.length > 0\n ? matches\n .map((a) => a.credentialId)\n .sort()\n .join(',')\n : groupName\n\n const entry = entries.get(entryHash)\n\n if (!entry) {\n entries.set(entryHash, {\n groupNames: {\n attributes: type === 'attribute' ? [groupName] : [],\n predicates: type === 'predicate' ? [groupName] : [],\n },\n matches,\n requestedAttributes: new Set(requestedAttributeNames),\n })\n return\n }\n\n if (type === 'attribute') {\n entry.groupNames.attributes.push(groupName)\n } else {\n entry.groupNames.predicates.push(groupName)\n }\n\n entry.requestedAttributes = new Set([...requestedAttributeNames, ...entry.requestedAttributes])\n\n // We only include the matches which are present in both entries. If we use the __CREDENTIAL__ it means we can only use\n // credentials that match both (we want this in Paradym). For the other ones we create a 'hash' from all available credentialIds\n // first already, so it should give the same result.\n entry.matches = entry.matches.filter((match) =>\n matches.some((innerMatch) => match.credentialId === innerMatch.credentialId)\n )\n }\n\n for (const [groupName, attributeArray] of Object.entries(anonCredsCredentials.attributes)) {\n const requestedAttribute = proofRequest.requested_attributes[groupName]\n if (!requestedAttribute) throw new Error('Invalid presentation request')\n const requestedAttributesNames = requestedAttribute.names ?? [requestedAttribute.name as string]\n\n mergeOrSetEntry('attribute', groupName, requestedAttributesNames, attributeArray)\n }\n\n for (const [groupName, predicateArray] of Object.entries(anonCredsCredentials.predicates)) {\n const requestedPredicate = proofRequest.requested_predicates[groupName]\n if (!requestedPredicate) throw new Error('Invalid presentation request')\n\n mergeOrSetEntry('predicate', groupName, ['TODO'], predicateArray)\n }\n\n const entriesArray = await Promise.all(\n Array.from(entries.entries()).map(async ([entryHash, entry]): Promise<FormattedSubmissionEntry> => {\n if (entry.matches.length === 0) {\n return {\n inputDescriptorId: entryHash,\n isSatisfied: false,\n // TODO: we can fetch the schema name based on requirements\n name: 't(commonMessages.credential)',\n requestedAttributePaths: Array.from(entry.requestedAttributes).map((a) => [a]),\n }\n }\n\n const credentials = (await Promise.all(\n entry.matches.map(async (match): Promise<FormattedSubmissionEntrySatisfiedCredential> => {\n const credential = await getCredential(paradym.agent, `w3c-credential-${match.credentialId}`)\n const credentialForDisplay = getCredentialForDisplay(credential)\n\n const disclosedAttributesWithValues = Object.entries(credentialForDisplay.attributes)\n .filter(([key]) => entry.requestedAttributes.has(key))\n .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})\n\n const disclosedPredicatesWithValues = Object.entries(anonCredsCredentials.predicates).reduce(\n (acc, [groupName]) => {\n const requestedPredicate = proofRequest.requested_predicates[groupName]\n return {\n ...acc,\n [requestedPredicate.name]: {\n type: requestedPredicate.p_type,\n value: requestedPredicate.p_value,\n },\n }\n },\n {}\n )\n\n return {\n credential: credentialForDisplay,\n disclosed: {\n attributes: {\n ...disclosedAttributesWithValues,\n ...disclosedPredicatesWithValues,\n },\n metadata: credentialForDisplay.metadata,\n paths: Array.from(entry.requestedAttributes).map((a) => [a]),\n },\n }\n })\n )) as NonEmptyArray<FormattedSubmissionEntrySatisfiedCredential>\n\n return {\n inputDescriptorId: entryHash,\n credentials,\n isSatisfied: true,\n name: credentials[0].credential.display.name,\n }\n })\n )\n const requestMessage = await paradym.agent.modules.proofs.findRequestMessage(proofExchangeId)\n const purpose =\n requestMessage?.comment ??\n (requestMessage instanceof V2RequestPresentationMessage ? requestMessage.goal : undefined)\n\n const submission: FormattedSubmission = {\n areAllSatisfied: entriesArray.every((entry) => entry.isSatisfied),\n entries: entriesArray,\n name: proofRequest?.name ?? 't(commonMessages.unknown)',\n purpose,\n }\n\n return { submission, formatKey, entries }\n },\n })\n\n const { mutateAsync: acceptMutateAsync, status: acceptStatus } = useMutation({\n mutationKey: ['acceptDidCommPresentation', proofExchangeId],\n mutationFn: async (options: AcceptPresentationOptions = { storeAsActivity: true }) => {\n try {\n let formatInput: { indy?: AnonCredsSelectedCredentials; anoncreds?: AnonCredsSelectedCredentials } | undefined =\n undefined\n\n if (options?.selectedCredentials && Object.keys(options.selectedCredentials).length > 0) {\n if (!data?.formatKey || !data.entries) throw new Error('Unable to accept presentation without credentials')\n\n const selectedAttributes: Record<string, AnonCredsRequestedAttributeMatch> = {}\n const selectedPredicates: Record<string, AnonCredsRequestedPredicateMatch> = {}\n\n for (const [inputDescriptorId, entry] of Array.from(data.entries.entries())) {\n const credentialId = options.selectedCredentials[inputDescriptorId]\n const match = entry.matches.find((match) => match.credentialId === credentialId) ?? entry.matches[0]\n\n for (const groupName of entry.groupNames.attributes) {\n selectedAttributes[groupName] = {\n ...match,\n revealed: true,\n }\n }\n\n for (const groupName of entry.groupNames.predicates) {\n selectedPredicates[groupName] = match\n }\n }\n\n formatInput = {\n [data.formatKey]: {\n attributes: selectedAttributes,\n predicates: selectedPredicates,\n selfAttestedAttributes: {},\n },\n }\n }\n\n const presentationDone$ = paradym.agent.events\n .observable<ProofStateChangedEvent>(ProofEventTypes.ProofStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.proofRecord.id === proofExchangeId &&\n [ProofState.PresentationSent, ProofState.Done].includes(event.payload.proofRecord.state)\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const presentationDonePromise = firstValueFrom(presentationDone$)\n await paradym.agent.modules.proofs.acceptRequest({\n proofRecordId: proofExchangeId,\n proofFormats: formatInput,\n })\n await presentationDonePromise\n\n if (options.storeAsActivity && data) {\n await addSharedActivityForSubmission(\n paradym,\n data.submission,\n {\n id: proofExchangeId,\n name: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n },\n 'success'\n )\n }\n } catch {\n if (options.storeAsActivity && data) {\n await addSharedActivityForSubmission(\n paradym,\n data.submission,\n {\n id: proofExchangeId,\n name: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n },\n 'failed'\n )\n }\n }\n },\n })\n\n const { mutateAsync: declineMutateAsync, status: declineStatus } = useMutation({\n mutationKey: ['declineDidCommPresentation', proofExchangeId],\n mutationFn: async (options: DeclinePresentationOptions = { deletePresentation: true, storeAsActivity: true }) => {\n const presentationDeclined$ = paradym.agent.events\n .observable<ProofStateChangedEvent>(ProofEventTypes.ProofStateChanged)\n .pipe(\n // Correct record with id and state\n filter(\n (event) =>\n event.payload.proofRecord.id === proofExchangeId &&\n [ProofState.Declined].includes(event.payload.proofRecord.state)\n ),\n // 10 seconds to complete exchange\n timeout(10000),\n first()\n )\n\n const presentationDeclinePromise = firstValueFrom(presentationDeclined$)\n await paradym.agent.modules.proofs.declineRequest({ proofRecordId: proofExchangeId, sendProblemReport: true })\n await presentationDeclinePromise\n\n if (options.deletePresentation) {\n void paradym.agent.modules.proofs.deleteById(proofExchangeId)\n }\n\n if (options.storeAsActivity && data) {\n await addSharedActivityForSubmission(\n paradym,\n data.submission,\n {\n id: proofExchangeId,\n name: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n },\n 'stopped'\n )\n }\n },\n })\n\n return {\n acceptPresentation: (options?: AcceptPresentationOptions) => acceptMutateAsync(options),\n declinePresentation: (options?: DeclinePresentationOptions) => declineMutateAsync(options),\n acceptStatus,\n declineStatus,\n proofExchange,\n submission: data?.submission,\n verifierName: connection?.theirLabel,\n logo: {\n url: connection?.imageUrl,\n },\n }\n}\n\n/**\n * Format requested predicate into string\n * @example `age greater than 18`\n *\n * @todo we could improve on this rendering, by e.g. recognizing dates in predicates (e.g. 20200101)\n */\n// function formatPredicate(t: typeof _t, requestedPredicate: AnonCredsRequestedPredicate) {\n// return `${requestedPredicate.name} ${t(predicateMessages[requestedPredicate.p_type])} ${requestedPredicate.p_value}`\n// }\n","import { type DidCommAgent, assertDidcommAgent } from '../agent'\nimport { useAgent } from '../providers/AgentProvider'\n\nexport const useDidCommAgent = () => {\n const { agent } = useAgent<DidCommAgent>()\n assertDidcommAgent(agent)\n return { agent }\n}\n","import { type OpenId4VcAgent, assertOpenId4VcAgent } from '../agent'\nimport { useAgent } from '../providers/AgentProvider'\n\nexport const useOpenId4VcAgent = () => {\n const { agent } = useAgent<OpenId4VcAgent>()\n assertOpenId4VcAgent(agent)\n return { agent }\n}\n","import { useMemo } from 'react'\nimport { useMdocRecords } from '../providers/MdocProvider'\nimport { useSdJwtVcRecords } from '../providers/SdJwtVcProvider'\nimport { useW3cCredentialRecords } from '../providers/W3cCredentialsProvider'\n\nexport const useCredentialRecords = () => {\n const { w3cCredentialRecords, isLoading: isLoadingW3c } = useW3cCredentialRecords()\n const { sdJwtVcRecords, isLoading: isLoadingSdJwt } = useSdJwtVcRecords()\n const { mdocRecords, isLoading: isLoadingMdoc } = useMdocRecords()\n\n const credentials = useMemo(() => {\n const allRecords = [...w3cCredentialRecords, ...mdocRecords, ...sdJwtVcRecords]\n\n // Sort by creation date\n const sortedRecords = allRecords.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n\n return sortedRecords\n }, [w3cCredentialRecords, sdJwtVcRecords, mdocRecords])\n\n return {\n credentials,\n isLoading: isLoadingSdJwt || isLoadingW3c || isLoadingMdoc,\n }\n}\n","import { useCredentialRecords } from './useCredentialRecords'\n\nexport const useCredentialRecordById = (id: string) => {\n const { isLoading, credentials } = useCredentialRecords()\n\n return {\n isLoading,\n credential: credentials.find((credential) => credential.id === id),\n }\n}\n","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn [decodeURIComponent(components.join(''))];\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher) || [];\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher) || [];\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","'use strict';\nmodule.exports = function (obj, predicate) {\n\tvar ret = {};\n\tvar keys = Object.keys(obj);\n\tvar isArr = Array.isArray(predicate);\n\n\tfor (var i = 0; i < keys.length; i++) {\n\t\tvar key = keys[i];\n\t\tvar val = obj[key];\n\n\t\tif (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n\t\t\tret[key] = val;\n\t\t}\n\t}\n\n\treturn ret;\n};\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\nconst filterObject = require('filter-obj');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nconst encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'colon-list-separator':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), ':list='].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), ':list=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\tcase 'bracket-separator': {\n\t\t\tconst keyValueSep = options.arrayFormat === 'bracket-separator' ?\n\t\t\t\t'[]=' :\n\t\t\t\t'=';\n\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\t// Translate null to an empty string so that it doesn't serialize as 'null'\n\t\t\t\tvalue = value === null ? '' : value;\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), keyValueSep, encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'colon-list-separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(:list)$/.exec(key);\n\t\t\t\tkey = key.replace(/:list$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n\t\t\t\tconst isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));\n\t\t\t\tvalue = isEncodedArray ? decode(value, options) : value;\n\t\t\t\tconst newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tcase 'bracket-separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = /(\\[\\])$/.test(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!isArray) {\n\t\t\t\t\taccumulator[key] = value ? decode(value, options) : value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst arrayValue = value === null ?\n\t\t\t\t\t[] :\n\t\t\t\t\tvalue.split(options.arrayFormatSeparator).map(item => decode(item, options));\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = arrayValue;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], arrayValue);\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(query, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof query !== 'string') {\n\t\treturn ret;\n\t}\n\n\tquery = query.trim().replace(/^[?#&]/, '');\n\n\tif (!query) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of query.split('&')) {\n\t\tif (param === '') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : ['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key])) ||\n\t\t(options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const key of Object.keys(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = object[key];\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length === 0 && options.arrayFormat === 'bracket-separator') {\n\t\t\t\treturn encode(key, options) + '[]';\n\t\t\t}\n\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (url, options) => {\n\toptions = Object.assign({\n\t\tdecode: true\n\t}, options);\n\n\tconst [url_, hash] = splitOnFirst(url, '#');\n\n\treturn Object.assign(\n\t\t{\n\t\t\turl: url_.split('?')[0] || '',\n\t\t\tquery: parse(extract(url), options)\n\t\t},\n\t\toptions && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}\n\t);\n};\n\nexports.stringifyUrl = (object, options) => {\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\t[encodeFragmentIdentifier]: true\n\t}, options);\n\n\tconst url = removeHash(object.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(object.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});\n\n\tconst query = Object.assign(parsedQueryFromUrl, object.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\tlet hash = getHash(object.url);\n\tif (object.fragmentIdentifier) {\n\t\thash = `#${options[encodeFragmentIdentifier] ? encode(object.fragmentIdentifier, options) : object.fragmentIdentifier}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n\nexports.pick = (input, filter, options) => {\n\toptions = Object.assign({\n\t\tparseFragmentIdentifier: true,\n\t\t[encodeFragmentIdentifier]: false\n\t}, options);\n\n\tconst {url, query, fragmentIdentifier} = exports.parseUrl(input, options);\n\treturn exports.stringifyUrl({\n\t\turl,\n\t\tquery: filterObject(query, filter),\n\t\tfragmentIdentifier\n\t}, options);\n};\n\nexports.exclude = (input, filter, options) => {\n\tconst exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);\n\n\treturn exports.pick(input, exclusionFilter, options);\n};\n","import type { DifPresentationExchangeDefinitionV2 } from '@credo-ts/core'\nimport type { OpenId4VpResolvedAuthorizationRequest } from '@credo-ts/openid4vc'\nimport type { CredentialForDisplay } from '../display/credential'\nimport { formatDcqlCredentialsForRequest } from './dcqlRequest'\nimport { formatDifPexCredentialsForRequest } from './presentationExchangeRequest'\n\nexport interface FormattedSubmissionEntryNotSatisfied {\n /**\n * can be either:\n * - AnonCreds groupName\n * - PEX inputDescriptorId\n * - DCQL credential query id\n */\n inputDescriptorId: string\n\n name?: string\n description?: string\n\n /**\n * Whether the entry is satisfied\n */\n isSatisfied: false\n\n requestedAttributePaths: Array<Array<string | number | null>>\n}\n\nexport interface FormattedSubmissionEntrySatisfied {\n /**\n * can be either:\n * - AnonCreds groupName\n * - PEX inputDescriptorId\n * - DCQL credential query id\n */\n inputDescriptorId: string\n\n name?: string\n description?: string\n\n /**\n * Whether the entry is satisfied\n */\n isSatisfied: true\n\n /**\n * Credentials that match the request entry. Wallet always needs to pick one.\n */\n credentials: FormattedSubmissionEntrySatisfiedCredential[]\n}\n\nexport type FormattedSubmissionEntry = FormattedSubmissionEntryNotSatisfied | FormattedSubmissionEntrySatisfied\n\nexport interface FormattedSubmission {\n name?: string\n purpose?: string\n areAllSatisfied: boolean\n entries: FormattedSubmissionEntry[]\n}\n\nexport interface FormattedSubmissionEntrySatisfiedCredential {\n credential: CredentialForDisplay\n\n /**\n * If not present the whole credential will be disclosed\n */\n disclosed: {\n attributes: CredentialForDisplay['attributes']\n metadata: CredentialForDisplay['metadata']\n\n paths: string[][]\n }\n}\n\nexport function getFormattedSubmission(resolvedAuthorizationRequest: OpenId4VpResolvedAuthorizationRequest) {\n if (resolvedAuthorizationRequest.presentationExchange) {\n return formatDifPexCredentialsForRequest(\n resolvedAuthorizationRequest.presentationExchange.credentialsForRequest,\n resolvedAuthorizationRequest.presentationExchange.definition as DifPresentationExchangeDefinitionV2\n )\n }\n\n if (resolvedAuthorizationRequest.dcql) {\n return formatDcqlCredentialsForRequest(resolvedAuthorizationRequest.dcql.queryResult)\n }\n\n throw new Error('No presentation exchange or dcql found in authorization request.')\n}\n","import type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { ParadymWalletInvitationNotRecognizedError, ParadymWalletInvitationRetrievalError } from '../error'\nimport { type InvitationResult, parseOpenIdPresentationRequestInvitation } from './parser'\n\nexport type FetchInvitationResult = InvitationResult\n\nexport async function fetchInvitationDataUrl(\n paradym: ParadymWalletSdk,\n dataUrl: string\n): Promise<FetchInvitationResult> {\n // If we haven't had a response after 10 seconds, we will handle as if the invitation is not valid.\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 10000)\n\n try {\n // If we still don't know what type of invitation it is, we assume it is a URL that we need to fetch to retrieve the invitation.\n const response = await fetch(dataUrl, {\n headers: {\n // for DIDComm out of band invitations we should include application/json\n // but we are flexible and also want to support other types of invitations\n // as e.g. the OpenID4VP request is a signed encoded JWT string\n Accept: 'application/json, text/plain, */*',\n },\n })\n clearTimeout(timeout)\n\n if (!response.ok) {\n throw new ParadymWalletInvitationRetrievalError()\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n const json: unknown = await response.json()\n return handleJsonResponse(json)\n }\n\n const text = await response.text()\n return handleTextResponse(paradym, text)\n } catch (error) {\n clearTimeout(timeout)\n throw new ParadymWalletInvitationRetrievalError()\n }\n}\n\n// TODO: what is the structure for didcomm?\nfunction handleJsonResponse(json: unknown): FetchInvitationResult {\n // We expect a JSON object\n if (!json || typeof json !== 'object' || Array.isArray(json)) {\n throw new ParadymWalletInvitationNotRecognizedError()\n }\n\n if ('@type' in json) {\n throw new ParadymWalletInvitationNotRecognizedError('not yet supported')\n }\n\n if ('credential_issuer' in json) {\n throw new ParadymWalletInvitationNotRecognizedError('not yet supported')\n }\n\n throw new ParadymWalletInvitationNotRecognizedError()\n}\n\nasync function handleTextResponse(paradym: ParadymWalletSdk, text: string): Promise<FetchInvitationResult> {\n // If the text starts with 'ey' we assume it's a JWT and thus an OpenID authorization request\n if (text.startsWith('ey')) {\n const { id, formattedSubmission } = await parseOpenIdPresentationRequestInvitation(paradym, text)\n return {\n __internal: {\n id,\n },\n openId4VcPresentationRequest: {\n formattedSubmission,\n },\n }\n }\n\n const json = JSON.parse(text)\n return handleJsonResponse(json)\n}\n","import { parseInvitationJson } from '@credo-ts/didcomm/build/util/parseInvitation'\nimport queryString from 'query-string'\nimport type { ParadymWalletSdk } from '../ParadymWalletSdk'\nimport { type CredentialForDisplay, getCredentialForDisplay } from '../display/credential'\nimport { ParadymWalletInvitationNotRecognizedError } from '../error'\nimport { type FormattedSubmission, getFormattedSubmission } from '../format/submission'\nimport { fetchInvitationDataUrl } from './fetch'\nimport {\n acquirePreAuthorizedAccessToken,\n receiveCredentialFromOpenId4VciOffer,\n resolveCredentialOffer,\n} from './resolver'\n\nexport type InvitationType = 'didcomm' | 'openid-credential-offer' | 'openid-authorization-request'\n\nexport type InvitationResult = {\n __internal: {\n id: string\n }\n didcomm?: {\n imageUrl?: string\n label?: string\n }\n openId4VcPresentationRequest?: {\n formattedSubmission: FormattedSubmission\n }\n openId4VcCredentialOffer?: {\n display: CredentialForDisplay\n }\n}\n\nexport enum InvitationQrTypes {\n OPENID_INITIATE_ISSUANCE = 'openid-initiate-issuance://',\n OPENID_CREDENTIAL_OFFER = 'openid-credential-offer://',\n OPENID4VP = 'openid4vp://',\n EUDI_OPENID4VP = 'eudi-openid4vp://',\n MDOC_OPENID4VP = 'mdoc-openid4vp://',\n OPENID_VC = 'openid-vc://',\n DIDCOMM = 'didcomm://',\n HTTPS = 'https://',\n HAIP = 'haip://',\n\n // TODO: this is included here, do want to allow for custom invitation types?\n EASY_PID = 'id.animo.ausweis:',\n}\n\nexport const isOpenIdCredentialOffer = (url: string) => {\n if (\n url.startsWith(InvitationQrTypes.OPENID_INITIATE_ISSUANCE) ||\n url.startsWith(InvitationQrTypes.OPENID_CREDENTIAL_OFFER)\n ) {\n return true\n }\n\n if (url.includes('credential_offer_uri=') || url.includes('credential_offer=')) {\n return true\n }\n\n return false\n}\n\nexport const isOpenIdPresentationRequest = (url: string) => {\n if (\n url.startsWith(InvitationQrTypes.OPENID_VC) ||\n url.startsWith(InvitationQrTypes.OPENID4VP) ||\n url.startsWith(InvitationQrTypes.EUDI_OPENID4VP) ||\n url.startsWith(InvitationQrTypes.MDOC_OPENID4VP)\n ) {\n return true\n }\n\n if (url.includes('request_uri=') || url.includes('request=')) {\n return true\n }\n\n return false\n}\n\nexport const isDidCommInvitation = (url: string) => {\n if (url.startsWith(InvitationQrTypes.DIDCOMM)) {\n return true\n }\n\n if (url.includes('c_i=') || url.includes('oob=') || url.includes('oobUrl=') || url.includes('d_m=')) {\n return true\n }\n\n return false\n}\n\nexport async function parseDidCommInvitation(paradym: ParadymWalletSdk, invitation: string | Record<string, unknown>) {\n if (typeof invitation === 'string') {\n const parsedUrl = queryString.parseUrl(invitation)\n const updatedInvitationUrl = (parsedUrl.query.oobUrl as string | undefined) ?? invitation\n\n // Try to parse the invitation as an DIDComm invitation.\n // We can't know for sure, as it could be a shortened URL to a DIDComm invitation.\n // So we use the parseMessage from credo and see if this returns a valid message.\n // Parse invitation supports legacy connection invitations, oob invitations, and\n // legacy connectionless invitations, and will all transform them into an OOB invitation.\n const parsedInvitation = await paradym.agent.modules.outOfBand.parseInvitation(updatedInvitationUrl)\n paradym.logger.debug(`Parsed didcomm invitation with id ${parsedInvitation.id}`)\n return parsedInvitation\n }\n return parseInvitationJson(invitation)\n}\n\nexport async function parseOpenIdCredentialOfferInvitation(paradym: ParadymWalletSdk, invitationUrl: string) {\n const { resolvedCredentialOffer } = await resolveCredentialOffer({\n paradym,\n offer: { uri: invitationUrl },\n })\n const tokenResponse = await acquirePreAuthorizedAccessToken({ agent: paradym.agent, resolvedCredentialOffer })\n const credentialResponses = await receiveCredentialFromOpenId4VciOffer({\n agent: paradym.agent,\n resolvedCredentialOffer,\n accessToken: tokenResponse,\n })\n\n const [{ credential }] = credentialResponses\n\n const display = getCredentialForDisplay(credential)\n\n return {\n id: credential.id,\n display,\n }\n}\n\nexport async function parseOpenIdPresentationRequestInvitation(paradym: ParadymWalletSdk, invitationUrl: string) {\n const resolved = await paradym.agent.modules.openId4VcHolder.resolveOpenId4VpAuthorizationRequest(invitationUrl)\n\n const formattedSubmission = getFormattedSubmission(resolved)\n\n // The output of this should be the input into the `shareProof` method\n\n return {\n id: 'TODO',\n formattedSubmission,\n }\n}\n\n// TODO(sdk): this, or another version of this method, cannot depend on the paradym instance for deeplink redirecting\nexport async function parseInvitationUrl(paradym: ParadymWalletSdk, invitationUrl: string): Promise<InvitationResult> {\n if (isOpenIdCredentialOffer(invitationUrl)) {\n const metadata = await parseOpenIdCredentialOfferInvitation(paradym, invitationUrl)\n\n return {\n __internal: { id: metadata.id },\n openId4VcCredentialOffer: {\n display: metadata.display,\n },\n }\n }\n\n if (isOpenIdPresentationRequest(invitationUrl)) {\n const { formattedSubmission, id } = await parseOpenIdPresentationRequestInvitation(paradym, invitationUrl)\n\n return {\n __internal: { id },\n openId4VcPresentationRequest: { formattedSubmission },\n }\n }\n\n if (isDidCommInvitation(invitationUrl)) {\n const outOfBandInvitation = await parseDidCommInvitation(paradym, invitationUrl)\n\n return {\n __internal: { id: outOfBandInvitation.id },\n didcomm: {\n imageUrl: outOfBandInvitation.imageUrl,\n label: outOfBandInvitation.label,\n },\n }\n }\n\n // If we can't detect the type of invitation from the URL, we will try to fetch the data from the URL\n // and see if we can detect if based on the response\n if (invitationUrl.startsWith('https://')) {\n return await fetchInvitationDataUrl(paradym, invitationUrl)\n }\n\n throw new ParadymWalletInvitationNotRecognizedError()\n}\n","import type {\n OpenId4VciRequestTokenResponse,\n OpenId4VciResolvedAuthorizationRequest,\n OpenId4VciResolvedCredentialOffer,\n} from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { getCredentialForDisplay } from '@paradym/wallet-sdk/display/credential'\nimport { receiveCredentialFromOpenId4VciOffer } from '@paradym/wallet-sdk/invitation/resolver'\n\nexport type RetrieveCredentialOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n tokenResponse: OpenId4VciRequestTokenResponse\n configurationId: string\n resolvedAuthorizationRequest?: OpenId4VciResolvedAuthorizationRequest\n\n // TODO(sdk): can we do this better?\n authorization?: {\n clientId: string\n redirectUri: string\n }\n}\n\nexport const retrieveCredentials = async (options: RetrieveCredentialOptions) => {\n const credentialResponses = await receiveCredentialFromOpenId4VciOffer({\n agent: options.paradym.agent,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n credentialConfigurationIdsToRequest: [options.configurationId],\n accessToken: options.tokenResponse,\n clientId: options.authorization ? options.authorization?.clientId : undefined,\n // Always request batch for non pid credentials\n requestBatch: true,\n })\n\n const credentialRecord = credentialResponses[0].credential\n return getCredentialForDisplay(credentialRecord)\n}\n","import type { OpenId4VciResolvedAuthorizationRequest, OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { retrieveCredentials } from './retrieveCredentials'\n\nexport type AcquireCredentialsAuthOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n resolvedAuthorizationRequest: OpenId4VciResolvedAuthorizationRequest\n authorization: {\n clientId: string\n redirectUri: string\n }\n authorizationCode: string\n}\n\nexport const acquireCredentialsAuth = async (options: AcquireCredentialsAuthOptions) => {\n const configurationId = Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n\n const tokenResponse = await options.paradym.agent.modules.openId4VcHolder.requestToken({\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n redirectUri: options.authorization.redirectUri,\n code: options.authorizationCode,\n clientId: options.authorization.clientId,\n codeVerifier:\n 'codeVerifier' in options.resolvedAuthorizationRequest\n ? options.resolvedAuthorizationRequest.codeVerifier\n : undefined,\n })\n\n const credential = await retrieveCredentials({\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n authorization: options.authorization,\n paradym: options.paradym,\n configurationId,\n tokenResponse,\n resolvedAuthorizationRequest: options.resolvedAuthorizationRequest,\n })\n\n return credential\n}\n","import { shareProof } from '@paradym/wallet-sdk/invitation/shareProof'\nimport type { FetchBatchCredentialCallback } from '../batch'\nimport type { CredentialsForProofRequest } from '../getCredentialsForProofRequest'\nimport { type AcquireCredentialsAuthOptions, acquireCredentialsAuth } from './acquireCredentialsAuth'\n\nexport type AcquireCredentialsAuthPresentationDuringIssuanceOptions = Omit<\n AcquireCredentialsAuthOptions,\n 'authorizationCode'\n> & {\n credentialsForRequest: CredentialsForProofRequest\n fetchBatchCredentialCallback?: FetchBatchCredentialCallback\n}\n\nexport const acquireCredentialsAuthPresentationDuringIssuance = async (\n options: AcquireCredentialsAuthPresentationDuringIssuanceOptions\n) => {\n const { presentationDuringIssuanceSession } = await shareProof({\n paradym: options.paradym,\n resolvedRequest: options.credentialsForRequest,\n selectedCredentials: {},\n fetchBatchCredentialCallback: options.fetchBatchCredentialCallback,\n })\n\n if (!('authSession' in options.resolvedAuthorizationRequest)) {\n throw new Error('Auth session is not available in the resolved authorization request')\n }\n\n const { authorizationCode } =\n await options.paradym.agent.modules.openId4VcHolder.retrieveAuthorizationCodeUsingPresentation({\n authSession: options.resolvedAuthorizationRequest.authSession,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n presentationDuringIssuanceSession,\n })\n\n return await acquireCredentialsAuth({ ...options, authorizationCode })\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { acquirePreAuthorizedAccessToken } from '@paradym/wallet-sdk/invitation/resolver'\nimport { retrieveCredentials } from './retrieveCredentials'\n\nexport type AcquireCredentialsPreAuthOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n}\n\nexport const acquireCredentialsPreAuth = async (options: AcquireCredentialsPreAuthOptions) => {\n // We want the first supported configuration id\n // TODO: handle empty configuration ids\n const configurationId = options.resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n\n if (!configurationId) {\n throw new Error('Could not establish the configuration id')\n }\n\n const tokenResponse = await acquirePreAuthorizedAccessToken({\n agent: options.paradym.agent,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n })\n\n return await retrieveCredentials({\n paradym: options.paradym,\n tokenResponse,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n configurationId,\n })\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { acquirePreAuthorizedAccessToken } from '@paradym/wallet-sdk/invitation/resolver'\nimport { retrieveCredentials } from './retrieveCredentials'\n\nexport type AcquireCredentialsPreAuthWithTransactionCodeOptions = {\n paradym: ParadymWalletSdk\n resolvedCredentialOffer: OpenId4VciResolvedCredentialOffer\n transactionCode: string\n}\n\nexport const acquireCredentialsPreAuthWithTransactionCode = async (\n options: AcquireCredentialsPreAuthWithTransactionCodeOptions\n) => {\n // We want the first supported configuration id\n // TODO: handle empty configuration ids\n const configurationId = options.resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n\n if (!configurationId) {\n throw new Error('Could not establish the configuration id')\n }\n\n const tokenResponse = await acquirePreAuthorizedAccessToken({\n agent: options.paradym.agent,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n })\n\n return await retrieveCredentials({\n paradym: options.paradym,\n tokenResponse,\n resolvedCredentialOffer: options.resolvedCredentialOffer,\n configurationId,\n })\n}\n","import type { ParadymWalletSdk } from '@paradym/wallet-sdk/ParadymWalletSdk'\nimport { type AcquireCredentialsAuthOptions, acquireCredentialsAuth } from './acquireCredentialsAuth'\nimport {\n type AcquireCredentialsAuthPresentationDuringIssuanceOptions,\n acquireCredentialsAuthPresentationDuringIssuance,\n} from './acquireCredentialsAuthPresentationDuringIssuance'\nimport { type AcquireCredentialsPreAuthOptions, acquireCredentialsPreAuth } from './acquireCredentialsPreAuth'\nimport {\n type AcquireCredentialsPreAuthWithTransactionCodeOptions,\n acquireCredentialsPreAuthWithTransactionCode,\n} from './acquireCredentialsPreAuthWithTransactionCode'\n\nexport type AcquireCredentialsOptions = { paradym: ParadymWalletSdk } & (\n | AcquireCredentialsPreAuthWithTransactionCodeOptions\n | AcquireCredentialsPreAuthOptions\n | AcquireCredentialsAuthOptions\n | AcquireCredentialsAuthPresentationDuringIssuanceOptions\n)\n\nexport const acquireCredentials = async (options: AcquireCredentialsOptions) => {\n if ('transactionCode' in options) {\n return await acquireCredentialsPreAuthWithTransactionCode(options)\n }\n\n if ('credentialsForRequest' in options) {\n return await acquireCredentialsAuthPresentationDuringIssuance(options)\n }\n\n if ('authorizationCode' in options) {\n return await acquireCredentialsAuth(options)\n }\n\n return await acquireCredentialsPreAuth(options)\n}\n","import type { OpenId4VciResolvedCredentialOffer } from '@credo-ts/openid4vc'\nimport { getCredentialDisplayWithDefaults } from '@paradym/wallet-sdk/display/common'\nimport { getCredentialForDisplayId } from '@paradym/wallet-sdk/display/credential'\nimport { getOpenId4VcCredentialDisplay } from '@paradym/wallet-sdk/display/openid4vc'\nimport { extractOpenId4VcCredentialMetadata } from '@paradym/wallet-sdk/metadata/credentials'\nimport type { ParadymWalletSdk } from '../../ParadymWalletSdk'\nimport { addReceivedActivity } from '../../storage/activities'\nimport { type CredentialRecord, storeCredential } from '../../storage/credentials'\n\nexport type CompleteCredentialRetrievalOptions = {\n paradym: ParadymWalletSdk\n record: CredentialRecord\n resolvedCredentialOffer?: OpenId4VciResolvedCredentialOffer\n}\n\nexport const completeCredentialRetrieval = async (options: CompleteCredentialRetrievalOptions) => {\n const credentialDisplayId = getCredentialForDisplayId(options.record)\n\n // We want the first supported configuration id\n // TODO(sdk): handle empty configuration ids\n const configurationId = options.resolvedCredentialOffer?.offeredCredentialConfigurations\n ? Object.keys(options.resolvedCredentialOffer.offeredCredentialConfigurations)[0]\n : undefined\n const configuration = configurationId\n ? options.resolvedCredentialOffer?.offeredCredentialConfigurations[configurationId]\n : undefined\n\n const issuerMetadata = options.resolvedCredentialOffer?.metadata.credentialIssuer\n\n const credentialDisplay = getCredentialDisplayWithDefaults(\n configuration && issuerMetadata\n ? getOpenId4VcCredentialDisplay(\n extractOpenId4VcCredentialMetadata(configuration, {\n display: issuerMetadata?.display,\n id: issuerMetadata?.credential_issuer,\n })\n )\n : {}\n )\n\n await storeCredential(options.paradym, options.record)\n await addReceivedActivity(options.paradym, {\n // FIXME: Should probably be the `iss`, but then we can't show it before we retrieved\n // the credential. Signed issuer metadata is the solution.\n entityId: options.resolvedCredentialOffer?.metadata.credentialIssuer.credential_issuer,\n host: credentialDisplay.issuer.domain,\n name: credentialDisplay.issuer.name,\n logo: credentialDisplay.issuer.logo,\n backgroundColor: '#ffffff', // Default to a white background for now\n credentialIds: [credentialDisplayId],\n })\n}\n","import { WalletInvalidKeyError } from '@credo-ts/core'\nimport { agentDependencies } from '@credo-ts/react-native'\nimport type { PropsWithChildren } from 'react'\nimport { type FullAgent, type SetupAgentOptions, setupAgent } from './agent'\nimport type { CredentialForDisplayId } from './display/credential'\nimport { ParadymWalletMustBeInitializedError } from './error'\nimport { useParadym } from './hooks'\nimport { useActivities } from './hooks/useActivities'\nimport { useActivityById } from './hooks/useActivityById'\nimport { useCredentialByCategory } from './hooks/useCredentialByCategory'\nimport { useCredentialById } from './hooks/useCredentialById'\nimport { useCredentialRecordById } from './hooks/useCredentialRecordById'\nimport { useCredentialRecords } from './hooks/useCredentialRecords'\nimport { useCredentials } from './hooks/useCredentials'\nimport { useDidCommConnectionActions } from './hooks/useDidCommConnectionActions'\nimport { useDidCommCredentialActions } from './hooks/useDidCommCredentialActions'\nimport { useDidCommPresentationActions } from './hooks/useDidCommPresentationActions'\nimport { useDidCommAgent } from './hooks/useDidcommAgent'\nimport { useOpenId4VcAgent } from './hooks/useOpenId4VcAgent'\nimport { type InvitationResult, parseDidCommInvitation, parseInvitationUrl } from './invitation/parser'\nimport {\n type ResolveCredentialOfferOptions,\n type ResolveOutOfBandInvitationResult,\n resolveCredentialOffer,\n resolveOutOfBandInvitation,\n} from './invitation/resolver'\nimport type { ParadymWalletSdkLogger } from './logger'\nimport { type AcquireCredentialsOptions, acquireCredentials } from './openid4vc/func/acquireCredentials'\nimport {\n type CompleteCredentialRetrievalOptions,\n completeCredentialRetrieval,\n} from './openid4vc/func/completeCredentialRetrieval'\nimport { AgentProvider, useAgent } from './providers/AgentProvider'\nimport { SecureUnlockProvider, secureWalletKey } from './secure'\nimport { type CredentialRecord, deleteCredential, storeCredential } from './storage/credentials'\nimport type { TrustMechanismConfiguration } from './trust/trustMechanism'\nimport type { DistributedOmit } from './types'\n\nexport type ParadymWalletSdkResult<T extends Record<string, unknown> = Record<string, unknown>> =\n | ({ success: true } & T)\n | { success: false; message: string }\n\nexport type ParadymWalletSdkOptions = SetupAgentOptions & {\n /**\n *\n * Trust mechanisms supported by the wallet\n *\n * The order matters. The first index will be tried first, until the last\n *\n * When one is found that works, it will be used\n *\n */\n // TODO(sdk): this will get more complex, as eudi_rp_auth needs more configuration\n trustMechanisms: TrustMechanismConfiguration[]\n}\n\nexport type SetupParadymWalletSdkOptions = Omit<ParadymWalletSdkOptions, 'key'>\n\nexport class ParadymWalletSdk {\n public trustMechanisms: TrustMechanismConfiguration[]\n public readonly agent: FullAgent\n\n public constructor(options: ParadymWalletSdkOptions) {\n this.agent = setupAgent(options) as FullAgent\n this.trustMechanisms = options.trustMechanisms\n }\n\n private assertAgentIsInitialized() {\n if (!this.agent.isInitialized) throw new ParadymWalletMustBeInitializedError()\n }\n\n public get walletId() {\n return this.agent.config.walletConfig?.id\n }\n\n public async reset() {\n this.logger.debug('Resetting wallet')\n\n await this.agent.wallet.delete()\n await this.agent.shutdown()\n\n const fs = new agentDependencies.FileSystem()\n\n // Clear cach and temp path\n if (await fs.exists(fs.cachePath)) await fs.delete(fs.cachePath)\n if (await fs.exists(fs.tempPath)) await fs.delete(fs.tempPath)\n\n const walletDirectory = `${fs.dataPath}/wallet/${this.walletId}`\n\n const walletDirectoryExists = await fs.exists(walletDirectory)\n if (walletDirectoryExists) {\n console.log('wallet directory exists, deleting')\n await fs.delete(walletDirectory)\n } else {\n console.log('wallet directory does not exist')\n }\n\n // I think removing triggers the biometrics somehow. We look at the salt\n // to see if the secure unlock has been setup.\n // await secureWalletKey.removeWalletKey(secureWalletKey.getWalletKeyVersion())\n await secureWalletKey.removeSalt(secureWalletKey.getWalletKeyVersion())\n }\n\n /**\n *\n * Initialized the wallet sdk and sets everything up for usage\n *\n */\n public async initialize(): Promise<ParadymWalletSdkResult> {\n try {\n await this.agent.initialize()\n return { success: true }\n } catch (e) {\n if (e instanceof WalletInvalidKeyError) {\n return { success: false, message: 'Invalid key' }\n }\n return { success: false, message: (e as Error).message }\n }\n }\n\n /**\n *\n * Shutsdown the agent and closes the wallet\n *\n */\n public async shutdown() {\n await this.agent.shutdown()\n }\n\n /**\n *\n * Paradym logger\n *\n * defaults to a console logger\n *\n */\n public get logger() {\n return this.agent.config.logger as ParadymWalletSdkLogger\n }\n\n /**\n *\n * All available hooks provided by the wallet SDK\n *\n */\n public get hooks() {\n this.assertAgentIsInitialized()\n\n return {\n useCredentials,\n useCredentialById,\n useCredentialByCategory,\n\n useActivities,\n useActivityById,\n\n // TODO: these are quite different than the openid4vc way\n // do we want to keep it like this or make them more consistent?\n useDidCommConnectionActions,\n useDidCommCredentialActions,\n useDidCommPresentationActions,\n }\n }\n\n /**\n *\n * Unstable hooks that can be used for more low-level functionality\n *\n * It is generally recommended to see if the desired output can be reached with `ParadymWalletSdk.hooks` first\n *\n */\n public get internalHooks() {\n this.assertAgentIsInitialized()\n\n return {\n useAgent,\n useDidCommAgent,\n useOpenId4VcAgent,\n useCredentialRecords,\n useCredentialRecordById,\n }\n }\n\n /**\n *\n * Provider for the WalletSdk\n *\n * Wrap your application in this, if you want to leverage the provided `this.hooks`\n *\n * @todo(sdk) New name for this provider\n *\n */\n public static UnlockProvider({\n children,\n configuration,\n }: PropsWithChildren<{ configuration: SetupParadymWalletSdkOptions }>) {\n return <SecureUnlockProvider configuration={configuration}>{children}</SecureUnlockProvider>\n }\n\n /**\n *\n * @todo(sdk) New name for this provider\n *\n */\n public static AppProvider({ children, recordIds }: PropsWithChildren<{ recordIds: string[] }>) {\n const { paradym } = useParadym('unlocked')\n\n return (\n <AgentProvider agent={paradym.agent} recordIds={recordIds}>\n {children}\n </AgentProvider>\n )\n }\n\n public async receiveInvitation(\n invitationUrl: string\n ): Promise<ParadymWalletSdkResult<Omit<InvitationResult, '__internal'>>> {\n this.assertAgentIsInitialized()\n\n try {\n const invitationResult = await parseInvitationUrl(this, invitationUrl)\n return { success: true, ...invitationResult }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : (error as string),\n }\n }\n }\n\n /**\n *\n * @todo how do we want to deal with didcomm proofs and credentials?\n *\n */\n public get credentials() {\n return {\n delete: this.deleteCredentials,\n store: this.storeCredential,\n }\n }\n\n private async deleteCredentials(\n ids: CredentialForDisplayId | Array<CredentialForDisplayId>\n ): Promise<ParadymWalletSdkResult> {\n try {\n const deleteCredentials = (Array.isArray(ids) ? ids : [ids]).map((id) => deleteCredential(this.agent, id))\n await Promise.all(deleteCredentials)\n return { success: true }\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : (error as string) }\n }\n }\n\n private async storeCredential(record: CredentialRecord): Promise<ParadymWalletSdkResult> {\n try {\n await storeCredential(this, record)\n return { success: true }\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : (error as string) }\n }\n }\n\n public async resolveDidCommInvitation(\n invitation: string | Record<string, unknown>\n ): Promise<ParadymWalletSdkResult<ResolveOutOfBandInvitationResult>> {\n try {\n const parsedInvitation = await parseDidCommInvitation(this, invitation)\n return { success: true, ...(await resolveOutOfBandInvitation(this.agent, parsedInvitation)) }\n } catch (error) {\n return { success: false, message: error instanceof Error ? error.message : `${error}` }\n }\n }\n\n public get openid4vc() {\n return {\n resolveCredentialOffer: (options: Omit<ResolveCredentialOfferOptions, 'paradym'>) =>\n resolveCredentialOffer({ ...options, paradym: this }),\n\n acquireCredentials: (options: DistributedOmit<AcquireCredentialsOptions, 'paradym'>) =>\n acquireCredentials({ ...options, paradym: this }),\n\n completeCredentialRetrieval: (options: Omit<CompleteCredentialRetrievalOptions, 'paradym'>) =>\n completeCredentialRetrieval({ ...options, paradym: this }),\n }\n }\n}\n"],"x_google_ignoreList":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,105,106,107,108,109,110,111,112,113,114,115,116,117,118,134,135,136,137,138],"mappings":"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"}
|