@zoreal/oauth2-js 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -61,7 +61,7 @@ function unsafeClaims(idToken) {
61
61
 
62
62
  // src/wire.ts
63
63
  var WIRE_VERSION = 1;
64
- var SDK_VERSION = "0.1.20";
64
+ var SDK_VERSION = "0.1.22";
65
65
  var SDK_NAME = "@zoreal/oauth2-js";
66
66
  var DEFAULT_ISSUER = "https://id.zoreal.com";
67
67
  var POLL_INTERVAL_MS = 2e3;
@@ -229,1146 +229,218 @@ function isMobileUserAgent() {
229
229
  return /android|iphone|ipad|ipod/i.test(navigator.userAgent);
230
230
  }
231
231
 
232
- // src/intent.ts
233
- var SIGN_IN_SCOPES = /* @__PURE__ */ new Set(["openid", "email", "profile.name"]);
234
- function resolveIntent(intent, scope, acrValues) {
235
- if (intent) return intent;
236
- const scopes = (scope ?? "openid").split(/\s+/).filter(Boolean);
237
- if (scopes.some((s) => !SIGN_IN_SCOPES.has(s))) return "identify";
238
- const acr = typeof acrValues === "string" ? acrValues.split(/\s+/) : acrValues ?? [];
239
- if (scopes.every((s) => s === "openid") && acr.includes("zoreal.live")) return "presence";
240
- return "sign-in";
232
+ // src/styles.ts
233
+ var PREFIX = "zrl";
234
+ var cx = (name) => `${PREFIX}-${name}`;
235
+ var STYLE_ELEMENT_ID = "zoreal-pairing-styles";
236
+ var LIGHT = `
237
+ --zrl-scrim: rgba(16, 18, 27, 0.45);
238
+ --zrl-surface: #ffffff;
239
+ --zrl-surface-sunken: #f6f7f9;
240
+ --zrl-ink: #16181c;
241
+ --zrl-ink-soft: #4a4f57;
242
+ --zrl-ink-mute: #6b7078;
243
+ --zrl-line: #e4e6ea;
244
+ --zrl-line-soft: #eef0f3;
245
+ --zrl-accent: #00b4d9;
246
+ --zrl-accent-soft: #dcf3fa;
247
+ --zrl-accent-ink: #04698a;
248
+ --zrl-urgent: #b4761a;
249
+ --zrl-qr-bg: #ffffff;
250
+ --zrl-qr-filter: none;
251
+ --zrl-qr-spent-filter: blur(3px);
252
+ --zrl-qr-blend: normal;
253
+ --zrl-shadow: 0 1px 2px rgba(16, 18, 27, 0.06), 0 20px 50px -12px rgba(16, 18, 27, 0.3);
254
+ --zrl-ring: rgba(16, 18, 27, 0.07);
255
+ /* The light on the QR well's edge. Brand blue on both grounds, a lighter
256
+ tint at the head; only its strength is themed, see the dark block. */
257
+ --zrl-beam: #00b4d9;
258
+ --zrl-beam-head: #7fe0f4;
259
+ --zrl-beam-line: 2px;
260
+ --zrl-glow-core: 4px;
261
+ --zrl-glow-reach: 24px;
262
+ --zrl-glow-blur: 8px;
263
+ --zrl-glow-opacity: 0.6;
264
+ `;
265
+ var DARK = `
266
+ --zrl-scrim: rgba(0, 0, 0, 0.62);
267
+ --zrl-surface: #17191d;
268
+ --zrl-surface-sunken: #1f2226;
269
+ --zrl-ink: #f4f5f7;
270
+ --zrl-ink-soft: #b3b8c0;
271
+ --zrl-ink-mute: #8b9199;
272
+ --zrl-line: #2c3036;
273
+ --zrl-line-soft: #24272c;
274
+ --zrl-accent: #34c9e8;
275
+ --zrl-accent-soft: #0d3b47;
276
+ --zrl-accent-ink: #7fdcf0;
277
+ --zrl-urgent: #e0a952;
278
+ /* The code is drawn light on the dark surface: the panel is transparent
279
+ and the image is inverted and screened, so only the modules and the
280
+ mark show. */
281
+ --zrl-qr-bg: transparent;
282
+ --zrl-qr-filter: invert(1);
283
+ --zrl-qr-spent-filter: invert(1) blur(3px);
284
+ --zrl-qr-blend: screen;
285
+ --zrl-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 20px 50px -12px rgba(0, 0, 0, 0.65);
286
+ --zrl-ring: rgba(255, 255, 255, 0.1);
287
+ /* A glow that reads on a white card disappears on a dark one: the light
288
+ here is brighter and wider, and its halo reaches further out. */
289
+ --zrl-beam: #22c8ec;
290
+ --zrl-beam-head: #c2f3fc;
291
+ --zrl-beam-line: 3px;
292
+ --zrl-glow-core: 6px;
293
+ --zrl-glow-reach: 32px;
294
+ --zrl-glow-blur: 10px;
295
+ --zrl-glow-opacity: 0.85;
296
+ `;
297
+ var CSS = `
298
+ .${PREFIX}-root { ${LIGHT} }
299
+ .${PREFIX}-root[data-theme="dark"] { ${DARK} }
300
+ @media (prefers-color-scheme: dark) {
301
+ .${PREFIX}-root[data-theme="auto"] { ${DARK} }
241
302
  }
242
- function titleFor(t, intent) {
243
- if (intent === "identify") return t.titleIdentify;
244
- if (intent === "presence") return t.titlePresence;
245
- return t.title;
303
+
304
+ .${PREFIX}-scrim {
305
+ position: fixed;
306
+ inset: 0;
307
+ z-index: 2147483000;
308
+ display: grid;
309
+ place-items: center;
310
+ overflow-y: auto;
311
+ padding: 16px;
312
+ background: var(--zrl-scrim);
313
+ backdrop-filter: blur(3px);
314
+ -webkit-backdrop-filter: blur(3px);
315
+ font-family: inherit;
316
+ animation: ${PREFIX}-fade 200ms ease-out both;
246
317
  }
247
318
 
248
- // src/return.ts
249
- var PREFIX = "zoreal:oauth2:return:";
250
- var DONE = "zoreal:oauth2:done:";
251
- var MAX_AGE_MS = 10 * 60 * 1e3;
252
- function storage() {
253
- try {
254
- return typeof localStorage === "undefined" ? null : localStorage;
255
- } catch {
256
- return null;
257
- }
319
+ .${PREFIX}-card {
320
+ position: relative;
321
+ box-sizing: border-box;
322
+ width: 100%;
323
+ max-width: 380px;
324
+ border-radius: 16px;
325
+ background: var(--zrl-surface);
326
+ color: var(--zrl-ink);
327
+ box-shadow: var(--zrl-shadow);
328
+ outline: 1px solid var(--zrl-ring);
329
+ outline-offset: -1px;
330
+ text-align: center;
331
+ animation: ${PREFIX}-rise 300ms cubic-bezier(0.23, 1, 0.32, 1) both;
258
332
  }
259
- function saveReturnFlow(flow) {
260
- try {
261
- storage()?.setItem(PREFIX + flow.requestId, JSON.stringify(flow));
262
- } catch {
263
- }
333
+
334
+ .${PREFIX}-body { padding: 28px 24px 20px; }
335
+
336
+ .${PREFIX}-lockup { display: block; margin: 0 auto; color: var(--zrl-ink); }
337
+
338
+ .${PREFIX}-title {
339
+ margin: 18px 0 0;
340
+ font-size: 18px;
341
+ font-weight: 600;
342
+ letter-spacing: -0.01em;
343
+ line-height: 1.3;
344
+ color: var(--zrl-ink);
264
345
  }
265
- function peekReturnFlow(requestId) {
266
- const store = storage();
267
- if (!store) return null;
268
- const raw = store.getItem(PREFIX + requestId);
269
- if (!raw) return null;
270
- try {
271
- const flow = JSON.parse(raw);
272
- if (flow.v !== 1 || flow.requestId !== requestId) return null;
273
- if (Date.now() - flow.createdAt > MAX_AGE_MS) return null;
274
- return flow;
275
- } catch {
276
- return null;
277
- }
346
+
347
+ .${PREFIX}-body-text {
348
+ margin: 6px auto 0;
349
+ max-width: 30ch;
350
+ font-size: 14px;
351
+ line-height: 1.55;
352
+ color: var(--zrl-ink-soft);
278
353
  }
279
- function forgetReturnFlow(requestId) {
280
- try {
281
- storage()?.removeItem(PREFIX + requestId);
282
- } catch {
283
- }
284
- if (pending === requestId) pending = null;
354
+
355
+ .${PREFIX}-qr-well {
356
+ position: relative;
357
+ display: grid;
358
+ place-items: center;
359
+ box-sizing: border-box;
360
+ width: 204px;
361
+ height: 204px;
362
+ margin: 20px auto 0;
363
+ padding: 12px;
364
+ border: 1px solid var(--zrl-line);
365
+ border-radius: var(--zrl-radius);
366
+ background: var(--zrl-qr-bg);
367
+ /* The light on the edge takes its shape from here and its colour and
368
+ strength from the theme tokens above. One lap in 4s on every tier. */
369
+ --zrl-radius: 16px;
370
+ --zrl-beam-time: 4s;
285
371
  }
286
- function markReturnDone(requestId) {
287
- try {
288
- const store = storage();
289
- store?.setItem(DONE + requestId, String(Date.now()));
290
- store?.removeItem(PREFIX + requestId);
291
- } catch {
292
- }
372
+
373
+ /* The light on the well's edge: a short comet running along the border, with
374
+ a soft glow outside it. Three overlays inside the well, each masked so the
375
+ comet can only ever paint where its mask allows, and the white interior lies
376
+ outside every mask: nothing here can reach the quiet zone a camera needs,
377
+ whatever the comet is doing. The mask is the padding box cut out of the
378
+ border box, a transparent layer clipped to the padding box intersected
379
+ with a solid one clipped to the border box. The prefixed form is for Chrome
380
+ before 120 and Safari before 15.4; the unprefixed one, declared after it,
381
+ wins everywhere else.
382
+
383
+ qr-beam keeps a thin ring on the border line: the comet itself.
384
+ qr-beam-glow is the glow: a wide band outside the well that blurs whatever
385
+ is inside it, and inside it qr-beam-glow-band keeps a 3px ring with a
386
+ second copy of the comet. The blur has to sit on the parent because a
387
+ filter is applied before a mask: blurred on the band itself, the glow
388
+ would be cut back to the band's own edge. On the parent it runs after the
389
+ band has clipped the comet thin and before the parent's mask cuts away the
390
+ inward half, which is what makes it fade outward and never over the QR.
391
+ All three share one containing block, the well's padding box, so the two
392
+ comets ride the same path; the spent badge is a later sibling and paints
393
+ above them. */
394
+ .${PREFIX}-qr-beam,
395
+ .${PREFIX}-qr-beam-glow,
396
+ .${PREFIX}-qr-beam-glow-band {
397
+ position: absolute;
398
+ inset: calc(0px - var(--zrl-beam-line));
399
+ border: var(--zrl-beam-line) solid transparent;
400
+ border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-beam-line));
401
+ pointer-events: none;
402
+ -webkit-mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
403
+ -webkit-mask-clip: padding-box, border-box;
404
+ -webkit-mask-composite: source-in;
405
+ mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
406
+ mask-clip: padding-box, border-box;
407
+ mask-composite: intersect;
293
408
  }
294
- function isReturnDone(requestId) {
295
- return storage()?.getItem(DONE + requestId) !== null && storage()?.getItem(DONE + requestId) !== void 0;
409
+ .${PREFIX}-qr-beam-glow {
410
+ inset: calc(0px - var(--zrl-glow-reach));
411
+ border-width: var(--zrl-glow-reach);
412
+ border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-reach));
413
+ filter: blur(var(--zrl-glow-blur));
414
+ opacity: var(--zrl-glow-opacity);
415
+ will-change: filter;
296
416
  }
297
- function returnToUrl() {
298
- if (typeof window === "undefined") return void 0;
299
- const { href } = window.location;
300
- const hash = href.indexOf("#");
301
- return hash === -1 ? href : href.slice(0, hash);
417
+ .${PREFIX}-qr-beam-glow-band {
418
+ inset: calc(0px - var(--zrl-glow-core));
419
+ border-width: var(--zrl-glow-core);
420
+ border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-core));
302
421
  }
303
- var RETURN_MARK = /(?:^|[#&])zoreal_return=([A-Za-z0-9]{32})(?:&|$)/;
304
- var pending = null;
305
- function pendingReturnId() {
306
- if (pending) return pending;
307
- if (typeof window === "undefined") return null;
308
- const match = RETURN_MARK.exec(window.location.hash);
309
- if (!match) return null;
310
- pending = match[1];
311
- try {
312
- window.history.replaceState(window.history.state, "", returnToUrl());
313
- } catch {
314
- }
315
- return pending;
316
- }
317
-
318
- // src/i18n.ts
319
- var en = {
320
- title: "Scan to sign in",
321
- titleIdentify: "Scan to verify your identity",
322
- titlePresence: "Scan to prove you are a real human",
323
- titleApprove: "Approve on your phone",
324
- bodyScan: "Scan with your phone camera or the ZOREAL ID app.",
325
- bodyApprove: "Approve the login in your ZOREAL ID app.",
326
- bodyEnrolling: "Finish setting up ZOREAL ID on your phone, then approve the login.",
327
- waiting: "Waiting for scan",
328
- waitingApproval: "Waiting for approval",
329
- expiresIn: "Expires in {time}",
330
- secured: "Proof-of-Human verification by ZOREAL",
331
- noIdTitle: "No ZOREAL ID yet?",
332
- noIdBody: "Scan the same code to download the app and create one for free. It only takes a minute.",
333
- cancel: "Cancel",
334
- close: "Close",
335
- qrAlt: "QR code to sign in with ZOREAL",
336
- buttonContinue: "Continue with ZOREAL"
337
- };
338
- var TRANSLATIONS = {
339
- en,
340
- sv: {
341
- title: "Skanna f\xF6r att logga in",
342
- titleIdentify: "Skanna f\xF6r att verifiera din identitet",
343
- titlePresence: "Skanna f\xF6r att bevisa att du \xE4r en riktig m\xE4nniska",
344
- titleApprove: "Godk\xE4nn p\xE5 telefonen",
345
- bodyScan: "Skanna med telefonens kamera eller ZOREAL ID-appen.",
346
- bodyApprove: "Godk\xE4nn inloggningen i ZOREAL ID-appen.",
347
- bodyEnrolling: "Slutf\xF6r konfigurationen av ZOREAL ID p\xE5 telefonen och godk\xE4nn sedan inloggningen.",
348
- waiting: "V\xE4ntar p\xE5 skanning",
349
- waitingApproval: "V\xE4ntar p\xE5 godk\xE4nnande",
350
- expiresIn: "Upph\xF6r om {time}",
351
- secured: "Proof-of-Human-verifiering av ZOREAL",
352
- noIdTitle: "Har du inget ZOREAL ID?",
353
- noIdBody: "Skanna samma kod f\xF6r att ladda ner appen och skapa ett gratis. Det tar bara en minut.",
354
- cancel: "Avbryt",
355
- close: "St\xE4ng",
356
- qrAlt: "QR-kod f\xF6r att logga in med ZOREAL",
357
- buttonContinue: "Forts\xE4tt med ZOREAL"
358
- },
359
- es: {
360
- title: "Escanea para iniciar sesi\xF3n",
361
- titleIdentify: "Escanea para verificar tu identidad",
362
- titlePresence: "Escanea para demostrar que eres una persona real",
363
- titleApprove: "Apru\xE9balo en tu tel\xE9fono",
364
- bodyScan: "Escanea con la c\xE1mara de tu tel\xE9fono o con la app ZOREAL ID.",
365
- bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
366
- bodyEnrolling: "Termina de configurar ZOREAL ID en tu tel\xE9fono y luego aprueba el inicio de sesi\xF3n.",
367
- waiting: "Esperando el escaneo",
368
- waitingApproval: "Esperando aprobaci\xF3n",
369
- expiresIn: "Caduca en {time}",
370
- secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
371
- noIdTitle: "\xBFA\xFAn no tienes ZOREAL ID?",
372
- noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear una gratis. Solo toma un minuto.",
373
- cancel: "Cancelar",
374
- close: "Cerrar",
375
- qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
376
- buttonContinue: "Continuar con ZOREAL"
377
- },
378
- pt: {
379
- title: "Digitalize para entrar",
380
- titleIdentify: "Digitalize para verificar a sua identidade",
381
- titlePresence: "Digitalize para provar que \xE9 uma pessoa real",
382
- titleApprove: "Aprove no seu telefone",
383
- bodyScan: "Digitalize com a c\xE2mara do seu telefone ou com a app ZOREAL ID.",
384
- bodyApprove: "Aprove o login no app ZOREAL ID.",
385
- bodyEnrolling: "Termine de configurar o ZOREAL ID no seu telefone e depois aprove o login.",
386
- waiting: "Aguardando digitaliza\xE7\xE3o",
387
- waitingApproval: "Aguardando aprova\xE7\xE3o",
388
- expiresIn: "Expira em {time}",
389
- secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
390
- noIdTitle: "Ainda n\xE3o tem ZOREAL ID?",
391
- noIdBody: "Digitalize o mesmo c\xF3digo para baixar o app e criar uma conta gr\xE1tis. Leva s\xF3 um minuto.",
392
- cancel: "Cancelar",
393
- close: "Fechar",
394
- qrAlt: "C\xF3digo QR para entrar com ZOREAL",
395
- buttonContinue: "Continuar com ZOREAL"
396
- },
397
- fr: {
398
- title: "Scannez pour vous connecter",
399
- titleIdentify: "Scannez pour v\xE9rifier votre identit\xE9",
400
- titlePresence: "Scannez pour prouver que vous \xEAtes bien un humain",
401
- titleApprove: "Approuvez sur votre t\xE9l\xE9phone",
402
- bodyScan: "Scannez avec l'appareil photo de votre t\xE9l\xE9phone ou l'app ZOREAL ID.",
403
- bodyApprove: "Approuvez la connexion dans votre app ZOREAL ID.",
404
- bodyEnrolling: "Terminez la configuration de ZOREAL ID sur votre t\xE9l\xE9phone, puis approuvez la connexion.",
405
- waiting: "En attente du scan",
406
- waitingApproval: "En attente d'approbation",
407
- expiresIn: "Expire dans {time}",
408
- secured: "V\xE9rification Proof-of-Human par ZOREAL",
409
- noIdTitle: "Pas encore de ZOREAL ID ?",
410
- noIdBody: "Scannez le m\xEAme code pour t\xE9l\xE9charger l'app et en cr\xE9er un gratuitement. Cela prend une minute.",
411
- cancel: "Annuler",
412
- close: "Fermer",
413
- qrAlt: "Code QR pour se connecter avec ZOREAL",
414
- buttonContinue: "Continuer avec ZOREAL"
415
- },
416
- de: {
417
- title: "Zum Anmelden scannen",
418
- titleIdentify: "Scannen, um Ihre Identit\xE4t zu verifizieren",
419
- titlePresence: "Scannen, um zu beweisen, dass Sie ein echter Mensch sind",
420
- titleApprove: "Auf dem Handy best\xE4tigen",
421
- bodyScan: "Mit der Handykamera oder der ZOREAL ID App scannen.",
422
- bodyApprove: "Anmeldung in der ZOREAL ID App best\xE4tigen.",
423
- bodyEnrolling: "ZOREAL ID auf dem Handy fertig einrichten und dann die Anmeldung best\xE4tigen.",
424
- waiting: "Warten auf Scan",
425
- waitingApproval: "Warten auf Best\xE4tigung",
426
- expiresIn: "L\xE4uft ab in {time}",
427
- secured: "Proof-of-Human-Verifizierung von ZOREAL",
428
- noIdTitle: "Noch keine ZOREAL ID?",
429
- noIdBody: "Denselben Code scannen, um die App zu laden und kostenlos eine zu erstellen. Dauert nur eine Minute.",
430
- cancel: "Abbrechen",
431
- close: "Schlie\xDFen",
432
- qrAlt: "QR-Code f\xFCr die Anmeldung mit ZOREAL",
433
- buttonContinue: "Weiter mit ZOREAL"
434
- },
435
- ru: {
436
- title: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u0439\u0442\u0438",
437
- titleIdentify: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C",
438
- titlePresence: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u044C, \u0447\u0442\u043E \u0432\u044B \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A",
439
- titleApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435",
440
- bodyScan: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u0439 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0447\u0435\u0440\u0435\u0437 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 ZOREAL ID.",
441
- bodyApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 ZOREAL ID.",
442
- bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435, \u0437\u0430\u0442\u0435\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434.",
443
- waiting: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u0441\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
444
- waitingApproval: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F",
445
- expiresIn: "\u0418\u0441\u0442\u0435\u043A\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 {time}",
446
- secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
447
- noIdTitle: "\u0415\u0449\u0451 \u043D\u0435\u0442 ZOREAL ID?",
448
- noIdBody: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u043E\u0442 \u0436\u0435 \u043A\u043E\u0434, \u0447\u0442\u043E\u0431\u044B \u0441\u043A\u0430\u0447\u0430\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0435\u0433\u043E \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E. \u042D\u0442\u043E \u0437\u0430\u0439\u043C\u0451\u0442 \u043C\u0438\u043D\u0443\u0442\u0443.",
449
- cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
450
- close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
451
- qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
452
- buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0441 ZOREAL"
453
- },
454
- ja: {
455
- title: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30ED\u30B0\u30A4\u30F3",
456
- titleIdentify: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u672C\u4EBA\u78BA\u8A8D",
457
- titlePresence: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u5B9F\u5728\u306E\u4EBA\u7269\u3067\u3042\u308B\u3053\u3068\u3092\u8A3C\u660E",
458
- titleApprove: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067\u627F\u8A8D",
459
- bodyScan: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u306E\u30AB\u30E1\u30E9\u307E\u305F\u306FZOREAL ID\u30A2\u30D7\u30EA\u3067\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
460
- bodyApprove: "ZOREAL ID\u30A2\u30D7\u30EA\u3067\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
461
- bodyEnrolling: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067ZOREAL ID\u306E\u8A2D\u5B9A\u3092\u5B8C\u4E86\u3057\u3001\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
462
- waiting: "\u30B9\u30AD\u30E3\u30F3\u5F85\u3061",
463
- waitingApproval: "\u627F\u8A8D\u5F85\u3061",
464
- expiresIn: "\u6709\u52B9\u671F\u9650\u307E\u3067 {time}",
465
- secured: "ZOREAL\u306B\u3088\u308BProof-of-Human\u8A8D\u8A3C",
466
- noIdTitle: "ZOREAL ID\u3092\u304A\u6301\u3061\u3067\u306A\u3044\u3067\u3059\u304B\uFF1F",
467
- noIdBody: "\u540C\u3058\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30A2\u30D7\u30EA\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3001\u7121\u6599\u3067\u4F5C\u6210\u3067\u304D\u307E\u3059\u30021\u5206\u307B\u3069\u3067\u5B8C\u4E86\u3057\u307E\u3059\u3002",
468
- cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
469
- close: "\u9589\u3058\u308B",
470
- qrAlt: "ZOREAL\u3067\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u305F\u3081\u306EQR\u30B3\u30FC\u30C9",
471
- buttonContinue: "ZOREAL\u3067\u7D9A\u884C"
472
- },
473
- hi: {
474
- title: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
475
- titleIdentify: "\u0905\u092A\u0928\u0940 \u092A\u0939\u091A\u093E\u0928 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
476
- titlePresence: "\u092F\u0939 \u0938\u093E\u092C\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902 \u0915\u093F \u0906\u092A \u090F\u0915 \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0907\u0902\u0938\u093E\u0928 \u0939\u0948\u0902",
477
- titleApprove: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902",
478
- bodyScan: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u0915\u0947 \u0915\u0948\u092E\u0930\u0947 \u092F\u093E ZOREAL ID \u0910\u092A \u0938\u0947 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964",
479
- bodyApprove: "\u0905\u092A\u0928\u0947 ZOREAL ID \u0910\u092A \u092E\u0947\u0902 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
480
- bodyEnrolling: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 ZOREAL ID \u0938\u0947\u091F\u0905\u092A \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902, \u092B\u093F\u0930 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
481
- waiting: "\u0938\u094D\u0915\u0948\u0928 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
482
- waitingApproval: "\u0938\u094D\u0935\u0940\u0915\u0943\u0924\u093F \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
483
- expiresIn: "{time} \u092E\u0947\u0902 \u0938\u092E\u093E\u092A\u094D\u0924",
484
- secured: "ZOREAL \u0926\u094D\u0935\u093E\u0930\u093E Proof-of-Human \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
485
- noIdTitle: "\u0905\u092D\u0940 \u0924\u0915 ZOREAL ID \u0928\u0939\u0940\u0902 \u0939\u0948?",
486
- noIdBody: "\u0910\u092A \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u0914\u0930 \u092E\u0941\u092B\u094D\u0924 \u092E\u0947\u0902 \u090F\u0915 \u092C\u0928\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0935\u0939\u0940 \u0915\u094B\u0921 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964 \u0907\u0938\u092E\u0947\u0902 \u092C\u0938 \u090F\u0915 \u092E\u093F\u0928\u091F \u0932\u0917\u0924\u093E \u0939\u0948\u0964",
487
- cancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
488
- close: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
489
- qrAlt: "ZOREAL \u0938\u0947 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F QR \u0915\u094B\u0921",
490
- buttonContinue: "ZOREAL \u0915\u0947 \u0938\u093E\u0925 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902"
491
- },
492
- zhs: {
493
- title: "\u626B\u7801\u767B\u5F55",
494
- titleIdentify: "\u626B\u7801\u9A8C\u8BC1\u8EAB\u4EFD",
495
- titlePresence: "\u626B\u7801\u8BC1\u660E\u60A8\u662F\u771F\u4EBA",
496
- titleApprove: "\u5728\u624B\u673A\u4E0A\u6279\u51C6",
497
- bodyScan: "\u4F7F\u7528\u624B\u673A\u76F8\u673A\u6216 ZOREAL ID \u5E94\u7528\u626B\u63CF\u3002",
498
- bodyApprove: "\u8BF7\u5728 ZOREAL ID \u5E94\u7528\u4E2D\u6279\u51C6\u767B\u5F55\u3002",
499
- bodyEnrolling: "\u8BF7\u5728\u624B\u673A\u4E0A\u5B8C\u6210 ZOREAL ID \u8BBE\u7F6E\uFF0C\u7136\u540E\u6279\u51C6\u767B\u5F55\u3002",
500
- waiting: "\u7B49\u5F85\u626B\u63CF",
501
- waitingApproval: "\u7B49\u5F85\u6279\u51C6",
502
- expiresIn: "{time} \u540E\u5931\u6548",
503
- secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A8C\u8BC1",
504
- noIdTitle: "\u8FD8\u6CA1\u6709 ZOREAL ID\uFF1F",
505
- noIdBody: "\u626B\u63CF\u540C\u4E00\u4E2A\u4E8C\u7EF4\u7801\u5373\u53EF\u4E0B\u8F7D\u5E94\u7528\u5E76\u514D\u8D39\u521B\u5EFA\uFF0C\u53EA\u9700\u4E00\u5206\u949F\u3002",
506
- cancel: "\u53D6\u6D88",
507
- close: "\u5173\u95ED",
508
- qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5F55\u7684\u4E8C\u7EF4\u7801",
509
- buttonContinue: "\u4F7F\u7528 ZOREAL \u7EE7\u7EED"
510
- },
511
- zht: {
512
- title: "\u6383\u78BC\u767B\u5165",
513
- titleIdentify: "\u6383\u78BC\u9A57\u8B49\u8EAB\u5206",
514
- titlePresence: "\u6383\u78BC\u8B49\u660E\u60A8\u662F\u771F\u4EBA",
515
- titleApprove: "\u5728\u624B\u6A5F\u4E0A\u6838\u51C6",
516
- bodyScan: "\u4F7F\u7528\u624B\u6A5F\u76F8\u6A5F\u6216 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u6383\u63CF\u3002",
517
- bodyApprove: "\u8ACB\u5728 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u4E2D\u6838\u51C6\u767B\u5165\u3002",
518
- bodyEnrolling: "\u8ACB\u5728\u624B\u6A5F\u4E0A\u5B8C\u6210 ZOREAL ID \u8A2D\u5B9A\uFF0C\u7136\u5F8C\u6838\u51C6\u767B\u5165\u3002",
519
- waiting: "\u7B49\u5F85\u6383\u63CF",
520
- waitingApproval: "\u7B49\u5F85\u6838\u51C6",
521
- expiresIn: "{time} \u5F8C\u5931\u6548",
522
- secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A57\u8B49",
523
- noIdTitle: "\u9084\u6C92\u6709 ZOREAL ID\uFF1F",
524
- noIdBody: "\u6383\u63CF\u540C\u4E00\u500B QR code \u5373\u53EF\u4E0B\u8F09\u61C9\u7528\u7A0B\u5F0F\u4E26\u514D\u8CBB\u5EFA\u7ACB\uFF0C\u53EA\u9700\u4E00\u5206\u9418\u3002",
525
- cancel: "\u53D6\u6D88",
526
- close: "\u95DC\u9589",
527
- qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5165\u7684 QR code",
528
- buttonContinue: "\u4F7F\u7528 ZOREAL \u7E7C\u7E8C"
529
- },
530
- ar: {
531
- title: "\u0627\u0645\u0633\u062D \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644",
532
- titleIdentify: "\u0627\u0645\u0633\u062D \u0644\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0647\u0648\u064A\u062A\u0643",
533
- titlePresence: "\u0627\u0645\u0633\u062D \u0644\u0625\u062B\u0628\u0627\u062A \u0623\u0646\u0643 \u0625\u0646\u0633\u0627\u0646 \u062D\u0642\u064A\u0642\u064A",
534
- titleApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643",
535
- bodyScan: "\u0627\u0645\u0633\u062D \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0643\u0627\u0645\u064A\u0631\u0627 \u0647\u0627\u062A\u0641\u0643 \u0623\u0648 \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
536
- bodyApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0641\u064A \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
537
- bodyEnrolling: "\u0623\u0643\u0645\u0644 \u0625\u0639\u062F\u0627\u062F ZOREAL ID \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643\u060C \u062B\u0645 \u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644.",
538
- waiting: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0633\u062D",
539
- waitingApproval: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629",
540
- expiresIn: "\u062A\u0646\u062A\u0647\u064A \u0627\u0644\u0635\u0644\u0627\u062D\u064A\u0629 \u062E\u0644\u0627\u0644 {time}",
541
- secured: "\u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 Proof-of-Human \u0628\u0648\u0627\u0633\u0637\u0629 ZOREAL",
542
- noIdTitle: "\u0644\u064A\u0633 \u0644\u062F\u064A\u0643 ZOREAL ID \u0628\u0639\u062F\u061F",
543
- noIdBody: "\u0627\u0645\u0633\u062D \u0627\u0644\u0631\u0645\u0632 \u0646\u0641\u0633\u0647 \u0644\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u0648\u0625\u0646\u0634\u0627\u0621 \u062D\u0633\u0627\u0628 \u0645\u062C\u0627\u0646\u064A. \u064A\u0633\u062A\u063A\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u0641\u0642\u0637.",
544
- cancel: "\u0625\u0644\u063A\u0627\u0621",
545
- close: "\u0625\u063A\u0644\u0627\u0642",
546
- qrAlt: "\u0631\u0645\u0632 QR \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL",
547
- buttonContinue: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL"
548
- },
549
- ko: {
550
- title: "\uC2A4\uCE94\uD558\uC5EC \uB85C\uADF8\uC778",
551
- titleIdentify: "\uC2A4\uCE94\uD558\uC5EC \uC2E0\uC6D0 \uD655\uC778",
552
- titlePresence: "\uC2A4\uCE94\uD558\uC5EC \uC2E4\uC81C \uC0AC\uB78C\uC784\uC744 \uC99D\uBA85",
553
- titleApprove: "\uD734\uB300\uD3F0\uC5D0\uC11C \uC2B9\uC778",
554
- bodyScan: "\uD734\uB300\uD3F0 \uCE74\uBA54\uB77C \uB610\uB294 ZOREAL ID \uC571\uC73C\uB85C \uC2A4\uCE94\uD558\uC138\uC694.",
555
- bodyApprove: "ZOREAL ID \uC571\uC5D0\uC11C \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
556
- bodyEnrolling: "\uD734\uB300\uD3F0\uC5D0\uC11C ZOREAL ID \uC124\uC815\uC744 \uC644\uB8CC\uD55C \uD6C4 \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
557
- waiting: "\uC2A4\uCE94 \uB300\uAE30 \uC911",
558
- waitingApproval: "\uC2B9\uC778 \uB300\uAE30 \uC911",
559
- expiresIn: "{time} \uD6C4 \uB9CC\uB8CC",
560
- secured: "ZOREAL\uC758 Proof-of-Human \uC778\uC99D",
561
- noIdTitle: "\uC544\uC9C1 ZOREAL ID\uAC00 \uC5C6\uC73C\uC2E0\uAC00\uC694?",
562
- noIdBody: "\uAC19\uC740 \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD574 \uC571\uC744 \uB0B4\uB824\uBC1B\uACE0 \uBB34\uB8CC\uB85C \uB9CC\uB4DC\uC138\uC694. 1\uBD84\uC774\uBA74 \uB429\uB2C8\uB2E4.",
563
- cancel: "\uCDE8\uC18C",
564
- close: "\uB2EB\uAE30",
565
- qrAlt: "ZOREAL\uB85C \uB85C\uADF8\uC778\uD558\uAE30 \uC704\uD55C QR \uCF54\uB4DC",
566
- buttonContinue: "ZOREAL\uB85C \uACC4\uC18D"
567
- },
568
- // Български
569
- bg: {
570
- title: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0437\u0430 \u0432\u0445\u043E\u0434",
571
- titleIdentify: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0438\u0442\u0435 \u0441\u0430\u043C\u043E\u043B\u0438\u0447\u043D\u043E\u0441\u0442\u0442\u0430 \u0441\u0438",
572
- titlePresence: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u0441\u0442\u0438\u043D\u0441\u043A\u0438 \u0447\u043E\u0432\u0435\u043A",
573
- titleApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438",
574
- bodyScan: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441 \u043A\u0430\u043C\u0435\u0440\u0430\u0442\u0430 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0441 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
575
- bodyApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
576
- bodyEnrolling: "\u0414\u043E\u0432\u044A\u0440\u0448\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0442\u0430 \u043D\u0430 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438, \u0441\u043B\u0435\u0434 \u043A\u043E\u0435\u0442\u043E \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430.",
577
- waiting: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u0441\u043A\u0430\u043D\u0438\u0440\u0430\u043D\u0435",
578
- waitingApproval: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0436\u0434\u0435\u043D\u0438\u0435",
579
- expiresIn: "\u0418\u0437\u0442\u0438\u0447\u0430 \u0441\u043B\u0435\u0434 {time}",
580
- secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
581
- noIdTitle: "\u0412\u0441\u0435 \u043E\u0449\u0435 \u043D\u044F\u043C\u0430\u0442\u0435 ZOREAL ID?",
582
- noIdBody: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441\u044A\u0449\u0438\u044F \u043A\u043E\u0434, \u0437\u0430 \u0434\u0430 \u0438\u0437\u0442\u0435\u0433\u043B\u0438\u0442\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E \u0438 \u0434\u0430 \u0441\u0438 \u0441\u044A\u0437\u0434\u0430\u0434\u0435\u0442\u0435 \u0431\u0435\u0437\u043F\u043B\u0430\u0442\u0435\u043D \u0430\u043A\u0430\u0443\u043D\u0442. \u041E\u0442\u043D\u0435\u043C\u0430 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442\u0430.",
583
- cancel: "\u041E\u0442\u043A\u0430\u0437",
584
- close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
585
- qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u0432\u0445\u043E\u0434 \u0441\u044A\u0441 ZOREAL",
586
- buttonContinue: "\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0438 \u0441\u044A\u0441 ZOREAL"
587
- },
588
- // বাংলা
589
- bn: {
590
- title: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
591
- titleIdentify: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09B0\u09BF\u099A\u09AF\u09BC \u09AF\u09BE\u099A\u09BE\u0987 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
592
- titlePresence: "\u0986\u09AA\u09A8\u09BF \u098F\u0995\u099C\u09A8 \u09AA\u09CD\u09B0\u0995\u09C3\u09A4 \u09AE\u09BE\u09A8\u09C1\u09B7 \u09A4\u09BE \u09AA\u09CD\u09B0\u09AE\u09BE\u09A3 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
593
- titleApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8",
594
- bodyScan: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7\u09B0 \u0995\u09CD\u09AF\u09BE\u09AE\u09C7\u09B0\u09BE \u09AC\u09BE ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
595
- bodyApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA\u09C7 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
596
- bodyEnrolling: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 ZOREAL ID \u09B8\u09C7\u099F\u0986\u09AA \u09B8\u09AE\u09CD\u09AA\u09C2\u09B0\u09CD\u09A3 \u0995\u09B0\u09C1\u09A8, \u09A4\u09BE\u09B0\u09AA\u09B0 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
597
- waiting: "\u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
598
- waitingApproval: "\u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
599
- expiresIn: "{time} \u09AA\u09B0\u09C7 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C7\u09B7 \u09B9\u09AC\u09C7",
600
- secured: "ZOREAL \u09A6\u09CD\u09AC\u09BE\u09B0\u09BE Proof-of-Human \u09AF\u09BE\u099A\u09BE\u0987\u0995\u09B0\u09A3",
601
- noIdTitle: "\u098F\u0996\u09A8\u09CB ZOREAL ID \u09A8\u09C7\u0987?",
602
- noIdBody: "\u0985\u09CD\u09AF\u09BE\u09AA \u09A1\u09BE\u0989\u09A8\u09B2\u09CB\u09A1 \u0995\u09B0\u09C7 \u09AC\u09BF\u09A8\u09BE\u09AE\u09C2\u09B2\u09CD\u09AF\u09C7 \u098F\u0995\u099F\u09BF \u09A4\u09C8\u09B0\u09BF \u0995\u09B0\u09A4\u09C7 \u098F\u0995\u0987 \u0995\u09CB\u09A1 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964 \u098F\u09A4\u09C7 \u09AE\u09BE\u09A4\u09CD\u09B0 \u098F\u0995 \u09AE\u09BF\u09A8\u09BF\u099F \u09B8\u09AE\u09AF\u09BC \u09B2\u09BE\u0997\u09C7\u0964",
603
- cancel: "\u09AC\u09BE\u09A4\u09BF\u09B2",
604
- close: "\u09AC\u09A8\u09CD\u09A7",
605
- qrAlt: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09BE\u09B0 \u099C\u09A8\u09CD\u09AF QR \u0995\u09CB\u09A1",
606
- buttonContinue: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u099A\u09BE\u09B2\u09BF\u09AF\u09BC\u09C7 \u09AF\u09BE\u09A8"
607
- },
608
- // Bosanski
609
- bs: {
610
- title: "Skenirajte za prijavu",
611
- titleIdentify: "Skenirajte da potvrdite svoj identitet",
612
- titlePresence: "Skenirajte da doka\u017Eete da ste stvarna osoba",
613
- titleApprove: "Odobrite na svom telefonu",
614
- bodyScan: "Skenirajte kamerom svog telefona ili aplikacijom ZOREAL ID.",
615
- bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
616
- bodyEnrolling: "Zavr\u0161ite pode\u0161avanje ZOREAL ID-a na svom telefonu, a zatim odobrite prijavu.",
617
- waiting: "\u010Ceka se skeniranje",
618
- waitingApproval: "\u010Ceka se odobrenje",
619
- expiresIn: "Isti\u010De za {time}",
620
- secured: "ZOREAL Proof-of-Human verifikacija",
621
- noIdTitle: "Nemate ZOREAL ID?",
622
- noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga napravite. Traje samo minutu.",
623
- cancel: "Otka\u017Ei",
624
- close: "Zatvori",
625
- qrAlt: "QR kod za prijavu putem ZOREAL-a",
626
- buttonContinue: "Nastavi sa ZOREAL-om"
627
- },
628
- // Čeština
629
- cs: {
630
- title: "P\u0159ihlaste se naskenov\xE1n\xEDm",
631
- titleIdentify: "Naskenujte pro ov\u011B\u0159en\xED toto\u017Enosti",
632
- titlePresence: "Naskenujte a proka\u017Ete, \u017Ee jste skute\u010Dn\xFD \u010Dlov\u011Bk",
633
- titleApprove: "Potvr\u010Fte v telefonu",
634
- bodyScan: "Naskenujte fotoapar\xE1tem telefonu nebo aplikac\xED ZOREAL ID.",
635
- bodyApprove: "Potvr\u010Fte p\u0159ihl\xE1\u0161en\xED v aplikaci ZOREAL ID.",
636
- bodyEnrolling: "Dokon\u010Dete nastaven\xED ZOREAL ID v telefonu a pot\xE9 potvr\u010Fte p\u0159ihl\xE1\u0161en\xED.",
637
- waiting: "\u010Cek\xE1n\xED na naskenov\xE1n\xED",
638
- waitingApproval: "\u010Cek\xE1n\xED na potvrzen\xED",
639
- expiresIn: "Vypr\u0161\xED za {time}",
640
- secured: "Ov\u011B\u0159en\xED Proof-of-Human od ZOREAL",
641
- noIdTitle: "Je\u0161t\u011B nem\xE1te ZOREAL ID?",
642
- noIdBody: "Naskenov\xE1n\xEDm stejn\xE9ho k\xF3du si st\xE1hnete aplikaci a zdarma vytvo\u0159\xEDte ZOREAL ID. Zabere to jen minutu.",
643
- cancel: "Zru\u0161it",
644
- close: "Zav\u0159\xEDt",
645
- qrAlt: "QR k\xF3d pro p\u0159ihl\xE1\u0161en\xED pomoc\xED ZOREAL",
646
- buttonContinue: "Pokra\u010Dovat se ZOREAL"
647
- },
648
- // Dansk
649
- da: {
650
- title: "Scan for at logge ind",
651
- titleIdentify: "Scan for at bekr\xE6fte din identitet",
652
- titlePresence: "Scan for at bevise, at du er et rigtigt menneske",
653
- titleApprove: "Godkend p\xE5 din telefon",
654
- bodyScan: "Scan med telefonens kamera eller ZOREAL ID-appen.",
655
- bodyApprove: "Godkend login i din ZOREAL ID-app.",
656
- bodyEnrolling: "F\xE6rdigg\xF8r ops\xE6tningen af ZOREAL ID p\xE5 din telefon, og godkend derefter login.",
657
- waiting: "Venter p\xE5 scanning",
658
- waitingApproval: "Venter p\xE5 godkendelse",
659
- expiresIn: "Udl\xF8ber om {time}",
660
- secured: "Proof-of-Human-verificering af ZOREAL",
661
- noIdTitle: "Har du ikke et ZOREAL ID endnu?",
662
- noIdBody: "Scan den samme kode for at hente appen og oprette et gratis. Det tager kun et minut.",
663
- cancel: "Annuller",
664
- close: "Luk",
665
- qrAlt: "QR-kode til at logge ind med ZOREAL",
666
- buttonContinue: "Forts\xE6t med ZOREAL"
667
- },
668
- // Ελληνικά
669
- el: {
670
- title: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7",
671
- titleIdentify: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 \u03C4\u03B1\u03C5\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2",
672
- titlePresence: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B4\u03B5\u03AF\u03BE\u03B5\u03C4\u03B5 \u03CC\u03C4\u03B9 \u03B5\u03AF\u03C3\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC\u03C2 \u03AC\u03BD\u03B8\u03C1\u03C9\u03C0\u03BF\u03C2",
673
- titleApprove: "\u0388\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2",
674
- bodyScan: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03BA\u03AC\u03BC\u03B5\u03C1\u03B1 \u03C4\u03BF\u03C5 \u03BA\u03B9\u03BD\u03B7\u03C4\u03BF\u03CD \u03C3\u03B1\u03C2 \u03AE \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
675
- bodyApprove: "\u0395\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
676
- bodyEnrolling: "\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03C4\u03BF\u03C5 ZOREAL ID \u03C3\u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03C0\u03B5\u03B9\u03C4\u03B1 \u03B5\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7.",
677
- waiting: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03C3\u03AC\u03C1\u03C9\u03C3\u03B7\u03C2",
678
- waitingApproval: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03AD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7\u03C2",
679
- expiresIn: "\u039B\u03AE\u03B3\u03B5\u03B9 \u03C3\u03B5 {time}",
680
- secured: "\u0395\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 Proof-of-Human \u03B1\u03C0\u03CC \u03C4\u03B7 ZOREAL",
681
- noIdTitle: "\u0394\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BA\u03CC\u03BC\u03B1 ZOREAL ID;",
682
- noIdBody: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03B1\u03C4\u03B5\u03B2\u03AC\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03B1\u03B9 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B4\u03C9\u03C1\u03B5\u03AC\u03BD. \u03A7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC.",
683
- cancel: "\u0386\u03BA\u03C5\u03C1\u03BF",
684
- close: "\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF",
685
- qrAlt: "\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 QR \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BC\u03B5 ZOREAL",
686
- buttonContinue: "\u03A3\u03C5\u03BD\u03AD\u03C7\u03B5\u03B9\u03B1 \u03BC\u03B5 ZOREAL"
687
- },
688
- // Español (LA)
689
- "es-419": {
690
- title: "Escanea para iniciar sesi\xF3n",
691
- titleIdentify: "Escanea para verificar tu identidad",
692
- titlePresence: "Escanea para demostrar que eres una persona real",
693
- titleApprove: "Aprueba desde tu celular",
694
- bodyScan: "Escanea con la c\xE1mara de tu celular o con la app ZOREAL ID.",
695
- bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
696
- bodyEnrolling: "Termina de configurar ZOREAL ID en tu celular y luego aprueba el inicio de sesi\xF3n.",
697
- waiting: "Esperando escaneo",
698
- waitingApproval: "Esperando aprobaci\xF3n",
699
- expiresIn: "Expira en {time}",
700
- secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
701
- noIdTitle: "\xBFTodav\xEDa no tienes ZOREAL ID?",
702
- noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear uno gratis. Solo toma un minuto.",
703
- cancel: "Cancelar",
704
- close: "Cerrar",
705
- qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
706
- buttonContinue: "Continuar con ZOREAL"
707
- },
708
- // Suomi
709
- fi: {
710
- title: "Kirjaudu sis\xE4\xE4n skannaamalla",
711
- titleIdentify: "Vahvista henkil\xF6llisyytesi skannaamalla",
712
- titlePresence: "Todista skannaamalla, ett\xE4 olet oikea ihminen",
713
- titleApprove: "Hyv\xE4ksy puhelimessasi",
714
- bodyScan: "Skannaa puhelimesi kameralla tai ZOREAL ID -sovelluksella.",
715
- bodyApprove: "Hyv\xE4ksy kirjautuminen ZOREAL ID -sovelluksessasi.",
716
- bodyEnrolling: "Viimeistele ZOREAL ID -sovelluksen k\xE4ytt\xF6\xF6notto puhelimellasi ja hyv\xE4ksy sitten kirjautuminen.",
717
- waiting: "Odotetaan skannausta",
718
- waitingApproval: "Odotetaan hyv\xE4ksynt\xE4\xE4",
719
- expiresIn: "Vanhenee {time} kuluttua",
720
- secured: "ZOREALin Proof-of-Human-vahvistus",
721
- noIdTitle: "Eik\xF6 sinulla ole viel\xE4 ZOREAL ID:t\xE4?",
722
- noIdBody: "Skannaa sama koodi ladataksesi sovelluksen ja luodaksesi tunnuksen ilmaiseksi. Se vie vain minuutin.",
723
- cancel: "Peruuta",
724
- close: "Sulje",
725
- qrAlt: "QR-koodi ZOREAL-kirjautumista varten",
726
- buttonContinue: "Jatka ZOREALilla"
727
- },
728
- // עברית
729
- he: {
730
- title: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8",
731
- titleIdentify: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D0\u05DE\u05EA \u05D0\u05EA \u05D6\u05D4\u05D5\u05EA\u05DA",
732
- titlePresence: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05DB\u05D9\u05D7 \u05E9\u05D0\u05EA\u05D4 \u05D0\u05D3\u05DD \u05D0\u05DE\u05D9\u05EA\u05D9",
733
- titleApprove: "\u05D0\u05E9\u05E8 \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA",
734
- bodyScan: "\u05E1\u05E8\u05D5\u05E7 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05DE\u05E6\u05DC\u05DE\u05EA \u05D4\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA \u05D0\u05D5 \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID.",
735
- bodyApprove: "\u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID \u05E9\u05DC\u05DA.",
736
- bodyEnrolling: "\u05E1\u05D9\u05D9\u05DD \u05DC\u05D4\u05D2\u05D3\u05D9\u05E8 \u05D0\u05EA ZOREAL ID \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA, \u05D5\u05D0\u05D6 \u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA.",
737
- waiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E1\u05E8\u05D9\u05E7\u05D4",
738
- waitingApproval: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8",
739
- expiresIn: "\u05D9\u05E4\u05D5\u05D2 \u05D1\u05E2\u05D5\u05D3 {time}",
740
- secured: "\u05D0\u05D9\u05DE\u05D5\u05EA Proof-of-Human \u05DE\u05D1\u05D9\u05EA ZOREAL",
741
- noIdTitle: "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05DC\u05DA ZOREAL ID?",
742
- noIdBody: "\u05E1\u05E8\u05D5\u05E7 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D5 \u05D4\u05E7\u05D5\u05D3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D5\u05DC\u05D9\u05E6\u05D5\u05E8 \u05D0\u05D7\u05D3 \u05D1\u05D7\u05D9\u05E0\u05DD. \u05D6\u05D4 \u05DC\u05D5\u05E7\u05D7 \u05E8\u05E7 \u05D3\u05E7\u05D4.",
743
- cancel: "\u05D1\u05D9\u05D8\u05D5\u05DC",
744
- close: "\u05E1\u05D2\u05D5\u05E8",
745
- qrAlt: "\u05E7\u05D5\u05D3 QR \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E2\u05DD ZOREAL",
746
- buttonContinue: "\u05D4\u05DE\u05E9\u05DA \u05E2\u05DD ZOREAL"
747
- },
748
- // Hrvatski
749
- hr: {
750
- title: "Skenirajte za prijavu",
751
- titleIdentify: "Skenirajte za potvrdu identiteta",
752
- titlePresence: "Skenirajte kako biste dokazali da ste stvarna osoba",
753
- titleApprove: "Odobrite na svom mobitelu",
754
- bodyScan: "Skenirajte kamerom svog mobitela ili aplikacijom ZOREAL ID.",
755
- bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
756
- bodyEnrolling: "Dovr\u0161ite postavljanje ZOREAL ID-a na svom mobitelu, a zatim odobrite prijavu.",
757
- waiting: "\u010Ceka se skeniranje",
758
- waitingApproval: "\u010Ceka se odobrenje",
759
- expiresIn: "Isti\u010De za {time}",
760
- secured: "ZOREAL Proof-of-Human provjera",
761
- noIdTitle: "Nemate ZOREAL ID?",
762
- noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga izradite. Traje samo minutu.",
763
- cancel: "Odustani",
764
- close: "Zatvori",
765
- qrAlt: "QR kod za prijavu putem ZOREAL-a",
766
- buttonContinue: "Nastavi sa ZOREAL-om"
767
- },
768
- // Magyar
769
- hu: {
770
- title: "Bejelentkez\xE9s beolvas\xE1ssal",
771
- titleIdentify: "Olvassa be a szem\xE9lyazonoss\xE1ga igazol\xE1s\xE1hoz",
772
- titlePresence: "Olvassa be annak igazol\xE1s\xE1hoz, hogy val\xF3di ember",
773
- titleApprove: "J\xF3v\xE1hagy\xE1s a telefonj\xE1n",
774
- bodyScan: "Olvassa be a telefonja kamer\xE1j\xE1val, vagy a ZOREAL ID alkalmaz\xE1ssal.",
775
- bodyApprove: "Hagyja j\xF3v\xE1 a bejelentkez\xE9st a ZOREAL ID alkalmaz\xE1sban.",
776
- bodyEnrolling: "Fejezze be a ZOREAL ID be\xE1ll\xEDt\xE1s\xE1t a telefonj\xE1n, majd hagyja j\xF3v\xE1 a bejelentkez\xE9st.",
777
- waiting: "V\xE1rakoz\xE1s beolvas\xE1sra",
778
- waitingApproval: "V\xE1rakoz\xE1s j\xF3v\xE1hagy\xE1sra",
779
- expiresIn: "Lej\xE1r {time} m\xFAlva",
780
- secured: "Proof-of-Human hiteles\xEDt\xE9s a ZOREAL-t\xF3l",
781
- noIdTitle: "M\xE9g nincs ZOREAL ID-je?",
782
- noIdBody: "Olvassa be ugyanazt a k\xF3dot az alkalmaz\xE1s let\xF6lt\xE9s\xE9hez, \xE9s hozzon l\xE9tre egyet ingyenesen. Mind\xF6ssze egy percet vesz ig\xE9nybe.",
783
- cancel: "M\xE9gse",
784
- close: "Bez\xE1r\xE1s",
785
- qrAlt: "QR-k\xF3d a ZOREAL-lal val\xF3 bejelentkez\xE9shez",
786
- buttonContinue: "Folytat\xE1s a ZOREAL-lal"
787
- },
788
- // Bahasa Indonesia
789
- id: {
790
- title: "Pindai untuk masuk",
791
- titleIdentify: "Pindai untuk memverifikasi identitas Anda",
792
- titlePresence: "Pindai untuk membuktikan bahwa Anda manusia sungguhan",
793
- titleApprove: "Setujui di ponsel Anda",
794
- bodyScan: "Pindai dengan kamera ponsel atau aplikasi ZOREAL ID.",
795
- bodyApprove: "Setujui proses masuk di aplikasi ZOREAL ID Anda.",
796
- bodyEnrolling: "Selesaikan pengaturan ZOREAL ID di ponsel Anda, lalu setujui proses masuk.",
797
- waiting: "Menunggu pemindaian",
798
- waitingApproval: "Menunggu persetujuan",
799
- expiresIn: "Berakhir dalam {time}",
800
- secured: "Verifikasi Proof-of-Human oleh ZOREAL",
801
- noIdTitle: "Belum punya ZOREAL ID?",
802
- noIdBody: "Pindai kode yang sama untuk mengunduh aplikasi dan membuat akun secara gratis. Hanya butuh waktu satu menit.",
803
- cancel: "Batal",
804
- close: "Tutup",
805
- qrAlt: "Kode QR untuk masuk dengan ZOREAL",
806
- buttonContinue: "Lanjutkan dengan ZOREAL"
807
- },
808
- // Italiano
809
- it: {
810
- title: "Scansiona per accedere",
811
- titleIdentify: "Scansiona per verificare la tua identit\xE0",
812
- titlePresence: "Scansiona per dimostrare di essere una persona reale",
813
- titleApprove: "Approva sul tuo telefono",
814
- bodyScan: "Scansiona con la fotocamera del telefono o con l'app ZOREAL ID.",
815
- bodyApprove: "Approva l'accesso nell'app ZOREAL ID.",
816
- bodyEnrolling: "Completa la configurazione di ZOREAL ID sul telefono, poi approva l'accesso.",
817
- waiting: "In attesa della scansione",
818
- waitingApproval: "In attesa di approvazione",
819
- expiresIn: "Scade tra {time}",
820
- secured: "Verifica Proof-of-Human di ZOREAL",
821
- noIdTitle: "Non hai ancora uno ZOREAL ID?",
822
- noIdBody: "Scansiona lo stesso codice per scaricare l'app e crearne uno gratis. Basta un minuto.",
823
- cancel: "Annulla",
824
- close: "Chiudi",
825
- qrAlt: "Codice QR per accedere con ZOREAL",
826
- buttonContinue: "Continua con ZOREAL"
827
- },
828
- // Bahasa Melayu
829
- ms: {
830
- title: "Imbas untuk log masuk",
831
- titleIdentify: "Imbas untuk mengesahkan identiti anda",
832
- titlePresence: "Imbas untuk membuktikan anda manusia sebenar",
833
- titleApprove: "Luluskan di telefon anda",
834
- bodyScan: "Imbas dengan kamera telefon atau aplikasi ZOREAL ID.",
835
- bodyApprove: "Luluskan log masuk dalam aplikasi ZOREAL ID anda.",
836
- bodyEnrolling: "Selesaikan persediaan ZOREAL ID di telefon anda, kemudian luluskan log masuk.",
837
- waiting: "Menunggu imbasan",
838
- waitingApproval: "Menunggu kelulusan",
839
- expiresIn: "Tamat tempoh dalam {time}",
840
- secured: "Pengesahan Proof-of-Human oleh ZOREAL",
841
- noIdTitle: "Belum ada ZOREAL ID?",
842
- noIdBody: "Imbas kod yang sama untuk memuat turun aplikasi dan cipta satu secara percuma. Hanya mengambil masa seminit.",
843
- cancel: "Batal",
844
- close: "Tutup",
845
- qrAlt: "Kod QR untuk log masuk dengan ZOREAL",
846
- buttonContinue: "Teruskan dengan ZOREAL"
847
- },
848
- // Nederlands
849
- nl: {
850
- title: "Scan om in te loggen",
851
- titleIdentify: "Scan om je identiteit te verifi\xEBren",
852
- titlePresence: "Scan om te bewijzen dat je een echt mens bent",
853
- titleApprove: "Keur goed op je telefoon",
854
- bodyScan: "Scan met de camera van je telefoon of de ZOREAL ID-app.",
855
- bodyApprove: "Keur de aanmelding goed in je ZOREAL ID-app.",
856
- bodyEnrolling: "Rond het instellen van ZOREAL ID op je telefoon af en keur daarna de aanmelding goed.",
857
- waiting: "Wachten op scan",
858
- waitingApproval: "Wachten op goedkeuring",
859
- expiresIn: "Verloopt over {time}",
860
- secured: "Proof-of-Human-verificatie door ZOREAL",
861
- noIdTitle: "Nog geen ZOREAL ID?",
862
- noIdBody: "Scan dezelfde code om de app te downloaden en gratis een account aan te maken. Dit duurt maar een minuut.",
863
- cancel: "Annuleren",
864
- close: "Sluiten",
865
- qrAlt: "QR-code om in te loggen met ZOREAL",
866
- buttonContinue: "Doorgaan met ZOREAL"
867
- },
868
- // Norsk
869
- no: {
870
- title: "Skann for \xE5 logge inn",
871
- titleIdentify: "Skann for \xE5 bekrefte identiteten din",
872
- titlePresence: "Skann for \xE5 bevise at du er et ekte menneske",
873
- titleApprove: "Godkjenn p\xE5 telefonen din",
874
- bodyScan: "Skann med telefonens kamera eller ZOREAL ID-appen.",
875
- bodyApprove: "Godkjenn innloggingen i ZOREAL ID-appen din.",
876
- bodyEnrolling: "Fullf\xF8r oppsettet av ZOREAL ID p\xE5 telefonen din, og godkjenn deretter innloggingen.",
877
- waiting: "Venter p\xE5 skanning",
878
- waitingApproval: "Venter p\xE5 godkjenning",
879
- expiresIn: "Utl\xF8per om {time}",
880
- secured: "Proof-of-Human-verifisering av ZOREAL",
881
- noIdTitle: "Har du ikke ZOREAL ID enn\xE5?",
882
- noIdBody: "Skann den samme koden for \xE5 laste ned appen og opprette en gratis. Det tar bare et minutt.",
883
- cancel: "Avbryt",
884
- close: "Lukk",
885
- qrAlt: "QR-kode for \xE5 logge inn med ZOREAL",
886
- buttonContinue: "Fortsett med ZOREAL"
887
- },
888
- // Polski
889
- pl: {
890
- title: "Zeskanuj, aby si\u0119 zalogowa\u0107",
891
- titleIdentify: "Zeskanuj, aby zweryfikowa\u0107 swoj\u0105 to\u017Csamo\u015B\u0107",
892
- titlePresence: "Zeskanuj, aby udowodni\u0107, \u017Ce jeste\u015B prawdziwym cz\u0142owiekiem",
893
- titleApprove: "Zatwierd\u017A w telefonie",
894
- bodyScan: "Zeskanuj aparatem telefonu lub aplikacj\u0105 ZOREAL ID.",
895
- bodyApprove: "Zatwierd\u017A logowanie w aplikacji ZOREAL ID.",
896
- bodyEnrolling: "Doko\u0144cz konfiguracj\u0119 ZOREAL ID w telefonie, a nast\u0119pnie zatwierd\u017A logowanie.",
897
- waiting: "Czekanie na skan",
898
- waitingApproval: "Czekanie na zatwierdzenie",
899
- expiresIn: "Wygasa za {time}",
900
- secured: "Weryfikacja Proof-of-Human od ZOREAL",
901
- noIdTitle: "Nie masz jeszcze ZOREAL ID?",
902
- noIdBody: "Zeskanuj ten sam kod, aby pobra\u0107 aplikacj\u0119 i bezp\u0142atnie utworzy\u0107 ZOREAL ID. Zajmie to tylko minut\u0119.",
903
- cancel: "Anuluj",
904
- close: "Zamknij",
905
- qrAlt: "Kod QR do logowania za pomoc\u0105 ZOREAL",
906
- buttonContinue: "Kontynuuj z ZOREAL"
907
- },
908
- // Português (BR)
909
- "pt-br": {
910
- title: "Escaneie para entrar",
911
- titleIdentify: "Escaneie para verificar sua identidade",
912
- titlePresence: "Escaneie para provar que voc\xEA \xE9 uma pessoa real",
913
- titleApprove: "Aprove no seu celular",
914
- bodyScan: "Escaneie com a c\xE2mera do seu celular ou com o app ZOREAL ID.",
915
- bodyApprove: "Aprove o login no app ZOREAL ID.",
916
- bodyEnrolling: "Termine de configurar o ZOREAL ID no seu celular e depois aprove o login.",
917
- waiting: "Aguardando escaneamento",
918
- waitingApproval: "Aguardando aprova\xE7\xE3o",
919
- expiresIn: "Expira em {time}",
920
- secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
921
- noIdTitle: "Ainda n\xE3o tem um ZOREAL ID?",
922
- noIdBody: "Escaneie o mesmo c\xF3digo para baixar o app e criar um de gra\xE7a. Leva s\xF3 um minuto.",
923
- cancel: "Cancelar",
924
- close: "Fechar",
925
- qrAlt: "C\xF3digo QR para entrar com ZOREAL",
926
- buttonContinue: "Continuar com ZOREAL"
927
- },
928
- // Română
929
- ro: {
930
- title: "Scana\u021Bi pentru conectare",
931
- titleIdentify: "Scana\u021Bi pentru a v\u0103 verifica identitatea",
932
- titlePresence: "Scana\u021Bi pentru a dovedi c\u0103 sunte\u021Bi o persoan\u0103 real\u0103",
933
- titleApprove: "Aproba\u021Bi de pe telefon",
934
- bodyScan: "Scana\u021Bi cu camera telefonului sau cu aplica\u021Bia ZOREAL ID.",
935
- bodyApprove: "Aproba\u021Bi conectarea \xEEn aplica\u021Bia ZOREAL ID.",
936
- bodyEnrolling: "Finaliza\u021Bi configurarea ZOREAL ID pe telefon, apoi aproba\u021Bi conectarea.",
937
- waiting: "Se a\u0219teapt\u0103 scanarea",
938
- waitingApproval: "Se a\u0219teapt\u0103 aprobarea",
939
- expiresIn: "Expir\u0103 \xEEn {time}",
940
- secured: "Verificare Proof-of-Human de la ZOREAL",
941
- noIdTitle: "Nu ave\u021Bi \xEEnc\u0103 un ZOREAL ID?",
942
- noIdBody: "Scana\u021Bi acela\u0219i cod pentru a desc\u0103rca aplica\u021Bia \u0219i a crea unul gratuit. Dureaz\u0103 doar un minut.",
943
- cancel: "Anuleaz\u0103",
944
- close: "\xCEnchide",
945
- qrAlt: "Cod QR pentru conectare cu ZOREAL",
946
- buttonContinue: "Continua\u021Bi cu ZOREAL"
947
- },
948
- // Српски
949
- sr: {
950
- title: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443",
951
- titleIdentify: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u043F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u0441\u0432\u043E\u0458 \u0438\u0434\u0435\u043D\u0442\u0438\u0442\u0435\u0442",
952
- titlePresence: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043F\u0440\u0430\u0432\u0430 \u043E\u0441\u043E\u0431\u0430",
953
- titleApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443",
954
- bodyScan: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u043C \u0441\u0432\u043E\u0433 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u043E\u043C ZOREAL ID.",
955
- bodyApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u0443 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0438 ZOREAL ID.",
956
- bodyEnrolling: "\u0414\u043E\u0432\u0440\u0448\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 ZOREAL ID-\u0430 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443, \u043F\u0430 \u043E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443.",
957
- waiting: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u0441\u043A\u0435\u043D\u0438\u0440\u0430\u045A\u0435",
958
- waitingApproval: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u043E\u0434\u043E\u0431\u0440\u0435\u045A\u0435",
959
- expiresIn: "\u0418\u0441\u0442\u0438\u0447\u0435 \u0437\u0430 {time}",
960
- secured: "ZOREAL Proof-of-Human \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0430",
961
- noIdTitle: "\u041D\u0435\u043C\u0430\u0442\u0435 ZOREAL ID?",
962
- noIdBody: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0438\u0441\u0442\u0438 \u043A\u043E\u0434 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0438 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E \u0433\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435. \u0422\u0440\u0430\u0458\u0435 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442.",
963
- cancel: "\u041E\u0442\u043A\u0430\u0436\u0438",
964
- close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
965
- qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043F\u0440\u0435\u043A\u043E ZOREAL-\u0430",
966
- buttonContinue: "\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 ZOREAL-\u043E\u043C"
967
- },
968
- // ไทย
969
- th: {
970
- title: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
971
- titleIdentify: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
972
- titlePresence: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E1E\u0E34\u0E2A\u0E39\u0E08\u0E19\u0E4C\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E40\u0E1B\u0E47\u0E19\u0E21\u0E19\u0E38\u0E29\u0E22\u0E4C\u0E08\u0E23\u0E34\u0E07",
973
- titleApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
974
- bodyScan: "\u0E2A\u0E41\u0E01\u0E19\u0E14\u0E49\u0E27\u0E22\u0E01\u0E25\u0E49\u0E2D\u0E07\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E2B\u0E23\u0E37\u0E2D\u0E41\u0E2D\u0E1B ZOREAL ID",
975
- bodyApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E43\u0E19\u0E41\u0E2D\u0E1B ZOREAL ID \u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
976
- bodyEnrolling: "\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32 ZOREAL ID \u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E43\u0E2B\u0E49\u0E40\u0E2A\u0E23\u0E47\u0E08\u0E2A\u0E34\u0E49\u0E19 \u0E41\u0E25\u0E49\u0E27\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
977
- waiting: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2A\u0E41\u0E01\u0E19",
978
- waitingApproval: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34",
979
- expiresIn: "\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38\u0E43\u0E19 {time}",
980
- secured: "\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19 Proof-of-Human \u0E42\u0E14\u0E22 ZOREAL",
981
- noIdTitle: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35 ZOREAL ID \u0E43\u0E0A\u0E48\u0E44\u0E2B\u0E21",
982
- noIdBody: "\u0E2A\u0E41\u0E01\u0E19\u0E42\u0E04\u0E49\u0E14\u0E40\u0E14\u0E35\u0E22\u0E27\u0E01\u0E31\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E41\u0E2D\u0E1B\u0E41\u0E25\u0E30\u0E2A\u0E23\u0E49\u0E32\u0E07\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E1F\u0E23\u0E35 \u0E43\u0E0A\u0E49\u0E40\u0E27\u0E25\u0E32\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E19\u0E32\u0E17\u0E35\u0E40\u0E14\u0E35\u0E22\u0E27",
983
- cancel: "\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",
984
- close: "\u0E1B\u0E34\u0E14",
985
- qrAlt: "\u0E04\u0E34\u0E27\u0E2D\u0E32\u0E23\u0E4C\u0E42\u0E04\u0E49\u0E14\u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E14\u0E49\u0E27\u0E22 ZOREAL",
986
- buttonContinue: "\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E15\u0E48\u0E2D\u0E14\u0E49\u0E27\u0E22 ZOREAL"
987
- },
988
- // Tagalog
989
- tl: {
990
- title: "I-scan para mag-sign in",
991
- titleIdentify: "I-scan para i-verify ang iyong pagkakakilanlan",
992
- titlePresence: "I-scan para patunayang tunay kang tao",
993
- titleApprove: "I-approve sa iyong telepono",
994
- bodyScan: "I-scan gamit ang camera ng iyong telepono o ang ZOREAL ID app.",
995
- bodyApprove: "I-approve ang login sa iyong ZOREAL ID app.",
996
- bodyEnrolling: "Tapusin muna ang pag-set up ng ZOREAL ID sa iyong telepono, pagkatapos ay i-approve ang login.",
997
- waiting: "Naghihintay ng scan",
998
- waitingApproval: "Naghihintay ng approval",
999
- expiresIn: "Mag-e-expire sa {time}",
1000
- secured: "Proof-of-Human verification mula sa ZOREAL",
1001
- noIdTitle: "Wala ka pang ZOREAL ID?",
1002
- noIdBody: "I-scan ang parehong code para i-download ang app at gumawa ng iyong ZOREAL ID nang libre. Isang minuto lang ito.",
1003
- cancel: "Kanselahin",
1004
- close: "Isara",
1005
- qrAlt: "QR code para mag-sign in gamit ang ZOREAL",
1006
- buttonContinue: "Magpatuloy gamit ang ZOREAL"
1007
- },
1008
- // Türkçe
1009
- tr: {
1010
- title: "Giri\u015F i\xE7in taray\u0131n",
1011
- titleIdentify: "Kimli\u011Finizi do\u011Frulamak i\xE7in taray\u0131n",
1012
- titlePresence: "Ger\xE7ek bir insan oldu\u011Funuzu kan\u0131tlamak i\xE7in taray\u0131n",
1013
- titleApprove: "Telefonunuzdan onaylay\u0131n",
1014
- bodyScan: "Telefonunuzun kameras\u0131yla veya ZOREAL ID uygulamas\u0131yla taray\u0131n.",
1015
- bodyApprove: "Giri\u015Fi ZOREAL ID uygulaman\u0131zdan onaylay\u0131n.",
1016
- bodyEnrolling: "Telefonunuzda ZOREAL ID kurulumunu tamamlay\u0131n, ard\u0131ndan giri\u015Fi onaylay\u0131n.",
1017
- waiting: "Tarama bekleniyor",
1018
- waitingApproval: "Onay bekleniyor",
1019
- expiresIn: "{time} i\xE7inde sona erer",
1020
- secured: "ZOREAL taraf\u0131ndan Proof-of-Human do\u011Frulamas\u0131",
1021
- noIdTitle: "Hen\xFCz ZOREAL ID'niz yok mu?",
1022
- noIdBody: "Uygulamay\u0131 indirmek ve \xFCcretsiz bir tane olu\u015Fturmak i\xE7in ayn\u0131 kodu taray\u0131n. Sadece bir dakikan\u0131z\u0131 al\u0131r.",
1023
- cancel: "\u0130ptal",
1024
- close: "Kapat",
1025
- qrAlt: "ZOREAL ile giri\u015F yapmak i\xE7in QR kodu",
1026
- buttonContinue: "ZOREAL ile devam et"
1027
- },
1028
- // Українська
1029
- uk: {
1030
- title: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443",
1031
- titleIdentify: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438 \u043E\u0441\u043E\u0431\u0443",
1032
- titlePresence: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u0434\u043E\u0432\u0435\u0441\u0442\u0438, \u0449\u043E \u0432\u0438 \u0441\u043F\u0440\u0430\u0432\u0436\u043D\u044F \u043B\u044E\u0434\u0438\u043D\u0430",
1033
- titleApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456",
1034
- bodyScan: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u044E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443 \u0430\u0431\u043E \u0434\u043E\u0434\u0430\u0442\u043A\u043E\u043C ZOREAL ID.",
1035
- bodyApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434 \u0443 \u0434\u043E\u0434\u0430\u0442\u043A\u0443 ZOREAL ID.",
1036
- bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456, \u0430 \u043F\u043E\u0442\u0456\u043C \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434.",
1037
- waiting: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
1038
- waitingApproval: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F",
1039
- expiresIn: "\u0421\u043F\u043B\u0438\u0432\u0430\u0454 \u0447\u0435\u0440\u0435\u0437 {time}",
1040
- secured: "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 Proof-of-Human \u0432\u0456\u0434 ZOREAL",
1041
- noIdTitle: "\u0429\u0435 \u043D\u0435\u043C\u0430\u0454 ZOREAL ID?",
1042
- noIdBody: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0442\u043E\u0439 \u0441\u0430\u043C\u0438\u0439 \u043A\u043E\u0434, \u0449\u043E\u0431 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u0456 \u0431\u0435\u0437\u043A\u043E\u0448\u0442\u043E\u0432\u043D\u043E \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0439\u043E\u0433\u043E. \u0426\u0435 \u0437\u0430\u0439\u043C\u0435 \u043B\u0438\u0448\u0435 \u0445\u0432\u0438\u043B\u0438\u043D\u0443.",
1043
- cancel: "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
1044
- close: "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
1045
- qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
1046
- buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0437 ZOREAL"
1047
- },
1048
- // اردو
1049
- ur: {
1050
- title: "\u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1051
- titleIdentify: "\u0627\u067E\u0646\u06CC \u0634\u0646\u0627\u062E\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1052
- titlePresence: "\u06CC\u06C1 \u062B\u0627\u0628\u062A \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA \u06A9\u06C1 \u0622\u067E \u0627\u06CC\u06A9 \u062D\u0642\u06CC\u0642\u06CC \u0627\u0646\u0633\u0627\u0646 \u06C1\u06CC\u06BA",
1053
- titleApprove: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA",
1054
- bodyScan: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u06A9\u06D2 \u06A9\u06CC\u0645\u0631\u06D2 \u06CC\u0627 ZOREAL ID \u0627\u06CC\u067E \u0633\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4",
1055
- bodyApprove: "\u0627\u067E\u0646\u06CC ZOREAL ID \u0627\u06CC\u067E \u0645\u06CC\u06BA \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1056
- bodyEnrolling: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 ZOREAL ID \u06A9\u06CC \u0633\u06CC\u0679 \u0627\u067E \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u060C \u067E\u06BE\u0631 \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1057
- waiting: "\u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1058
- waitingApproval: "\u0645\u0646\u0638\u0648\u0631\u06CC \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1059
- expiresIn: "{time} \u0645\u06CC\u06BA \u062E\u062A\u0645 \u06C1\u0648\u06AF\u0627",
1060
- secured: "ZOREAL \u06A9\u06CC \u062C\u0627\u0646\u0628 \u0633\u06D2 Proof-of-Human \u062A\u0635\u062F\u06CC\u0642",
1061
- noIdTitle: "\u0627\u0628\u06BE\u06CC \u062A\u06A9 ZOREAL ID \u0646\u06C1\u06CC\u06BA \u06C1\u06D2\u061F",
1062
- noIdBody: "\u0627\u06CC\u067E \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u0631\u0646\u06D2 \u0627\u0648\u0631 \u0645\u0641\u062A \u0645\u06CC\u06BA \u0627\u06CC\u06A9 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0648\u06C1\u06CC \u06A9\u0648\u0688 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4 \u0627\u0633 \u0645\u06CC\u06BA \u0635\u0631\u0641 \u0627\u06CC\u06A9 \u0645\u0646\u0679 \u0644\u06AF\u062A\u0627 \u06C1\u06D2\u06D4",
1063
- cancel: "\u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA",
1064
- close: "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
1065
- qrAlt: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 QR \u06A9\u0648\u0688",
1066
- buttonContinue: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u06CC\u06BA"
1067
- },
1068
- // Tiếng Việt
1069
- vi: {
1070
- title: "Qu\xE9t \u0111\u1EC3 \u0111\u0103ng nh\u1EADp",
1071
- titleIdentify: "Qu\xE9t \u0111\u1EC3 x\xE1c minh danh t\xEDnh c\u1EE7a b\u1EA1n",
1072
- titlePresence: "Qu\xE9t \u0111\u1EC3 ch\u1EE9ng minh b\u1EA1n l\xE0 ng\u01B0\u1EDDi th\u1EADt",
1073
- titleApprove: "Ph\xEA duy\u1EC7t tr\xEAn \u0111i\u1EC7n tho\u1EA1i c\u1EE7a b\u1EA1n",
1074
- bodyScan: "Qu\xE9t b\u1EB1ng camera \u0111i\u1EC7n tho\u1EA1i ho\u1EB7c \u1EE9ng d\u1EE5ng ZOREAL ID.",
1075
- bodyApprove: "Ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp trong \u1EE9ng d\u1EE5ng ZOREAL ID c\u1EE7a b\u1EA1n.",
1076
- bodyEnrolling: "Ho\xE0n t\u1EA5t thi\u1EBFt l\u1EADp ZOREAL ID tr\xEAn \u0111i\u1EC7n tho\u1EA1i, sau \u0111\xF3 ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp.",
1077
- waiting: "\u0110ang ch\u1EDD qu\xE9t m\xE3",
1078
- waitingApproval: "\u0110ang ch\u1EDD ph\xEA duy\u1EC7t",
1079
- expiresIn: "H\u1EBFt h\u1EA1n sau {time}",
1080
- secured: "X\xE1c minh Proof-of-Human b\u1EDFi ZOREAL",
1081
- noIdTitle: "Ch\u01B0a c\xF3 ZOREAL ID?",
1082
- noIdBody: "Qu\xE9t c\xF9ng m\xE3 n\xE0y \u0111\u1EC3 t\u1EA3i \u1EE9ng d\u1EE5ng v\xE0 t\u1EA1o t\xE0i kho\u1EA3n mi\u1EC5n ph\xED. Ch\u1EC9 m\u1EA5t m\u1ED9t ph\xFAt.",
1083
- cancel: "H\u1EE7y",
1084
- close: "\u0110\xF3ng",
1085
- qrAlt: "M\xE3 QR \u0111\u1EC3 \u0111\u0103ng nh\u1EADp b\u1EB1ng ZOREAL",
1086
- buttonContinue: "Ti\u1EBFp t\u1EE5c v\u1EDBi ZOREAL"
1087
- }
1088
- };
1089
- var RTL = /* @__PURE__ */ new Set(["ar", "he", "iw", "ur"]);
1090
- var ALIASES = {
1091
- nb: "no",
1092
- // Bokmål — what we actually wrote
1093
- nn: "no",
1094
- // Nynorsk reader, served Bokmål: closer than English
1095
- fil: "tl",
1096
- // Filipino / Tagalog
1097
- iw: "he",
1098
- // superseded code for Hebrew, still emitted by some platforms
1099
- in: "id"
1100
- // superseded code for Indonesian
1101
- };
1102
- var LATAM = /* @__PURE__ */ new Set([
1103
- "ar",
1104
- "bo",
1105
- "cl",
1106
- "co",
1107
- "cr",
1108
- "cu",
1109
- "do",
1110
- "ec",
1111
- "gt",
1112
- "hn",
1113
- "mx",
1114
- "ni",
1115
- "pa",
1116
- "pe",
1117
- "pr",
1118
- "py",
1119
- "sv",
1120
- "uy",
1121
- "ve",
1122
- "419"
1123
- ]);
1124
- function lookup(locale) {
1125
- const tag = locale.toLowerCase().replace(/_/g, "-");
1126
- const parts = tag.split("-");
1127
- const primary = ALIASES[parts[0]] ?? parts[0];
1128
- const region = parts[1];
1129
- if (primary === "zh") {
1130
- const simplified = /(^|-)(hans|cn|sg|my)(-|$)/.test(tag);
1131
- return TRANSLATIONS[simplified ? "zhs" : "zht"];
1132
- }
1133
- if (primary === "es" && region && LATAM.has(region)) return TRANSLATIONS["es-419"];
1134
- if (primary === "pt" && region === "br") return TRANSLATIONS["pt-br"];
1135
- return TRANSLATIONS[tag] ?? TRANSLATIONS[primary];
1136
- }
1137
- function browserLocales() {
1138
- if (typeof navigator === "undefined") return [];
1139
- const nav = navigator;
1140
- if (nav.languages && nav.languages.length) return [...nav.languages];
1141
- return nav.language ? [nav.language] : [];
1142
- }
1143
- function strings(locale) {
1144
- if (locale) return lookup(locale) ?? en;
1145
- for (const candidate of browserLocales()) {
1146
- const hit = lookup(candidate);
1147
- if (hit) return hit;
1148
- }
1149
- return en;
1150
- }
1151
- function isRtl(locale) {
1152
- const tag = locale ?? browserLocales()[0];
1153
- if (!tag) return false;
1154
- return RTL.has(tag.toLowerCase().replace(/_/g, "-").split("-")[0]);
1155
- }
1156
- function interpolate(template, time) {
1157
- return template.replace("{time}", time);
1158
- }
1159
-
1160
- // src/styles.ts
1161
- var PREFIX2 = "zrl";
1162
- var cx = (name) => `${PREFIX2}-${name}`;
1163
- var STYLE_ELEMENT_ID = "zoreal-pairing-styles";
1164
- var LIGHT = `
1165
- --zrl-scrim: rgba(16, 18, 27, 0.45);
1166
- --zrl-surface: #ffffff;
1167
- --zrl-surface-sunken: #f6f7f9;
1168
- --zrl-ink: #16181c;
1169
- --zrl-ink-soft: #4a4f57;
1170
- --zrl-ink-mute: #6b7078;
1171
- --zrl-line: #e4e6ea;
1172
- --zrl-line-soft: #eef0f3;
1173
- --zrl-accent: #00b4d9;
1174
- --zrl-accent-soft: #dcf3fa;
1175
- --zrl-accent-ink: #04698a;
1176
- --zrl-urgent: #b4761a;
1177
- --zrl-qr-bg: #ffffff;
1178
- --zrl-qr-filter: none;
1179
- --zrl-qr-spent-filter: blur(3px);
1180
- --zrl-qr-blend: normal;
1181
- --zrl-shadow: 0 1px 2px rgba(16, 18, 27, 0.06), 0 20px 50px -12px rgba(16, 18, 27, 0.3);
1182
- --zrl-ring: rgba(16, 18, 27, 0.07);
1183
- /* The light on the QR well's edge. Brand blue on both grounds, a lighter
1184
- tint at the head; only its strength is themed, see the dark block. */
1185
- --zrl-beam: #00b4d9;
1186
- --zrl-beam-head: #7fe0f4;
1187
- --zrl-beam-line: 2px;
1188
- --zrl-glow-core: 4px;
1189
- --zrl-glow-reach: 24px;
1190
- --zrl-glow-blur: 8px;
1191
- --zrl-glow-opacity: 0.6;
1192
- `;
1193
- var DARK = `
1194
- --zrl-scrim: rgba(0, 0, 0, 0.62);
1195
- --zrl-surface: #17191d;
1196
- --zrl-surface-sunken: #1f2226;
1197
- --zrl-ink: #f4f5f7;
1198
- --zrl-ink-soft: #b3b8c0;
1199
- --zrl-ink-mute: #8b9199;
1200
- --zrl-line: #2c3036;
1201
- --zrl-line-soft: #24272c;
1202
- --zrl-accent: #34c9e8;
1203
- --zrl-accent-soft: #0d3b47;
1204
- --zrl-accent-ink: #7fdcf0;
1205
- --zrl-urgent: #e0a952;
1206
- /* The code is drawn light on the dark surface: the panel is transparent
1207
- and the image is inverted and screened, so only the modules and the
1208
- mark show. */
1209
- --zrl-qr-bg: transparent;
1210
- --zrl-qr-filter: invert(1);
1211
- --zrl-qr-spent-filter: invert(1) blur(3px);
1212
- --zrl-qr-blend: screen;
1213
- --zrl-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 20px 50px -12px rgba(0, 0, 0, 0.65);
1214
- --zrl-ring: rgba(255, 255, 255, 0.1);
1215
- /* A glow that reads on a white card disappears on a dark one: the light
1216
- here is brighter and wider, and its halo reaches further out. */
1217
- --zrl-beam: #22c8ec;
1218
- --zrl-beam-head: #c2f3fc;
1219
- --zrl-beam-line: 3px;
1220
- --zrl-glow-core: 6px;
1221
- --zrl-glow-reach: 32px;
1222
- --zrl-glow-blur: 10px;
1223
- --zrl-glow-opacity: 0.85;
1224
- `;
1225
- var CSS = `
1226
- .${PREFIX2}-root { ${LIGHT} }
1227
- .${PREFIX2}-root[data-theme="dark"] { ${DARK} }
1228
- @media (prefers-color-scheme: dark) {
1229
- .${PREFIX2}-root[data-theme="auto"] { ${DARK} }
1230
- }
1231
-
1232
- .${PREFIX2}-scrim {
1233
- position: fixed;
1234
- inset: 0;
1235
- z-index: 2147483000;
1236
- display: grid;
1237
- place-items: center;
1238
- overflow-y: auto;
1239
- padding: 16px;
1240
- background: var(--zrl-scrim);
1241
- backdrop-filter: blur(3px);
1242
- -webkit-backdrop-filter: blur(3px);
1243
- font-family: inherit;
1244
- animation: ${PREFIX2}-fade 200ms ease-out both;
1245
- }
1246
-
1247
- .${PREFIX2}-card {
1248
- position: relative;
1249
- box-sizing: border-box;
1250
- width: 100%;
1251
- max-width: 380px;
1252
- border-radius: 16px;
1253
- background: var(--zrl-surface);
1254
- color: var(--zrl-ink);
1255
- box-shadow: var(--zrl-shadow);
1256
- outline: 1px solid var(--zrl-ring);
1257
- outline-offset: -1px;
1258
- text-align: center;
1259
- animation: ${PREFIX2}-rise 300ms cubic-bezier(0.23, 1, 0.32, 1) both;
1260
- }
1261
-
1262
- .${PREFIX2}-body { padding: 28px 24px 20px; }
1263
-
1264
- .${PREFIX2}-lockup { display: block; margin: 0 auto; color: var(--zrl-ink); }
1265
-
1266
- .${PREFIX2}-title {
1267
- margin: 18px 0 0;
1268
- font-size: 18px;
1269
- font-weight: 600;
1270
- letter-spacing: -0.01em;
1271
- line-height: 1.3;
1272
- color: var(--zrl-ink);
1273
- }
1274
-
1275
- .${PREFIX2}-body-text {
1276
- margin: 6px auto 0;
1277
- max-width: 30ch;
1278
- font-size: 14px;
1279
- line-height: 1.55;
1280
- color: var(--zrl-ink-soft);
1281
- }
1282
-
1283
- .${PREFIX2}-qr-well {
1284
- position: relative;
1285
- display: grid;
1286
- place-items: center;
1287
- box-sizing: border-box;
1288
- width: 204px;
1289
- height: 204px;
1290
- margin: 20px auto 0;
1291
- padding: 12px;
1292
- border: 1px solid var(--zrl-line);
1293
- border-radius: var(--zrl-radius);
1294
- background: var(--zrl-qr-bg);
1295
- /* The light on the edge takes its shape from here and its colour and
1296
- strength from the theme tokens above. One lap in 4s on every tier. */
1297
- --zrl-radius: 16px;
1298
- --zrl-beam-time: 4s;
1299
- }
1300
-
1301
- /* The light on the well's edge: a short comet running along the border, with
1302
- a soft glow outside it. Three overlays inside the well, each masked so the
1303
- comet can only ever paint where its mask allows, and the white interior lies
1304
- outside every mask: nothing here can reach the quiet zone a camera needs,
1305
- whatever the comet is doing. The mask is the padding box cut out of the
1306
- border box, a transparent layer clipped to the padding box intersected
1307
- with a solid one clipped to the border box. The prefixed form is for Chrome
1308
- before 120 and Safari before 15.4; the unprefixed one, declared after it,
1309
- wins everywhere else.
1310
-
1311
- qr-beam keeps a thin ring on the border line: the comet itself.
1312
- qr-beam-glow is the glow: a wide band outside the well that blurs whatever
1313
- is inside it, and inside it qr-beam-glow-band keeps a 3px ring with a
1314
- second copy of the comet. The blur has to sit on the parent because a
1315
- filter is applied before a mask: blurred on the band itself, the glow
1316
- would be cut back to the band's own edge. On the parent it runs after the
1317
- band has clipped the comet thin and before the parent's mask cuts away the
1318
- inward half, which is what makes it fade outward and never over the QR.
1319
- All three share one containing block, the well's padding box, so the two
1320
- comets ride the same path; the spent badge is a later sibling and paints
1321
- above them. */
1322
- .${PREFIX2}-qr-beam,
1323
- .${PREFIX2}-qr-beam-glow,
1324
- .${PREFIX2}-qr-beam-glow-band {
1325
- position: absolute;
1326
- inset: calc(0px - var(--zrl-beam-line));
1327
- border: var(--zrl-beam-line) solid transparent;
1328
- border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-beam-line));
1329
- pointer-events: none;
1330
- -webkit-mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
1331
- -webkit-mask-clip: padding-box, border-box;
1332
- -webkit-mask-composite: source-in;
1333
- mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
1334
- mask-clip: padding-box, border-box;
1335
- mask-composite: intersect;
1336
- }
1337
- .${PREFIX2}-qr-beam-glow {
1338
- inset: calc(0px - var(--zrl-glow-reach));
1339
- border-width: var(--zrl-glow-reach);
1340
- border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-reach));
1341
- filter: blur(var(--zrl-glow-blur));
1342
- opacity: var(--zrl-glow-opacity);
1343
- will-change: filter;
1344
- }
1345
- .${PREFIX2}-qr-beam-glow-band {
1346
- inset: calc(0px - var(--zrl-glow-core));
1347
- border-width: var(--zrl-glow-core);
1348
- border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-core));
1349
- }
1350
-
1351
- /* At rest the edge holds a dim, even blue: a 1px line on the border and, from
1352
- the glow band, a soft halo outside it. Hidden while the comet runs, so the
1353
- border reads as the well's own line with a light passing over it; shown
1354
- once the light has stopped. Every path below ends here, which is what
1355
- makes them look the same at rest. */
1356
- .${PREFIX2}-qr-beam::before,
1357
- .${PREFIX2}-qr-beam-glow-band::before {
1358
- content: '';
1359
- position: absolute;
1360
- inset: -50%;
1361
- background: var(--zrl-beam);
1362
- opacity: 0;
1363
- transition: opacity 400ms cubic-bezier(0.23, 1, 0.32, 1);
422
+
423
+ /* At rest the edge holds a dim, even blue: a 1px line on the border and, from
424
+ the glow band, a soft halo outside it. Hidden while the comet runs, so the
425
+ border reads as the well's own line with a light passing over it; shown
426
+ once the light has stopped. Every path below ends here, which is what
427
+ makes them look the same at rest. */
428
+ .${PREFIX}-qr-beam::before,
429
+ .${PREFIX}-qr-beam-glow-band::before {
430
+ content: '';
431
+ position: absolute;
432
+ inset: -50%;
433
+ background: var(--zrl-beam);
434
+ opacity: 0;
435
+ transition: opacity 400ms cubic-bezier(0.23, 1, 0.32, 1);
1364
436
  }
1365
437
 
1366
438
  /* The moving light: an oversized square carrying a conic sweep, rotated
1367
439
  whole. A transform animation runs on the compositor, so the light keeps
1368
440
  moving while the page is busy; animating the gradient angle instead
1369
441
  repaints every frame on the main thread and stutters. */
1370
- .${PREFIX2}-qr-beam::after,
1371
- .${PREFIX2}-qr-beam-glow-band::after {
442
+ .${PREFIX}-qr-beam::after,
443
+ .${PREFIX}-qr-beam-glow-band::after {
1372
444
  content: '';
1373
445
  position: absolute;
1374
446
  inset: -50%;
@@ -1379,7 +451,7 @@ var CSS = `
1379
451
  var(--zrl-beam-head) 348deg,
1380
452
  transparent 356deg 360deg
1381
453
  );
1382
- animation: ${PREFIX2}-orbit var(--zrl-beam-time) linear infinite;
454
+ animation: ${PREFIX}-orbit var(--zrl-beam-time) linear infinite;
1383
455
  will-change: transform;
1384
456
  transition: opacity 400ms cubic-bezier(0.23, 1, 0.32, 1);
1385
457
  }
@@ -1387,15 +459,15 @@ var CSS = `
1387
459
  /* Spent: the light stops where it is and fades, and the edge settles to the
1388
460
  dim glow. Paused rather than removed, so it does not jump back to its start
1389
461
  on the way out. */
1390
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam::after,
1391
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam-glow-band::after {
462
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam::after,
463
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam-glow-band::after {
1392
464
  animation-play-state: paused;
1393
465
  opacity: 0;
1394
466
  }
1395
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam::before { opacity: 0.55; }
1396
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam-glow-band::before { opacity: 0.7; }
467
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam::before { opacity: 0.55; }
468
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam-glow-band::before { opacity: 0.7; }
1397
469
 
1398
- .${PREFIX2}-qr {
470
+ .${PREFIX}-qr {
1399
471
  display: block;
1400
472
  width: 100%;
1401
473
  height: 100%;
@@ -1410,17 +482,17 @@ var CSS = `
1410
482
  /* Once the code is claimed the QR is spent. Blurring it out rather than
1411
483
  swapping it keeps one object on screen through the state change, so the eye
1412
484
  reads a transformation instead of two things trading places. */
1413
- .${PREFIX2}-qr[data-spent="true"] { opacity: 0.2; filter: var(--zrl-qr-spent-filter); transform: scale(0.96); }
485
+ .${PREFIX}-qr[data-spent="true"] { opacity: 0.2; filter: var(--zrl-qr-spent-filter); transform: scale(0.96); }
1414
486
 
1415
- .${PREFIX2}-qr-overlay {
487
+ .${PREFIX}-qr-overlay {
1416
488
  position: absolute;
1417
489
  inset: 0;
1418
490
  display: grid;
1419
491
  place-items: center;
1420
- animation: ${PREFIX2}-fade 200ms ease-out both;
492
+ animation: ${PREFIX}-fade 200ms ease-out both;
1421
493
  }
1422
494
 
1423
- .${PREFIX2}-qr-badge {
495
+ .${PREFIX}-qr-badge {
1424
496
  display: grid;
1425
497
  place-items: center;
1426
498
  width: 56px;
@@ -1430,7 +502,7 @@ var CSS = `
1430
502
  color: var(--zrl-accent-ink);
1431
503
  }
1432
504
 
1433
- .${PREFIX2}-status {
505
+ .${PREFIX}-status {
1434
506
  display: flex;
1435
507
  align-items: center;
1436
508
  justify-content: center;
@@ -1441,8 +513,8 @@ var CSS = `
1441
513
  color: var(--zrl-ink);
1442
514
  }
1443
515
 
1444
- .${PREFIX2}-dot { position: relative; display: grid; place-items: center; width: 8px; height: 8px; }
1445
- .${PREFIX2}-dot i {
516
+ .${PREFIX}-dot { position: relative; display: grid; place-items: center; width: 8px; height: 8px; }
517
+ .${PREFIX}-dot i {
1446
518
  position: absolute;
1447
519
  width: 8px;
1448
520
  height: 8px;
@@ -1450,25 +522,25 @@ var CSS = `
1450
522
  background: var(--zrl-accent);
1451
523
  font-style: normal;
1452
524
  }
1453
- .${PREFIX2}-dot i:first-child { animation: ${PREFIX2}-ping 1.8s cubic-bezier(0.23, 1, 0.32, 1) infinite; }
525
+ .${PREFIX}-dot i:first-child { animation: ${PREFIX}-ping 1.8s cubic-bezier(0.23, 1, 0.32, 1) infinite; }
1454
526
 
1455
- .${PREFIX2}-timer {
527
+ .${PREFIX}-timer {
1456
528
  margin: 4px 0 0;
1457
529
  font-size: 12px;
1458
530
  font-variant-numeric: tabular-nums;
1459
531
  color: var(--zrl-ink-mute);
1460
532
  transition: color 200ms ease-out;
1461
533
  }
1462
- .${PREFIX2}-timer[data-urgent="true"] { color: var(--zrl-urgent); }
534
+ .${PREFIX}-timer[data-urgent="true"] { color: var(--zrl-urgent); }
1463
535
 
1464
- .${PREFIX2}-help {
536
+ .${PREFIX}-help {
1465
537
  padding: 14px 24px;
1466
538
  border-top: 1px solid var(--zrl-line-soft);
1467
539
  background: var(--zrl-surface-sunken);
1468
540
  border-radius: 0;
1469
541
  }
1470
- .${PREFIX2}-help-title { margin: 0; font-size: 12px; font-weight: 600; color: var(--zrl-ink); }
1471
- .${PREFIX2}-help-body {
542
+ .${PREFIX}-help-title { margin: 0; font-size: 12px; font-weight: 600; color: var(--zrl-ink); }
543
+ .${PREFIX}-help-body {
1472
544
  margin: 4px auto 0;
1473
545
  max-width: 34ch;
1474
546
  font-size: 12px;
@@ -1476,9 +548,9 @@ var CSS = `
1476
548
  color: var(--zrl-ink-soft);
1477
549
  }
1478
550
 
1479
- .${PREFIX2}-footer { padding: 12px; border-top: 1px solid var(--zrl-line-soft); }
551
+ .${PREFIX}-footer { padding: 12px; border-top: 1px solid var(--zrl-line-soft); }
1480
552
 
1481
- .${PREFIX2}-cancel {
553
+ .${PREFIX}-cancel {
1482
554
  display: block;
1483
555
  width: 100%;
1484
556
  padding: 10px;
@@ -1492,10 +564,10 @@ var CSS = `
1492
564
  cursor: pointer;
1493
565
  transition: background-color 150ms ease-out, color 150ms ease-out, transform 150ms ease-out;
1494
566
  }
1495
- .${PREFIX2}-cancel:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
1496
- .${PREFIX2}-cancel:active { transform: scale(0.99); }
567
+ .${PREFIX}-cancel:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
568
+ .${PREFIX}-cancel:active { transform: scale(0.99); }
1497
569
 
1498
- .${PREFIX2}-secured {
570
+ .${PREFIX}-secured {
1499
571
  display: flex;
1500
572
  align-items: center;
1501
573
  justify-content: center;
@@ -1507,9 +579,9 @@ var CSS = `
1507
579
  border-radius: 6px;
1508
580
  transition: color 150ms ease-out;
1509
581
  }
1510
- .${PREFIX2}-secured:hover { color: var(--zrl-ink); }
582
+ .${PREFIX}-secured:hover { color: var(--zrl-ink); }
1511
583
 
1512
- .${PREFIX2}-close {
584
+ .${PREFIX}-close {
1513
585
  position: absolute;
1514
586
  top: 12px;
1515
587
  inset-inline-end: 12px;
@@ -1525,25 +597,25 @@ var CSS = `
1525
597
  cursor: pointer;
1526
598
  transition: background-color 150ms ease-out, color 150ms ease-out, transform 150ms ease-out;
1527
599
  }
1528
- .${PREFIX2}-close:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
1529
- .${PREFIX2}-close:active { transform: scale(0.95); }
600
+ .${PREFIX}-close:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
601
+ .${PREFIX}-close:active { transform: scale(0.95); }
1530
602
 
1531
- .${PREFIX2}-card :focus-visible {
603
+ .${PREFIX}-card :focus-visible {
1532
604
  outline: 2px solid var(--zrl-accent);
1533
605
  outline-offset: 2px;
1534
606
  }
1535
607
 
1536
- @keyframes ${PREFIX2}-fade { from { opacity: 0 } to { opacity: 1 } }
1537
- @keyframes ${PREFIX2}-rise {
608
+ @keyframes ${PREFIX}-fade { from { opacity: 0 } to { opacity: 1 } }
609
+ @keyframes ${PREFIX}-rise {
1538
610
  from { opacity: 0; transform: translateY(10px) scale(0.98) }
1539
611
  to { opacity: 1; transform: none }
1540
612
  }
1541
- @keyframes ${PREFIX2}-ping {
613
+ @keyframes ${PREFIX}-ping {
1542
614
  0% { transform: scale(1); opacity: 0.5 }
1543
615
  70%, 100% { transform: scale(2.6); opacity: 0 }
1544
616
  }
1545
617
 
1546
- @keyframes ${PREFIX2}-orbit { to { transform: rotate(360deg) } }
618
+ @keyframes ${PREFIX}-orbit { to { transform: rotate(360deg) } }
1547
619
  /* THE BUSY RING. The light of the QR well, around any control that is
1548
620
  waiting on the provider: the button on a phone between the tap and the
1549
621
  hand-over to the app. The well's sweep is a cone from the centre, which is
@@ -1560,13 +632,13 @@ var CSS = `
1560
632
  straight fade from the head to nothing three tenths of the way back; the
1561
633
  component sets each layer's length, offset and opacity. Shown only while
1562
634
  busy. */
1563
- .${PREFIX2}-ring {
635
+ .${PREFIX}-ring {
1564
636
  position: relative;
1565
637
  display: inline-flex;
1566
638
  vertical-align: middle;
1567
639
  --zrl-beam-time: 4s;
1568
640
  }
1569
- .${PREFIX2}-ring-svg {
641
+ .${PREFIX}-ring-svg {
1570
642
  position: absolute;
1571
643
  inset: -4px;
1572
644
  width: calc(100% + 8px);
@@ -1576,8 +648,18 @@ var CSS = `
1576
648
  opacity: 0;
1577
649
  transition: opacity 200ms ease-out;
1578
650
  }
1579
- .${PREFIX2}-ring[data-busy="true"] > .${PREFIX2}-ring-svg { opacity: 1; }
1580
- .${PREFIX2}-ring-svg rect {
651
+ .${PREFIX}-ring[data-busy="true"] > .${PREFIX}-ring-svg { opacity: 1; }
652
+ /* The same light as an overlay in the document body, placed over a site's
653
+ own control by the package itself (busy.ts): nothing of the site's
654
+ markup or CSS is touched, and neither an ancestor's overflow nor a
655
+ selector on the control's parent is affected. */
656
+ .${PREFIX}-ring-overlay {
657
+ position: fixed;
658
+ display: block;
659
+ z-index: 2147483000;
660
+ pointer-events: none;
661
+ }
662
+ .${PREFIX}-ring-svg rect {
1581
663
  --zrl-l: var(--zrl-ring-len, 600px);
1582
664
  x: 2px;
1583
665
  y: 2px;
@@ -1588,46 +670,1084 @@ var CSS = `
1588
670
  stroke-width: var(--zrl-beam-line);
1589
671
  stroke-linecap: round;
1590
672
  stroke-dashoffset: var(--zrl-s, 0px);
1591
- animation: ${PREFIX2}-dash var(--zrl-beam-time) linear infinite;
673
+ animation: ${PREFIX}-dash var(--zrl-beam-time) linear infinite;
1592
674
  }
1593
- .${PREFIX2}-ring-head { stroke: var(--zrl-beam-head); }
1594
- .${PREFIX2}-ring-halo {
675
+ .${PREFIX}-ring-head { stroke: var(--zrl-beam-head); }
676
+ .${PREFIX}-ring-halo {
1595
677
  stroke-width: calc(var(--zrl-glow-core) * 2 + var(--zrl-beam-line));
1596
678
  filter: blur(var(--zrl-glow-blur));
1597
679
  }
1598
- @keyframes ${PREFIX2}-dash {
1599
- from { stroke-dashoffset: var(--zrl-s, 0px); }
1600
- to { stroke-dashoffset: calc(var(--zrl-s, 0px) - var(--zrl-l)); }
680
+ @keyframes ${PREFIX}-dash {
681
+ from { stroke-dashoffset: var(--zrl-s, 0px); }
682
+ to { stroke-dashoffset: calc(var(--zrl-s, 0px) - var(--zrl-l)); }
683
+ }
684
+ @media (prefers-reduced-motion: reduce) {
685
+ .${PREFIX}-ring-svg rect { animation: none; stroke-dasharray: none; opacity: 0.45; }
686
+ .${PREFIX}-ring-halo, .${PREFIX}-ring-head { display: none; }
687
+ }
688
+
689
+
690
+ @media (prefers-reduced-motion: reduce) {
691
+ .${PREFIX}-scrim,
692
+ .${PREFIX}-card,
693
+ .${PREFIX}-qr-overlay { animation: none }
694
+ .${PREFIX}-dot i:first-child { animation: none; opacity: 0.35 }
695
+ .${PREFIX}-qr,
696
+ .${PREFIX}-cancel,
697
+ .${PREFIX}-close,
698
+ .${PREFIX}-timer { transition: none }
699
+ /* No travelling light; the edge keeps its dim static glow instead. */
700
+ .${PREFIX}-qr-beam::after,
701
+ .${PREFIX}-qr-beam-glow-band::after { animation: none; opacity: 0 }
702
+ .${PREFIX}-qr-beam::before { opacity: 0.55 }
703
+ .${PREFIX}-qr-beam-glow-band::before { opacity: 0.7 }
704
+ }
705
+ `;
706
+ function ensureStyles() {
707
+ if (typeof document === "undefined") return;
708
+ if (document.getElementById(STYLE_ELEMENT_ID)) return;
709
+ const el2 = document.createElement("style");
710
+ el2.id = STYLE_ELEMENT_ID;
711
+ el2.textContent = CSS;
712
+ document.head.appendChild(el2);
713
+ }
714
+
715
+ // src/busy.ts
716
+ var SVG_NS = "http://www.w3.org/2000/svg";
717
+ var TAIL = 0.3;
718
+ var STACK = Array.from({ length: 12 }, (_, i) => 12 - i);
719
+ var HALO = [3, 2, 1];
720
+ function radiusOf(control) {
721
+ const value = parseFloat(getComputedStyle(control).borderTopLeftRadius);
722
+ return Number.isFinite(value) ? value : 8;
723
+ }
724
+ function holdBusy(control) {
725
+ if (typeof document === "undefined") return () => {
726
+ };
727
+ ensureStyles();
728
+ const hadDisabled = control.hasAttribute("disabled");
729
+ const hadBusy = control.getAttribute("aria-busy");
730
+ if (control instanceof HTMLButtonElement || control instanceof HTMLInputElement) {
731
+ control.disabled = true;
732
+ } else {
733
+ control.setAttribute("aria-disabled", "true");
734
+ }
735
+ control.setAttribute("aria-busy", "true");
736
+ const overlay = document.createElement("div");
737
+ overlay.className = `${cx("root")} ${cx("ring")} ${cx("ring-overlay")}`;
738
+ overlay.dataset.theme = "auto";
739
+ overlay.dataset.busy = "true";
740
+ overlay.setAttribute("aria-hidden", "true");
741
+ const svg2 = document.createElementNS(SVG_NS, "svg");
742
+ svg2.setAttribute("class", cx("ring-svg"));
743
+ const rx = radiusOf(control) + 2;
744
+ const layer = (name, len, alpha) => {
745
+ const rect = document.createElementNS(SVG_NS, "rect");
746
+ rect.setAttribute("class", cx(name));
747
+ rect.setAttribute("rx", String(rx));
748
+ rect.setAttribute("ry", String(rx));
749
+ rect.style.strokeDasharray = `calc(var(--zrl-l) * ${len}) calc(var(--zrl-l) * ${1 - len})`;
750
+ rect.style.setProperty("--zrl-s", `calc(var(--zrl-l) * ${-(TAIL - len)})`);
751
+ rect.style.opacity = alpha;
752
+ svg2.appendChild(rect);
753
+ return rect;
754
+ };
755
+ let measured = null;
756
+ for (const n of HALO) {
757
+ const rect = layer("ring-halo", TAIL * n / HALO.length, `calc(var(--zrl-glow-opacity) * 0.6 / ${n})`);
758
+ measured ?? (measured = rect);
759
+ }
760
+ for (const n of STACK) layer(n <= 2 ? "ring-head" : "ring-tail", TAIL * n / STACK.length, String(1 / n));
761
+ overlay.appendChild(svg2);
762
+ document.body.appendChild(overlay);
763
+ let frame = 0;
764
+ const place = () => {
765
+ frame = 0;
766
+ const box = control.getBoundingClientRect();
767
+ overlay.style.left = `${box.left}px`;
768
+ overlay.style.top = `${box.top}px`;
769
+ overlay.style.width = `${box.width}px`;
770
+ overlay.style.height = `${box.height}px`;
771
+ const length = typeof measured?.getTotalLength === "function" ? measured.getTotalLength() : 0;
772
+ if (length > 0) overlay.style.setProperty("--zrl-ring-len", `${length}px`);
773
+ };
774
+ const schedule = () => {
775
+ if (!frame) frame = requestAnimationFrame(place);
776
+ };
777
+ place();
778
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
779
+ observer?.observe(control);
780
+ window.addEventListener("scroll", schedule, true);
781
+ window.addEventListener("resize", schedule);
782
+ let released = false;
783
+ return () => {
784
+ if (released) return;
785
+ released = true;
786
+ if (frame) cancelAnimationFrame(frame);
787
+ observer?.disconnect();
788
+ window.removeEventListener("scroll", schedule, true);
789
+ window.removeEventListener("resize", schedule);
790
+ overlay.remove();
791
+ if (control instanceof HTMLButtonElement || control instanceof HTMLInputElement) {
792
+ control.disabled = hadDisabled;
793
+ } else {
794
+ control.removeAttribute("aria-disabled");
795
+ }
796
+ if (hadBusy === null) control.removeAttribute("aria-busy");
797
+ else control.setAttribute("aria-busy", hadBusy);
798
+ };
799
+ }
800
+
801
+ // src/intent.ts
802
+ var SIGN_IN_SCOPES = /* @__PURE__ */ new Set(["openid", "email", "profile.name"]);
803
+ function resolveIntent(intent, scope, acrValues) {
804
+ if (intent) return intent;
805
+ const scopes = (scope ?? "openid").split(/\s+/).filter(Boolean);
806
+ if (scopes.some((s) => !SIGN_IN_SCOPES.has(s))) return "identify";
807
+ const acr = typeof acrValues === "string" ? acrValues.split(/\s+/) : acrValues ?? [];
808
+ if (scopes.every((s) => s === "openid") && acr.includes("zoreal.live")) return "presence";
809
+ return "sign-in";
810
+ }
811
+ function titleFor(t, intent) {
812
+ if (intent === "identify") return t.titleIdentify;
813
+ if (intent === "presence") return t.titlePresence;
814
+ return t.title;
815
+ }
816
+
817
+ // src/return.ts
818
+ var PREFIX2 = "zoreal:oauth2:return:";
819
+ var DONE = "zoreal:oauth2:done:";
820
+ var MAX_AGE_MS = 10 * 60 * 1e3;
821
+ function storage() {
822
+ try {
823
+ return typeof localStorage === "undefined" ? null : localStorage;
824
+ } catch {
825
+ return null;
826
+ }
827
+ }
828
+ function saveReturnFlow(flow) {
829
+ try {
830
+ storage()?.setItem(PREFIX2 + flow.requestId, JSON.stringify(flow));
831
+ } catch {
832
+ }
833
+ }
834
+ function peekReturnFlow(requestId) {
835
+ const store = storage();
836
+ if (!store) return null;
837
+ const raw = store.getItem(PREFIX2 + requestId);
838
+ if (!raw) return null;
839
+ try {
840
+ const flow = JSON.parse(raw);
841
+ if (flow.v !== 1 || flow.requestId !== requestId) return null;
842
+ if (Date.now() - flow.createdAt > MAX_AGE_MS) return null;
843
+ return flow;
844
+ } catch {
845
+ return null;
846
+ }
847
+ }
848
+ function forgetReturnFlow(requestId) {
849
+ try {
850
+ storage()?.removeItem(PREFIX2 + requestId);
851
+ } catch {
852
+ }
853
+ if (pending === requestId) pending = null;
854
+ }
855
+ function markReturnDone(requestId) {
856
+ try {
857
+ const store = storage();
858
+ store?.setItem(DONE + requestId, String(Date.now()));
859
+ store?.removeItem(PREFIX2 + requestId);
860
+ } catch {
861
+ }
862
+ }
863
+ function isReturnDone(requestId) {
864
+ return storage()?.getItem(DONE + requestId) !== null && storage()?.getItem(DONE + requestId) !== void 0;
865
+ }
866
+ function visibleOrDone(requestId, signal) {
867
+ if (typeof document === "undefined" || document.visibilityState !== "hidden") {
868
+ return Promise.resolve(!isReturnDone(requestId));
869
+ }
870
+ return new Promise((resolve) => {
871
+ const finish = (value) => {
872
+ document.removeEventListener("visibilitychange", onVisible);
873
+ window.removeEventListener("storage", onStorage);
874
+ signal?.removeEventListener("abort", onAbort);
875
+ resolve(value);
876
+ };
877
+ const onVisible = () => {
878
+ if (document.visibilityState !== "hidden") finish(!isReturnDone(requestId));
879
+ };
880
+ const onStorage = () => {
881
+ if (isReturnDone(requestId)) finish(false);
882
+ };
883
+ const onAbort = () => finish(false);
884
+ document.addEventListener("visibilitychange", onVisible);
885
+ window.addEventListener("storage", onStorage);
886
+ signal?.addEventListener("abort", onAbort, { once: true });
887
+ if (isReturnDone(requestId)) finish(false);
888
+ });
889
+ }
890
+ function returnToUrl() {
891
+ if (typeof window === "undefined") return void 0;
892
+ const { href } = window.location;
893
+ const hash = href.indexOf("#");
894
+ return hash === -1 ? href : href.slice(0, hash);
895
+ }
896
+ var RETURN_MARK = /(?:^|[#&])zoreal_return=([A-Za-z0-9]{32})(?:&|$)/;
897
+ var pending = null;
898
+ function pendingReturnId() {
899
+ if (pending) return pending;
900
+ if (typeof window === "undefined") return null;
901
+ const match = RETURN_MARK.exec(window.location.hash);
902
+ if (!match) return null;
903
+ pending = match[1];
904
+ try {
905
+ window.history.replaceState(window.history.state, "", returnToUrl());
906
+ } catch {
907
+ }
908
+ return pending;
909
+ }
910
+
911
+ // src/i18n.ts
912
+ var en = {
913
+ title: "Scan to sign in",
914
+ titleIdentify: "Scan to verify your identity",
915
+ titlePresence: "Scan to prove you are a real human",
916
+ titleApprove: "Approve on your phone",
917
+ bodyScan: "Scan with your phone camera or the ZOREAL ID app.",
918
+ bodyApprove: "Approve the login in your ZOREAL ID app.",
919
+ bodyEnrolling: "Finish setting up ZOREAL ID on your phone, then approve the login.",
920
+ waiting: "Waiting for scan",
921
+ waitingApproval: "Waiting for approval",
922
+ expiresIn: "Expires in {time}",
923
+ secured: "Proof-of-Human verification by ZOREAL",
924
+ noIdTitle: "No ZOREAL ID yet?",
925
+ noIdBody: "Scan the same code to download the app and create one for free. It only takes a minute.",
926
+ cancel: "Cancel",
927
+ close: "Close",
928
+ qrAlt: "QR code to sign in with ZOREAL",
929
+ buttonContinue: "Continue with ZOREAL"
930
+ };
931
+ var TRANSLATIONS = {
932
+ en,
933
+ sv: {
934
+ title: "Skanna f\xF6r att logga in",
935
+ titleIdentify: "Skanna f\xF6r att verifiera din identitet",
936
+ titlePresence: "Skanna f\xF6r att bevisa att du \xE4r en riktig m\xE4nniska",
937
+ titleApprove: "Godk\xE4nn p\xE5 telefonen",
938
+ bodyScan: "Skanna med telefonens kamera eller ZOREAL ID-appen.",
939
+ bodyApprove: "Godk\xE4nn inloggningen i ZOREAL ID-appen.",
940
+ bodyEnrolling: "Slutf\xF6r konfigurationen av ZOREAL ID p\xE5 telefonen och godk\xE4nn sedan inloggningen.",
941
+ waiting: "V\xE4ntar p\xE5 skanning",
942
+ waitingApproval: "V\xE4ntar p\xE5 godk\xE4nnande",
943
+ expiresIn: "Upph\xF6r om {time}",
944
+ secured: "Proof-of-Human-verifiering av ZOREAL",
945
+ noIdTitle: "Har du inget ZOREAL ID?",
946
+ noIdBody: "Skanna samma kod f\xF6r att ladda ner appen och skapa ett gratis. Det tar bara en minut.",
947
+ cancel: "Avbryt",
948
+ close: "St\xE4ng",
949
+ qrAlt: "QR-kod f\xF6r att logga in med ZOREAL",
950
+ buttonContinue: "Forts\xE4tt med ZOREAL"
951
+ },
952
+ es: {
953
+ title: "Escanea para iniciar sesi\xF3n",
954
+ titleIdentify: "Escanea para verificar tu identidad",
955
+ titlePresence: "Escanea para demostrar que eres una persona real",
956
+ titleApprove: "Apru\xE9balo en tu tel\xE9fono",
957
+ bodyScan: "Escanea con la c\xE1mara de tu tel\xE9fono o con la app ZOREAL ID.",
958
+ bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
959
+ bodyEnrolling: "Termina de configurar ZOREAL ID en tu tel\xE9fono y luego aprueba el inicio de sesi\xF3n.",
960
+ waiting: "Esperando el escaneo",
961
+ waitingApproval: "Esperando aprobaci\xF3n",
962
+ expiresIn: "Caduca en {time}",
963
+ secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
964
+ noIdTitle: "\xBFA\xFAn no tienes ZOREAL ID?",
965
+ noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear una gratis. Solo toma un minuto.",
966
+ cancel: "Cancelar",
967
+ close: "Cerrar",
968
+ qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
969
+ buttonContinue: "Continuar con ZOREAL"
970
+ },
971
+ pt: {
972
+ title: "Digitalize para entrar",
973
+ titleIdentify: "Digitalize para verificar a sua identidade",
974
+ titlePresence: "Digitalize para provar que \xE9 uma pessoa real",
975
+ titleApprove: "Aprove no seu telefone",
976
+ bodyScan: "Digitalize com a c\xE2mara do seu telefone ou com a app ZOREAL ID.",
977
+ bodyApprove: "Aprove o login no app ZOREAL ID.",
978
+ bodyEnrolling: "Termine de configurar o ZOREAL ID no seu telefone e depois aprove o login.",
979
+ waiting: "Aguardando digitaliza\xE7\xE3o",
980
+ waitingApproval: "Aguardando aprova\xE7\xE3o",
981
+ expiresIn: "Expira em {time}",
982
+ secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
983
+ noIdTitle: "Ainda n\xE3o tem ZOREAL ID?",
984
+ noIdBody: "Digitalize o mesmo c\xF3digo para baixar o app e criar uma conta gr\xE1tis. Leva s\xF3 um minuto.",
985
+ cancel: "Cancelar",
986
+ close: "Fechar",
987
+ qrAlt: "C\xF3digo QR para entrar com ZOREAL",
988
+ buttonContinue: "Continuar com ZOREAL"
989
+ },
990
+ fr: {
991
+ title: "Scannez pour vous connecter",
992
+ titleIdentify: "Scannez pour v\xE9rifier votre identit\xE9",
993
+ titlePresence: "Scannez pour prouver que vous \xEAtes bien un humain",
994
+ titleApprove: "Approuvez sur votre t\xE9l\xE9phone",
995
+ bodyScan: "Scannez avec l'appareil photo de votre t\xE9l\xE9phone ou l'app ZOREAL ID.",
996
+ bodyApprove: "Approuvez la connexion dans votre app ZOREAL ID.",
997
+ bodyEnrolling: "Terminez la configuration de ZOREAL ID sur votre t\xE9l\xE9phone, puis approuvez la connexion.",
998
+ waiting: "En attente du scan",
999
+ waitingApproval: "En attente d'approbation",
1000
+ expiresIn: "Expire dans {time}",
1001
+ secured: "V\xE9rification Proof-of-Human par ZOREAL",
1002
+ noIdTitle: "Pas encore de ZOREAL ID ?",
1003
+ noIdBody: "Scannez le m\xEAme code pour t\xE9l\xE9charger l'app et en cr\xE9er un gratuitement. Cela prend une minute.",
1004
+ cancel: "Annuler",
1005
+ close: "Fermer",
1006
+ qrAlt: "Code QR pour se connecter avec ZOREAL",
1007
+ buttonContinue: "Continuer avec ZOREAL"
1008
+ },
1009
+ de: {
1010
+ title: "Zum Anmelden scannen",
1011
+ titleIdentify: "Scannen, um Ihre Identit\xE4t zu verifizieren",
1012
+ titlePresence: "Scannen, um zu beweisen, dass Sie ein echter Mensch sind",
1013
+ titleApprove: "Auf dem Handy best\xE4tigen",
1014
+ bodyScan: "Mit der Handykamera oder der ZOREAL ID App scannen.",
1015
+ bodyApprove: "Anmeldung in der ZOREAL ID App best\xE4tigen.",
1016
+ bodyEnrolling: "ZOREAL ID auf dem Handy fertig einrichten und dann die Anmeldung best\xE4tigen.",
1017
+ waiting: "Warten auf Scan",
1018
+ waitingApproval: "Warten auf Best\xE4tigung",
1019
+ expiresIn: "L\xE4uft ab in {time}",
1020
+ secured: "Proof-of-Human-Verifizierung von ZOREAL",
1021
+ noIdTitle: "Noch keine ZOREAL ID?",
1022
+ noIdBody: "Denselben Code scannen, um die App zu laden und kostenlos eine zu erstellen. Dauert nur eine Minute.",
1023
+ cancel: "Abbrechen",
1024
+ close: "Schlie\xDFen",
1025
+ qrAlt: "QR-Code f\xFCr die Anmeldung mit ZOREAL",
1026
+ buttonContinue: "Weiter mit ZOREAL"
1027
+ },
1028
+ ru: {
1029
+ title: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u0439\u0442\u0438",
1030
+ titleIdentify: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C",
1031
+ titlePresence: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u044C, \u0447\u0442\u043E \u0432\u044B \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A",
1032
+ titleApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435",
1033
+ bodyScan: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u0439 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0447\u0435\u0440\u0435\u0437 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 ZOREAL ID.",
1034
+ bodyApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 ZOREAL ID.",
1035
+ bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435, \u0437\u0430\u0442\u0435\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434.",
1036
+ waiting: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u0441\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
1037
+ waitingApproval: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F",
1038
+ expiresIn: "\u0418\u0441\u0442\u0435\u043A\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 {time}",
1039
+ secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
1040
+ noIdTitle: "\u0415\u0449\u0451 \u043D\u0435\u0442 ZOREAL ID?",
1041
+ noIdBody: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u043E\u0442 \u0436\u0435 \u043A\u043E\u0434, \u0447\u0442\u043E\u0431\u044B \u0441\u043A\u0430\u0447\u0430\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0435\u0433\u043E \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E. \u042D\u0442\u043E \u0437\u0430\u0439\u043C\u0451\u0442 \u043C\u0438\u043D\u0443\u0442\u0443.",
1042
+ cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
1043
+ close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
1044
+ qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
1045
+ buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0441 ZOREAL"
1046
+ },
1047
+ ja: {
1048
+ title: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30ED\u30B0\u30A4\u30F3",
1049
+ titleIdentify: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u672C\u4EBA\u78BA\u8A8D",
1050
+ titlePresence: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u5B9F\u5728\u306E\u4EBA\u7269\u3067\u3042\u308B\u3053\u3068\u3092\u8A3C\u660E",
1051
+ titleApprove: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067\u627F\u8A8D",
1052
+ bodyScan: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u306E\u30AB\u30E1\u30E9\u307E\u305F\u306FZOREAL ID\u30A2\u30D7\u30EA\u3067\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1053
+ bodyApprove: "ZOREAL ID\u30A2\u30D7\u30EA\u3067\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1054
+ bodyEnrolling: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067ZOREAL ID\u306E\u8A2D\u5B9A\u3092\u5B8C\u4E86\u3057\u3001\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1055
+ waiting: "\u30B9\u30AD\u30E3\u30F3\u5F85\u3061",
1056
+ waitingApproval: "\u627F\u8A8D\u5F85\u3061",
1057
+ expiresIn: "\u6709\u52B9\u671F\u9650\u307E\u3067 {time}",
1058
+ secured: "ZOREAL\u306B\u3088\u308BProof-of-Human\u8A8D\u8A3C",
1059
+ noIdTitle: "ZOREAL ID\u3092\u304A\u6301\u3061\u3067\u306A\u3044\u3067\u3059\u304B\uFF1F",
1060
+ noIdBody: "\u540C\u3058\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30A2\u30D7\u30EA\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3001\u7121\u6599\u3067\u4F5C\u6210\u3067\u304D\u307E\u3059\u30021\u5206\u307B\u3069\u3067\u5B8C\u4E86\u3057\u307E\u3059\u3002",
1061
+ cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
1062
+ close: "\u9589\u3058\u308B",
1063
+ qrAlt: "ZOREAL\u3067\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u305F\u3081\u306EQR\u30B3\u30FC\u30C9",
1064
+ buttonContinue: "ZOREAL\u3067\u7D9A\u884C"
1065
+ },
1066
+ hi: {
1067
+ title: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
1068
+ titleIdentify: "\u0905\u092A\u0928\u0940 \u092A\u0939\u091A\u093E\u0928 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
1069
+ titlePresence: "\u092F\u0939 \u0938\u093E\u092C\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902 \u0915\u093F \u0906\u092A \u090F\u0915 \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0907\u0902\u0938\u093E\u0928 \u0939\u0948\u0902",
1070
+ titleApprove: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902",
1071
+ bodyScan: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u0915\u0947 \u0915\u0948\u092E\u0930\u0947 \u092F\u093E ZOREAL ID \u0910\u092A \u0938\u0947 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964",
1072
+ bodyApprove: "\u0905\u092A\u0928\u0947 ZOREAL ID \u0910\u092A \u092E\u0947\u0902 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
1073
+ bodyEnrolling: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 ZOREAL ID \u0938\u0947\u091F\u0905\u092A \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902, \u092B\u093F\u0930 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
1074
+ waiting: "\u0938\u094D\u0915\u0948\u0928 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
1075
+ waitingApproval: "\u0938\u094D\u0935\u0940\u0915\u0943\u0924\u093F \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
1076
+ expiresIn: "{time} \u092E\u0947\u0902 \u0938\u092E\u093E\u092A\u094D\u0924",
1077
+ secured: "ZOREAL \u0926\u094D\u0935\u093E\u0930\u093E Proof-of-Human \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
1078
+ noIdTitle: "\u0905\u092D\u0940 \u0924\u0915 ZOREAL ID \u0928\u0939\u0940\u0902 \u0939\u0948?",
1079
+ noIdBody: "\u0910\u092A \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u0914\u0930 \u092E\u0941\u092B\u094D\u0924 \u092E\u0947\u0902 \u090F\u0915 \u092C\u0928\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0935\u0939\u0940 \u0915\u094B\u0921 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964 \u0907\u0938\u092E\u0947\u0902 \u092C\u0938 \u090F\u0915 \u092E\u093F\u0928\u091F \u0932\u0917\u0924\u093E \u0939\u0948\u0964",
1080
+ cancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
1081
+ close: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
1082
+ qrAlt: "ZOREAL \u0938\u0947 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F QR \u0915\u094B\u0921",
1083
+ buttonContinue: "ZOREAL \u0915\u0947 \u0938\u093E\u0925 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902"
1084
+ },
1085
+ zhs: {
1086
+ title: "\u626B\u7801\u767B\u5F55",
1087
+ titleIdentify: "\u626B\u7801\u9A8C\u8BC1\u8EAB\u4EFD",
1088
+ titlePresence: "\u626B\u7801\u8BC1\u660E\u60A8\u662F\u771F\u4EBA",
1089
+ titleApprove: "\u5728\u624B\u673A\u4E0A\u6279\u51C6",
1090
+ bodyScan: "\u4F7F\u7528\u624B\u673A\u76F8\u673A\u6216 ZOREAL ID \u5E94\u7528\u626B\u63CF\u3002",
1091
+ bodyApprove: "\u8BF7\u5728 ZOREAL ID \u5E94\u7528\u4E2D\u6279\u51C6\u767B\u5F55\u3002",
1092
+ bodyEnrolling: "\u8BF7\u5728\u624B\u673A\u4E0A\u5B8C\u6210 ZOREAL ID \u8BBE\u7F6E\uFF0C\u7136\u540E\u6279\u51C6\u767B\u5F55\u3002",
1093
+ waiting: "\u7B49\u5F85\u626B\u63CF",
1094
+ waitingApproval: "\u7B49\u5F85\u6279\u51C6",
1095
+ expiresIn: "{time} \u540E\u5931\u6548",
1096
+ secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A8C\u8BC1",
1097
+ noIdTitle: "\u8FD8\u6CA1\u6709 ZOREAL ID\uFF1F",
1098
+ noIdBody: "\u626B\u63CF\u540C\u4E00\u4E2A\u4E8C\u7EF4\u7801\u5373\u53EF\u4E0B\u8F7D\u5E94\u7528\u5E76\u514D\u8D39\u521B\u5EFA\uFF0C\u53EA\u9700\u4E00\u5206\u949F\u3002",
1099
+ cancel: "\u53D6\u6D88",
1100
+ close: "\u5173\u95ED",
1101
+ qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5F55\u7684\u4E8C\u7EF4\u7801",
1102
+ buttonContinue: "\u4F7F\u7528 ZOREAL \u7EE7\u7EED"
1103
+ },
1104
+ zht: {
1105
+ title: "\u6383\u78BC\u767B\u5165",
1106
+ titleIdentify: "\u6383\u78BC\u9A57\u8B49\u8EAB\u5206",
1107
+ titlePresence: "\u6383\u78BC\u8B49\u660E\u60A8\u662F\u771F\u4EBA",
1108
+ titleApprove: "\u5728\u624B\u6A5F\u4E0A\u6838\u51C6",
1109
+ bodyScan: "\u4F7F\u7528\u624B\u6A5F\u76F8\u6A5F\u6216 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u6383\u63CF\u3002",
1110
+ bodyApprove: "\u8ACB\u5728 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u4E2D\u6838\u51C6\u767B\u5165\u3002",
1111
+ bodyEnrolling: "\u8ACB\u5728\u624B\u6A5F\u4E0A\u5B8C\u6210 ZOREAL ID \u8A2D\u5B9A\uFF0C\u7136\u5F8C\u6838\u51C6\u767B\u5165\u3002",
1112
+ waiting: "\u7B49\u5F85\u6383\u63CF",
1113
+ waitingApproval: "\u7B49\u5F85\u6838\u51C6",
1114
+ expiresIn: "{time} \u5F8C\u5931\u6548",
1115
+ secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A57\u8B49",
1116
+ noIdTitle: "\u9084\u6C92\u6709 ZOREAL ID\uFF1F",
1117
+ noIdBody: "\u6383\u63CF\u540C\u4E00\u500B QR code \u5373\u53EF\u4E0B\u8F09\u61C9\u7528\u7A0B\u5F0F\u4E26\u514D\u8CBB\u5EFA\u7ACB\uFF0C\u53EA\u9700\u4E00\u5206\u9418\u3002",
1118
+ cancel: "\u53D6\u6D88",
1119
+ close: "\u95DC\u9589",
1120
+ qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5165\u7684 QR code",
1121
+ buttonContinue: "\u4F7F\u7528 ZOREAL \u7E7C\u7E8C"
1122
+ },
1123
+ ar: {
1124
+ title: "\u0627\u0645\u0633\u062D \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644",
1125
+ titleIdentify: "\u0627\u0645\u0633\u062D \u0644\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0647\u0648\u064A\u062A\u0643",
1126
+ titlePresence: "\u0627\u0645\u0633\u062D \u0644\u0625\u062B\u0628\u0627\u062A \u0623\u0646\u0643 \u0625\u0646\u0633\u0627\u0646 \u062D\u0642\u064A\u0642\u064A",
1127
+ titleApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643",
1128
+ bodyScan: "\u0627\u0645\u0633\u062D \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0643\u0627\u0645\u064A\u0631\u0627 \u0647\u0627\u062A\u0641\u0643 \u0623\u0648 \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
1129
+ bodyApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0641\u064A \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
1130
+ bodyEnrolling: "\u0623\u0643\u0645\u0644 \u0625\u0639\u062F\u0627\u062F ZOREAL ID \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643\u060C \u062B\u0645 \u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644.",
1131
+ waiting: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0633\u062D",
1132
+ waitingApproval: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629",
1133
+ expiresIn: "\u062A\u0646\u062A\u0647\u064A \u0627\u0644\u0635\u0644\u0627\u062D\u064A\u0629 \u062E\u0644\u0627\u0644 {time}",
1134
+ secured: "\u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 Proof-of-Human \u0628\u0648\u0627\u0633\u0637\u0629 ZOREAL",
1135
+ noIdTitle: "\u0644\u064A\u0633 \u0644\u062F\u064A\u0643 ZOREAL ID \u0628\u0639\u062F\u061F",
1136
+ noIdBody: "\u0627\u0645\u0633\u062D \u0627\u0644\u0631\u0645\u0632 \u0646\u0641\u0633\u0647 \u0644\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u0648\u0625\u0646\u0634\u0627\u0621 \u062D\u0633\u0627\u0628 \u0645\u062C\u0627\u0646\u064A. \u064A\u0633\u062A\u063A\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u0641\u0642\u0637.",
1137
+ cancel: "\u0625\u0644\u063A\u0627\u0621",
1138
+ close: "\u0625\u063A\u0644\u0627\u0642",
1139
+ qrAlt: "\u0631\u0645\u0632 QR \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL",
1140
+ buttonContinue: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL"
1141
+ },
1142
+ ko: {
1143
+ title: "\uC2A4\uCE94\uD558\uC5EC \uB85C\uADF8\uC778",
1144
+ titleIdentify: "\uC2A4\uCE94\uD558\uC5EC \uC2E0\uC6D0 \uD655\uC778",
1145
+ titlePresence: "\uC2A4\uCE94\uD558\uC5EC \uC2E4\uC81C \uC0AC\uB78C\uC784\uC744 \uC99D\uBA85",
1146
+ titleApprove: "\uD734\uB300\uD3F0\uC5D0\uC11C \uC2B9\uC778",
1147
+ bodyScan: "\uD734\uB300\uD3F0 \uCE74\uBA54\uB77C \uB610\uB294 ZOREAL ID \uC571\uC73C\uB85C \uC2A4\uCE94\uD558\uC138\uC694.",
1148
+ bodyApprove: "ZOREAL ID \uC571\uC5D0\uC11C \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
1149
+ bodyEnrolling: "\uD734\uB300\uD3F0\uC5D0\uC11C ZOREAL ID \uC124\uC815\uC744 \uC644\uB8CC\uD55C \uD6C4 \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
1150
+ waiting: "\uC2A4\uCE94 \uB300\uAE30 \uC911",
1151
+ waitingApproval: "\uC2B9\uC778 \uB300\uAE30 \uC911",
1152
+ expiresIn: "{time} \uD6C4 \uB9CC\uB8CC",
1153
+ secured: "ZOREAL\uC758 Proof-of-Human \uC778\uC99D",
1154
+ noIdTitle: "\uC544\uC9C1 ZOREAL ID\uAC00 \uC5C6\uC73C\uC2E0\uAC00\uC694?",
1155
+ noIdBody: "\uAC19\uC740 \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD574 \uC571\uC744 \uB0B4\uB824\uBC1B\uACE0 \uBB34\uB8CC\uB85C \uB9CC\uB4DC\uC138\uC694. 1\uBD84\uC774\uBA74 \uB429\uB2C8\uB2E4.",
1156
+ cancel: "\uCDE8\uC18C",
1157
+ close: "\uB2EB\uAE30",
1158
+ qrAlt: "ZOREAL\uB85C \uB85C\uADF8\uC778\uD558\uAE30 \uC704\uD55C QR \uCF54\uB4DC",
1159
+ buttonContinue: "ZOREAL\uB85C \uACC4\uC18D"
1160
+ },
1161
+ // Български
1162
+ bg: {
1163
+ title: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0437\u0430 \u0432\u0445\u043E\u0434",
1164
+ titleIdentify: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0438\u0442\u0435 \u0441\u0430\u043C\u043E\u043B\u0438\u0447\u043D\u043E\u0441\u0442\u0442\u0430 \u0441\u0438",
1165
+ titlePresence: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u0441\u0442\u0438\u043D\u0441\u043A\u0438 \u0447\u043E\u0432\u0435\u043A",
1166
+ titleApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438",
1167
+ bodyScan: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441 \u043A\u0430\u043C\u0435\u0440\u0430\u0442\u0430 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0441 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
1168
+ bodyApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
1169
+ bodyEnrolling: "\u0414\u043E\u0432\u044A\u0440\u0448\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0442\u0430 \u043D\u0430 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438, \u0441\u043B\u0435\u0434 \u043A\u043E\u0435\u0442\u043E \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430.",
1170
+ waiting: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u0441\u043A\u0430\u043D\u0438\u0440\u0430\u043D\u0435",
1171
+ waitingApproval: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0436\u0434\u0435\u043D\u0438\u0435",
1172
+ expiresIn: "\u0418\u0437\u0442\u0438\u0447\u0430 \u0441\u043B\u0435\u0434 {time}",
1173
+ secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
1174
+ noIdTitle: "\u0412\u0441\u0435 \u043E\u0449\u0435 \u043D\u044F\u043C\u0430\u0442\u0435 ZOREAL ID?",
1175
+ noIdBody: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441\u044A\u0449\u0438\u044F \u043A\u043E\u0434, \u0437\u0430 \u0434\u0430 \u0438\u0437\u0442\u0435\u0433\u043B\u0438\u0442\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E \u0438 \u0434\u0430 \u0441\u0438 \u0441\u044A\u0437\u0434\u0430\u0434\u0435\u0442\u0435 \u0431\u0435\u0437\u043F\u043B\u0430\u0442\u0435\u043D \u0430\u043A\u0430\u0443\u043D\u0442. \u041E\u0442\u043D\u0435\u043C\u0430 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442\u0430.",
1176
+ cancel: "\u041E\u0442\u043A\u0430\u0437",
1177
+ close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
1178
+ qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u0432\u0445\u043E\u0434 \u0441\u044A\u0441 ZOREAL",
1179
+ buttonContinue: "\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0438 \u0441\u044A\u0441 ZOREAL"
1180
+ },
1181
+ // বাংলা
1182
+ bn: {
1183
+ title: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
1184
+ titleIdentify: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09B0\u09BF\u099A\u09AF\u09BC \u09AF\u09BE\u099A\u09BE\u0987 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
1185
+ titlePresence: "\u0986\u09AA\u09A8\u09BF \u098F\u0995\u099C\u09A8 \u09AA\u09CD\u09B0\u0995\u09C3\u09A4 \u09AE\u09BE\u09A8\u09C1\u09B7 \u09A4\u09BE \u09AA\u09CD\u09B0\u09AE\u09BE\u09A3 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
1186
+ titleApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8",
1187
+ bodyScan: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7\u09B0 \u0995\u09CD\u09AF\u09BE\u09AE\u09C7\u09B0\u09BE \u09AC\u09BE ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1188
+ bodyApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA\u09C7 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1189
+ bodyEnrolling: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 ZOREAL ID \u09B8\u09C7\u099F\u0986\u09AA \u09B8\u09AE\u09CD\u09AA\u09C2\u09B0\u09CD\u09A3 \u0995\u09B0\u09C1\u09A8, \u09A4\u09BE\u09B0\u09AA\u09B0 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1190
+ waiting: "\u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
1191
+ waitingApproval: "\u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
1192
+ expiresIn: "{time} \u09AA\u09B0\u09C7 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C7\u09B7 \u09B9\u09AC\u09C7",
1193
+ secured: "ZOREAL \u09A6\u09CD\u09AC\u09BE\u09B0\u09BE Proof-of-Human \u09AF\u09BE\u099A\u09BE\u0987\u0995\u09B0\u09A3",
1194
+ noIdTitle: "\u098F\u0996\u09A8\u09CB ZOREAL ID \u09A8\u09C7\u0987?",
1195
+ noIdBody: "\u0985\u09CD\u09AF\u09BE\u09AA \u09A1\u09BE\u0989\u09A8\u09B2\u09CB\u09A1 \u0995\u09B0\u09C7 \u09AC\u09BF\u09A8\u09BE\u09AE\u09C2\u09B2\u09CD\u09AF\u09C7 \u098F\u0995\u099F\u09BF \u09A4\u09C8\u09B0\u09BF \u0995\u09B0\u09A4\u09C7 \u098F\u0995\u0987 \u0995\u09CB\u09A1 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964 \u098F\u09A4\u09C7 \u09AE\u09BE\u09A4\u09CD\u09B0 \u098F\u0995 \u09AE\u09BF\u09A8\u09BF\u099F \u09B8\u09AE\u09AF\u09BC \u09B2\u09BE\u0997\u09C7\u0964",
1196
+ cancel: "\u09AC\u09BE\u09A4\u09BF\u09B2",
1197
+ close: "\u09AC\u09A8\u09CD\u09A7",
1198
+ qrAlt: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09BE\u09B0 \u099C\u09A8\u09CD\u09AF QR \u0995\u09CB\u09A1",
1199
+ buttonContinue: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u099A\u09BE\u09B2\u09BF\u09AF\u09BC\u09C7 \u09AF\u09BE\u09A8"
1200
+ },
1201
+ // Bosanski
1202
+ bs: {
1203
+ title: "Skenirajte za prijavu",
1204
+ titleIdentify: "Skenirajte da potvrdite svoj identitet",
1205
+ titlePresence: "Skenirajte da doka\u017Eete da ste stvarna osoba",
1206
+ titleApprove: "Odobrite na svom telefonu",
1207
+ bodyScan: "Skenirajte kamerom svog telefona ili aplikacijom ZOREAL ID.",
1208
+ bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
1209
+ bodyEnrolling: "Zavr\u0161ite pode\u0161avanje ZOREAL ID-a na svom telefonu, a zatim odobrite prijavu.",
1210
+ waiting: "\u010Ceka se skeniranje",
1211
+ waitingApproval: "\u010Ceka se odobrenje",
1212
+ expiresIn: "Isti\u010De za {time}",
1213
+ secured: "ZOREAL Proof-of-Human verifikacija",
1214
+ noIdTitle: "Nemate ZOREAL ID?",
1215
+ noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga napravite. Traje samo minutu.",
1216
+ cancel: "Otka\u017Ei",
1217
+ close: "Zatvori",
1218
+ qrAlt: "QR kod za prijavu putem ZOREAL-a",
1219
+ buttonContinue: "Nastavi sa ZOREAL-om"
1220
+ },
1221
+ // Čeština
1222
+ cs: {
1223
+ title: "P\u0159ihlaste se naskenov\xE1n\xEDm",
1224
+ titleIdentify: "Naskenujte pro ov\u011B\u0159en\xED toto\u017Enosti",
1225
+ titlePresence: "Naskenujte a proka\u017Ete, \u017Ee jste skute\u010Dn\xFD \u010Dlov\u011Bk",
1226
+ titleApprove: "Potvr\u010Fte v telefonu",
1227
+ bodyScan: "Naskenujte fotoapar\xE1tem telefonu nebo aplikac\xED ZOREAL ID.",
1228
+ bodyApprove: "Potvr\u010Fte p\u0159ihl\xE1\u0161en\xED v aplikaci ZOREAL ID.",
1229
+ bodyEnrolling: "Dokon\u010Dete nastaven\xED ZOREAL ID v telefonu a pot\xE9 potvr\u010Fte p\u0159ihl\xE1\u0161en\xED.",
1230
+ waiting: "\u010Cek\xE1n\xED na naskenov\xE1n\xED",
1231
+ waitingApproval: "\u010Cek\xE1n\xED na potvrzen\xED",
1232
+ expiresIn: "Vypr\u0161\xED za {time}",
1233
+ secured: "Ov\u011B\u0159en\xED Proof-of-Human od ZOREAL",
1234
+ noIdTitle: "Je\u0161t\u011B nem\xE1te ZOREAL ID?",
1235
+ noIdBody: "Naskenov\xE1n\xEDm stejn\xE9ho k\xF3du si st\xE1hnete aplikaci a zdarma vytvo\u0159\xEDte ZOREAL ID. Zabere to jen minutu.",
1236
+ cancel: "Zru\u0161it",
1237
+ close: "Zav\u0159\xEDt",
1238
+ qrAlt: "QR k\xF3d pro p\u0159ihl\xE1\u0161en\xED pomoc\xED ZOREAL",
1239
+ buttonContinue: "Pokra\u010Dovat se ZOREAL"
1240
+ },
1241
+ // Dansk
1242
+ da: {
1243
+ title: "Scan for at logge ind",
1244
+ titleIdentify: "Scan for at bekr\xE6fte din identitet",
1245
+ titlePresence: "Scan for at bevise, at du er et rigtigt menneske",
1246
+ titleApprove: "Godkend p\xE5 din telefon",
1247
+ bodyScan: "Scan med telefonens kamera eller ZOREAL ID-appen.",
1248
+ bodyApprove: "Godkend login i din ZOREAL ID-app.",
1249
+ bodyEnrolling: "F\xE6rdigg\xF8r ops\xE6tningen af ZOREAL ID p\xE5 din telefon, og godkend derefter login.",
1250
+ waiting: "Venter p\xE5 scanning",
1251
+ waitingApproval: "Venter p\xE5 godkendelse",
1252
+ expiresIn: "Udl\xF8ber om {time}",
1253
+ secured: "Proof-of-Human-verificering af ZOREAL",
1254
+ noIdTitle: "Har du ikke et ZOREAL ID endnu?",
1255
+ noIdBody: "Scan den samme kode for at hente appen og oprette et gratis. Det tager kun et minut.",
1256
+ cancel: "Annuller",
1257
+ close: "Luk",
1258
+ qrAlt: "QR-kode til at logge ind med ZOREAL",
1259
+ buttonContinue: "Forts\xE6t med ZOREAL"
1260
+ },
1261
+ // Ελληνικά
1262
+ el: {
1263
+ title: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7",
1264
+ titleIdentify: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 \u03C4\u03B1\u03C5\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2",
1265
+ titlePresence: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B4\u03B5\u03AF\u03BE\u03B5\u03C4\u03B5 \u03CC\u03C4\u03B9 \u03B5\u03AF\u03C3\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC\u03C2 \u03AC\u03BD\u03B8\u03C1\u03C9\u03C0\u03BF\u03C2",
1266
+ titleApprove: "\u0388\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2",
1267
+ bodyScan: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03BA\u03AC\u03BC\u03B5\u03C1\u03B1 \u03C4\u03BF\u03C5 \u03BA\u03B9\u03BD\u03B7\u03C4\u03BF\u03CD \u03C3\u03B1\u03C2 \u03AE \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
1268
+ bodyApprove: "\u0395\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
1269
+ bodyEnrolling: "\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03C4\u03BF\u03C5 ZOREAL ID \u03C3\u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03C0\u03B5\u03B9\u03C4\u03B1 \u03B5\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7.",
1270
+ waiting: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03C3\u03AC\u03C1\u03C9\u03C3\u03B7\u03C2",
1271
+ waitingApproval: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03AD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7\u03C2",
1272
+ expiresIn: "\u039B\u03AE\u03B3\u03B5\u03B9 \u03C3\u03B5 {time}",
1273
+ secured: "\u0395\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 Proof-of-Human \u03B1\u03C0\u03CC \u03C4\u03B7 ZOREAL",
1274
+ noIdTitle: "\u0394\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BA\u03CC\u03BC\u03B1 ZOREAL ID;",
1275
+ noIdBody: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03B1\u03C4\u03B5\u03B2\u03AC\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03B1\u03B9 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B4\u03C9\u03C1\u03B5\u03AC\u03BD. \u03A7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC.",
1276
+ cancel: "\u0386\u03BA\u03C5\u03C1\u03BF",
1277
+ close: "\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF",
1278
+ qrAlt: "\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 QR \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BC\u03B5 ZOREAL",
1279
+ buttonContinue: "\u03A3\u03C5\u03BD\u03AD\u03C7\u03B5\u03B9\u03B1 \u03BC\u03B5 ZOREAL"
1280
+ },
1281
+ // Español (LA)
1282
+ "es-419": {
1283
+ title: "Escanea para iniciar sesi\xF3n",
1284
+ titleIdentify: "Escanea para verificar tu identidad",
1285
+ titlePresence: "Escanea para demostrar que eres una persona real",
1286
+ titleApprove: "Aprueba desde tu celular",
1287
+ bodyScan: "Escanea con la c\xE1mara de tu celular o con la app ZOREAL ID.",
1288
+ bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
1289
+ bodyEnrolling: "Termina de configurar ZOREAL ID en tu celular y luego aprueba el inicio de sesi\xF3n.",
1290
+ waiting: "Esperando escaneo",
1291
+ waitingApproval: "Esperando aprobaci\xF3n",
1292
+ expiresIn: "Expira en {time}",
1293
+ secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
1294
+ noIdTitle: "\xBFTodav\xEDa no tienes ZOREAL ID?",
1295
+ noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear uno gratis. Solo toma un minuto.",
1296
+ cancel: "Cancelar",
1297
+ close: "Cerrar",
1298
+ qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
1299
+ buttonContinue: "Continuar con ZOREAL"
1300
+ },
1301
+ // Suomi
1302
+ fi: {
1303
+ title: "Kirjaudu sis\xE4\xE4n skannaamalla",
1304
+ titleIdentify: "Vahvista henkil\xF6llisyytesi skannaamalla",
1305
+ titlePresence: "Todista skannaamalla, ett\xE4 olet oikea ihminen",
1306
+ titleApprove: "Hyv\xE4ksy puhelimessasi",
1307
+ bodyScan: "Skannaa puhelimesi kameralla tai ZOREAL ID -sovelluksella.",
1308
+ bodyApprove: "Hyv\xE4ksy kirjautuminen ZOREAL ID -sovelluksessasi.",
1309
+ bodyEnrolling: "Viimeistele ZOREAL ID -sovelluksen k\xE4ytt\xF6\xF6notto puhelimellasi ja hyv\xE4ksy sitten kirjautuminen.",
1310
+ waiting: "Odotetaan skannausta",
1311
+ waitingApproval: "Odotetaan hyv\xE4ksynt\xE4\xE4",
1312
+ expiresIn: "Vanhenee {time} kuluttua",
1313
+ secured: "ZOREALin Proof-of-Human-vahvistus",
1314
+ noIdTitle: "Eik\xF6 sinulla ole viel\xE4 ZOREAL ID:t\xE4?",
1315
+ noIdBody: "Skannaa sama koodi ladataksesi sovelluksen ja luodaksesi tunnuksen ilmaiseksi. Se vie vain minuutin.",
1316
+ cancel: "Peruuta",
1317
+ close: "Sulje",
1318
+ qrAlt: "QR-koodi ZOREAL-kirjautumista varten",
1319
+ buttonContinue: "Jatka ZOREALilla"
1320
+ },
1321
+ // עברית
1322
+ he: {
1323
+ title: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8",
1324
+ titleIdentify: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D0\u05DE\u05EA \u05D0\u05EA \u05D6\u05D4\u05D5\u05EA\u05DA",
1325
+ titlePresence: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05DB\u05D9\u05D7 \u05E9\u05D0\u05EA\u05D4 \u05D0\u05D3\u05DD \u05D0\u05DE\u05D9\u05EA\u05D9",
1326
+ titleApprove: "\u05D0\u05E9\u05E8 \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA",
1327
+ bodyScan: "\u05E1\u05E8\u05D5\u05E7 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05DE\u05E6\u05DC\u05DE\u05EA \u05D4\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA \u05D0\u05D5 \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID.",
1328
+ bodyApprove: "\u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID \u05E9\u05DC\u05DA.",
1329
+ bodyEnrolling: "\u05E1\u05D9\u05D9\u05DD \u05DC\u05D4\u05D2\u05D3\u05D9\u05E8 \u05D0\u05EA ZOREAL ID \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA, \u05D5\u05D0\u05D6 \u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA.",
1330
+ waiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E1\u05E8\u05D9\u05E7\u05D4",
1331
+ waitingApproval: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8",
1332
+ expiresIn: "\u05D9\u05E4\u05D5\u05D2 \u05D1\u05E2\u05D5\u05D3 {time}",
1333
+ secured: "\u05D0\u05D9\u05DE\u05D5\u05EA Proof-of-Human \u05DE\u05D1\u05D9\u05EA ZOREAL",
1334
+ noIdTitle: "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05DC\u05DA ZOREAL ID?",
1335
+ noIdBody: "\u05E1\u05E8\u05D5\u05E7 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D5 \u05D4\u05E7\u05D5\u05D3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D5\u05DC\u05D9\u05E6\u05D5\u05E8 \u05D0\u05D7\u05D3 \u05D1\u05D7\u05D9\u05E0\u05DD. \u05D6\u05D4 \u05DC\u05D5\u05E7\u05D7 \u05E8\u05E7 \u05D3\u05E7\u05D4.",
1336
+ cancel: "\u05D1\u05D9\u05D8\u05D5\u05DC",
1337
+ close: "\u05E1\u05D2\u05D5\u05E8",
1338
+ qrAlt: "\u05E7\u05D5\u05D3 QR \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E2\u05DD ZOREAL",
1339
+ buttonContinue: "\u05D4\u05DE\u05E9\u05DA \u05E2\u05DD ZOREAL"
1340
+ },
1341
+ // Hrvatski
1342
+ hr: {
1343
+ title: "Skenirajte za prijavu",
1344
+ titleIdentify: "Skenirajte za potvrdu identiteta",
1345
+ titlePresence: "Skenirajte kako biste dokazali da ste stvarna osoba",
1346
+ titleApprove: "Odobrite na svom mobitelu",
1347
+ bodyScan: "Skenirajte kamerom svog mobitela ili aplikacijom ZOREAL ID.",
1348
+ bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
1349
+ bodyEnrolling: "Dovr\u0161ite postavljanje ZOREAL ID-a na svom mobitelu, a zatim odobrite prijavu.",
1350
+ waiting: "\u010Ceka se skeniranje",
1351
+ waitingApproval: "\u010Ceka se odobrenje",
1352
+ expiresIn: "Isti\u010De za {time}",
1353
+ secured: "ZOREAL Proof-of-Human provjera",
1354
+ noIdTitle: "Nemate ZOREAL ID?",
1355
+ noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga izradite. Traje samo minutu.",
1356
+ cancel: "Odustani",
1357
+ close: "Zatvori",
1358
+ qrAlt: "QR kod za prijavu putem ZOREAL-a",
1359
+ buttonContinue: "Nastavi sa ZOREAL-om"
1360
+ },
1361
+ // Magyar
1362
+ hu: {
1363
+ title: "Bejelentkez\xE9s beolvas\xE1ssal",
1364
+ titleIdentify: "Olvassa be a szem\xE9lyazonoss\xE1ga igazol\xE1s\xE1hoz",
1365
+ titlePresence: "Olvassa be annak igazol\xE1s\xE1hoz, hogy val\xF3di ember",
1366
+ titleApprove: "J\xF3v\xE1hagy\xE1s a telefonj\xE1n",
1367
+ bodyScan: "Olvassa be a telefonja kamer\xE1j\xE1val, vagy a ZOREAL ID alkalmaz\xE1ssal.",
1368
+ bodyApprove: "Hagyja j\xF3v\xE1 a bejelentkez\xE9st a ZOREAL ID alkalmaz\xE1sban.",
1369
+ bodyEnrolling: "Fejezze be a ZOREAL ID be\xE1ll\xEDt\xE1s\xE1t a telefonj\xE1n, majd hagyja j\xF3v\xE1 a bejelentkez\xE9st.",
1370
+ waiting: "V\xE1rakoz\xE1s beolvas\xE1sra",
1371
+ waitingApproval: "V\xE1rakoz\xE1s j\xF3v\xE1hagy\xE1sra",
1372
+ expiresIn: "Lej\xE1r {time} m\xFAlva",
1373
+ secured: "Proof-of-Human hiteles\xEDt\xE9s a ZOREAL-t\xF3l",
1374
+ noIdTitle: "M\xE9g nincs ZOREAL ID-je?",
1375
+ noIdBody: "Olvassa be ugyanazt a k\xF3dot az alkalmaz\xE1s let\xF6lt\xE9s\xE9hez, \xE9s hozzon l\xE9tre egyet ingyenesen. Mind\xF6ssze egy percet vesz ig\xE9nybe.",
1376
+ cancel: "M\xE9gse",
1377
+ close: "Bez\xE1r\xE1s",
1378
+ qrAlt: "QR-k\xF3d a ZOREAL-lal val\xF3 bejelentkez\xE9shez",
1379
+ buttonContinue: "Folytat\xE1s a ZOREAL-lal"
1380
+ },
1381
+ // Bahasa Indonesia
1382
+ id: {
1383
+ title: "Pindai untuk masuk",
1384
+ titleIdentify: "Pindai untuk memverifikasi identitas Anda",
1385
+ titlePresence: "Pindai untuk membuktikan bahwa Anda manusia sungguhan",
1386
+ titleApprove: "Setujui di ponsel Anda",
1387
+ bodyScan: "Pindai dengan kamera ponsel atau aplikasi ZOREAL ID.",
1388
+ bodyApprove: "Setujui proses masuk di aplikasi ZOREAL ID Anda.",
1389
+ bodyEnrolling: "Selesaikan pengaturan ZOREAL ID di ponsel Anda, lalu setujui proses masuk.",
1390
+ waiting: "Menunggu pemindaian",
1391
+ waitingApproval: "Menunggu persetujuan",
1392
+ expiresIn: "Berakhir dalam {time}",
1393
+ secured: "Verifikasi Proof-of-Human oleh ZOREAL",
1394
+ noIdTitle: "Belum punya ZOREAL ID?",
1395
+ noIdBody: "Pindai kode yang sama untuk mengunduh aplikasi dan membuat akun secara gratis. Hanya butuh waktu satu menit.",
1396
+ cancel: "Batal",
1397
+ close: "Tutup",
1398
+ qrAlt: "Kode QR untuk masuk dengan ZOREAL",
1399
+ buttonContinue: "Lanjutkan dengan ZOREAL"
1400
+ },
1401
+ // Italiano
1402
+ it: {
1403
+ title: "Scansiona per accedere",
1404
+ titleIdentify: "Scansiona per verificare la tua identit\xE0",
1405
+ titlePresence: "Scansiona per dimostrare di essere una persona reale",
1406
+ titleApprove: "Approva sul tuo telefono",
1407
+ bodyScan: "Scansiona con la fotocamera del telefono o con l'app ZOREAL ID.",
1408
+ bodyApprove: "Approva l'accesso nell'app ZOREAL ID.",
1409
+ bodyEnrolling: "Completa la configurazione di ZOREAL ID sul telefono, poi approva l'accesso.",
1410
+ waiting: "In attesa della scansione",
1411
+ waitingApproval: "In attesa di approvazione",
1412
+ expiresIn: "Scade tra {time}",
1413
+ secured: "Verifica Proof-of-Human di ZOREAL",
1414
+ noIdTitle: "Non hai ancora uno ZOREAL ID?",
1415
+ noIdBody: "Scansiona lo stesso codice per scaricare l'app e crearne uno gratis. Basta un minuto.",
1416
+ cancel: "Annulla",
1417
+ close: "Chiudi",
1418
+ qrAlt: "Codice QR per accedere con ZOREAL",
1419
+ buttonContinue: "Continua con ZOREAL"
1420
+ },
1421
+ // Bahasa Melayu
1422
+ ms: {
1423
+ title: "Imbas untuk log masuk",
1424
+ titleIdentify: "Imbas untuk mengesahkan identiti anda",
1425
+ titlePresence: "Imbas untuk membuktikan anda manusia sebenar",
1426
+ titleApprove: "Luluskan di telefon anda",
1427
+ bodyScan: "Imbas dengan kamera telefon atau aplikasi ZOREAL ID.",
1428
+ bodyApprove: "Luluskan log masuk dalam aplikasi ZOREAL ID anda.",
1429
+ bodyEnrolling: "Selesaikan persediaan ZOREAL ID di telefon anda, kemudian luluskan log masuk.",
1430
+ waiting: "Menunggu imbasan",
1431
+ waitingApproval: "Menunggu kelulusan",
1432
+ expiresIn: "Tamat tempoh dalam {time}",
1433
+ secured: "Pengesahan Proof-of-Human oleh ZOREAL",
1434
+ noIdTitle: "Belum ada ZOREAL ID?",
1435
+ noIdBody: "Imbas kod yang sama untuk memuat turun aplikasi dan cipta satu secara percuma. Hanya mengambil masa seminit.",
1436
+ cancel: "Batal",
1437
+ close: "Tutup",
1438
+ qrAlt: "Kod QR untuk log masuk dengan ZOREAL",
1439
+ buttonContinue: "Teruskan dengan ZOREAL"
1440
+ },
1441
+ // Nederlands
1442
+ nl: {
1443
+ title: "Scan om in te loggen",
1444
+ titleIdentify: "Scan om je identiteit te verifi\xEBren",
1445
+ titlePresence: "Scan om te bewijzen dat je een echt mens bent",
1446
+ titleApprove: "Keur goed op je telefoon",
1447
+ bodyScan: "Scan met de camera van je telefoon of de ZOREAL ID-app.",
1448
+ bodyApprove: "Keur de aanmelding goed in je ZOREAL ID-app.",
1449
+ bodyEnrolling: "Rond het instellen van ZOREAL ID op je telefoon af en keur daarna de aanmelding goed.",
1450
+ waiting: "Wachten op scan",
1451
+ waitingApproval: "Wachten op goedkeuring",
1452
+ expiresIn: "Verloopt over {time}",
1453
+ secured: "Proof-of-Human-verificatie door ZOREAL",
1454
+ noIdTitle: "Nog geen ZOREAL ID?",
1455
+ noIdBody: "Scan dezelfde code om de app te downloaden en gratis een account aan te maken. Dit duurt maar een minuut.",
1456
+ cancel: "Annuleren",
1457
+ close: "Sluiten",
1458
+ qrAlt: "QR-code om in te loggen met ZOREAL",
1459
+ buttonContinue: "Doorgaan met ZOREAL"
1460
+ },
1461
+ // Norsk
1462
+ no: {
1463
+ title: "Skann for \xE5 logge inn",
1464
+ titleIdentify: "Skann for \xE5 bekrefte identiteten din",
1465
+ titlePresence: "Skann for \xE5 bevise at du er et ekte menneske",
1466
+ titleApprove: "Godkjenn p\xE5 telefonen din",
1467
+ bodyScan: "Skann med telefonens kamera eller ZOREAL ID-appen.",
1468
+ bodyApprove: "Godkjenn innloggingen i ZOREAL ID-appen din.",
1469
+ bodyEnrolling: "Fullf\xF8r oppsettet av ZOREAL ID p\xE5 telefonen din, og godkjenn deretter innloggingen.",
1470
+ waiting: "Venter p\xE5 skanning",
1471
+ waitingApproval: "Venter p\xE5 godkjenning",
1472
+ expiresIn: "Utl\xF8per om {time}",
1473
+ secured: "Proof-of-Human-verifisering av ZOREAL",
1474
+ noIdTitle: "Har du ikke ZOREAL ID enn\xE5?",
1475
+ noIdBody: "Skann den samme koden for \xE5 laste ned appen og opprette en gratis. Det tar bare et minutt.",
1476
+ cancel: "Avbryt",
1477
+ close: "Lukk",
1478
+ qrAlt: "QR-kode for \xE5 logge inn med ZOREAL",
1479
+ buttonContinue: "Fortsett med ZOREAL"
1480
+ },
1481
+ // Polski
1482
+ pl: {
1483
+ title: "Zeskanuj, aby si\u0119 zalogowa\u0107",
1484
+ titleIdentify: "Zeskanuj, aby zweryfikowa\u0107 swoj\u0105 to\u017Csamo\u015B\u0107",
1485
+ titlePresence: "Zeskanuj, aby udowodni\u0107, \u017Ce jeste\u015B prawdziwym cz\u0142owiekiem",
1486
+ titleApprove: "Zatwierd\u017A w telefonie",
1487
+ bodyScan: "Zeskanuj aparatem telefonu lub aplikacj\u0105 ZOREAL ID.",
1488
+ bodyApprove: "Zatwierd\u017A logowanie w aplikacji ZOREAL ID.",
1489
+ bodyEnrolling: "Doko\u0144cz konfiguracj\u0119 ZOREAL ID w telefonie, a nast\u0119pnie zatwierd\u017A logowanie.",
1490
+ waiting: "Czekanie na skan",
1491
+ waitingApproval: "Czekanie na zatwierdzenie",
1492
+ expiresIn: "Wygasa za {time}",
1493
+ secured: "Weryfikacja Proof-of-Human od ZOREAL",
1494
+ noIdTitle: "Nie masz jeszcze ZOREAL ID?",
1495
+ noIdBody: "Zeskanuj ten sam kod, aby pobra\u0107 aplikacj\u0119 i bezp\u0142atnie utworzy\u0107 ZOREAL ID. Zajmie to tylko minut\u0119.",
1496
+ cancel: "Anuluj",
1497
+ close: "Zamknij",
1498
+ qrAlt: "Kod QR do logowania za pomoc\u0105 ZOREAL",
1499
+ buttonContinue: "Kontynuuj z ZOREAL"
1500
+ },
1501
+ // Português (BR)
1502
+ "pt-br": {
1503
+ title: "Escaneie para entrar",
1504
+ titleIdentify: "Escaneie para verificar sua identidade",
1505
+ titlePresence: "Escaneie para provar que voc\xEA \xE9 uma pessoa real",
1506
+ titleApprove: "Aprove no seu celular",
1507
+ bodyScan: "Escaneie com a c\xE2mera do seu celular ou com o app ZOREAL ID.",
1508
+ bodyApprove: "Aprove o login no app ZOREAL ID.",
1509
+ bodyEnrolling: "Termine de configurar o ZOREAL ID no seu celular e depois aprove o login.",
1510
+ waiting: "Aguardando escaneamento",
1511
+ waitingApproval: "Aguardando aprova\xE7\xE3o",
1512
+ expiresIn: "Expira em {time}",
1513
+ secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
1514
+ noIdTitle: "Ainda n\xE3o tem um ZOREAL ID?",
1515
+ noIdBody: "Escaneie o mesmo c\xF3digo para baixar o app e criar um de gra\xE7a. Leva s\xF3 um minuto.",
1516
+ cancel: "Cancelar",
1517
+ close: "Fechar",
1518
+ qrAlt: "C\xF3digo QR para entrar com ZOREAL",
1519
+ buttonContinue: "Continuar com ZOREAL"
1520
+ },
1521
+ // Română
1522
+ ro: {
1523
+ title: "Scana\u021Bi pentru conectare",
1524
+ titleIdentify: "Scana\u021Bi pentru a v\u0103 verifica identitatea",
1525
+ titlePresence: "Scana\u021Bi pentru a dovedi c\u0103 sunte\u021Bi o persoan\u0103 real\u0103",
1526
+ titleApprove: "Aproba\u021Bi de pe telefon",
1527
+ bodyScan: "Scana\u021Bi cu camera telefonului sau cu aplica\u021Bia ZOREAL ID.",
1528
+ bodyApprove: "Aproba\u021Bi conectarea \xEEn aplica\u021Bia ZOREAL ID.",
1529
+ bodyEnrolling: "Finaliza\u021Bi configurarea ZOREAL ID pe telefon, apoi aproba\u021Bi conectarea.",
1530
+ waiting: "Se a\u0219teapt\u0103 scanarea",
1531
+ waitingApproval: "Se a\u0219teapt\u0103 aprobarea",
1532
+ expiresIn: "Expir\u0103 \xEEn {time}",
1533
+ secured: "Verificare Proof-of-Human de la ZOREAL",
1534
+ noIdTitle: "Nu ave\u021Bi \xEEnc\u0103 un ZOREAL ID?",
1535
+ noIdBody: "Scana\u021Bi acela\u0219i cod pentru a desc\u0103rca aplica\u021Bia \u0219i a crea unul gratuit. Dureaz\u0103 doar un minut.",
1536
+ cancel: "Anuleaz\u0103",
1537
+ close: "\xCEnchide",
1538
+ qrAlt: "Cod QR pentru conectare cu ZOREAL",
1539
+ buttonContinue: "Continua\u021Bi cu ZOREAL"
1540
+ },
1541
+ // Српски
1542
+ sr: {
1543
+ title: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443",
1544
+ titleIdentify: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u043F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u0441\u0432\u043E\u0458 \u0438\u0434\u0435\u043D\u0442\u0438\u0442\u0435\u0442",
1545
+ titlePresence: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043F\u0440\u0430\u0432\u0430 \u043E\u0441\u043E\u0431\u0430",
1546
+ titleApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443",
1547
+ bodyScan: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u043C \u0441\u0432\u043E\u0433 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u043E\u043C ZOREAL ID.",
1548
+ bodyApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u0443 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0438 ZOREAL ID.",
1549
+ bodyEnrolling: "\u0414\u043E\u0432\u0440\u0448\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 ZOREAL ID-\u0430 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443, \u043F\u0430 \u043E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443.",
1550
+ waiting: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u0441\u043A\u0435\u043D\u0438\u0440\u0430\u045A\u0435",
1551
+ waitingApproval: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u043E\u0434\u043E\u0431\u0440\u0435\u045A\u0435",
1552
+ expiresIn: "\u0418\u0441\u0442\u0438\u0447\u0435 \u0437\u0430 {time}",
1553
+ secured: "ZOREAL Proof-of-Human \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0430",
1554
+ noIdTitle: "\u041D\u0435\u043C\u0430\u0442\u0435 ZOREAL ID?",
1555
+ noIdBody: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0438\u0441\u0442\u0438 \u043A\u043E\u0434 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0438 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E \u0433\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435. \u0422\u0440\u0430\u0458\u0435 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442.",
1556
+ cancel: "\u041E\u0442\u043A\u0430\u0436\u0438",
1557
+ close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
1558
+ qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043F\u0440\u0435\u043A\u043E ZOREAL-\u0430",
1559
+ buttonContinue: "\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 ZOREAL-\u043E\u043C"
1560
+ },
1561
+ // ไทย
1562
+ th: {
1563
+ title: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
1564
+ titleIdentify: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
1565
+ titlePresence: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E1E\u0E34\u0E2A\u0E39\u0E08\u0E19\u0E4C\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E40\u0E1B\u0E47\u0E19\u0E21\u0E19\u0E38\u0E29\u0E22\u0E4C\u0E08\u0E23\u0E34\u0E07",
1566
+ titleApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
1567
+ bodyScan: "\u0E2A\u0E41\u0E01\u0E19\u0E14\u0E49\u0E27\u0E22\u0E01\u0E25\u0E49\u0E2D\u0E07\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E2B\u0E23\u0E37\u0E2D\u0E41\u0E2D\u0E1B ZOREAL ID",
1568
+ bodyApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E43\u0E19\u0E41\u0E2D\u0E1B ZOREAL ID \u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
1569
+ bodyEnrolling: "\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32 ZOREAL ID \u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E43\u0E2B\u0E49\u0E40\u0E2A\u0E23\u0E47\u0E08\u0E2A\u0E34\u0E49\u0E19 \u0E41\u0E25\u0E49\u0E27\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
1570
+ waiting: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2A\u0E41\u0E01\u0E19",
1571
+ waitingApproval: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34",
1572
+ expiresIn: "\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38\u0E43\u0E19 {time}",
1573
+ secured: "\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19 Proof-of-Human \u0E42\u0E14\u0E22 ZOREAL",
1574
+ noIdTitle: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35 ZOREAL ID \u0E43\u0E0A\u0E48\u0E44\u0E2B\u0E21",
1575
+ noIdBody: "\u0E2A\u0E41\u0E01\u0E19\u0E42\u0E04\u0E49\u0E14\u0E40\u0E14\u0E35\u0E22\u0E27\u0E01\u0E31\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E41\u0E2D\u0E1B\u0E41\u0E25\u0E30\u0E2A\u0E23\u0E49\u0E32\u0E07\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E1F\u0E23\u0E35 \u0E43\u0E0A\u0E49\u0E40\u0E27\u0E25\u0E32\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E19\u0E32\u0E17\u0E35\u0E40\u0E14\u0E35\u0E22\u0E27",
1576
+ cancel: "\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",
1577
+ close: "\u0E1B\u0E34\u0E14",
1578
+ qrAlt: "\u0E04\u0E34\u0E27\u0E2D\u0E32\u0E23\u0E4C\u0E42\u0E04\u0E49\u0E14\u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E14\u0E49\u0E27\u0E22 ZOREAL",
1579
+ buttonContinue: "\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E15\u0E48\u0E2D\u0E14\u0E49\u0E27\u0E22 ZOREAL"
1580
+ },
1581
+ // Tagalog
1582
+ tl: {
1583
+ title: "I-scan para mag-sign in",
1584
+ titleIdentify: "I-scan para i-verify ang iyong pagkakakilanlan",
1585
+ titlePresence: "I-scan para patunayang tunay kang tao",
1586
+ titleApprove: "I-approve sa iyong telepono",
1587
+ bodyScan: "I-scan gamit ang camera ng iyong telepono o ang ZOREAL ID app.",
1588
+ bodyApprove: "I-approve ang login sa iyong ZOREAL ID app.",
1589
+ bodyEnrolling: "Tapusin muna ang pag-set up ng ZOREAL ID sa iyong telepono, pagkatapos ay i-approve ang login.",
1590
+ waiting: "Naghihintay ng scan",
1591
+ waitingApproval: "Naghihintay ng approval",
1592
+ expiresIn: "Mag-e-expire sa {time}",
1593
+ secured: "Proof-of-Human verification mula sa ZOREAL",
1594
+ noIdTitle: "Wala ka pang ZOREAL ID?",
1595
+ noIdBody: "I-scan ang parehong code para i-download ang app at gumawa ng iyong ZOREAL ID nang libre. Isang minuto lang ito.",
1596
+ cancel: "Kanselahin",
1597
+ close: "Isara",
1598
+ qrAlt: "QR code para mag-sign in gamit ang ZOREAL",
1599
+ buttonContinue: "Magpatuloy gamit ang ZOREAL"
1600
+ },
1601
+ // Türkçe
1602
+ tr: {
1603
+ title: "Giri\u015F i\xE7in taray\u0131n",
1604
+ titleIdentify: "Kimli\u011Finizi do\u011Frulamak i\xE7in taray\u0131n",
1605
+ titlePresence: "Ger\xE7ek bir insan oldu\u011Funuzu kan\u0131tlamak i\xE7in taray\u0131n",
1606
+ titleApprove: "Telefonunuzdan onaylay\u0131n",
1607
+ bodyScan: "Telefonunuzun kameras\u0131yla veya ZOREAL ID uygulamas\u0131yla taray\u0131n.",
1608
+ bodyApprove: "Giri\u015Fi ZOREAL ID uygulaman\u0131zdan onaylay\u0131n.",
1609
+ bodyEnrolling: "Telefonunuzda ZOREAL ID kurulumunu tamamlay\u0131n, ard\u0131ndan giri\u015Fi onaylay\u0131n.",
1610
+ waiting: "Tarama bekleniyor",
1611
+ waitingApproval: "Onay bekleniyor",
1612
+ expiresIn: "{time} i\xE7inde sona erer",
1613
+ secured: "ZOREAL taraf\u0131ndan Proof-of-Human do\u011Frulamas\u0131",
1614
+ noIdTitle: "Hen\xFCz ZOREAL ID'niz yok mu?",
1615
+ noIdBody: "Uygulamay\u0131 indirmek ve \xFCcretsiz bir tane olu\u015Fturmak i\xE7in ayn\u0131 kodu taray\u0131n. Sadece bir dakikan\u0131z\u0131 al\u0131r.",
1616
+ cancel: "\u0130ptal",
1617
+ close: "Kapat",
1618
+ qrAlt: "ZOREAL ile giri\u015F yapmak i\xE7in QR kodu",
1619
+ buttonContinue: "ZOREAL ile devam et"
1620
+ },
1621
+ // Українська
1622
+ uk: {
1623
+ title: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443",
1624
+ titleIdentify: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438 \u043E\u0441\u043E\u0431\u0443",
1625
+ titlePresence: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u0434\u043E\u0432\u0435\u0441\u0442\u0438, \u0449\u043E \u0432\u0438 \u0441\u043F\u0440\u0430\u0432\u0436\u043D\u044F \u043B\u044E\u0434\u0438\u043D\u0430",
1626
+ titleApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456",
1627
+ bodyScan: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u044E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443 \u0430\u0431\u043E \u0434\u043E\u0434\u0430\u0442\u043A\u043E\u043C ZOREAL ID.",
1628
+ bodyApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434 \u0443 \u0434\u043E\u0434\u0430\u0442\u043A\u0443 ZOREAL ID.",
1629
+ bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456, \u0430 \u043F\u043E\u0442\u0456\u043C \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434.",
1630
+ waiting: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
1631
+ waitingApproval: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F",
1632
+ expiresIn: "\u0421\u043F\u043B\u0438\u0432\u0430\u0454 \u0447\u0435\u0440\u0435\u0437 {time}",
1633
+ secured: "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 Proof-of-Human \u0432\u0456\u0434 ZOREAL",
1634
+ noIdTitle: "\u0429\u0435 \u043D\u0435\u043C\u0430\u0454 ZOREAL ID?",
1635
+ noIdBody: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0442\u043E\u0439 \u0441\u0430\u043C\u0438\u0439 \u043A\u043E\u0434, \u0449\u043E\u0431 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u0456 \u0431\u0435\u0437\u043A\u043E\u0448\u0442\u043E\u0432\u043D\u043E \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0439\u043E\u0433\u043E. \u0426\u0435 \u0437\u0430\u0439\u043C\u0435 \u043B\u0438\u0448\u0435 \u0445\u0432\u0438\u043B\u0438\u043D\u0443.",
1636
+ cancel: "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
1637
+ close: "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
1638
+ qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
1639
+ buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0437 ZOREAL"
1640
+ },
1641
+ // اردو
1642
+ ur: {
1643
+ title: "\u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1644
+ titleIdentify: "\u0627\u067E\u0646\u06CC \u0634\u0646\u0627\u062E\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1645
+ titlePresence: "\u06CC\u06C1 \u062B\u0627\u0628\u062A \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA \u06A9\u06C1 \u0622\u067E \u0627\u06CC\u06A9 \u062D\u0642\u06CC\u0642\u06CC \u0627\u0646\u0633\u0627\u0646 \u06C1\u06CC\u06BA",
1646
+ titleApprove: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA",
1647
+ bodyScan: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u06A9\u06D2 \u06A9\u06CC\u0645\u0631\u06D2 \u06CC\u0627 ZOREAL ID \u0627\u06CC\u067E \u0633\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4",
1648
+ bodyApprove: "\u0627\u067E\u0646\u06CC ZOREAL ID \u0627\u06CC\u067E \u0645\u06CC\u06BA \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1649
+ bodyEnrolling: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 ZOREAL ID \u06A9\u06CC \u0633\u06CC\u0679 \u0627\u067E \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u060C \u067E\u06BE\u0631 \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1650
+ waiting: "\u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1651
+ waitingApproval: "\u0645\u0646\u0638\u0648\u0631\u06CC \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1652
+ expiresIn: "{time} \u0645\u06CC\u06BA \u062E\u062A\u0645 \u06C1\u0648\u06AF\u0627",
1653
+ secured: "ZOREAL \u06A9\u06CC \u062C\u0627\u0646\u0628 \u0633\u06D2 Proof-of-Human \u062A\u0635\u062F\u06CC\u0642",
1654
+ noIdTitle: "\u0627\u0628\u06BE\u06CC \u062A\u06A9 ZOREAL ID \u0646\u06C1\u06CC\u06BA \u06C1\u06D2\u061F",
1655
+ noIdBody: "\u0627\u06CC\u067E \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u0631\u0646\u06D2 \u0627\u0648\u0631 \u0645\u0641\u062A \u0645\u06CC\u06BA \u0627\u06CC\u06A9 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0648\u06C1\u06CC \u06A9\u0648\u0688 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4 \u0627\u0633 \u0645\u06CC\u06BA \u0635\u0631\u0641 \u0627\u06CC\u06A9 \u0645\u0646\u0679 \u0644\u06AF\u062A\u0627 \u06C1\u06D2\u06D4",
1656
+ cancel: "\u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA",
1657
+ close: "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
1658
+ qrAlt: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 QR \u06A9\u0648\u0688",
1659
+ buttonContinue: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u06CC\u06BA"
1660
+ },
1661
+ // Tiếng Việt
1662
+ vi: {
1663
+ title: "Qu\xE9t \u0111\u1EC3 \u0111\u0103ng nh\u1EADp",
1664
+ titleIdentify: "Qu\xE9t \u0111\u1EC3 x\xE1c minh danh t\xEDnh c\u1EE7a b\u1EA1n",
1665
+ titlePresence: "Qu\xE9t \u0111\u1EC3 ch\u1EE9ng minh b\u1EA1n l\xE0 ng\u01B0\u1EDDi th\u1EADt",
1666
+ titleApprove: "Ph\xEA duy\u1EC7t tr\xEAn \u0111i\u1EC7n tho\u1EA1i c\u1EE7a b\u1EA1n",
1667
+ bodyScan: "Qu\xE9t b\u1EB1ng camera \u0111i\u1EC7n tho\u1EA1i ho\u1EB7c \u1EE9ng d\u1EE5ng ZOREAL ID.",
1668
+ bodyApprove: "Ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp trong \u1EE9ng d\u1EE5ng ZOREAL ID c\u1EE7a b\u1EA1n.",
1669
+ bodyEnrolling: "Ho\xE0n t\u1EA5t thi\u1EBFt l\u1EADp ZOREAL ID tr\xEAn \u0111i\u1EC7n tho\u1EA1i, sau \u0111\xF3 ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp.",
1670
+ waiting: "\u0110ang ch\u1EDD qu\xE9t m\xE3",
1671
+ waitingApproval: "\u0110ang ch\u1EDD ph\xEA duy\u1EC7t",
1672
+ expiresIn: "H\u1EBFt h\u1EA1n sau {time}",
1673
+ secured: "X\xE1c minh Proof-of-Human b\u1EDFi ZOREAL",
1674
+ noIdTitle: "Ch\u01B0a c\xF3 ZOREAL ID?",
1675
+ noIdBody: "Qu\xE9t c\xF9ng m\xE3 n\xE0y \u0111\u1EC3 t\u1EA3i \u1EE9ng d\u1EE5ng v\xE0 t\u1EA1o t\xE0i kho\u1EA3n mi\u1EC5n ph\xED. Ch\u1EC9 m\u1EA5t m\u1ED9t ph\xFAt.",
1676
+ cancel: "H\u1EE7y",
1677
+ close: "\u0110\xF3ng",
1678
+ qrAlt: "M\xE3 QR \u0111\u1EC3 \u0111\u0103ng nh\u1EADp b\u1EB1ng ZOREAL",
1679
+ buttonContinue: "Ti\u1EBFp t\u1EE5c v\u1EDBi ZOREAL"
1680
+ }
1681
+ };
1682
+ var RTL = /* @__PURE__ */ new Set(["ar", "he", "iw", "ur"]);
1683
+ var ALIASES = {
1684
+ nb: "no",
1685
+ // Bokmål — what we actually wrote
1686
+ nn: "no",
1687
+ // Nynorsk reader, served Bokmål: closer than English
1688
+ fil: "tl",
1689
+ // Filipino / Tagalog
1690
+ iw: "he",
1691
+ // superseded code for Hebrew, still emitted by some platforms
1692
+ in: "id"
1693
+ // superseded code for Indonesian
1694
+ };
1695
+ var LATAM = /* @__PURE__ */ new Set([
1696
+ "ar",
1697
+ "bo",
1698
+ "cl",
1699
+ "co",
1700
+ "cr",
1701
+ "cu",
1702
+ "do",
1703
+ "ec",
1704
+ "gt",
1705
+ "hn",
1706
+ "mx",
1707
+ "ni",
1708
+ "pa",
1709
+ "pe",
1710
+ "pr",
1711
+ "py",
1712
+ "sv",
1713
+ "uy",
1714
+ "ve",
1715
+ "419"
1716
+ ]);
1717
+ function lookup(locale) {
1718
+ const tag = locale.toLowerCase().replace(/_/g, "-");
1719
+ const parts = tag.split("-");
1720
+ const primary = ALIASES[parts[0]] ?? parts[0];
1721
+ const region = parts[1];
1722
+ if (primary === "zh") {
1723
+ const simplified = /(^|-)(hans|cn|sg|my)(-|$)/.test(tag);
1724
+ return TRANSLATIONS[simplified ? "zhs" : "zht"];
1725
+ }
1726
+ if (primary === "es" && region && LATAM.has(region)) return TRANSLATIONS["es-419"];
1727
+ if (primary === "pt" && region === "br") return TRANSLATIONS["pt-br"];
1728
+ return TRANSLATIONS[tag] ?? TRANSLATIONS[primary];
1729
+ }
1730
+ function browserLocales() {
1731
+ if (typeof navigator === "undefined") return [];
1732
+ const nav = navigator;
1733
+ if (nav.languages && nav.languages.length) return [...nav.languages];
1734
+ return nav.language ? [nav.language] : [];
1601
1735
  }
1602
- @media (prefers-reduced-motion: reduce) {
1603
- .${PREFIX2}-ring-svg rect { animation: none; stroke-dasharray: none; opacity: 0.45; }
1604
- .${PREFIX2}-ring-halo, .${PREFIX2}-ring-head { display: none; }
1736
+ function strings(locale) {
1737
+ if (locale) return lookup(locale) ?? en;
1738
+ for (const candidate of browserLocales()) {
1739
+ const hit = lookup(candidate);
1740
+ if (hit) return hit;
1741
+ }
1742
+ return en;
1605
1743
  }
1606
-
1607
-
1608
- @media (prefers-reduced-motion: reduce) {
1609
- .${PREFIX2}-scrim,
1610
- .${PREFIX2}-card,
1611
- .${PREFIX2}-qr-overlay { animation: none }
1612
- .${PREFIX2}-dot i:first-child { animation: none; opacity: 0.35 }
1613
- .${PREFIX2}-qr,
1614
- .${PREFIX2}-cancel,
1615
- .${PREFIX2}-close,
1616
- .${PREFIX2}-timer { transition: none }
1617
- /* No travelling light; the edge keeps its dim static glow instead. */
1618
- .${PREFIX2}-qr-beam::after,
1619
- .${PREFIX2}-qr-beam-glow-band::after { animation: none; opacity: 0 }
1620
- .${PREFIX2}-qr-beam::before { opacity: 0.55 }
1621
- .${PREFIX2}-qr-beam-glow-band::before { opacity: 0.7 }
1744
+ function isRtl(locale) {
1745
+ const tag = locale ?? browserLocales()[0];
1746
+ if (!tag) return false;
1747
+ return RTL.has(tag.toLowerCase().replace(/_/g, "-").split("-")[0]);
1622
1748
  }
1623
- `;
1624
- function ensureStyles() {
1625
- if (typeof document === "undefined") return;
1626
- if (document.getElementById(STYLE_ELEMENT_ID)) return;
1627
- const el2 = document.createElement("style");
1628
- el2.id = STYLE_ELEMENT_ID;
1629
- el2.textContent = CSS;
1630
- document.head.appendChild(el2);
1749
+ function interpolate(template, time) {
1750
+ return template.replace("{time}", time);
1631
1751
  }
1632
1752
 
1633
1753
  // src/modal.ts
@@ -1644,9 +1764,9 @@ function el(tag, className, text) {
1644
1764
  if (text !== void 0) node.textContent = text;
1645
1765
  return node;
1646
1766
  }
1647
- var SVG_NS = "http://www.w3.org/2000/svg";
1767
+ var SVG_NS2 = "http://www.w3.org/2000/svg";
1648
1768
  function svg(viewBox, attrs = {}) {
1649
- const node = document.createElementNS(SVG_NS, "svg");
1769
+ const node = document.createElementNS(SVG_NS2, "svg");
1650
1770
  node.setAttribute("viewBox", viewBox);
1651
1771
  node.setAttribute("focusable", "false");
1652
1772
  node.setAttribute("aria-hidden", "true");
@@ -1654,7 +1774,7 @@ function svg(viewBox, attrs = {}) {
1654
1774
  return node;
1655
1775
  }
1656
1776
  function path(d, attrs = {}) {
1657
- const node = document.createElementNS(SVG_NS, "path");
1777
+ const node = document.createElementNS(SVG_NS2, "path");
1658
1778
  node.setAttribute("d", d);
1659
1779
  for (const [k, v] of Object.entries(attrs)) node.setAttribute(k, v);
1660
1780
  return node;
@@ -1692,7 +1812,7 @@ function lockup(height) {
1692
1812
  node.setAttribute("role", "img");
1693
1813
  node.setAttribute("aria-label", "ZOREAL");
1694
1814
  node.appendChild(path(WORDMARK, { fill: "currentColor" }));
1695
- const g = document.createElementNS(SVG_NS, "g");
1815
+ const g = document.createElementNS(SVG_NS2, "g");
1696
1816
  g.setAttribute("fill", ZOREAL_BLUE);
1697
1817
  g.setAttribute("fill-rule", "evenodd");
1698
1818
  for (const d of MARK_PATHS) g.appendChild(path(d));
@@ -2011,10 +2131,13 @@ function startLogin(options) {
2011
2131
  let stopRefresh = () => {
2012
2132
  };
2013
2133
  controller.signal.addEventListener("abort", () => stopRefresh());
2134
+ const releaseControl = options.control ? holdBusy(options.control) : () => {
2135
+ };
2014
2136
  const teardown = () => {
2015
2137
  stopRefresh();
2016
2138
  modal?.close();
2017
2139
  modal = null;
2140
+ releaseControl();
2018
2141
  };
2019
2142
  const run = async () => {
2020
2143
  const verifier = generateVerifier();
@@ -2075,7 +2198,7 @@ function startLogin(options) {
2075
2198
  controller.signal,
2076
2199
  { tolerateUnknownUntil: Date.now() + 15e3 }
2077
2200
  );
2078
- if (isReturnDone(requestId)) {
2201
+ if (!await visibleOrDone(requestId, controller.signal)) {
2079
2202
  throw new DOMException("aborted", "AbortError");
2080
2203
  }
2081
2204
  } else {
@@ -2240,6 +2363,8 @@ function resumeLogin(options) {
2240
2363
  forgetReturnFlow(id);
2241
2364
  const issuer = options.issuer ?? saved.issuer;
2242
2365
  const controller = new AbortController();
2366
+ const releaseControl = options.control ? holdBusy(options.control) : () => {
2367
+ };
2243
2368
  const promise = (async () => {
2244
2369
  const code = await pollUntilApproved(
2245
2370
  issuer,
@@ -2274,6 +2399,7 @@ function resumeLogin(options) {
2274
2399
  markReturnDone(id);
2275
2400
  return response;
2276
2401
  })();
2402
+ promise.then(releaseControl, releaseControl);
2277
2403
  promise.catch(() => {
2278
2404
  });
2279
2405
  return {