@sanctum-key/react-native-sdk 1.0.27 → 1.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/build/package.json +1 -1
  2. package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
  3. package/build/src/components/EnhancedCameraView.js +45 -20
  4. package/build/src/components/EnhancedCameraView.js.map +1 -1
  5. package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  6. package/build/src/components/KYCElements/IDCardCapture.js +186 -50
  7. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  8. package/build/src/components/OverLay/type.d.ts +3 -1
  9. package/build/src/components/OverLay/type.d.ts.map +1 -1
  10. package/build/src/components/OverLay/type.js.map +1 -1
  11. package/build/src/components/TemplateKYCExample.d.ts +2 -1
  12. package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
  13. package/build/src/components/TemplateKYCExample.js +2 -2
  14. package/build/src/components/TemplateKYCExample.js.map +1 -1
  15. package/build/src/components/TemplateKYCFlowRefactored.d.ts +1 -0
  16. package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
  17. package/build/src/components/TemplateKYCFlowRefactored.js +2 -2
  18. package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
  19. package/build/src/hooks/useTemplateKYCFlow.d.ts +1 -0
  20. package/build/src/hooks/useTemplateKYCFlow.d.ts.map +1 -1
  21. package/build/src/hooks/useTemplateKYCFlow.js +31 -17
  22. package/build/src/hooks/useTemplateKYCFlow.js.map +1 -1
  23. package/build/src/modules/api/KYCService.d.ts +8 -0
  24. package/build/src/modules/api/KYCService.d.ts.map +1 -1
  25. package/build/src/modules/api/KYCService.js +30 -0
  26. package/build/src/modules/api/KYCService.js.map +1 -1
  27. package/package.json +1 -1
  28. package/src/components/EnhancedCameraView.tsx +60 -27
  29. package/src/components/KYCElements/IDCardCapture.tsx +236 -80
  30. package/src/components/OverLay/type.ts +5 -1
  31. package/src/components/TemplateKYCExample.tsx +7 -3
  32. package/src/components/TemplateKYCFlowRefactored.tsx +3 -0
  33. package/src/hooks/useTemplateKYCFlow.tsx +65 -34
  34. package/src/modules/api/KYCService.ts +41 -0
@@ -1 +1 @@
1
- {"version":3,"file":"KYCService.js","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport { GovernmentDocumentType, GovernmentDocumentTypeShorted, OrientationVideoResponse } from '../../types/KYC.types';\nimport { CheckTemplateTypeResponse } from '../../components/OverLay/type';\nimport { SessionResponse, VerificationSessionRequest } from './types';\nimport { KycEnvironment } from '../../types/env.types';\nimport { logger } from '../../utils/logger';\nimport { Platform } from 'react-native';\nimport KYCConfig from '../../config/KYCConfig';\n\nconst appendFileToFormData = async (formData: FormData, key: string, uri: string, name: string = 'file.jpg', type: string = 'image/jpeg') => {\n if (Platform.OS === 'web') {\n const response = await fetch(uri);\n const blob = await response.blob();\n formData.append(key, blob, name);\n } else {\n formData.append(key, { uri, type, name } as any);\n }\n};\n\nconst documentTypeMap: Record<string, string> = {\n passport: \"passport\",\n driversLicense: \"driving_licence\",\n healthInsuranceCard: \"health_insurance_card\",\n residencePermit: \"permanent_residence_card\",\n identityCard: \"identity_card\",\n\n nationalId: \"identity_card\", // We saw this in your earlier logs!\n national_id: \"identity_card\",\n \n drivers_licence: \"driving_licence\", // Plural 'drivers' to singular 'driving'\n drivers_license: \"driving_licence\", // American spelling 'license'\n driving_license: \"driving_licence\", // American spelling 'license'\n permanent_residence: \"permanent_residence_card\", // Missing the word 'card'\n};\n\nlet cachedToken: string | null = null;\nlet tokenExpiryTime: number | null = null;\nlet activeAuthRequest: Promise<string> | null = null; \n\nexport interface KYCRequest {\n userId: string;\n documentImage: string;\n selfieImage: string;\n documentType: 'passport' | 'id_card' | 'drivers_license';\n}\n\nexport interface KYCResponse {\n success: boolean;\n verificationId: string;\n status: 'pending' | 'approved' | 'rejected';\n message?: string;\n}\n\nexport interface FaceDetectionRequest {\n selfieImage: string;\n documentImage: string;\n}\n\nexport interface FaceDetectionResponse {\n match: boolean;\n confidence: number;\n message: string;\n}\n\nexport interface SelfieVideoResponse {\n orientation_direction: \"center\" | \"left\" | \"right\",\n turn_score: number;\n bbox: number[];\n capture: boolean;\n instruction: string;\n error: string;\n}\n\n\nexport class KYCService {\n private baseURL: string;\n private apiKey: string;\n // Additional service base URLs (fixed as per current infra)\n private faceServiceURL = 'https://face-infera.sanctumkey.com';\n private textExtractionServiceURL = 'https://text-infera.sanctumkey.com';\n private mrzServiceURL = 'https://mrz-infera.sanctumkey.com';\n private barcodeServiceURL = 'https://face-infera.sanctumkey.com';\n private orientationServiceURL = 'http://18.188.180.154:8080';\n\n constructor(baseURL: string, apiKey: string) {\n this.baseURL = baseURL;\n this.apiKey = apiKey;\n }\n\n private getHeaders() {\n return {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async submitKYC(data: KYCRequest): Promise<KYCResponse> {\n try {\n const response = await axios.post(\n `${this.baseURL}/kyc/submit`,\n data,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error submitting KYC:', error);\n throw error;\n }\n }\n\n async detectFace(data: FaceDetectionRequest): Promise<FaceDetectionResponse> {\n try {\n const response = await axios.post(\n `${this.baseURL}/ai/face-detection`,\n data,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error detecting face:', error);\n throw error;\n }\n }\n\n async validateDocument(documentImage: string, documentType: string): Promise<any> {\n try {\n const response = await axios.post(\n `${this.baseURL}/ai/document-validation`,\n { documentImage, documentType },\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error validating document:', error);\n throw error;\n }\n }\n\n async getKYCStatus(verificationId: string): Promise<KYCResponse> {\n try {\n const response = await axios.get(\n `${this.baseURL}/kyc/status/${verificationId}`,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error getting KYC status:', error);\n throw error;\n }\n }\n\n async processSelfieOrientationPicture(videoFile: string, token: string): Promise<SelfieVideoResponse[]> {\n \n try {\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'selfie_picture.jpg', 'image/jpeg');\n\n const response = await axios.post<SelfieVideoResponse[]>(\n `${this.faceServiceURL}/detect_face_orientation/`,\n formData,\n {\n timeout: 20000,\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}`, },\n }\n );\n return response.data;\n } catch (error) {\n logger.error('Error processing selfie orientation:', error);\n throw error;\n }\n }\n\n async processOrientationVideo(videoFile: string, env: KycEnvironment = 'PRODUCTION'): Promise<OrientationVideoResponse> {\n try {\n // SANDBOX mode: skip AI verification and return mock response\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI orientation video processing\");\n logger.log(\"SANDBOX mode: Returning mock orientation video response\");\n return {\n success: true,\n data: {\n center: { captured: true, frame: 10 },\n left: { captured: true, frame: 30 },\n right: { captured: true, frame: 50 }\n },\n message: 'SANDBOX: Orientation video processed successfully (mocked)'\n };\n }\n\n // Create FormData for multipart/form-data request\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'orientation_video.mp4', 'video/mp4');\n\n\n const response = await axios.post(\n `${this.orientationServiceURL}/process_orientation_video_stream/`,\n formData,\n {\n // Let axios set the proper multipart boundary header automatically\n timeout: 90000,\n }\n );\n\n return {\n success: true,\n data: response.data,\n message: 'Orientation video processed successfully'\n };\n } catch (error: any) {\n logger.error('Error processing orientation video:', JSON.stringify(error, null, 2));\n\n // Handle specific error cases\n if (error.response?.status === 503) {\n return {\n success: false,\n error: {\n code: 'SERVICE_UNAVAILABLE',\n message: 'Service not ready, model not initialized.',\n details: error.response.data\n },\n message: 'Service temporarily unavailable'\n };\n }\n\n return {\n success: false,\n error: {\n code: 'PROCESSING_ERROR',\n message: error.response?.data?.detail || error.message || 'Unknown error occurred',\n details: error.response?.data\n },\n message: 'Failed to process orientation video'\n };\n }\n }\n\n // STEP 1 - ID CARD VALIDATION\n async detectFaceOnId(\n idCardImageUri: string, \n token: string, \n docType: string, \n env: KycEnvironment = 'PRODUCTION'\n ): Promise<{ result: boolean; detail: any[]; card_obb?: any }> { // Added card_obb to signature\n \n // SANDBOX mode\n if (env === 'SANDBOX') {\n logger.log(\"SANDBOX mode: Returning mock face detection response\");\n return {\n result: true,\n detail: [{ confidence: 0.95, bbox: [50, 50, 200, 200] }],\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n \n const formData = new FormData();\n await appendFileToFormData(formData, 'file', idCardImageUri, 'id_card_photo.jpg', 'image/jpeg');\n \n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n\n // Log metadata, NOT the FormData object\n logger.log('detectFaceOnId Request:', { docTypeShorted, imageUri: idCardImageUri });\n \n try {\n const res = await axios.post(\n `${this.faceServiceURL}/detect_face/?doc_type=${docTypeShorted}`, \n formData,\n {\n headers: { \n 'Content-Type': 'multipart/form-data', \n 'Authorization': `Bearer ${token}` \n },\n timeout: 20000 // 20 seconds is good, but ensure the image is compressed before this step!\n }\n );\n \n // It's safe to stringify res.data if the backend returns a clean JSON object\n logger.log('detectFaceOnId res', JSON.stringify(res.data, null, 2));\n \n if (res.data?.result) {\n return res.data;\n }\n \n throw new Error(res.data?.detail || 'detect_face failed');\n \n } catch (error: any) {\n // Use your safe error extractor, avoid JSON.stringify on raw Axios errors\n const safeError = errorMessage(error) || error.message;\n logger.error('Error detecting face on id:', safeError);\n throw error;\n }\n }\n\n //check templatetemplate_type\n async checkTemplateType(\n params: { \n fileUri: string; \n docType: string; \n docRegion: string; \n token: string; \n postfix: string;\n issuingSubdivision?: string; \n }, \n env: KycEnvironment = 'PRODUCTION'\n ): Promise<any> {\n \n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI template type check\");\n logger.log(\"SANDBOX mode: Returning mock template type response\");\n const { docType, docRegion, postfix } = params;\n return {\n template_path: `templates/${docType}_${docRegion}_${postfix}.jpg`,\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const { fileUri, docType, docRegion, token, postfix, issuingSubdivision } = params;\n const formData = new FormData();\n \n await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');\n\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType];\n \n // Build the base URL\n let url = `${this.mrzServiceURL}/get_template_version/?doc_type=${encodeURIComponent(docTypeShorted)}&doc_region=${encodeURIComponent(docRegion)}&postfix=${postfix}`;\n\n if (issuingSubdivision) {\n url += `&issuing_subdivision=${encodeURIComponent(issuingSubdivision)}`;\n }\n\n logger.log('checkTemplateType params', this.mrzServiceURL, JSON.stringify({ fileUri, docTypeShorted, docRegion, issuingSubdivision, token, postfix, url }, null, 2));\n \n try {\n const res = await axios.post<CheckTemplateTypeResponse>(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}`, },\n timeout: 60000,\n });\n logger.log('checkTemplateType res', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n logger.error('Error checking template type:', JSON.stringify(e));\n throw e;\n }\n }\n\n async extractDocumentInformation(params: { \n fileUri: string; \n docType: string; \n docRegion: string; \n templatePath: string; \n issuingSubdivision?: string;\n token: string; \n postfix?: string \n }): Promise<any> {\n const { fileUri, docType, docRegion, templatePath, issuingSubdivision, token, postfix = 'front' } = params;\n \n // 1. Prepare Form Data\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');\n\n let queryParams = `doc_type=${encodeURIComponent(docType)}&doc_region=${encodeURIComponent(docRegion)}&template_path=${encodeURIComponent(templatePath)}&postfix=${postfix}&cleaned=true`;\n \n if (issuingSubdivision) {\n queryParams += `&issuing_subdivision=${encodeURIComponent(issuingSubdivision)}`;\n }\n logger.log(`URL PARAMS: ${queryParams}`)\n \n const url = `${this.textExtractionServiceURL}/extract_doc_information/?${queryParams}`;\n\n try {\n const startRes = await axios.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}` },\n timeout: 60000,\n });\n \n const jobId = startRes.data?.job_id;\n if (!jobId) throw new Error(\"Backend did not return a job_id\");\n\n logger.log(`Extraction job started: ${jobId}. Polling for results...`);\n\n // 4. Poll the Status Endpoint\n const statusUrl = `${this.textExtractionServiceURL}/extract_doc_information/status/${jobId}`;\n \n // Poll every 2 seconds, up to 15 times (30 seconds max)\n const maxRetries = 15;\n for (let i = 0; i < maxRetries; i++) {\n // Wait 2 seconds before checking\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const statusRes = await axios.get(statusUrl, {\n headers: { 'Authorization': `Bearer ${token}` }\n });\n\n const statusData = statusRes.data;\n\n if (statusData.status === 'completed') {\n logger.log('Extraction completed successfully', JSON.stringify(truncateFields(statusData.result)));\n return statusData.result; \n }\n\n if (statusData.status === 'failed') {\n throw new Error(statusData.error || \"Document extraction failed during processing.\");\n }\n\n }\n\n throw new Error(\"Document extraction timed out waiting for results.\");\n\n } catch (e: any) {\n const errorMsg = e.response?.data?.detail || e.message;\n logger.error('Error extracting document information:', errorMsg);\n throw new Error(errorMsg);\n }\n }\n\n async extractBarcode(params: { fileUri: string; token: string; docType: string; postfix?: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI barcode extraction\");\n logger.log(\"SANDBOX mode: Returning mock barcode response\");\n return {\n barcode_data: 'SANDBOX_MOCK_BARCODE_DATA',\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const { fileUri, token, docType, postfix = 'back' } = params;\n logger.log(docType)\n const formData = new FormData();\n \n await appendFileToFormData(formData, 'file', fileUri, `id_${postfix}_photo.jpg`, 'image/jpeg');\n\n const url = `${this.barcodeServiceURL}/decode_barcode/?doc_type=${encodeURIComponent(docType)}`;\n\n const attempt = async () => {\n try {\n const res = await axios.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}` },\n timeout: 60000,\n });\n \n logger.log('📦 Raw extractBarcode response:', JSON.stringify(res.data, null, 2));\n \n \n return res.data;\n } catch (e: any) {\n throw new Error(e?.message || 'Erreur de détection du code-barres');\n }\n };\n\n try {\n return await attempt();\n } catch (e) {\n logger.error('❌ Error extracting Barcode text:', JSON.stringify(e));\n throw e;\n }\n }\n\n async formatBarcodeData(params: { textInput: string; token: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI barcode formatting\");\n logger.log(\"SANDBOX mode: Returning mock formatted barcode response\");\n return {\n barcode_type: \"SANDBOX_MOCK\",\n first_name: \"JOHN\",\n last_name: \"DOE\",\n card_number: \"000000000000\"\n };\n }\n\n const { textInput, token } = params;\n \n const formData = new URLSearchParams();\n formData.append('text_input', textInput);\n\n const url = `${this.barcodeServiceURL}/format_barcode_data/`;\n\n const attempt = async () => {\n try {\n const res = await axios.post(url, formData.toString(), {\n headers: { \n 'Content-Type': 'application/x-www-form-urlencoded', \n 'Authorization': `Bearer ${token}` \n },\n timeout: 60000,\n });\n \n logger.log('📦 Raw formatBarcodeData response:', JSON.stringify(res.data, null, 2));\n \n return res.data;\n } catch (e: any) {\n throw new Error(e?.message || 'Erreur de formatage du code-barres');\n }\n };\n\n try {\n return await attempt();\n } catch (e) {\n logger.error('❌ Error formatting Barcode text:', JSON.stringify(e));\n throw e;\n }\n }\n\n\n async extractMrzText(\n params: {\n fileUri: string;\n docType: string;\n docRegion: string;\n postfix?: string;\n token: string;\n template_path: string;\n mrz_type?: string;\n },\n env: KycEnvironment = 'PRODUCTION'\n ): Promise<any> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI MRZ extraction\");\n const { docType, docRegion, postfix = 'back', mrz_type } = params;\n return {\n success: true,\n parsed_data: {\n status: 'success',\n document_type: docType,\n mrz_type: mrz_type || 'TD1',\n doc_region: docRegion,\n postfix: postfix\n },\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n const { fileUri, docType, docRegion, postfix = 'back', token, template_path, mrz_type } = params;\n\n // ... top of extractMrzText (params extraction, etc) ...\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n const safeMrzType = mrz_type && mrz_type.trim() !== '' ? mrz_type : 'TD1';\n \n logger.log(\"docTypeShorted\", docTypeShorted, docRegion, postfix);\n\n const queryParams = new URLSearchParams({\n doc_type: docTypeShorted,\n doc_region: docRegion,\n postfix: postfix,\n template_path: template_path,\n mrz_type: safeMrzType,\n reset_cache: 'true'\n }).toString();\n\n const url = `${this.mrzServiceURL}/extract_mrz_text/?${queryParams}`;\n logger.log(\"url\", url);\n\n try {\n let response;\n\n if (Platform.OS === 'web') {\n const nativeFetch = window.fetch;\n const NativeFormData = window.FormData;\n\n const formData = new NativeFormData();\n \n // Fetch the Blob natively\n const fileReq = await nativeFetch(fileUri);\n const blob = await fileReq.blob();\n \n // Append the Blob. The native browser will perfectly handle the multipart boundary.\n formData.append('file', blob, `id_card_${postfix}.jpg`);\n\n // Execute using Native Fetch!\n response = await nativeFetch(url, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n },\n body: formData,\n });\n\n } else {\n // 📱 MOBILE NATIVE: React Native's Native Bridge expects this exact object\n const formData = new FormData();\n const filePayload = {\n uri: fileUri, \n type: 'image/jpeg',\n name: `id_card_${postfix}.jpg`,\n };\n formData.append('file', filePayload as any);\n\n response = await fetch(url, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n },\n body: formData,\n });\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.error('Backend MRZ Error Details:', errorText);\n throw new Error(`Erreur serveur: ${response.status}`);\n }\n\n const data = await response.json();\n logger.log('extractMrzText res', JSON.stringify(data, null, 2));\n\n if (Object.keys(data).length === 0) throw new Error('No data found');\n \n if (data?.success === false) {\n const serverMessage = data.parsed_data?.status_message || data.parsed_data?.status || 'Échec de l\\'extraction MRZ';\n throw new Error(`Lecture MRZ refusée: ${serverMessage}`);\n }\n\n return data;\n\n } catch (error: any) {\n logger.error(\"MRZ Fetch Error: \", error?.message || error);\n throw new Error(error?.message || 'Erreur de connexion lors de l\\'extraction MRZ');\n }\n }\n\n // STEP 2 - SELFIE VALIDATION\n async recognizeFace(params: { idPhotoUri: string; selfiePhotoUri: string }, env: KycEnvironment = 'PRODUCTION'): Promise<{ is_match: boolean; similarity: number; id_bbox?: number[]; selfie_bbox?: number[] }> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI face recognition\");\n logger.log(\"SANDBOX mode: Returning mock face recognition response\");\n return {\n is_match: true,\n similarity: 0.95,\n id_bbox: [50, 50, 200, 200],\n selfie_bbox: [50, 50, 200, 200]\n };\n }\n\n const { idPhotoUri, selfiePhotoUri } = params;\n const formData = new FormData();\n await appendFileToFormData(formData, 'id_photo', idPhotoUri, 'id_card_photo.jpg', 'image/jpeg');\n await appendFileToFormData(formData, 'selfie_photo', selfiePhotoUri, 'selfie_final.jpg', 'image/jpeg');\n\n const res = await axios.post(`${this.faceServiceURL}/recognize_face/`, formData, { timeout: 45000 });\n if (res.data?.detail) throw new Error(res.data.detail);\n return res.data;\n }\n\n // HEALTH CHECKS\n async healthFaceDetection(): Promise<any> {\n const res = await axios.get(`${this.faceServiceURL}/health`);\n return res.data;\n }\n\n async healthTextExtraction(): Promise<any> {\n const res = await axios.get(`${this.textExtractionServiceURL}/health`);\n return res.data;\n }\n\n async healthMrzService(): Promise<any> {\n const res = await axios.get(`${this.mrzServiceURL}/health`);\n return res.data;\n }\n\n async healthOrientationService(): Promise<any> {\n const res = await axios.get(`${this.orientationServiceURL}/health`);\n return res.data;\n }\n\n async newSession({ token, apiKey }: { token?: string, apiKey?: string }): Promise<SessionResponse> {\n try {\n const data = {\n \"status\": \"PENDING\",\n \"metadata\": {},\n }\n const res = await axios.post<SessionResponse>(`${KYCConfig.getBackendUrl()}/verification/sessions/`,\n data, {\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'Authorization': `ApiKey ${apiKey}` } : { 'Authorization': `Bearer ${token}` })\n }\n });\n return res.data;\n } catch (error: any) {\n logger.error('Error creating session:', JSON.stringify(errorMessage(error), null, 2));\n\n // Extract backend error message if available\n const backendMessage = errorMessage(error);\n\n if (backendMessage) {\n logger.error('Backend error message:', JSON.stringify(truncateFields(backendMessage), null, 2));\n throw new Error(`Backend error: ${JSON.stringify(truncateFields(backendMessage))}`);\n }\n\n throw error;\n }\n }\n\n\n async verificationSession(payload: VerificationSessionRequest): Promise<any> {\n try {\n const { session_id, step, data, templateId, action, apiKey } = payload;\n const token = apiKey ? undefined : await authentification();\n\n if (!apiKey && !token) {\n throw new Error(\"Authentication failed: No API key or Token available.\");\n }\n\n // 1. Original Shallow Clone (Preserves file paths perfectly)\n const normalizedData = { ...data };\n\n logger.log(\"🔍 [DocType Check] Raw incoming data.metadata.document_type:\", normalizedData?.metadata?.document_type);\n logger.log(\"🔍 [DocType Check] Raw incoming data.documentType:\", normalizedData?.documentType);\n\n // Enhanced fallback to guarantee we find the document type\n const rawDocType = \n normalizedData?.metadata?.document_type || \n normalizedData?.documentType || \n normalizedData?.documents?.documentType;\n\n if (rawDocType) {\n const originalDocType = rawDocType;\n const mappedDocType = documentTypeMap[originalDocType] ?? originalDocType;\n\n normalizedData.metadata = {\n ...normalizedData.metadata,\n document_type: mappedDocType,\n };\n \n normalizedData.documentType = mappedDocType;\n\n if (normalizedData.documents) {\n normalizedData.documents = {\n ...normalizedData.documents,\n documentType: mappedDocType\n };\n\n const isSingleSided = ['passport', 'visa'].includes(mappedDocType.toLowerCase());\n if (isSingleSided && !normalizedData.documents.back) {\n normalizedData.documents.back = {}; \n }\n\n if (normalizedData.documents.front?.mrz && typeof normalizedData.documents.front.mrz === 'string') {\n try {\n normalizedData.documents.front = {\n ...normalizedData.documents.front,\n mrz: JSON.parse(normalizedData.documents.front.mrz)\n };\n } catch (e) {\n logger.log(\"Warning: Could not parse front MRZ JSON\");\n }\n }\n\n if (normalizedData.documents.back?.mrz && typeof normalizedData.documents.back.mrz === 'string') {\n try {\n normalizedData.documents.back = {\n ...normalizedData.documents.back,\n mrz: JSON.parse(normalizedData.documents.back.mrz)\n };\n } catch (e) {\n logger.log(\"Warning: Could not parse back MRZ JSON\");\n }\n }\n }\n }\n\n const payloadData = {\n action,\n data: {\n ...normalizedData,\n step,\n templateId,\n },\n session_id,\n timestamp: new Date().toISOString(),\n };\n\n const url = `${KYCConfig.getBackendUrl()}/verification/api/kyc/sessions/${session_id}/steps/${step}/`;\n const logPayload = truncateFields({ payloadData, session_id, step });\n \n logger.log(\n \"verificationSession payload\",\n JSON.stringify(\n {\n url,\n apiKey: apiKey ? \"***HIDDEN***\" : \"None\",\n token: token ? \"***HIDDEN***\" : \"None\",\n payload: logPayload,\n },\n null,\n 2\n )\n );\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `ApiKey ${apiKey}` } : {}),\n ...(token && !apiKey ? { Authorization: `Bearer ${token}` } : {})\n };\n\n const res = await axios.post<SessionResponse>(url, payloadData, { headers });\n\n logger.log(\n \"verificationSession res\",\n JSON.stringify(truncateFields(res.data), null, 2)\n );\n return res.data;\n\n } catch (error: any) {\n const parsedError = errorMessage(error);\n const finalErrorMessage = parsedError || error?.message || \"Unknown validation error\";\n \n logger.error(\n \"Error validating component:\",\n JSON.stringify(finalErrorMessage, null, 2)\n );\n throw new Error(typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n }\n}\n\n /** Send email verification code. POST /api/v1/accounts/email/send/ */\n async sendEmailVerificationCode(\n email: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/send/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { email },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n /** Verify email with OTP. POST /api/v1/accounts/email/verify/ */\n async verifyEmailCode(\n otp: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/verify/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { otp },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n async getVerificationResult(session_id: string, apiKey?: string): Promise<any> {\n try {\n \n const token = apiKey ? undefined : await authentification();\n \n const url = `${KYCConfig.getBackendUrl()}/verification/api/kyc/result/?session_id=${session_id}`;\n \n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n logger.log(\"⏳ 8 seconds passed. Force-killing hanging Axios request...\");\n controller.abort();\n }, 8000);\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n \n if (apiKey) {\n headers[\"Authorization\"] = `ApiKey ${apiKey}`;\n } else if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n \n logger.log(\"3. Firing Axios GET to:\", url);\n \n const res = await axios.get(url, {\n headers,\n signal: controller.signal \n });\n \n // Clear the timeout if the request succeeds!\n clearTimeout(timeoutId);\n \n return res.data;\n \n } catch (error: any) {\n // Catch the AbortController kill signal and format it as a timeout\n if (axios.isCancel(error) || error.name === 'AbortError' || error.name === 'CanceledError') {\n logger.error('Axios request was forcefully aborted due to timeout');\n throw new Error('Timeout exceeded');\n }\n \n logger.error('Error getting verification result:', JSON.stringify(errorMessage(error) || error.message, null, 2));\n throw error;\n }\n }\n\n /** Send WhatsApp verification code. POST /api/v1/accounts/send-whatsapp-verification/ */\n async sendWhatsAppVerificationCode(\n sessionId: string,\n phoneNumber: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/send-whatsapp-verification/`;\n \n // 1. Formatting (Ensure consistency with verification step)\n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n \n // 2. Prepare Payload\n const payload = {\n session_id: sessionId,\n phone_number: formattedPhoneNumber\n };\n\n\n\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n\n\n\n try {\n const res = await axios.post(url, payload, { headers });\n \n logger.log(\"✅ WhatsApp Send Success:\", res.data);\n return res.data;\n \n } catch (error: any) {\n if (error.response) {\n logger.error(\"🛑 WhatsApp Send Failed (Server Response):\", {\n status: error.response.status,\n data: error.response.data,\n headers: error.response.headers\n });\n } \n throw error;\n }\n }\n\n async verifyWhatsAppCode(\n sessionId: string,\n otp: string,\n phoneNumber: string, \n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/verify-whatsapp-code/`; \n \n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n \n const payload = {\n session_id: sessionId,\n verification_code: otp,\n phone_number: formattedPhoneNumber\n };\n\n\n\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n\n\n try {\n const res = await axios.post(url, payload, { headers });\n \n return res.data;\n \n } catch (error: any) {\n if (error.response) {\n logger.error(\"🛑 WhatsApp Verification Failed (Server Response):\", {\n status: error.response.status,\n data: error.response.data,\n headers: error.response.headers\n });\n } \n throw error;\n }\n}\n\n// Inside KYCService.ts\n\nasync validateBackTemplate(params: {\n region: string;\n docType: string;\n frontTemplateName: string;\n backTemplateName: string;\n subRegion: string;\n token: string;\n}, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') {\n logger.log(\"SANDBOX mode: Skipping back template validation\");\n return { is_match: true, status_message: \"SANDBOX: Valid Match\" };\n }\n\n const { region, docType, frontTemplateName, backTemplateName, subRegion, token } = params;\n \n const queryParams = new URLSearchParams({\n region: region,\n doc_type: docType,\n front_template_name: frontTemplateName,\n back_template_name: backTemplateName,\n sub_region: subRegion || \"\"\n }).toString();\n\n const url = `${this.mrzServiceURL}/validate_back_template/?${queryParams}`;\n\n logger.log('validateBackTemplate URL', url);\n\n try {\n // Pass `null` for the body since the data is now in the URL\n const res = await axios.post(url, null, {\n headers: { \n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}` \n },\n timeout: 20000,\n });\n logger.log('validateBackTemplate res', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n const errorMsg = e.response?.data?.detail || e.response?.data?.Error || e.message;\n logger.error('Error validating back template:', JSON.stringify(errorMsg));\n throw new Error(typeof errorMsg === 'string' ? errorMsg : 'Template validation failed');\n }\n}\n}\n\nconst kycService = new KYCService(\"\", \"\");\nexport default kycService;\n\n// Pour éviter d'afficher des champs trop longs, on tronque les valeurs longues dans le log\nexport function truncateFields(obj: any, maxLength = 420): any {\n if (typeof obj !== 'object' || obj === null) return obj;\n if (Array.isArray(obj)) return obj.map(item => truncateFields(item, maxLength));\n const truncated: any = {};\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const value = obj[key];\n if (typeof value === 'string' && value.length > maxLength) {\n truncated[key] = value.slice(0, maxLength) + '... [truncated]';\n } else if (typeof value === 'object' && value !== null) {\n truncated[key] = truncateFields(value, maxLength);\n } else {\n truncated[key] = value;\n }\n }\n return truncated;\n}\n\n\n\n\n// Strictly define the return type as Promise<string>\nexport const authentification = async (): Promise<string> => {\n try {\n // 1. If we have a valid token (with 10 seconds of breathing room), return it immediately\n if (cachedToken && tokenExpiryTime && Date.now() < tokenExpiryTime - 10000) {\n return cachedToken;\n }\n\n // 2. RACE CONDITION PREVENTION\n if (activeAuthRequest) {\n return activeAuthRequest;\n }\n\n // 3. Create the request and lock it\n activeAuthRequest = (async () => {\n logger.log('Authenticating: Fetching new Keycloak token...');\n \n const params = 'client_id=kyc_frontend&client_secret=QhgAmvKgmwODzsEp98dnA4PeUEMMaFHd&grant_type=client_credentials';\n \n const res = await axios.post(\n `https://idms.sanctumkey.com/realms/kyc/protocol/openid-connect/token`,\n params,\n {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n }\n );\n \n cachedToken = res.data.access_token;\n \n if (!cachedToken) {\n throw new Error(\"Keycloak returned a success response but no access_token was found.\");\n }\n\n // Calculate exact expiry timestamp (expires_in is usually in seconds)\n const expiresInMs = (res.data.expires_in || 300) * 1000; \n tokenExpiryTime = Date.now() + expiresInMs;\n\n return cachedToken; \n })();\n\n const finalToken = await activeAuthRequest;\n return finalToken;\n\n } catch (error: any) {\n cachedToken = null; // Clear bad cache\n \n const safeErrorMessage = \n error?.response?.data?.error_description || \n error?.response?.data?.error || \n error?.message || \n 'Unknown network error';\n \n logger.error('Error authentifying:', safeErrorMessage);\n throw new Error(`Échec de l'authentification: ${safeErrorMessage}`);\n \n } finally {\n // 4. Always clear the lock when the request finishes\n activeAuthRequest = null;\n }\n}\n\nexport const errorMessage = (error: any) => {\n return error.response?.data?.message ||\n error.response?.data?.detail ||\n error.response?.data?.error ||\n error.response?.data;\n}"]}
1
+ {"version":3,"file":"KYCService.js","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAA0B,6BAA6B,EAA4B,MAAM,uBAAuB,CAAC;AAIxH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,MAAM,oBAAoB,GAAG,KAAK,EAAE,QAAkB,EAAE,GAAW,EAAE,GAAW,EAAE,OAAe,UAAU,EAAE,OAAe,YAAY,EAAE,EAAE;IAC1I,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAS,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,eAAe,GAA2B;IAC9C,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,iBAAiB;IACjC,mBAAmB,EAAE,uBAAuB;IAC5C,eAAe,EAAE,0BAA0B;IAC3C,YAAY,EAAE,eAAe;IAE7B,UAAU,EAAE,eAAe,EAAW,oCAAoC;IAC1E,WAAW,EAAE,eAAe;IAE5B,eAAe,EAAE,iBAAiB,EAAI,yCAAyC;IAC/E,eAAe,EAAE,iBAAiB,EAAI,8BAA8B;IACpE,eAAe,EAAE,iBAAiB,EAAI,8BAA8B;IACpE,mBAAmB,EAAE,0BAA0B,EAAE,0BAA0B;CAC5E,CAAC;AAEF,IAAI,WAAW,GAAkB,IAAI,CAAC;AACtC,IAAI,eAAe,GAAkB,IAAI,CAAC;AAC1C,IAAI,iBAAiB,GAA2B,IAAI,CAAC;AAqCrD,MAAM,OAAO,UAAU;IACb,OAAO,CAAS;IAChB,MAAM,CAAS;IACvB,4DAA4D;IACpD,cAAc,GAAG,oCAAoC,CAAC;IACtD,wBAAwB,GAAG,oCAAoC,CAAC;IAChE,aAAa,GAAG,mCAAmC,CAAC;IACpD,iBAAiB,GAAG,oCAAoC,CAAC;IACzD,qBAAqB,GAAG,4BAA4B,CAAC;IAE7D,YAAY,OAAe,EAAE,MAAc;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACxC,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAgB;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,OAAO,aAAa,EAC5B,IAAI,EACJ,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAA0B;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,OAAO,oBAAoB,EACnC,IAAI,EACJ,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,aAAqB,EAAE,YAAoB;QAChE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,OAAO,yBAAyB,EACxC,EAAE,aAAa,EAAE,YAAY,EAAE,EAC/B,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,cAAsB;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAC9B,GAAG,IAAI,CAAC,OAAO,eAAe,cAAc,EAAE,EAC9C,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC/B,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,+BAA+B,CAAC,SAAiB,EAAE,KAAa;QAEpE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAC;YAE5F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,cAAc,2BAA2B,EACjD,QAAQ,EACR;gBACE,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,GAAG;aACxF,CACF,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,SAAiB,EAAE,MAAsB,YAAY;QACjF,IAAI,CAAC;YACH,8DAA8D;YAC9D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACtE,MAAM,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACtE,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;wBACrC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;wBACnC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;qBACrC;oBACD,OAAO,EAAE,4DAA4D;iBACtE,CAAC;YACJ,CAAC;YAED,kDAAkD;YAClD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,CAAC,CAAC;YAG9F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,qBAAqB,oCAAoC,EACjE,QAAQ,EACR;gBACE,mEAAmE;gBACnE,OAAO,EAAE,KAAK;aACf,CACF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,0CAA0C;aACpD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpF,8BAA8B;YAC9B,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,2CAA2C;wBACpD,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;qBAC7B;oBACD,OAAO,EAAE,iCAAiC;iBAC3C,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,wBAAwB;oBAClF,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI;iBAC9B;gBACD,OAAO,EAAE,qCAAqC;aAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,KAAa,EACb,OAAe,EACf,MAAsB,YAAY;QAGlC,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACnE,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;aACpD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAEhG,MAAM,cAAc,GAAG,6BAA6B,CAAC,OAAiC,CAAC,IAAI,OAAO,CAAC;QAEnG,wCAAwC;QACxC,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QAEpF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAC1B,GAAG,IAAI,CAAC,cAAc,0BAA0B,cAAc,EAAE,EAChE,QAAQ,EACR;gBACE,OAAO,EAAE;oBACP,cAAc,EAAE,qBAAqB;oBACrC,eAAe,EAAE,UAAU,KAAK,EAAE;iBACnC;gBACD,OAAO,EAAE,KAAK,CAAC,2EAA2E;aAC3F,CACF,CAAC;YAEF,6EAA6E;YAC7E,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpE,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBACrB,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,oBAAoB,CAAC,CAAC;QAE5D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,0EAA0E;YAC1E,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,iBAAiB,CACrB,MAOC,EACD,MAAsB,YAAY;QAGlC,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YAClE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC/C,OAAO;gBACL,aAAa,EAAE,aAAa,OAAO,IAAI,SAAS,IAAI,OAAO,MAAM;gBACjE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;aACpD,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC;QACnF,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAEhC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,OAAO,MAAM,EAAE,YAAY,CAAC,CAAC;QAE9F,MAAM,cAAc,GAAG,6BAA6B,CAAC,OAAiC,CAAC,CAAC;QAExF,qBAAqB;QACrB,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,mCAAmC,kBAAkB,CAAC,cAAc,CAAC,eAAe,kBAAkB,CAAC,SAAS,CAAC,YAAY,OAAO,EAAE,CAAC;QAEtK,IAAI,kBAAkB,EAAE,CAAC;YACvB,GAAG,IAAI,wBAAwB,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAErK,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAA4B,GAAG,EAAE,QAAQ,EAAE;gBACrE,OAAO,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,GAAG;gBACvF,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACvE,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,MAQhC;QACC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC;QAE3G,uBAAuB;QACvB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,OAAO,MAAM,EAAE,YAAY,CAAC,CAAC;QAE9F,IAAI,WAAW,GAAG,YAAY,kBAAkB,CAAC,OAAO,CAAC,eAAe,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,kBAAkB,CAAC,YAAY,CAAC,YAAY,OAAO,eAAe,CAAC;QAE1L,IAAI,kBAAkB,EAAE,CAAC;YACvB,WAAW,IAAI,wBAAwB,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClF,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,eAAe,WAAW,EAAE,CAAC,CAAA;QAExC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,wBAAwB,6BAA6B,WAAW,EAAE,CAAC;QAEvF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE;gBAC/C,OAAO,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE;gBACtF,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAE/D,MAAM,CAAC,GAAG,CAAC,2BAA2B,KAAK,0BAA0B,CAAC,CAAC;YAEvE,8BAA8B;YAC9B,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,wBAAwB,mCAAmC,KAAK,EAAE,CAAC;YAE7F,wDAAwD;YACxD,MAAM,UAAU,GAAG,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,iCAAiC;gBACjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAExD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE;oBAC1C,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE;iBACjD,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC;gBAElC,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACtC,MAAM,CAAC,GAAG,CAAC,mCAAmC,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACnG,OAAO,UAAU,CAAC,MAAM,CAAC;gBAC3B,CAAC;gBAED,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,+CAA+C,CAAC,CAAC;gBACvF,CAAC;YAEH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAExE,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA6E,EAAE,MAAsB,YAAY;QACpI,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC5D,OAAO;gBACL,YAAY,EAAE,2BAA2B;gBACzC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;aACpD,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAEhC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,YAAY,EAAE,YAAY,CAAC,CAAC;QAE/F,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,iBAAiB,6BAA6B,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAEhG,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE;oBAC1C,OAAO,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE;oBACtF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAGjF,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,oCAAoC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA4C,EAAE,MAAsB,YAAY;QACtG,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACtE,OAAO;gBACL,YAAY,EAAE,cAAc;gBAC5B,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,KAAK;gBAChB,WAAW,EAAE,cAAc;aAC5B,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAEpC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAEzC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,iBAAiB,uBAAuB,CAAC;QAE7D,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE;oBACrD,OAAO,EAAE;wBACP,cAAc,EAAE,mCAAmC;wBACnD,eAAe,EAAE,UAAU,KAAK,EAAE;qBACnC;oBACD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBAEH,MAAM,CAAC,GAAG,CAAC,oCAAoC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAEpF,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,oCAAoC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,cAAc,CAClB,MAQC,EACD,MAAsB,YAAY;QAEnC,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE;oBACX,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,OAAO;oBACtB,QAAQ,EAAE,QAAQ,IAAI,KAAK;oBAC3B,UAAU,EAAE,SAAS;oBACrB,OAAO,EAAE,OAAO;iBACjB;gBACD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;aACpD,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAEjG,yDAAyD;QACzD,MAAM,cAAc,GAAG,6BAA6B,CAAC,OAAiC,CAAC,IAAI,OAAO,CAAC;QACnG,MAAM,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAE1E,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACpC,QAAQ,EAAE,cAAc;YACxB,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,OAAO;YAChB,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,MAAM;SACtB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,sBAAsB,WAAW,EAAE,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC;YAEb,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBACxB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;gBACjC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAEvC,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;gBAEtC,0BAA0B;gBAC1B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAElC,oFAAoF;gBACpF,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC;gBAExD,8BAA8B;gBAC9B,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE;oBAC9B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACL,eAAe,EAAE,UAAU,KAAK,EAAE;wBAClC,QAAQ,EAAE,kBAAkB;qBAC/B;oBACD,IAAI,EAAE,QAAQ;iBACjB,CAAC,CAAC;YAEP,CAAC;iBAAM,CAAC;gBACJ,2EAA2E;gBAC3E,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,WAAW,GAAG;oBAChB,GAAG,EAAE,OAAO;oBACZ,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,WAAW,OAAO,MAAM;iBACjC,CAAC;gBACF,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAkB,CAAC,CAAC;gBAE5C,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACL,eAAe,EAAE,UAAU,KAAK,EAAE;wBAClC,QAAQ,EAAE,kBAAkB;qBAC/B;oBACD,IAAI,EAAE,QAAQ;iBACjB,CAAC,CAAC;YACP,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAErE,IAAI,IAAI,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,4BAA4B,CAAC;gBACnH,MAAM,IAAI,KAAK,CAAC,wBAAwB,aAAa,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,IAAI,CAAC;QAEd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,+CAA+C,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAEA,6BAA6B;IAC7B,KAAK,CAAC,aAAa,CAAC,MAAsD,EAAE,MAAsB,YAAY;QAC5G,eAAe;QACf,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACrE,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;gBAC3B,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;aAChC,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAChG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAEvG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,kBAAkB,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,mBAAmB;QACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,SAAS,CAAC,CAAC;QAC7D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,wBAAwB,SAAS,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,CAAC,CAAC;QAC5D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAqB,SAAS,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAuC;QACrE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG;gBACX,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,EAAE;aACf,CAAA;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAkB,GAAG,SAAS,CAAC,aAAa,EAAE,yBAAyB,EACjG,IAAI,EAAE;gBACN,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;iBAC/F;aACF,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEtF,6CAA6C;YAC7C,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAE3C,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChG,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,mBAAmB,CAAC,OAAmC;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC;YAE5D,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YAED,6DAA6D;YAC7D,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAEnC,MAAM,CAAC,GAAG,CAAC,8DAA8D,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YACpH,MAAM,CAAC,GAAG,CAAC,oDAAoD,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAE/F,2DAA2D;YAC3D,MAAM,UAAU,GACd,cAAc,EAAE,QAAQ,EAAE,aAAa;gBACvC,cAAc,EAAE,YAAY;gBAC5B,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC;YAE1C,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,eAAe,GAAG,UAAU,CAAC;gBACnC,MAAM,aAAa,GAAG,eAAe,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC;gBAE1E,cAAc,CAAC,QAAQ,GAAG;oBACxB,GAAG,cAAc,CAAC,QAAQ;oBAC1B,aAAa,EAAE,aAAa;iBAC7B,CAAC;gBAEF,cAAc,CAAC,YAAY,GAAG,aAAa,CAAC;gBAE5C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;oBAC7B,cAAc,CAAC,SAAS,GAAG;wBACzB,GAAG,cAAc,CAAC,SAAS;wBAC3B,YAAY,EAAE,aAAa;qBAC5B,CAAC;oBAEF,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;oBACjF,IAAI,aAAa,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;wBACpD,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC;oBACrC,CAAC;oBAED,IAAI,cAAc,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,OAAO,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;wBAClG,IAAI,CAAC;4BACH,cAAc,CAAC,SAAS,CAAC,KAAK,GAAG;gCAC/B,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK;gCACjC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;6BACpD,CAAC;wBACJ,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;oBAED,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;wBAChG,IAAI,CAAC;4BACH,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG;gCAC9B,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI;gCAChC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;6BACnD,CAAC;wBACJ,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;wBACvD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG;gBAClB,MAAM;gBACN,IAAI,EAAE;oBACJ,GAAG,cAAc;oBACjB,IAAI;oBACJ,UAAU;iBACX;gBACD,UAAU;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,kCAAkC,UAAU,UAAU,IAAI,GAAG,CAAC;YACtG,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YAErE,MAAM,CAAC,GAAG,CACR,6BAA6B,EAC7B,IAAI,CAAC,SAAS,CACZ;gBACE,GAAG;gBACH,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM;gBACxC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM;gBACtC,OAAO,EAAE,UAAU;aACpB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YAEF,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAkB,GAAG,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE7E,MAAM,CAAC,GAAG,CACR,yBAAyB,EACzB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAClD,CAAC;YACF,OAAO,GAAG,CAAC,IAAI,CAAC;QAElB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,iBAAiB,GAAG,WAAW,IAAI,KAAK,EAAE,OAAO,IAAI,0BAA0B,CAAC;YAEtF,MAAM,CAAC,KAAK,CACV,6BAA6B,EAC7B,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAC3C,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IAEC,sEAAsE;IACtE,KAAK,CAAC,yBAAyB,CAC7B,KAAa,EACb,IAA0C;QAE1C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,uBAAuB,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QACnF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAC1B,GAAG,EACH,EAAE,KAAK,EAAE,EACT;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;aAC1G;SACF,CACF,CAAC;QACF,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,eAAe,CACnB,GAAW,EACX,IAA0C;QAE1C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,yBAAyB,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QACnF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAC1B,GAAG,EACH,EAAE,GAAG,EAAE,EACP;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;aAC1G;SACF,CACF,CAAC;QACF,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,UAAkB,EAAE,MAAe;QAC7D,IAAI,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC;YAE5D,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,4CAA4C,UAAU,EAAE,CAAC;YAEjG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,MAAM,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBACzE,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;aACnC,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;YAChD,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YAC/C,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAE3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC/B,OAAO;gBACP,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,6CAA6C;YAC7C,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,OAAO,GAAG,CAAC,IAAI,CAAC;QAElB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,mEAAmE;YACnE,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC3F,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAClH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,4BAA4B,CAChC,SAAiB,EACjB,WAAmB,EACnB,IAA0C;QAE1C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,uCAAuC,CAAC;QAEhF,4DAA4D;QAC5D,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE5D,qBAAqB;QACrB,MAAM,OAAO,GAAG;YACZ,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,oBAAoB;SACrC,CAAC;QAIF,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG;YACZ,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;SAC5G,CAAC;QAIF,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAExD,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACjD,OAAO,GAAG,CAAC,IAAI,CAAC;QAEpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;oBACvD,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;oBAC7B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;oBACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;iBAClC,CAAC,CAAC;YACP,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,SAAiB,EACjB,GAAW,EACX,WAAmB,EACnB,IAA0C;QAE1C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,iCAAiC,CAAC;QAE1E,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAG;YACZ,UAAU,EAAE,SAAS;YACrB,iBAAiB,EAAE,GAAG;YACtB,YAAY,EAAE,oBAAoB;SACrC,CAAC;QAIF,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG;YACZ,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;SAC5G,CAAC;QAGF,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAExD,OAAO,GAAG,CAAC,IAAI,CAAC;QAEpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE;oBAC/D,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;oBAC7B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;oBACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;iBAClC,CAAC,CAAC;YACP,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,uBAAuB;IAEvB,KAAK,CAAC,oBAAoB,CAAC,MAO1B,EAAE,MAAsB,YAAY;QACnC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC9D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAE1F,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACtC,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,OAAO;YACjB,mBAAmB,EAAE,iBAAiB;YACtC,kBAAkB,EAAE,gBAAgB;YACpC,UAAU,EAAE,SAAS,IAAI,EAAE;SAC5B,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,4BAA4B,WAAW,EAAE,CAAC;QAE3E,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;gBACtC,OAAO,EAAE;oBACP,QAAQ,EAAE,kBAAkB;oBAC5B,eAAe,EAAE,UAAU,KAAK,EAAE;iBACnC;gBACD,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1E,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;YAClF,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED;;;SAGK;IACL,KAAK,CAAC,oBAAoB,CACxB,OAAmD,EACnD,MAAc,CAAC,2BAA2B;;QAE1C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,yCAAyC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAE1E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,+BAA+B,CAAC;YAExE,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,2BAA2B;aAChE,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;gBACzC,OAAO;gBACP,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/E,OAAO,GAAG,CAAC,IAAI,CAAC;QAElB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,iBAAiB,GAAG,WAAW,IAAI,KAAK,EAAE,OAAO,IAAI,kCAAkC,CAAC;YAC9F,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC/I,MAAM,IAAI,KAAK,CAAC,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;CAIA;AAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC1C,eAAe,UAAU,CAAC;AAE1B,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAAC,GAAQ,EAAE,SAAS,GAAG,GAAG;IACtD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAChF,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,SAAS;QAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC1D,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,iBAAiB,CAAC;QACjE,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAKD,qDAAqD;AACrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAqB,EAAE;IAC1D,IAAI,CAAC;QACH,yFAAyF;QACzF,IAAI,WAAW,IAAI,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,KAAK,EAAE,CAAC;YAC3E,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,+BAA+B;QAC/B,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAED,oCAAoC;QACpC,iBAAiB,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,qGAAqG,CAAC;YAErH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAC1B,sEAAsE,EACtE,MAAM,EACN;gBACE,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;iBACpD;aACF,CACF,CAAC;YAEF,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAEpC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACzF,CAAC;YAED,sEAAsE;YACtE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;YACxD,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;YAE3C,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC;QAC3C,OAAO,UAAU,CAAC;IAEpB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,WAAW,GAAG,IAAI,CAAC,CAAC,kBAAkB;QAEtC,MAAM,gBAAgB,GACpB,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB;YACxC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;YAC5B,KAAK,EAAE,OAAO;YACd,uBAAuB,CAAC;QAE1B,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,gCAAgC,gBAAgB,EAAE,CAAC,CAAC;IAEtE,CAAC;YAAS,CAAC;QACT,qDAAqD;QACrD,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAU,EAAE,EAAE;IACzC,OAAO,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO;QAClC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM;QAC5B,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK;QAC3B,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;AACzB,CAAC,CAAA","sourcesContent":["import axios from 'axios';\nimport { GovernmentDocumentType, GovernmentDocumentTypeShorted, OrientationVideoResponse } from '../../types/KYC.types';\nimport { CheckTemplateTypeResponse } from '../../components/OverLay/type';\nimport { SessionResponse, VerificationSessionRequest } from './types';\nimport { KycEnvironment } from '../../types/env.types';\nimport { logger } from '../../utils/logger';\nimport { Platform } from 'react-native';\nimport KYCConfig from '../../config/KYCConfig';\n\nconst appendFileToFormData = async (formData: FormData, key: string, uri: string, name: string = 'file.jpg', type: string = 'image/jpeg') => {\n if (Platform.OS === 'web') {\n const response = await fetch(uri);\n const blob = await response.blob();\n formData.append(key, blob, name);\n } else {\n formData.append(key, { uri, type, name } as any);\n }\n};\n\nconst documentTypeMap: Record<string, string> = {\n passport: \"passport\",\n driversLicense: \"driving_licence\",\n healthInsuranceCard: \"health_insurance_card\",\n residencePermit: \"permanent_residence_card\",\n identityCard: \"identity_card\",\n\n nationalId: \"identity_card\", // We saw this in your earlier logs!\n national_id: \"identity_card\",\n \n drivers_licence: \"driving_licence\", // Plural 'drivers' to singular 'driving'\n drivers_license: \"driving_licence\", // American spelling 'license'\n driving_license: \"driving_licence\", // American spelling 'license'\n permanent_residence: \"permanent_residence_card\", // Missing the word 'card'\n};\n\nlet cachedToken: string | null = null;\nlet tokenExpiryTime: number | null = null;\nlet activeAuthRequest: Promise<string> | null = null; \n\nexport interface KYCRequest {\n userId: string;\n documentImage: string;\n selfieImage: string;\n documentType: 'passport' | 'id_card' | 'drivers_license';\n}\n\nexport interface KYCResponse {\n success: boolean;\n verificationId: string;\n status: 'pending' | 'approved' | 'rejected';\n message?: string;\n}\n\nexport interface FaceDetectionRequest {\n selfieImage: string;\n documentImage: string;\n}\n\nexport interface FaceDetectionResponse {\n match: boolean;\n confidence: number;\n message: string;\n}\n\nexport interface SelfieVideoResponse {\n orientation_direction: \"center\" | \"left\" | \"right\",\n turn_score: number;\n bbox: number[];\n capture: boolean;\n instruction: string;\n error: string;\n}\n\n\nexport class KYCService {\n private baseURL: string;\n private apiKey: string;\n // Additional service base URLs (fixed as per current infra)\n private faceServiceURL = 'https://face-infera.sanctumkey.com';\n private textExtractionServiceURL = 'https://text-infera.sanctumkey.com';\n private mrzServiceURL = 'https://mrz-infera.sanctumkey.com';\n private barcodeServiceURL = 'https://face-infera.sanctumkey.com';\n private orientationServiceURL = 'http://18.188.180.154:8080';\n\n constructor(baseURL: string, apiKey: string) {\n this.baseURL = baseURL;\n this.apiKey = apiKey;\n }\n\n private getHeaders() {\n return {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async submitKYC(data: KYCRequest): Promise<KYCResponse> {\n try {\n const response = await axios.post(\n `${this.baseURL}/kyc/submit`,\n data,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error submitting KYC:', error);\n throw error;\n }\n }\n\n async detectFace(data: FaceDetectionRequest): Promise<FaceDetectionResponse> {\n try {\n const response = await axios.post(\n `${this.baseURL}/ai/face-detection`,\n data,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error detecting face:', error);\n throw error;\n }\n }\n\n async validateDocument(documentImage: string, documentType: string): Promise<any> {\n try {\n const response = await axios.post(\n `${this.baseURL}/ai/document-validation`,\n { documentImage, documentType },\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error validating document:', error);\n throw error;\n }\n }\n\n async getKYCStatus(verificationId: string): Promise<KYCResponse> {\n try {\n const response = await axios.get(\n `${this.baseURL}/kyc/status/${verificationId}`,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error getting KYC status:', error);\n throw error;\n }\n }\n\n async processSelfieOrientationPicture(videoFile: string, token: string): Promise<SelfieVideoResponse[]> {\n \n try {\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'selfie_picture.jpg', 'image/jpeg');\n\n const response = await axios.post<SelfieVideoResponse[]>(\n `${this.faceServiceURL}/detect_face_orientation/`,\n formData,\n {\n timeout: 20000,\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}`, },\n }\n );\n return response.data;\n } catch (error) {\n logger.error('Error processing selfie orientation:', error);\n throw error;\n }\n }\n\n async processOrientationVideo(videoFile: string, env: KycEnvironment = 'PRODUCTION'): Promise<OrientationVideoResponse> {\n try {\n // SANDBOX mode: skip AI verification and return mock response\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI orientation video processing\");\n logger.log(\"SANDBOX mode: Returning mock orientation video response\");\n return {\n success: true,\n data: {\n center: { captured: true, frame: 10 },\n left: { captured: true, frame: 30 },\n right: { captured: true, frame: 50 }\n },\n message: 'SANDBOX: Orientation video processed successfully (mocked)'\n };\n }\n\n // Create FormData for multipart/form-data request\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'orientation_video.mp4', 'video/mp4');\n\n\n const response = await axios.post(\n `${this.orientationServiceURL}/process_orientation_video_stream/`,\n formData,\n {\n // Let axios set the proper multipart boundary header automatically\n timeout: 90000,\n }\n );\n\n return {\n success: true,\n data: response.data,\n message: 'Orientation video processed successfully'\n };\n } catch (error: any) {\n logger.error('Error processing orientation video:', JSON.stringify(error, null, 2));\n\n // Handle specific error cases\n if (error.response?.status === 503) {\n return {\n success: false,\n error: {\n code: 'SERVICE_UNAVAILABLE',\n message: 'Service not ready, model not initialized.',\n details: error.response.data\n },\n message: 'Service temporarily unavailable'\n };\n }\n\n return {\n success: false,\n error: {\n code: 'PROCESSING_ERROR',\n message: error.response?.data?.detail || error.message || 'Unknown error occurred',\n details: error.response?.data\n },\n message: 'Failed to process orientation video'\n };\n }\n }\n\n // STEP 1 - ID CARD VALIDATION\n async detectFaceOnId(\n idCardImageUri: string, \n token: string, \n docType: string, \n env: KycEnvironment = 'PRODUCTION'\n ): Promise<{ result: boolean; detail: any[]; card_obb?: any }> { // Added card_obb to signature\n \n // SANDBOX mode\n if (env === 'SANDBOX') {\n logger.log(\"SANDBOX mode: Returning mock face detection response\");\n return {\n result: true,\n detail: [{ confidence: 0.95, bbox: [50, 50, 200, 200] }],\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n \n const formData = new FormData();\n await appendFileToFormData(formData, 'file', idCardImageUri, 'id_card_photo.jpg', 'image/jpeg');\n \n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n\n // Log metadata, NOT the FormData object\n logger.log('detectFaceOnId Request:', { docTypeShorted, imageUri: idCardImageUri });\n \n try {\n const res = await axios.post(\n `${this.faceServiceURL}/detect_face/?doc_type=${docTypeShorted}`, \n formData,\n {\n headers: { \n 'Content-Type': 'multipart/form-data', \n 'Authorization': `Bearer ${token}` \n },\n timeout: 20000 // 20 seconds is good, but ensure the image is compressed before this step!\n }\n );\n \n // It's safe to stringify res.data if the backend returns a clean JSON object\n logger.log('detectFaceOnId res', JSON.stringify(res.data, null, 2));\n \n if (res.data?.result) {\n return res.data;\n }\n \n throw new Error(res.data?.detail || 'detect_face failed');\n \n } catch (error: any) {\n // Use your safe error extractor, avoid JSON.stringify on raw Axios errors\n const safeError = errorMessage(error) || error.message;\n logger.error('Error detecting face on id:', safeError);\n throw error;\n }\n }\n\n //check templatetemplate_type\n async checkTemplateType(\n params: { \n fileUri: string; \n docType: string; \n docRegion: string; \n token: string; \n postfix: string;\n issuingSubdivision?: string; \n }, \n env: KycEnvironment = 'PRODUCTION'\n ): Promise<any> {\n \n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI template type check\");\n logger.log(\"SANDBOX mode: Returning mock template type response\");\n const { docType, docRegion, postfix } = params;\n return {\n template_path: `templates/${docType}_${docRegion}_${postfix}.jpg`,\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const { fileUri, docType, docRegion, token, postfix, issuingSubdivision } = params;\n const formData = new FormData();\n \n await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');\n\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType];\n \n // Build the base URL\n let url = `${this.mrzServiceURL}/get_template_version/?doc_type=${encodeURIComponent(docTypeShorted)}&doc_region=${encodeURIComponent(docRegion)}&postfix=${postfix}`;\n\n if (issuingSubdivision) {\n url += `&issuing_subdivision=${encodeURIComponent(issuingSubdivision)}`;\n }\n\n logger.log('checkTemplateType params', this.mrzServiceURL, JSON.stringify({ fileUri, docTypeShorted, docRegion, issuingSubdivision, token, postfix, url }, null, 2));\n \n try {\n const res = await axios.post<CheckTemplateTypeResponse>(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}`, },\n timeout: 60000,\n });\n logger.log('checkTemplateType res', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n logger.error('Error checking template type:', JSON.stringify(e));\n throw e;\n }\n }\n\n async extractDocumentInformation(params: { \n fileUri: string; \n docType: string; \n docRegion: string; \n templatePath: string; \n issuingSubdivision?: string;\n token: string; \n postfix?: string \n }): Promise<any> {\n const { fileUri, docType, docRegion, templatePath, issuingSubdivision, token, postfix = 'front' } = params;\n \n // 1. Prepare Form Data\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');\n\n let queryParams = `doc_type=${encodeURIComponent(docType)}&doc_region=${encodeURIComponent(docRegion)}&template_path=${encodeURIComponent(templatePath)}&postfix=${postfix}&cleaned=true`;\n \n if (issuingSubdivision) {\n queryParams += `&issuing_subdivision=${encodeURIComponent(issuingSubdivision)}`;\n }\n logger.log(`URL PARAMS: ${queryParams}`)\n \n const url = `${this.textExtractionServiceURL}/extract_doc_information/?${queryParams}`;\n\n try {\n const startRes = await axios.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}` },\n timeout: 60000,\n });\n \n const jobId = startRes.data?.job_id;\n if (!jobId) throw new Error(\"Backend did not return a job_id\");\n\n logger.log(`Extraction job started: ${jobId}. Polling for results...`);\n\n // 4. Poll the Status Endpoint\n const statusUrl = `${this.textExtractionServiceURL}/extract_doc_information/status/${jobId}`;\n \n // Poll every 2 seconds, up to 15 times (30 seconds max)\n const maxRetries = 15;\n for (let i = 0; i < maxRetries; i++) {\n // Wait 2 seconds before checking\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const statusRes = await axios.get(statusUrl, {\n headers: { 'Authorization': `Bearer ${token}` }\n });\n\n const statusData = statusRes.data;\n\n if (statusData.status === 'completed') {\n logger.log('Extraction completed successfully', JSON.stringify(truncateFields(statusData.result)));\n return statusData.result; \n }\n\n if (statusData.status === 'failed') {\n throw new Error(statusData.error || \"Document extraction failed during processing.\");\n }\n\n }\n\n throw new Error(\"Document extraction timed out waiting for results.\");\n\n } catch (e: any) {\n const errorMsg = e.response?.data?.detail || e.message;\n logger.error('Error extracting document information:', errorMsg);\n throw new Error(errorMsg);\n }\n }\n\n async extractBarcode(params: { fileUri: string; token: string; docType: string; postfix?: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI barcode extraction\");\n logger.log(\"SANDBOX mode: Returning mock barcode response\");\n return {\n barcode_data: 'SANDBOX_MOCK_BARCODE_DATA',\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const { fileUri, token, docType, postfix = 'back' } = params;\n logger.log(docType)\n const formData = new FormData();\n \n await appendFileToFormData(formData, 'file', fileUri, `id_${postfix}_photo.jpg`, 'image/jpeg');\n\n const url = `${this.barcodeServiceURL}/decode_barcode/?doc_type=${encodeURIComponent(docType)}`;\n\n const attempt = async () => {\n try {\n const res = await axios.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}` },\n timeout: 60000,\n });\n \n logger.log('📦 Raw extractBarcode response:', JSON.stringify(res.data, null, 2));\n \n \n return res.data;\n } catch (e: any) {\n throw new Error(e?.message || 'Erreur de détection du code-barres');\n }\n };\n\n try {\n return await attempt();\n } catch (e) {\n logger.error('❌ Error extracting Barcode text:', JSON.stringify(e));\n throw e;\n }\n }\n\n async formatBarcodeData(params: { textInput: string; token: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI barcode formatting\");\n logger.log(\"SANDBOX mode: Returning mock formatted barcode response\");\n return {\n barcode_type: \"SANDBOX_MOCK\",\n first_name: \"JOHN\",\n last_name: \"DOE\",\n card_number: \"000000000000\"\n };\n }\n\n const { textInput, token } = params;\n \n const formData = new URLSearchParams();\n formData.append('text_input', textInput);\n\n const url = `${this.barcodeServiceURL}/format_barcode_data/`;\n\n const attempt = async () => {\n try {\n const res = await axios.post(url, formData.toString(), {\n headers: { \n 'Content-Type': 'application/x-www-form-urlencoded', \n 'Authorization': `Bearer ${token}` \n },\n timeout: 60000,\n });\n \n logger.log('📦 Raw formatBarcodeData response:', JSON.stringify(res.data, null, 2));\n \n return res.data;\n } catch (e: any) {\n throw new Error(e?.message || 'Erreur de formatage du code-barres');\n }\n };\n\n try {\n return await attempt();\n } catch (e) {\n logger.error('❌ Error formatting Barcode text:', JSON.stringify(e));\n throw e;\n }\n }\n\n\n async extractMrzText(\n params: {\n fileUri: string;\n docType: string;\n docRegion: string;\n postfix?: string;\n token: string;\n template_path: string;\n mrz_type?: string;\n },\n env: KycEnvironment = 'PRODUCTION'\n ): Promise<any> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI MRZ extraction\");\n const { docType, docRegion, postfix = 'back', mrz_type } = params;\n return {\n success: true,\n parsed_data: {\n status: 'success',\n document_type: docType,\n mrz_type: mrz_type || 'TD1',\n doc_region: docRegion,\n postfix: postfix\n },\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n const { fileUri, docType, docRegion, postfix = 'back', token, template_path, mrz_type } = params;\n\n // ... top of extractMrzText (params extraction, etc) ...\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n const safeMrzType = mrz_type && mrz_type.trim() !== '' ? mrz_type : 'TD1';\n \n logger.log(\"docTypeShorted\", docTypeShorted, docRegion, postfix);\n\n const queryParams = new URLSearchParams({\n doc_type: docTypeShorted,\n doc_region: docRegion,\n postfix: postfix,\n template_path: template_path,\n mrz_type: safeMrzType,\n reset_cache: 'true'\n }).toString();\n\n const url = `${this.mrzServiceURL}/extract_mrz_text/?${queryParams}`;\n logger.log(\"url\", url);\n\n try {\n let response;\n\n if (Platform.OS === 'web') {\n const nativeFetch = window.fetch;\n const NativeFormData = window.FormData;\n\n const formData = new NativeFormData();\n \n // Fetch the Blob natively\n const fileReq = await nativeFetch(fileUri);\n const blob = await fileReq.blob();\n \n // Append the Blob. The native browser will perfectly handle the multipart boundary.\n formData.append('file', blob, `id_card_${postfix}.jpg`);\n\n // Execute using Native Fetch!\n response = await nativeFetch(url, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n },\n body: formData,\n });\n\n } else {\n // 📱 MOBILE NATIVE: React Native's Native Bridge expects this exact object\n const formData = new FormData();\n const filePayload = {\n uri: fileUri, \n type: 'image/jpeg',\n name: `id_card_${postfix}.jpg`,\n };\n formData.append('file', filePayload as any);\n\n response = await fetch(url, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n },\n body: formData,\n });\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.error('Backend MRZ Error Details:', errorText);\n throw new Error(`Erreur serveur: ${response.status}`);\n }\n\n const data = await response.json();\n logger.log('extractMrzText res', JSON.stringify(data, null, 2));\n\n if (Object.keys(data).length === 0) throw new Error('No data found');\n \n if (data?.success === false) {\n const serverMessage = data.parsed_data?.status_message || data.parsed_data?.status || 'Échec de l\\'extraction MRZ';\n throw new Error(`Lecture MRZ refusée: ${serverMessage}`);\n }\n\n return data;\n\n } catch (error: any) {\n logger.error(\"MRZ Fetch Error: \", error?.message || error);\n throw new Error(error?.message || 'Erreur de connexion lors de l\\'extraction MRZ');\n }\n }\n\n // STEP 2 - SELFIE VALIDATION\n async recognizeFace(params: { idPhotoUri: string; selfiePhotoUri: string }, env: KycEnvironment = 'PRODUCTION'): Promise<{ is_match: boolean; similarity: number; id_bbox?: number[]; selfie_bbox?: number[] }> {\n // SANDBOX mode\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI face recognition\");\n logger.log(\"SANDBOX mode: Returning mock face recognition response\");\n return {\n is_match: true,\n similarity: 0.95,\n id_bbox: [50, 50, 200, 200],\n selfie_bbox: [50, 50, 200, 200]\n };\n }\n\n const { idPhotoUri, selfiePhotoUri } = params;\n const formData = new FormData();\n await appendFileToFormData(formData, 'id_photo', idPhotoUri, 'id_card_photo.jpg', 'image/jpeg');\n await appendFileToFormData(formData, 'selfie_photo', selfiePhotoUri, 'selfie_final.jpg', 'image/jpeg');\n\n const res = await axios.post(`${this.faceServiceURL}/recognize_face/`, formData, { timeout: 45000 });\n if (res.data?.detail) throw new Error(res.data.detail);\n return res.data;\n }\n\n // HEALTH CHECKS\n async healthFaceDetection(): Promise<any> {\n const res = await axios.get(`${this.faceServiceURL}/health`);\n return res.data;\n }\n\n async healthTextExtraction(): Promise<any> {\n const res = await axios.get(`${this.textExtractionServiceURL}/health`);\n return res.data;\n }\n\n async healthMrzService(): Promise<any> {\n const res = await axios.get(`${this.mrzServiceURL}/health`);\n return res.data;\n }\n\n async healthOrientationService(): Promise<any> {\n const res = await axios.get(`${this.orientationServiceURL}/health`);\n return res.data;\n }\n\n async newSession({ token, apiKey }: { token?: string, apiKey?: string }): Promise<SessionResponse> {\n try {\n const data = {\n \"status\": \"PENDING\",\n \"metadata\": {},\n }\n const res = await axios.post<SessionResponse>(`${KYCConfig.getBackendUrl()}/verification/sessions/`,\n data, {\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'Authorization': `ApiKey ${apiKey}` } : { 'Authorization': `Bearer ${token}` })\n }\n });\n return res.data;\n } catch (error: any) {\n logger.error('Error creating session:', JSON.stringify(errorMessage(error), null, 2));\n\n // Extract backend error message if available\n const backendMessage = errorMessage(error);\n\n if (backendMessage) {\n logger.error('Backend error message:', JSON.stringify(truncateFields(backendMessage), null, 2));\n throw new Error(`Backend error: ${JSON.stringify(truncateFields(backendMessage))}`);\n }\n\n throw error;\n }\n }\n\n\n async verificationSession(payload: VerificationSessionRequest): Promise<any> {\n try {\n const { session_id, step, data, templateId, action, apiKey } = payload;\n const token = apiKey ? undefined : await authentification();\n\n if (!apiKey && !token) {\n throw new Error(\"Authentication failed: No API key or Token available.\");\n }\n\n // 1. Original Shallow Clone (Preserves file paths perfectly)\n const normalizedData = { ...data };\n\n logger.log(\"🔍 [DocType Check] Raw incoming data.metadata.document_type:\", normalizedData?.metadata?.document_type);\n logger.log(\"🔍 [DocType Check] Raw incoming data.documentType:\", normalizedData?.documentType);\n\n // Enhanced fallback to guarantee we find the document type\n const rawDocType = \n normalizedData?.metadata?.document_type || \n normalizedData?.documentType || \n normalizedData?.documents?.documentType;\n\n if (rawDocType) {\n const originalDocType = rawDocType;\n const mappedDocType = documentTypeMap[originalDocType] ?? originalDocType;\n\n normalizedData.metadata = {\n ...normalizedData.metadata,\n document_type: mappedDocType,\n };\n \n normalizedData.documentType = mappedDocType;\n\n if (normalizedData.documents) {\n normalizedData.documents = {\n ...normalizedData.documents,\n documentType: mappedDocType\n };\n\n const isSingleSided = ['passport', 'visa'].includes(mappedDocType.toLowerCase());\n if (isSingleSided && !normalizedData.documents.back) {\n normalizedData.documents.back = {}; \n }\n\n if (normalizedData.documents.front?.mrz && typeof normalizedData.documents.front.mrz === 'string') {\n try {\n normalizedData.documents.front = {\n ...normalizedData.documents.front,\n mrz: JSON.parse(normalizedData.documents.front.mrz)\n };\n } catch (e) {\n logger.log(\"Warning: Could not parse front MRZ JSON\");\n }\n }\n\n if (normalizedData.documents.back?.mrz && typeof normalizedData.documents.back.mrz === 'string') {\n try {\n normalizedData.documents.back = {\n ...normalizedData.documents.back,\n mrz: JSON.parse(normalizedData.documents.back.mrz)\n };\n } catch (e) {\n logger.log(\"Warning: Could not parse back MRZ JSON\");\n }\n }\n }\n }\n\n const payloadData = {\n action,\n data: {\n ...normalizedData,\n step,\n templateId,\n },\n session_id,\n timestamp: new Date().toISOString(),\n };\n\n const url = `${KYCConfig.getBackendUrl()}/verification/api/kyc/sessions/${session_id}/steps/${step}/`;\n const logPayload = truncateFields({ payloadData, session_id, step });\n \n logger.log(\n \"verificationSession payload\",\n JSON.stringify(\n {\n url,\n apiKey: apiKey ? \"***HIDDEN***\" : \"None\",\n token: token ? \"***HIDDEN***\" : \"None\",\n payload: logPayload,\n },\n null,\n 2\n )\n );\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `ApiKey ${apiKey}` } : {}),\n ...(token && !apiKey ? { Authorization: `Bearer ${token}` } : {})\n };\n\n const res = await axios.post<SessionResponse>(url, payloadData, { headers });\n\n logger.log(\n \"verificationSession res\",\n JSON.stringify(truncateFields(res.data), null, 2)\n );\n return res.data;\n\n } catch (error: any) {\n const parsedError = errorMessage(error);\n const finalErrorMessage = parsedError || error?.message || \"Unknown validation error\";\n \n logger.error(\n \"Error validating component:\",\n JSON.stringify(finalErrorMessage, null, 2)\n );\n throw new Error(typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n }\n}\n\n /** Send email verification code. POST /api/v1/accounts/email/send/ */\n async sendEmailVerificationCode(\n email: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/send/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { email },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n /** Verify email with OTP. POST /api/v1/accounts/email/verify/ */\n async verifyEmailCode(\n otp: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/verify/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { otp },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n async getVerificationResult(session_id: string, apiKey?: string): Promise<any> {\n try {\n \n const token = apiKey ? undefined : await authentification();\n \n const url = `${KYCConfig.getBackendUrl()}/verification/api/kyc/result/?session_id=${session_id}`;\n \n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n logger.log(\"⏳ 8 seconds passed. Force-killing hanging Axios request...\");\n controller.abort();\n }, 8000);\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n \n if (apiKey) {\n headers[\"Authorization\"] = `ApiKey ${apiKey}`;\n } else if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n \n logger.log(\"3. Firing Axios GET to:\", url);\n \n const res = await axios.get(url, {\n headers,\n signal: controller.signal \n });\n \n // Clear the timeout if the request succeeds!\n clearTimeout(timeoutId);\n \n return res.data;\n \n } catch (error: any) {\n // Catch the AbortController kill signal and format it as a timeout\n if (axios.isCancel(error) || error.name === 'AbortError' || error.name === 'CanceledError') {\n logger.error('Axios request was forcefully aborted due to timeout');\n throw new Error('Timeout exceeded');\n }\n \n logger.error('Error getting verification result:', JSON.stringify(errorMessage(error) || error.message, null, 2));\n throw error;\n }\n }\n\n /** Send WhatsApp verification code. POST /api/v1/accounts/send-whatsapp-verification/ */\n async sendWhatsAppVerificationCode(\n sessionId: string,\n phoneNumber: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/send-whatsapp-verification/`;\n \n // 1. Formatting (Ensure consistency with verification step)\n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n \n // 2. Prepare Payload\n const payload = {\n session_id: sessionId,\n phone_number: formattedPhoneNumber\n };\n\n\n\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n\n\n\n try {\n const res = await axios.post(url, payload, { headers });\n \n logger.log(\"✅ WhatsApp Send Success:\", res.data);\n return res.data;\n \n } catch (error: any) {\n if (error.response) {\n logger.error(\"🛑 WhatsApp Send Failed (Server Response):\", {\n status: error.response.status,\n data: error.response.data,\n headers: error.response.headers\n });\n } \n throw error;\n }\n }\n\n async verifyWhatsAppCode(\n sessionId: string,\n otp: string,\n phoneNumber: string, \n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/verify-whatsapp-code/`; \n \n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n \n const payload = {\n session_id: sessionId,\n verification_code: otp,\n phone_number: formattedPhoneNumber\n };\n\n\n\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n\n\n try {\n const res = await axios.post(url, payload, { headers });\n \n return res.data;\n \n } catch (error: any) {\n if (error.response) {\n logger.error(\"🛑 WhatsApp Verification Failed (Server Response):\", {\n status: error.response.status,\n data: error.response.data,\n headers: error.response.headers\n });\n } \n throw error;\n }\n}\n\n// Inside KYCService.ts\n\nasync validateBackTemplate(params: {\n region: string;\n docType: string;\n frontTemplateName: string;\n backTemplateName: string;\n subRegion: string;\n token: string;\n}, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') {\n logger.log(\"SANDBOX mode: Skipping back template validation\");\n return { is_match: true, status_message: \"SANDBOX: Valid Match\" };\n }\n\n const { region, docType, frontTemplateName, backTemplateName, subRegion, token } = params;\n \n const queryParams = new URLSearchParams({\n region: region,\n doc_type: docType,\n front_template_name: frontTemplateName,\n back_template_name: backTemplateName,\n sub_region: subRegion || \"\"\n }).toString();\n\n const url = `${this.mrzServiceURL}/validate_back_template/?${queryParams}`;\n\n logger.log('validateBackTemplate URL', url);\n\n try {\n // Pass `null` for the body since the data is now in the URL\n const res = await axios.post(url, null, {\n headers: { \n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}` \n },\n timeout: 20000,\n });\n logger.log('validateBackTemplate res', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n const errorMsg = e.response?.data?.detail || e.response?.data?.Error || e.message;\n logger.error('Error validating back template:', JSON.stringify(errorMsg));\n throw new Error(typeof errorMsg === 'string' ? errorMsg : 'Template validation failed');\n }\n}\n\n/**\n * Generates a new referral code for a specific session.\n * Endpoint: POST /api/v1/core/referral-code/generate/\n */\nasync generateReferralCode(\n payload: { session_id: string; [key: string]: any }, \n apiKey: string // 🚨 Now strictly required\n): Promise<any> {\n try {\n logger.log(`Generating referral code for session: ${payload.session_id}`);\n\n if (!apiKey) {\n throw new Error(\"Authentication failed: API key is required.\");\n }\n\n const url = `${KYCConfig.getBackendUrl()}/core/referral-code/generate/`;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `ApiKey ${apiKey}` // 🚨 Strictly using ApiKey\n };\n\n const res = await axios.post(url, payload, { \n headers,\n timeout: 8000 \n });\n\n logger.log(\"generateReferralCode SUCCESS:\", JSON.stringify(res.data, null, 2));\n return res.data;\n\n } catch (error: any) {\n const parsedError = errorMessage(error);\n const finalErrorMessage = parsedError || error?.message || \"Failed to generate referral code\";\n logger.error(\"Error generating referral code:\", typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n throw new Error(typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n }\n}\n\n\n\n}\n\nconst kycService = new KYCService(\"\", \"\");\nexport default kycService;\n\n// Pour éviter d'afficher des champs trop longs, on tronque les valeurs longues dans le log\nexport function truncateFields(obj: any, maxLength = 420): any {\n if (typeof obj !== 'object' || obj === null) return obj;\n if (Array.isArray(obj)) return obj.map(item => truncateFields(item, maxLength));\n const truncated: any = {};\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const value = obj[key];\n if (typeof value === 'string' && value.length > maxLength) {\n truncated[key] = value.slice(0, maxLength) + '... [truncated]';\n } else if (typeof value === 'object' && value !== null) {\n truncated[key] = truncateFields(value, maxLength);\n } else {\n truncated[key] = value;\n }\n }\n return truncated;\n}\n\n\n\n\n// Strictly define the return type as Promise<string>\nexport const authentification = async (): Promise<string> => {\n try {\n // 1. If we have a valid token (with 10 seconds of breathing room), return it immediately\n if (cachedToken && tokenExpiryTime && Date.now() < tokenExpiryTime - 10000) {\n return cachedToken;\n }\n\n // 2. RACE CONDITION PREVENTION\n if (activeAuthRequest) {\n return activeAuthRequest;\n }\n\n // 3. Create the request and lock it\n activeAuthRequest = (async () => {\n logger.log('Authenticating: Fetching new Keycloak token...');\n \n const params = 'client_id=kyc_frontend&client_secret=QhgAmvKgmwODzsEp98dnA4PeUEMMaFHd&grant_type=client_credentials';\n \n const res = await axios.post(\n `https://idms.sanctumkey.com/realms/kyc/protocol/openid-connect/token`,\n params,\n {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n }\n );\n \n cachedToken = res.data.access_token;\n \n if (!cachedToken) {\n throw new Error(\"Keycloak returned a success response but no access_token was found.\");\n }\n\n // Calculate exact expiry timestamp (expires_in is usually in seconds)\n const expiresInMs = (res.data.expires_in || 300) * 1000; \n tokenExpiryTime = Date.now() + expiresInMs;\n\n return cachedToken; \n })();\n\n const finalToken = await activeAuthRequest;\n return finalToken;\n\n } catch (error: any) {\n cachedToken = null; // Clear bad cache\n \n const safeErrorMessage = \n error?.response?.data?.error_description || \n error?.response?.data?.error || \n error?.message || \n 'Unknown network error';\n \n logger.error('Error authentifying:', safeErrorMessage);\n throw new Error(`Échec de l'authentification: ${safeErrorMessage}`);\n \n } finally {\n // 4. Always clear the lock when the request finishes\n activeAuthRequest = null;\n }\n}\n\nexport const errorMessage = (error: any) => {\n return error.response?.data?.message ||\n error.response?.data?.detail ||\n error.response?.data?.error ||\n error.response?.data;\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctum-key/react-native-sdk",
3
- "version": "1.0.27",
3
+ "version": "1.0.29",
4
4
  "description": "Sanctum Key React Native SDK",
5
5
  "main": "build/src/index.js",
6
6
  "types": "build/src/index.d.ts",
@@ -27,20 +27,20 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
27
27
  }) => {
28
28
  const { t } = useI18n();
29
29
  const camera = useRef<Camera>(null);
30
-
31
30
  const webVideoRef = useRef<HTMLVideoElement | null>(null);
31
+
32
32
  const isCapturingRef = useRef(false);
33
33
  const isProcessingRef = useRef(isProcessing);
34
+
34
35
  const [cameraType] = useState<'front' | 'back'>(initialCameraType);
35
36
  const [hasPermission, setHasPermission] = useState<boolean | null>(null);
36
37
  const [isInitialized, setIsInitialized] = useState(false);
37
38
  const [refreshCamera] = useState(false);
38
39
 
39
- // 🚨 NEW STATE: Tells React when it is safe to mount the Web Scanner
40
40
  const [isVideoFound, setIsVideoFound] = useState(false);
41
-
42
41
  const scannedBarcodeRef = useRef<string | null>(null);
43
42
  const containerRef = useRef<any>(null);
43
+
44
44
  const device = useCameraDevice(cameraType);
45
45
 
46
46
  useEffect(() => {
@@ -54,14 +54,22 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
54
54
  const granted = await VisionCameraModule.requestAllPermissions();
55
55
  if (!granted) {
56
56
  setHasPermission(false);
57
- onError?.({ message: t('camera.permissionRequired') });
57
+ onError?.({
58
+ message: t('camera.permissionRequired'),
59
+ name: 'NotAllowedError', // Emulate web standard for easy catching
60
+ code: 'permission-denied'
61
+ });
58
62
  return;
59
63
  }
60
64
  }
61
65
  setHasPermission(true);
62
- } catch {
66
+ } catch (e: any) {
63
67
  setHasPermission(false);
64
- onError?.({ message: t('camera.errorOccurred') });
68
+ onError?.({
69
+ message: e.message || t('camera.errorOccurred'),
70
+ name: e.name || 'UnknownError',
71
+ code: e.code || 'unknown'
72
+ });
65
73
  }
66
74
  };
67
75
 
@@ -70,8 +78,15 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
70
78
  }, [showCamera, refreshCamera]);
71
79
 
72
80
  const onInitialized = useCallback(() => setIsInitialized(true), []);
81
+
82
+ // 🚨 UPDATED: Catch Vision Camera deep errors (e.g. session-in-use) and pass them up
73
83
  const onCameraError = useCallback((error: any) => {
74
- onError?.({ message: error.message || t('camera.errorOccurred') });
84
+ console.warn("🎥 [Vision Camera Error Caught]:", error);
85
+ onError?.({
86
+ message: error.message || t('camera.errorOccurred'),
87
+ code: error.code, // Contains specific RNVC codes (e.g., 'session/camera-in-use')
88
+ name: error.name // Contains Web standard names (e.g., 'NotReadableError')
89
+ });
75
90
  }, [onError, t]);
76
91
 
77
92
  const codeScanner = useCodeScanner({
@@ -92,12 +107,22 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
92
107
  const captureSilentPhoto = useCallback(async () => {
93
108
  if (!camera.current || !isInitialized || isProcessingRef.current || isCapturingRef.current) return;
94
109
  if (silentCaptureResult?.isAnalyzing) return;
110
+
95
111
  try {
96
112
  isCapturingRef.current = true;
97
- const photo = await camera.current.takePhoto({ enableShutterSound: false, flash: 'off' });
113
+ const photo = await camera.current.takePhoto({
114
+ enableShutterSound: false,
115
+ flash: 'off'
116
+ });
117
+
98
118
  const result = await VisionCameraModule.processPhotoResult(photo);
99
- onSilentCapture?.({ ...result, path: result.path || photo.path, barcode: scannedBarcodeRef.current });
119
+ onSilentCapture?.({
120
+ ...result,
121
+ path: result.path || photo.path,
122
+ barcode: scannedBarcodeRef.current
123
+ });
100
124
  } catch {
125
+ // Intentionally swallow silent capture errors so we don't spam the UI
101
126
  } finally {
102
127
  isCapturingRef.current = false;
103
128
  }
@@ -107,11 +132,13 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
107
132
  if (!showCamera || !isInitialized || isProcessing) return;
108
133
  let active = true;
109
134
  let id: ReturnType<typeof setInterval>;
135
+
110
136
  const timer = setTimeout(() => {
111
137
  if (!active) return;
112
138
  const intervalDelay = isScanningBarcode ? 3000 : 1500;
113
139
  id = setInterval(captureSilentPhoto, intervalDelay);
114
140
  }, 1500);
141
+
115
142
  return () => {
116
143
  active = false;
117
144
  clearTimeout(timer);
@@ -119,16 +146,12 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
119
146
  };
120
147
  }, [showCamera, isInitialized, isProcessing, captureSilentPhoto, isScanningBarcode]);
121
148
 
122
- // Web: Aggressive Video Element Hunter
123
149
  useEffect(() => {
124
- // 🚨 Kick off the search immediately if we are on the web and the camera should be showing
125
150
  if (Platform.OS !== 'web' || !showCamera) return;
126
151
 
127
152
  let timeoutId: ReturnType<typeof setTimeout>;
128
-
153
+
129
154
  const findVideo = () => {
130
- console.log('🔍 [WEB ENGINE] Searching for <video> element in DOM...');
131
-
132
155
  let video: HTMLVideoElement | null = null;
133
156
  if (containerRef.current?.querySelector) {
134
157
  video = containerRef.current.querySelector('video');
@@ -136,28 +159,20 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
136
159
  if (!video) {
137
160
  video = document.querySelector('video');
138
161
  }
139
-
162
+
140
163
  if (video) {
141
- console.log('✅ [WEB ENGINE] <video> element locked! Booting ZXing Scanner.');
142
164
  webVideoRef.current = video;
143
- setIsVideoFound(true); // This tells React to mount the scanner!
165
+ setIsVideoFound(true);
144
166
  } else {
145
- console.log('⏳ [WEB ENGINE] <video> not found yet, retrying in 500ms...');
146
167
  timeoutId = setTimeout(findVideo, 500);
147
168
  }
148
169
  };
149
170
 
150
- // Start hunting immediately, do NOT wait for isInitialized
151
171
  findVideo();
152
-
153
172
  return () => clearTimeout(timeoutId);
154
173
  }, [showCamera]);
155
174
 
156
- // 🚨 FIX: Memoized Web Callback to prevent infinite re-rendering loop
157
175
  const handleWebBarcodeScanned = useCallback((value: string) => {
158
- console.log(`🎉 [WEB SCANNER] SUCCESS! Decoded value:`, value);
159
- alert(`Decoded: ${value.substring(0, 50)}...`);
160
-
161
176
  if (!isProcessingRef.current && value !== scannedBarcodeRef.current) {
162
177
  scannedBarcodeRef.current = value;
163
178
  onBarcodeScanned?.(value);
@@ -165,7 +180,27 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
165
180
  }, [onBarcodeScanned]);
166
181
 
167
182
  if (hasPermission === null) return <View style={[styles.container, style]} />;
168
- if (hasPermission === false) return <View style={[styles.container, style]}><Text style={styles.permissionMessage}>{t('camera.permissionRequired')}</Text></View>;
183
+
184
+ if (hasPermission === false) return (
185
+ <View style={[styles.container, style]}>
186
+ <Text style={styles.permissionMessage}>{t('camera.permissionRequired')}</Text>
187
+ </View>
188
+ );
189
+
190
+ if (!device && showCamera) {
191
+ // We delay the missing device error slightly to account for the camera mounting delay
192
+ setTimeout(() => {
193
+ if (!device) {
194
+ onError?.({
195
+ message: "No camera detected",
196
+ name: "NotFoundError",
197
+ code: "device/not-found"
198
+ });
199
+ }
200
+ }, 1000);
201
+ return <View style={[styles.container, style]} />;
202
+ }
203
+
169
204
  if (!device || !showCamera) return <View style={[styles.container, style]} />;
170
205
 
171
206
  return (
@@ -183,7 +218,6 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
183
218
  onError={onCameraError}
184
219
  codeScanner={Platform.OS !== 'web' && isScanningBarcode ? codeScanner : undefined}
185
220
  />
186
-
187
221
  {Platform.OS === 'web' && isScanningBarcode && isVideoFound && (
188
222
  <WebBarcodeScanner
189
223
  videoRef={webVideoRef as React.RefObject<HTMLVideoElement>}
@@ -191,7 +225,6 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
191
225
  active={!isProcessingRef.current}
192
226
  />
193
227
  )}
194
-
195
228
  {overlayComponent}
196
229
  </View>
197
230
  );