@trustchex/react-native-sdk 1.409.0 → 1.464.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKModule.kt +2 -8
  2. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +59 -1
  3. package/ios/Camera/TrustchexCameraView.swift +9 -1
  4. package/lib/module/Screens/Debug/NFCScanTestScreen.js +635 -0
  5. package/lib/module/Screens/Dynamic/ContractAcceptanceScreen.js +1 -4
  6. package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +17 -4
  7. package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +102 -23
  8. package/lib/module/Screens/Dynamic/VerbalConsentScreen.js +1079 -0
  9. package/lib/module/Screens/Dynamic/VideoCallScreen.js +3 -1
  10. package/lib/module/Screens/Static/ResultScreen.js +128 -22
  11. package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +8 -0
  12. package/lib/module/Shared/Animations/recording.json +1 -0
  13. package/lib/module/Shared/Components/DebugNavigationPanel.js +69 -71
  14. package/lib/module/Shared/Components/EIDScanner.js +212 -108
  15. package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +5 -3
  16. package/lib/module/Shared/Components/IdentityDocumentCamera.js +53 -36
  17. package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +13 -4
  18. package/lib/module/Shared/Components/NavigationManager.js +24 -16
  19. package/lib/module/Shared/EIDReader/aesSecureMessagingWrapper.js +51 -0
  20. package/lib/module/Shared/EIDReader/apduLevelPACECapable.js +3 -0
  21. package/lib/module/Shared/EIDReader/bacKey.js +16 -2
  22. package/lib/module/Shared/EIDReader/eidReader.js +354 -13
  23. package/lib/module/Shared/EIDReader/eidService.js +25 -1
  24. package/lib/module/Shared/EIDReader/nfcManagerCardService.js +4 -7
  25. package/lib/module/Shared/EIDReader/paceInfo.js +85 -0
  26. package/lib/module/Shared/EIDReader/paceKeySpec.js +51 -0
  27. package/lib/module/Shared/EIDReader/protocol/paceAPDUSender.js +100 -0
  28. package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +655 -0
  29. package/lib/module/Shared/EIDReader/protocol/paceResult.js +37 -0
  30. package/lib/module/Shared/EIDReader/secureMessagingWrapper.js +27 -4
  31. package/lib/module/Shared/EIDReader/smartcards/commandAPDU.js +2 -1
  32. package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +1 -1
  33. package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +6 -3
  34. package/lib/module/Shared/EIDReader/utils/aesCrypto.utils.js +189 -0
  35. package/lib/module/Shared/Libs/analytics.utils.js +4 -0
  36. package/lib/module/Shared/Libs/contains.js +1 -40
  37. package/lib/module/Shared/Libs/country-display.utils.js +34 -0
  38. package/lib/module/Shared/Libs/demo.utils.js +8 -0
  39. package/lib/module/Shared/Libs/mrz.utils.js +3 -2
  40. package/lib/module/Shared/Libs/status-bar.utils.js +4 -2
  41. package/lib/module/Shared/Types/analytics.types.js +2 -0
  42. package/lib/module/Translation/Resources/en.js +41 -2
  43. package/lib/module/Translation/Resources/tr.js +41 -2
  44. package/lib/module/Trustchex.js +54 -20
  45. package/lib/module/version.js +1 -1
  46. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts +3 -0
  47. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts.map +1 -0
  48. package/lib/typescript/src/Screens/Dynamic/ContractAcceptanceScreen.d.ts.map +1 -1
  49. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
  50. package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
  51. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts +3 -0
  52. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts.map +1 -0
  53. package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts.map +1 -1
  54. package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
  55. package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
  56. package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
  57. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
  58. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
  59. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +1 -1
  60. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
  61. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +5 -0
  62. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
  63. package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
  64. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts +18 -0
  65. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts.map +1 -0
  66. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts +23 -0
  67. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts.map +1 -0
  68. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts +6 -0
  69. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts.map +1 -1
  70. package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
  71. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts +9 -0
  72. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts.map +1 -1
  73. package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
  74. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts +50 -0
  75. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts.map +1 -0
  76. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts +30 -0
  77. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts.map +1 -0
  78. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts +17 -0
  79. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts.map +1 -0
  80. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts +105 -0
  81. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -0
  82. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts +24 -0
  83. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts.map +1 -0
  84. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts +15 -0
  85. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts.map +1 -1
  86. package/lib/typescript/src/Shared/EIDReader/smartcards/commandAPDU.d.ts.map +1 -1
  87. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
  88. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts +39 -0
  89. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts.map +1 -0
  90. package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
  91. package/lib/typescript/src/Shared/Libs/contains.d.ts +0 -7
  92. package/lib/typescript/src/Shared/Libs/contains.d.ts.map +1 -1
  93. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts +2 -0
  94. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -0
  95. package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
  96. package/lib/typescript/src/Shared/Libs/http-client.d.ts +1 -1
  97. package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
  98. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  99. package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts.map +1 -1
  100. package/lib/typescript/src/Shared/Types/analytics.types.d.ts +2 -0
  101. package/lib/typescript/src/Shared/Types/analytics.types.d.ts.map +1 -1
  102. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +10 -1
  103. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
  104. package/lib/typescript/src/Translation/Resources/en.d.ts +40 -1
  105. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  106. package/lib/typescript/src/Translation/Resources/tr.d.ts +40 -1
  107. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  108. package/lib/typescript/src/Trustchex.d.ts.map +1 -1
  109. package/lib/typescript/src/version.d.ts +1 -1
  110. package/package.json +7 -4
  111. package/src/Screens/Debug/NFCScanTestScreen.tsx +692 -0
  112. package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +1 -4
  113. package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +21 -4
  114. package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +124 -23
  115. package/src/Screens/Dynamic/VerbalConsentScreen.tsx +1401 -0
  116. package/src/Screens/Dynamic/VideoCallScreen.tsx +3 -1
  117. package/src/Screens/Static/ResultScreen.tsx +183 -31
  118. package/src/Screens/Static/VerificationSessionCheckScreen.tsx +9 -0
  119. package/src/Shared/Animations/recording.json +1 -0
  120. package/src/Shared/Components/DebugNavigationPanel.tsx +73 -48
  121. package/src/Shared/Components/EIDScanner.tsx +222 -111
  122. package/src/Shared/Components/IdentityDocumentCamera.flows.ts +7 -4
  123. package/src/Shared/Components/IdentityDocumentCamera.tsx +199 -184
  124. package/src/Shared/Components/IdentityDocumentCamera.utils.ts +13 -4
  125. package/src/Shared/Components/NavigationManager.tsx +27 -18
  126. package/src/Shared/EIDReader/aesSecureMessagingWrapper.ts +69 -0
  127. package/src/Shared/EIDReader/apduLevelPACECapable.ts +34 -0
  128. package/src/Shared/EIDReader/bacKey.ts +24 -8
  129. package/src/Shared/EIDReader/eidReader.ts +398 -12
  130. package/src/Shared/EIDReader/eidService.ts +49 -1
  131. package/src/Shared/EIDReader/nfcManagerCardService.ts +4 -6
  132. package/src/Shared/EIDReader/paceInfo.ts +159 -0
  133. package/src/Shared/EIDReader/paceKeySpec.ts +56 -0
  134. package/src/Shared/EIDReader/protocol/paceAPDUSender.ts +163 -0
  135. package/src/Shared/EIDReader/protocol/paceProtocol.ts +946 -0
  136. package/src/Shared/EIDReader/protocol/paceResult.ts +62 -0
  137. package/src/Shared/EIDReader/secureMessagingWrapper.ts +28 -10
  138. package/src/Shared/EIDReader/smartcards/commandAPDU.ts +2 -1
  139. package/src/Shared/EIDReader/tlv/tlv.helpers.ts +1 -1
  140. package/src/Shared/EIDReader/tlv/tlv.utils.ts +8 -5
  141. package/src/Shared/EIDReader/utils/aesCrypto.utils.ts +217 -0
  142. package/src/Shared/Libs/analytics.utils.ts +4 -0
  143. package/src/Shared/Libs/contains.ts +0 -53
  144. package/src/Shared/Libs/country-display.utils.ts +55 -0
  145. package/src/Shared/Libs/crypto.utils.ts +2 -2
  146. package/src/Shared/Libs/demo.utils.ts +10 -0
  147. package/src/Shared/Libs/http-client.ts +12 -4
  148. package/src/Shared/Libs/mrz.utils.ts +3 -2
  149. package/src/Shared/Libs/status-bar.utils.ts +4 -2
  150. package/src/Shared/Services/VideoSessionService.ts +1 -1
  151. package/src/Shared/Types/analytics.types.ts +2 -0
  152. package/src/Shared/Types/identificationInfo.ts +11 -0
  153. package/src/Translation/Resources/en.ts +63 -3
  154. package/src/Translation/Resources/tr.ts +62 -3
  155. package/src/Trustchex.tsx +53 -17
  156. package/src/version.ts +1 -1
@@ -55,7 +55,9 @@ const VideoCallScreen = ({
55
55
  } else {
56
56
  // Guide screen with white background - use dark icons
57
57
  StatusBar.setBarStyle('dark-content', true);
58
- StatusBar.setBackgroundColor('#ffffff', true);
58
+ if (Platform.OS === 'android') {
59
+ StatusBar.setBackgroundColor('#ffffff', true);
60
+ }
59
61
  }
60
62
  }, [hasGuideShown]);
61
63
  const serviceRef = useRef(null);
@@ -11,6 +11,7 @@ import LottieView from 'lottie-react-native';
11
11
  import { runWithRetry } from "../../Shared/Libs/promise.utils.js";
12
12
  import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
13
13
  import NavigationManager from "../../Shared/Components/NavigationManager.js";
14
+ import { getLocalizedCountryName } from "../../Shared/Libs/country-display.utils.js";
14
15
  import mrzUtils from "../../Shared/Libs/mrz.utils.js";
15
16
  import { useTranslation } from 'react-i18next';
16
17
  import { Video as VideoCompressor } from 'react-native-compressor';
@@ -27,10 +28,12 @@ const ResultScreen = () => {
27
28
  const [isSubmitting, setIsSubmitting] = useState(false);
28
29
  const [progress, setProgress] = useState(0);
29
30
  const navigationManagerRef = React.useRef(null);
31
+ const hasSubmittedRef = React.useRef(false);
30
32
  const [shouldShowDemoData, setShouldShowDemoData] = useState(false);
31
33
  const [deviceIdentifier, setDeviceIdentifier] = useState('');
32
34
  const {
33
- t
35
+ t,
36
+ i18n
34
37
  } = useTranslation();
35
38
  const insets = useSafeAreaInsets();
36
39
 
@@ -49,7 +52,7 @@ const ResultScreen = () => {
49
52
  const dd = dateStr.substring(4, 6);
50
53
 
51
54
  // Assume 19xx if YY >= 50, else 20xx
52
- const year = parseInt(yy) >= 50 ? `19${yy}` : `20${yy}`;
55
+ const year = parseInt(yy, 10) >= 50 ? `19${yy}` : `20${yy}`;
53
56
  return `${dd}/${mm}/${year}`;
54
57
  }
55
58
 
@@ -66,6 +69,28 @@ const ResultScreen = () => {
66
69
  return dateStr;
67
70
  }
68
71
  }, []);
72
+ const formatGender = useCallback(code => {
73
+ switch (code?.toUpperCase()) {
74
+ case 'M':
75
+ return t('eidScannerScreen.genderMale');
76
+ case 'F':
77
+ return t('eidScannerScreen.genderFemale');
78
+ default:
79
+ return t('eidScannerScreen.genderUnspecified');
80
+ }
81
+ }, [t]);
82
+ const formatDocumentType = useCallback(code => {
83
+ if (!code) return '';
84
+ const upper = code.toUpperCase();
85
+ if (upper.startsWith('P')) return t('eidScannerScreen.docTypePassport');
86
+ if (upper.startsWith('I')) return t('eidScannerScreen.docTypeID');
87
+ if (upper.startsWith('A')) return t('eidScannerScreen.docTypeResidence');
88
+ if (upper.startsWith('V')) return t('eidScannerScreen.docTypeVisa');
89
+ return code;
90
+ }, [t]);
91
+ const formatNationality = useCallback(code => {
92
+ return getLocalizedCountryName(code, i18n.language);
93
+ }, [i18n.language]);
69
94
  const apiUrl = useMemo(() => `${appContext.baseUrl}/api/app/mobile`, [appContext.baseUrl]);
70
95
  useEffect(() => {
71
96
  if (appContext.isDemoSession || appContext.isTestVideoSession) {
@@ -122,17 +147,21 @@ const ResultScreen = () => {
122
147
  if (!scannedDocument.mrzFields) {
123
148
  throw new Error('MRZ fields not found');
124
149
  }
150
+
151
+ // Backend payload must contain raw MRZ data only.
152
+ // Human-friendly formatting is strictly for UI rendering paths.
153
+ const rawMrzFields = scannedDocument.mrzFields;
125
154
  const identificationDocument = {
126
- type: scannedDocument.mrzFields.documentCode,
127
- name: scannedDocument.mrzFields.firstName,
128
- surname: scannedDocument.mrzFields.lastName,
129
- gender: getGenderEnumType(scannedDocument.mrzFields.sex),
130
- number: scannedDocument.mrzFields.documentNumber,
131
- country: scannedDocument.mrzFields.issuingState,
155
+ type: rawMrzFields.documentCode,
156
+ name: rawMrzFields.firstName,
157
+ surname: rawMrzFields.lastName,
158
+ gender: getGenderEnumType(rawMrzFields.sex),
159
+ number: rawMrzFields.documentNumber,
160
+ country: rawMrzFields.issuingState,
132
161
  barcodeValue: scannedDocument.barcodeValue,
133
- personalNumber: scannedDocument.mrzFields.personalNumber || scannedDocument.mrzFields.optional1,
134
- birthDate: mrzUtils.convertMRZDateToISODate(scannedDocument.mrzFields.birthDate),
135
- expiryDate: mrzUtils.convertMRZDateToISODate(scannedDocument.mrzFields.expirationDate),
162
+ personalNumber: rawMrzFields.personalNumber || rawMrzFields.optional1,
163
+ birthDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.birthDate),
164
+ expiryDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.expirationDate),
136
165
  dataSource: scannedDocument.dataSource,
137
166
  mrzText: scannedDocument.mrzText
138
167
  };
@@ -185,7 +214,7 @@ const ResultScreen = () => {
185
214
  const faceImage = scannedIdentityDocument?.faceImage;
186
215
  if (faceImage && faceImage !== '') {
187
216
  scannedIdentityDocument.faceImageMimeType ||= 'image/jpeg';
188
- const extension = scannedIdentityDocument.faceImageMimeType === 'image/jp2' ? 'jp2' : 'jpg';
217
+ const extension = scannedIdentityDocument.faceImageMimeType === 'image/jp2' ? 'jp2' : scannedIdentityDocument.faceImageMimeType === 'image/png' ? 'png' : 'jpg';
189
218
  await RNFS.writeFile(decodeURIComponent(`${RNFS.TemporaryDirectoryPath}/FACE_IMAGE.${extension}`), faceImage, 'base64');
190
219
  uploadFileOptions.files.push({
191
220
  name: 'files',
@@ -238,8 +267,9 @@ const ResultScreen = () => {
238
267
  if (livenessVideoPath) {
239
268
  let videoFilePath;
240
269
  if (Platform.OS === 'ios') {
241
- await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}`);
242
- videoFilePath = `${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}/LIVENESS_VIDEO.mp4`;
270
+ const tmpTimestamp = new Date().getTime();
271
+ await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
272
+ videoFilePath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/LIVENESS_VIDEO.mp4`;
243
273
  } else {
244
274
  videoFilePath = `${RNFS.TemporaryDirectoryPath}/LIVENESS_VIDEO.mp4`;
245
275
  }
@@ -268,11 +298,60 @@ const ResultScreen = () => {
268
298
  });
269
299
  }
270
300
  }
301
+ if (uploadFileOptions.files.length === 0) {
302
+ return;
303
+ }
271
304
  const response = await RNFS.uploadFiles(uploadFileOptions).promise;
272
305
  if (![200, 201, 204].includes(response.statusCode)) {
273
306
  throw new Error('Media upload failed');
274
307
  }
275
308
  }, [apiUrl]);
309
+ const uploadVerbalConsentVideos = useCallback(async (identificationId, verbalConsentVideos) => {
310
+ if (!verbalConsentVideos?.length) {
311
+ return;
312
+ }
313
+ for (const consentVideo of verbalConsentVideos) {
314
+ const normalizedPath = consentVideo.videoPath.replace('file://', '');
315
+ let targetPath;
316
+ if (Platform.OS === 'ios') {
317
+ const tmpTimestamp = new Date().getTime();
318
+ await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
319
+ targetPath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/VERBAL_CONSENT_VIDEO.mp4`;
320
+ } else {
321
+ targetPath = `${RNFS.TemporaryDirectoryPath}/VERBAL_CONSENT_VIDEO.mp4`;
322
+ }
323
+ await RNFS.copyFile(normalizedPath, targetPath);
324
+ const compressedVideoPath = await VideoCompressor.compress(targetPath, {
325
+ compressionMethod: 'manual',
326
+ bitrate: 500000,
327
+ // 500 kbps
328
+ maxSize: 1280,
329
+ // HD 720p
330
+ minimumFileSizeForCompress: 0 // Always compress
331
+ });
332
+ const compressedNormalizedPath = compressedVideoPath.replace('file://', '');
333
+ const response = await RNFS.uploadFiles({
334
+ toUrl: `${apiUrl}/identifications/${identificationId}/media`,
335
+ method: 'POST',
336
+ headers: {
337
+ Accept: 'application/json'
338
+ },
339
+ fields: {
340
+ consentTitle: consentVideo.title,
341
+ consentText: consentVideo.text
342
+ },
343
+ files: [{
344
+ name: 'files',
345
+ filename: 'VERBAL_CONSENT_VIDEO.mp4',
346
+ filepath: compressedNormalizedPath,
347
+ filetype: 'video/mp4'
348
+ }]
349
+ }).promise;
350
+ if (![200, 201, 204].includes(response.statusCode)) {
351
+ throw new Error('Verbal consent video upload failed');
352
+ }
353
+ }
354
+ }, [apiUrl]);
276
355
  const submit = useCallback(async identificationInfo => {
277
356
  try {
278
357
  setIsSubmitting(true);
@@ -297,6 +376,7 @@ const ResultScreen = () => {
297
376
  const livenessDetection = identificationInfo.livenessDetection;
298
377
  await runWithRetry(() => uploadIdentificationMedia(identificationId, scannedIdentityDocument, livenessDetection, false));
299
378
  }
379
+ await runWithRetry(() => uploadVerbalConsentVideos(identificationId, identificationInfo.verbalConsentVideos));
300
380
  setProgress(90);
301
381
  await runWithRetry(() => finishIdentification(identificationId, sessionKey));
302
382
  setProgress(100);
@@ -325,9 +405,10 @@ const ResultScreen = () => {
325
405
  appContext.onError?.(t('resultScreen.submissionFailed'));
326
406
  navigationManagerRef.current?.reset();
327
407
  }
328
- }, [createIdentification, apiUrl, uploadIdentificationMedia, finishIdentification, submitIdentificationDocument, submitIdentificationConsent, t, appContext]);
408
+ }, [createIdentification, apiUrl, uploadIdentificationMedia, uploadVerbalConsentVideos, finishIdentification, submitIdentificationDocument, submitIdentificationConsent, t, appContext]);
329
409
  useEffect(() => {
330
- if (appContext.identificationInfo && !appContext.isDemoSession && !appContext.isTestVideoSession) {
410
+ if (appContext.identificationInfo && !appContext.isDemoSession && !appContext.isTestVideoSession && !hasSubmittedRef.current) {
411
+ hasSubmittedRef.current = true;
331
412
  submit(appContext.identificationInfo);
332
413
  }
333
414
  }, [appContext.identificationInfo, appContext.isDemoSession, appContext.isTestVideoSession, submit]);
@@ -391,7 +472,7 @@ const ResultScreen = () => {
391
472
  children: [t('eidScannerScreen.documentCode'), ":"]
392
473
  }), /*#__PURE__*/_jsx(Text, {
393
474
  style: styles.mrzInfoText,
394
- children: appContext.identificationInfo.scannedDocument.mrzFields?.documentCode
475
+ children: formatDocumentType(appContext.identificationInfo.scannedDocument.mrzFields?.documentCode)
395
476
  })]
396
477
  }), /*#__PURE__*/_jsxs(View, {
397
478
  style: styles.mrzInfoItem,
@@ -400,7 +481,7 @@ const ResultScreen = () => {
400
481
  children: [t('eidScannerScreen.nationality'), ":"]
401
482
  }), /*#__PURE__*/_jsx(Text, {
402
483
  style: styles.mrzInfoText,
403
- children: appContext.identificationInfo.scannedDocument.mrzFields?.issuingState
484
+ children: formatNationality(appContext.identificationInfo.scannedDocument.mrzFields?.nationality || appContext.identificationInfo.scannedDocument.mrzFields?.issuingState)
404
485
  })]
405
486
  }), /*#__PURE__*/_jsxs(View, {
406
487
  style: styles.mrzInfoItem,
@@ -454,7 +535,7 @@ const ResultScreen = () => {
454
535
  children: [t('eidScannerScreen.gender'), ":"]
455
536
  }), /*#__PURE__*/_jsx(Text, {
456
537
  style: styles.mrzInfoText,
457
- children: appContext.identificationInfo.scannedDocument.mrzFields?.sex
538
+ children: formatGender(appContext.identificationInfo.scannedDocument.mrzFields?.sex)
458
539
  })]
459
540
  }), /*#__PURE__*/_jsxs(View, {
460
541
  style: styles.mrzInfoItem,
@@ -600,6 +681,30 @@ const ResultScreen = () => {
600
681
  }, index))
601
682
  })
602
683
  })]
684
+ }), !!appContext.identificationInfo.verbalConsentVideos?.length && /*#__PURE__*/_jsxs(_Fragment, {
685
+ children: [/*#__PURE__*/_jsx(Text, {
686
+ style: styles.sectionHeader,
687
+ children: t('resultScreen.demoVerbalConsent')
688
+ }), appContext.identificationInfo.verbalConsentVideos.map((consentVideo, index) => /*#__PURE__*/_jsxs(View, {
689
+ children: [/*#__PURE__*/_jsxs(Text, {
690
+ style: styles.sectionText,
691
+ children: [t('resultScreen.demoVerbalConsentTitle'), ":", ' ', consentVideo.title]
692
+ }), /*#__PURE__*/_jsxs(Text, {
693
+ style: styles.sectionText,
694
+ children: [t('resultScreen.demoVerbalConsentText'), ":", ' ', consentVideo.text]
695
+ }), /*#__PURE__*/_jsx(Text, {
696
+ style: styles.sectionText,
697
+ children: t('resultScreen.demoVideo')
698
+ }), /*#__PURE__*/_jsx(Video, {
699
+ source: {
700
+ uri: consentVideo.videoPath
701
+ },
702
+ resizeMode: "contain",
703
+ style: styles.video,
704
+ controls: true,
705
+ muted: false
706
+ })]
707
+ }, `${consentVideo.videoPath}-${index}`))]
603
708
  })]
604
709
  })
605
710
  }), /*#__PURE__*/_jsx(View, {
@@ -688,9 +793,10 @@ const styles = StyleSheet.create({
688
793
  },
689
794
  image: {
690
795
  width: 100,
691
- height: 100,
692
- objectFit: 'contain',
693
- borderRadius: 8
796
+ height: 140,
797
+ objectFit: 'cover',
798
+ borderRadius: 12,
799
+ overflow: 'hidden'
694
800
  },
695
801
  imageItem: {
696
802
  display: 'flex',
@@ -95,6 +95,11 @@ const VerificationSessionCheckScreen = () => {
95
95
  const appContextRef = useRef(appContext);
96
96
  appContextRef.current = appContext;
97
97
  useEffect(() => {
98
+ // Skip session check when navigated from debug panel — the debug panel
99
+ // already set up workflowSteps and currentWorkflowStep directly.
100
+ if (appContext.isDebugNavigated) {
101
+ return;
102
+ }
98
103
  const sid = appContext.identificationInfo.sessionId;
99
104
  if (!sid || checkedSessionIdRef.current === sid) {
100
105
  return;
@@ -185,6 +190,9 @@ const VerificationSessionCheckScreen = () => {
185
190
  const isDemoMode = isDemoSession(alphanumericText);
186
191
  const sessionResponse = await getSessionByCode(alphanumericText);
187
192
  if (sessionResponse?.id) {
193
+ // Mark as checked before setting sessionId to prevent
194
+ // the useEffect from triggering a duplicate navigation.
195
+ checkedSessionIdRef.current = sessionResponse.id;
188
196
  if (appContext.setSessionId) {
189
197
  appContext.setSessionId(sessionResponse.id);
190
198
  } else {
@@ -0,0 +1 @@
1
+ {"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":488,"h":488,"nm":"recording spectrum_MAIN","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,163]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,37]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,211]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,83]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,155]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,91]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,186]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,256]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,209]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,124]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[180.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,211]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,37]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,163]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]}