@jaak.ai/stamps 2.0.0-dev.29 → 2.0.0-dev.30

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.
@@ -1,2 +1,2 @@
1
- import{r as t,c as e,a as i,h as s}from"./p-BP1Q4KOg.js";const a=":host{display:block;width:100%;height:100%;font-family:system-ui, -apple-system, sans-serif;color:#1a1a1a}.detector-container{display:flex;flex-direction:column;align-items:center;width:100%;height:100%}h1{font-size:24px;font-weight:500;color:#333;margin:0 0 24px 0}.video-container{position:relative;width:100%;height:100%;background:#333;border:1px solid #e0e0e0;border-radius:8px;overflow:hidden}video,canvas{position:absolute;width:100%;height:100%;border-radius:8px}video.mirror,canvas.mirror{transform:rotateY(180deg)}canvas{z-index:1}video{z-index:0}.status{margin-top:16px;font-size:12px;color:#666}.overlay-mask{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;display:block;pointer-events:none}.card-outline{position:absolute;top:var(--mask-center-y, 50%);left:var(--mask-center-x, 50%);transform:translate(-50%, -50%);width:var(--mask-width, 88%);height:var(--mask-height, 55%);border:none;border-radius:4px;background:transparent;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7);opacity:0.8}.card-outline.perfect-match{box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7)}.side{position:absolute;background:#999;transition:background-color 0.3s ease}.side.aligned{background:#28a745}.side-top{top:0;left:0;width:100%;height:3px}.side-right{top:0;right:0;width:3px;height:100%}.side-bottom{bottom:0;left:0;width:100%;height:3px}.side-left{top:0;left:0;width:3px;height:100%}.corner{position:absolute;width:20px;height:20px;border:2px solid #999;z-index:12}.corner-tl{top:-10px;left:-10px;border-right:none;border-bottom:none}.corner-tr{top:-10px;right:-10px;border-left:none;border-bottom:none}.corner-bl{bottom:-10px;left:-10px;border-right:none;border-top:none}.corner-br{bottom:-10px;right:-10px;border-left:none;border-top:none}.corner.perfect-match{border-color:#28a745}.guide-text{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;font-size:14px;font-weight:600;text-align:center;white-space:normal;background:rgba(128, 128, 128, 0.8);padding:12px 20px;border-radius:20px;max-width:300px;z-index:20}.capture-animation{position:absolute;top:0;left:0;width:100%;height:100%;background:#fff;opacity:0;z-index:30;pointer-events:none;animation:captureFlash 0.6s ease-out}@keyframes captureFlash{0%{opacity:0}15%{opacity:0.8}30%{opacity:0}45%{opacity:0.4}60%{opacity:0}100%{opacity:0}}.card-outline.capturing{animation:pulseGreen 0.6s ease-out}@keyframes pulseGreen{0%{border-color:#28a745;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 0 4px rgba(40, 167, 69, 0)}50%{border-color:#28a745;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 0 8px rgba(40, 167, 69, 0.6)}100%{border-color:#28a745;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 0 4px rgba(40, 167, 69, 0)}}.flip-animation{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);z-index:35;pointer-events:none;opacity:0;animation:showFlipInstruction 3s ease-in-out;display:flex;flex-direction:column;align-items:center;justify-content:center}.id-card-icon{width:80px;height:50px;background:linear-gradient(135deg, #6c757d 0%, #495057 100%);border-radius:8px;position:relative;animation:flipCard 2s ease-in-out infinite;box-shadow:0 4px 12px rgba(0, 0, 0, 0.3)}.id-card-icon::before{content:'';position:absolute;top:8px;left:8px;width:16px;height:12px;background:rgba(255, 255, 255, 0.9);border-radius:2px}.id-card-icon::after{content:'';position:absolute;top:25px;left:8px;width:64px;height:3px;background:rgba(255, 255, 255, 0.7);border-radius:1px;box-shadow:0 6px 0 rgba(255, 255, 255, 0.7), 0 12px 0 rgba(255, 255, 255, 0.7)}.flip-text{margin-top:12px;color:#fff;font-size:14px;font-weight:600;text-align:center;background:rgba(128, 128, 128, 0.8);padding:12px 20px;border-radius:20px;max-width:300px}@keyframes showFlipInstruction{0%{opacity:0;transform:translate(-50%, -50%) scale(0.8)}15%{opacity:1;transform:translate(-50%, -50%) scale(1)}85%{opacity:1;transform:translate(-50%, -50%) scale(1)}100%{opacity:0;transform:translate(-50%, -50%) scale(0.8)}}@keyframes flipCard{0%{transform:rotateY(0deg)}50%{transform:rotateY(180deg)}100%{transform:rotateY(360deg)}}.success-animation{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);z-index:35;pointer-events:none;opacity:0;animation:showSuccessMessage 3s ease-in-out;display:flex;flex-direction:column;align-items:center;justify-content:center}.check-icon{width:80px;height:80px;background:linear-gradient(135deg, #6c757d 0%, #495057 100%);border-radius:50%;position:relative;animation:bounceSuccess 0.6s ease-out;box-shadow:0 4px 16px rgba(108, 117, 125, 0.4);display:flex;align-items:center;justify-content:center}.check-icon::before{content:'';position:absolute;width:20px;height:35px;border:4px solid #fff;border-top:none;border-left:none;transform:rotate(45deg);animation:drawCheck 0.4s ease-out 0.2s both}.success-text{margin-top:16px;color:#fff;font-size:14px;font-weight:600;text-align:center;background:rgba(128, 128, 128, 0.8);padding:12px 20px;border-radius:20px;max-width:300px;animation:fadeInUp 0.5s ease-out 0.4s both}@keyframes showSuccessMessage{0%{opacity:0;transform:translate(-50%, -50%) scale(0.5)}15%{opacity:1;transform:translate(-50%, -50%) scale(1)}85%{opacity:1;transform:translate(-50%, -50%) scale(1)}100%{opacity:0;transform:translate(-50%, -50%) scale(0.9)}}@keyframes bounceSuccess{0%{transform:scale(0)}50%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes drawCheck{0%{width:0;height:0}50%{width:20px;height:0}100%{width:20px;height:35px}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}100%{opacity:1;transform:translateY(0)}}.skip-button{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);z-index:25;pointer-events:auto;background:#fff;color:#333;border:none;border-radius:25px;padding:12px 24px;font-size:14px;font-weight:600;cursor:pointer;transition:all 0.3s ease}.skip-button:hover{background:#f8f9fa}.skip-button:active{background:#e9ecef;transform:translateX(-50%) translateY(0)}.camera-controls{position:absolute;top:16px;right:16px;z-index:25;display:flex;gap:8px;pointer-events:auto}.flip-camera-button{height:40px;padding:0 16px;border:none;border-radius:8px;background:rgba(0, 0, 0, 0.6);backdrop-filter:blur(12px);color:#ffffff;font-size:12px;font-weight:500;cursor:pointer;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255, 255, 255, 0.1);white-space:nowrap;min-width:fit-content}.camera-selector-button{height:40px;padding:0 16px;border:none;border-radius:8px;background:rgba(0, 0, 0, 0.6);backdrop-filter:blur(12px);color:#ffffff;font-size:12px;font-weight:500;cursor:pointer;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255, 255, 255, 0.1);white-space:nowrap;min-width:fit-content}.flip-camera-button:hover,.camera-selector-button:hover{background:rgba(0, 0, 0, 0.8);border-color:rgba(255, 255, 255, 0.2);transform:translateY(-1px)}.flip-camera-button:active,.camera-selector-button:active{transform:translateY(0);background:rgba(0, 0, 0, 0.9)}.camera-selector-dropdown{position:absolute;top:56px;right:16px;z-index:30;background:rgba(0, 0, 0, 0.85);backdrop-filter:blur(20px);border-radius:12px;min-width:260px;max-width:300px;border:1px solid rgba(255, 255, 255, 0.1);overflow:hidden;pointer-events:auto;animation:slideInFromTop 0.3s ease-out}@keyframes slideInFromTop{0%{opacity:0;transform:translateY(-8px) scale(0.95)}100%{opacity:1;transform:translateY(0) scale(1)}}.camera-selector-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid rgba(255, 255, 255, 0.1)}.camera-selector-header span{font-weight:500;color:#ffffff;font-size:13px;opacity:0.9}.close-selector{width:20px;height:20px;border:none;background:none;color:rgba(255, 255, 255, 0.7);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all 0.2s ease}.close-selector:hover{background:rgba(255, 255, 255, 0.1);color:#ffffff}.camera-list{padding:4px 0;max-height:240px;overflow-y:auto}.camera-option{width:100%;padding:10px 16px;border:none;background:none;text-align:left;cursor:pointer;transition:all 0.2s ease;display:flex;justify-content:space-between;align-items:center;color:rgba(255, 255, 255, 0.9)}.camera-option:hover{background:rgba(255, 255, 255, 0.08)}.camera-option.selected{background:rgba(255, 255, 255, 0.12);color:#ffffff}.camera-label{font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px;font-weight:400}.selected-indicator{font-size:14px;color:#ffffff;opacity:0.9}.device-info{padding:8px 16px;border-top:1px solid rgba(255, 255, 255, 0.1);background:rgba(255, 255, 255, 0.05)}.device-info small{color:rgba(255, 255, 255, 0.6);font-size:11px;text-transform:capitalize;font-weight:400}@media (max-width: 480px){.camera-controls{top:12px;right:12px;gap:6px}.flip-camera-button{height:36px;padding:0 12px;font-size:11px;border-radius:6px}.camera-selector-button{height:36px;padding:0 12px;font-size:11px;border-radius:6px}.camera-selector-dropdown{right:12px;top:48px;min-width:240px;max-width:calc(100vw - 24px)}.camera-selector-header{padding:10px 14px}.camera-option{padding:8px 14px}.device-info{padding:6px 14px}}.watermark{position:absolute;bottom:12px;right:12px;z-index:15;pointer-events:none;opacity:0.7}.watermark img{height:24px;width:auto;filter:drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3))}.loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.8);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:30;border-radius:20px}.loading-spinner{width:60px;height:60px;border:4px solid rgba(255, 255, 255, 0.2);border-top:4px solid #007bff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:20px}.loading-text{color:white;font-size:16px;font-weight:500;text-align:center;opacity:0.9}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.status-bar{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);background:rgba(0, 0, 0, 0.7);border-radius:15px;padding:8px 16px;z-index:40;backdrop-filter:blur(5px);border:1px solid rgba(255, 255, 255, 0.1)}.status-message{font-size:12px;font-weight:500;text-align:center;color:#fff;white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}";const o=class{constructor(i){t(this,i);this.captureCompleted=e(this,"captureCompleted");this.isReady=e(this,"isReady")}get el(){return i(this)}debug=false;alignmentTolerance=10;maskSize=90;cropMargin=0;useDocumentClassification=false;preferredCamera="auto";captureCompleted;isReady;isVideoActive=false;statusMessage="Presione el botón para activar la cámara";statusColor="#aaa";bestScore=0;capturedFullFrame=null;capturedCroppedId=null;capturedBackFullFrame=null;capturedBackCroppedId=null;captureStep="front";isCapturing=false;showFlipAnimation=false;showSuccessAnimation=false;shouldMirrorVideo=true;sideAlignment={top:false,right:false,bottom:false,left:false};isDetectionPaused=false;isLoading=false;isModelPreloaded=false;isMaskReady=false;availableCameras=[];selectedCameraId=null;showCameraSelector=false;isMultipleCamerasAvailable=false;videoRef;canvasRef;session;startTime;videoStream;animationId;hasScreenshotTaken=false;lastDetectedBox;mobileNetSession;mobileNetClassMap;deviceType="desktop";preferredCameraFacing=null;frameSkipCounter=0;FRAME_SKIP=2;consecutiveFailures=0;MAX_FAILURES=30;lastInferenceTime=0;MIN_INFERENCE_INTERVAL=50;preprocessCanvas;preprocessCtx;captureCanvas;captureCtx;MODEL_PATH="https://storage.googleapis.com/jaak-static/web/component/stamps/ddmyp-v1.onnx";MOBILENET_MODEL_PATH="https://storage.googleapis.com/jaak-static/web/component/stamps/cdmmp-v1.onnx";MOBILENET_CLASSES_PATH="https://storage.googleapis.com/jaak-static/web/component/stamps/cdmmp-v1.json";INPUT_SIZE=320;CONFIDENCE_THRESHOLD=.6;ID1_ASPECT_RATIO=85.6/53.98;logger={info:(...t)=>{if(this.debug){console.log(`[JAAK-STAMPS] [INFO] [${(new Date).toLocaleTimeString()}]`,...t)}},warn:(...t)=>{if(this.debug){console.warn(`[JAAK-STAMPS] [WARN] [${(new Date).toLocaleTimeString()}]`,...t)}},error:(...t)=>{if(this.debug){console.error(`[JAAK-STAMPS] [ERROR] [${(new Date).toLocaleTimeString()}]`,...t)}},debug:(...t)=>{if(this.debug){console.debug(`[JAAK-STAMPS] [DEBUG] [${(new Date).toLocaleTimeString()}]`,...t)}},state:(t,e)=>{if(this.debug){console.log(`[JAAK-STAMPS] [STATE] [${(new Date).toLocaleTimeString()}] ${t}`,e||"")}},performance:(t,e)=>{if(this.debug){console.log(`[JAAK-STAMPS] [PERF] [${(new Date).toLocaleTimeString()}] ${t}: ${e}ms`)}}};validateMaskSize(){if(this.maskSize<50||this.maskSize>100){this.logger.warn(`Propiedad maskSize inválida. Valor: ${this.maskSize}, esperado: 50-100. Usando valor por defecto: 90`);this.maskSize=90}}validateCropMargin(){if(this.cropMargin<0||this.cropMargin>100){this.logger.warn(`Propiedad cropMargin inválida. Valor: ${this.cropMargin}, esperado: 0-100. Usando valor por defecto: 0`);this.cropMargin=0}}validatePreferredCamera(){const t=["auto","front","back"];if(!t.includes(this.preferredCamera)){this.logger.warn(`Propiedad preferredCamera inválida. Valor: ${this.preferredCamera}, esperado: ${t.join(", ")}. Usando valor por defecto: 'auto'`);this.preferredCamera="auto"}}emitReadyEvent(){const t=!!window.ort&&this.isModelPreloaded;this.isReady.emit(t);this.logger.state("COMPONENTE_LISTO",{ortLibraryLoaded:!!window.ort,modelPreloaded:this.isModelPreloaded,isReady:t})}isRearCamera(t){const e=t.getVideoTracks()[0];if(!e)return false;const i=e.getSettings();return i.facingMode==="environment"}async detectDeviceTypeAndCameras(){const t=navigator.userAgent;const e=/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(t);const i=/iPad|Android/i.test(t)&&window.innerWidth>=768;if(i){this.deviceType="tablet"}else if(e){this.deviceType="mobile"}else{this.deviceType="desktop"}this.logger.state("DISPOSITIVO_DETECTADO",{deviceType:this.deviceType,userAgent:navigator.userAgent,screenDimensions:{width:window.innerWidth,height:window.innerHeight}});await this.enumerateAndDetectCameras();this.loadCameraPreference()}async enumerateAndDetectCameras(){try{const t=await this.checkCameraPermission();if(t==="denied"){this.logger.error("Permiso de cámara denegado por el usuario");this.statusMessage="Permiso de cámara denegado";this.statusColor="#ff6b6b";return}if(t==="prompt"){const t=await navigator.mediaDevices.getUserMedia({video:true});t.getTracks().forEach((t=>t.stop()))}const e=await navigator.mediaDevices.enumerateDevices();this.availableCameras=e.filter((t=>t.kind==="videoinput"));this.isMultipleCamerasAvailable=this.availableCameras.length>1;this.logger.state("CAMARAS_DETECTADAS",{count:this.availableCameras.length,isMultipleCamerasAvailable:this.isMultipleCamerasAvailable,cameras:this.availableCameras.map((t=>({id:t.deviceId,label:t.label||"Unknown Camera"})))});this.setInitialCameraPreference()}catch(t){this.logger.error("Error al enumerar cámaras disponibles:",t);this.handleCameraPermissionError(t)}}async checkCameraPermission(){try{if(!navigator.permissions){return"prompt"}const t=await navigator.permissions.query({name:"camera"});return t.state}catch(t){this.logger.warn("No se pudo verificar permisos de cámara:",t);return"prompt"}}handleCameraPermissionError(t){if(t.name==="NotAllowedError"){this.statusMessage="Permiso de cámara denegado. Active el permiso en configuración.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}else if(t.name==="NotFoundError"){this.statusMessage="No se encontraron cámaras disponibles.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}else if(t.name==="NotReadableError"){this.statusMessage="Cámara en uso por otra aplicación.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}else{this.statusMessage="Error al acceder a las cámaras.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}}setInitialCameraPreference(){if(this.availableCameras.length===0)return;if(this.preferredCamera==="front"){this.preferredCameraFacing="user";const t=this.availableCameras.find((t=>t.label.toLowerCase().includes("front")||t.label.toLowerCase().includes("user")||t.label.toLowerCase().includes("selfie")||!t.label.toLowerCase().includes("back")&&!t.label.toLowerCase().includes("rear")));if(t){this.selectedCameraId=t.deviceId;this.logger.state("CAMARA_FRONTAL_SELECCIONADA",{label:t.label,deviceId:t.deviceId})}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.warn("Cámara frontal no encontrada, usando primera disponible:",this.availableCameras[0].label)}}else if(this.preferredCamera==="back"){this.preferredCameraFacing="environment";const t=this.availableCameras.find((t=>t.label.toLowerCase().includes("back")||t.label.toLowerCase().includes("rear")||t.label.toLowerCase().includes("environment")));if(t){this.selectedCameraId=t.deviceId;this.logger.state("CAMARA_TRASERA_SELECCIONADA",{label:t.label,deviceId:t.deviceId})}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.warn("Cámara trasera no encontrada, usando primera disponible:",this.availableCameras[0].label)}}else{if(this.deviceType==="mobile"||this.deviceType==="tablet"){this.preferredCameraFacing="environment";const t=this.availableCameras.find((t=>t.label.toLowerCase().includes("back")||t.label.toLowerCase().includes("rear")||t.label.toLowerCase().includes("environment")));if(t){this.selectedCameraId=t.deviceId;this.logger.state("CAMARA_AUTO_SELECCIONADA_MOBILE",{type:"rear",label:t.label,deviceId:t.deviceId})}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.warn("Cámara trasera no encontrada en mobile, usando primera disponible:",this.availableCameras[0].label)}}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.state("CAMARA_AUTO_SELECCIONADA_DESKTOP",{label:this.availableCameras[0].label,deviceId:this.availableCameras[0].deviceId})}}}loadCameraPreference(){try{const t=localStorage.getItem("jaak-stamps-camera-preference");if(t){const e=JSON.parse(t);const i=this.availableCameras.some((t=>t.deviceId===e.cameraId));if(i){this.selectedCameraId=e.cameraId;this.preferredCameraFacing=e.facing;this.logger.state("PREFERENCIA_CAMARA_CARGADA",e)}}}catch(t){this.logger.warn("Error al cargar preferencia de cámara:",t)}}saveCameraPreference(){try{const t={cameraId:this.selectedCameraId,facing:this.preferredCameraFacing,timestamp:Date.now()};localStorage.setItem("jaak-stamps-camera-preference",JSON.stringify(t));this.logger.state("PREFERENCIA_CAMARA_GUARDADA",t)}catch(t){this.logger.warn("Error al guardar preferencia de cámara:",t)}}async switchCamera(t){if(!this.isVideoActive||this.selectedCameraId===t)return;try{const e=this.availableCameras.find((e=>e.deviceId===t));if(!e){this.logger.warn("Cámara seleccionada no encontrada, re-enumerando dispositivos...");await this.enumerateAndDetectCameras();return}if(this.debug){this.statusMessage="Cambiando cámara...";this.statusColor="#007bff"}if(this.videoStream){this.videoStream.getTracks().forEach((t=>t.stop()))}this.selectedCameraId=t;const i=e.label.toLowerCase().includes("back")||e.label.toLowerCase().includes("rear")||e.label.toLowerCase().includes("environment");this.preferredCameraFacing=i?"environment":"user";this.saveCameraPreference();await this.setupCameraWithRetry();this.logger.state("CAMARA_CAMBIADA",{label:e.label,deviceId:e.deviceId})}catch(t){this.logger.error("Error al cambiar de cámara:",t);this.handleCameraPermissionError(t)}}async setupCameraWithRetry(t=3){for(let e=1;e<=t;e++){try{await this.setupCamera();if(this.debug){this.statusMessage="Cámara configurada correctamente";this.statusColor="#28a745"}return}catch(i){this.logger.error(`Intento ${e} de configuración de cámara fallido:`,i);if(e===t){this.statusMessage="Error al configurar la cámara";this.statusColor="#ff6b6b";this.handleCameraPermissionError(i);throw i}if(this.debug){this.statusMessage=`Reintentando configuración de cámara... (${e}/${t})`;this.statusColor="#ffb366"}await new Promise((t=>setTimeout(t,500*e)))}}}toggleCameraSelector(){this.showCameraSelector=!this.showCameraSelector;this.logger.state("SELECTOR_CAMARA_TOGGLE",{showCameraSelector:this.showCameraSelector,isMultipleCamerasAvailable:this.isMultipleCamerasAvailable,availableCameras:this.availableCameras.length,isVideoActive:this.isVideoActive})}async flipCamera(){if(!this.isMultipleCamerasAvailable)return;const t=this.availableCameras.findIndex((t=>t.deviceId===this.selectedCameraId));const e=(t+1)%this.availableCameras.length;const i=this.availableCameras[e];await this.switchCamera(i.deviceId)}async componentDidLoad(){this.logger.state("COMPONENTE_INICIALIZANDO",{debug:this.debug,maskSize:this.maskSize,cropMargin:this.cropMargin,useDocumentClassification:this.useDocumentClassification,preferredCamera:this.preferredCamera});if(this.debug){this.isLoading=true;this.statusMessage="Inicializando componente...";this.statusColor="#007bff";await new Promise((t=>setTimeout(t,500)))}this.validateMaskSize();this.validateCropMargin();this.validatePreferredCamera();if(this.debug){this.statusMessage="Detectando cámaras disponibles..."}await this.detectDeviceTypeAndCameras();if(!window.ort){if(this.debug){this.statusMessage="Cargando librerías de IA..."}const t=document.createElement("script");t.src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js";document.head.appendChild(t);t.onload=()=>{setTimeout((()=>{this.statusMessage="Presione el botón para activar la cámara";this.statusColor="#aaa";this.isLoading=false;this.emitReadyEvent()}),300)}}else{setTimeout((()=>{this.statusMessage="Presione el botón para activar la cámara";this.statusColor="#aaa";this.isLoading=false;this.emitReadyEvent()}),300)}this.initializeCanvasPool();this.setupResizeObserver()}setupResizeObserver(){if("ResizeObserver"in window&&this.canvasRef){const t=new ResizeObserver((()=>{this.handleResize()}));t.observe(this.canvasRef.parentElement)}}handleResize(){if(this.canvasRef){const t=this.canvasRef.parentElement;const e=t.getBoundingClientRect();this.canvasRef.width=e.width;this.canvasRef.height=e.height;this.updateMaskDimensions(e);this.logger.debug("Canvas redimensionado:",{width:e.width,height:e.height})}}updateMaskDimensions(t){if(!this.videoRef)return;const e=this.videoRef.videoWidth;const i=this.videoRef.videoHeight;if(e===0||i===0)return;const s=e/i;const a=t.width/t.height;let o,r;let n=0,c=0;if(s>a){o=t.width;r=t.width/s;c=(t.height-r)/2}else{r=t.height;o=t.height*s;n=(t.width-o)/2}const h=r*this.ID1_ASPECT_RATIO;let d,l;const f=this.maskSize/100;if(h<=o){l=r*f;d=l*this.ID1_ASPECT_RATIO}else{d=o*f;l=d/this.ID1_ASPECT_RATIO}const p=d/t.width*100;const m=l/t.height*100;const b=n+o/2;const u=c+r/2;const g=b/t.width*100;const x=u/t.height*100;this.el.style.setProperty("--mask-width",`${p}%`);this.el.style.setProperty("--mask-height",`${m}%`);this.el.style.setProperty("--mask-center-x",`${g}%`);this.el.style.setProperty("--mask-center-y",`${x}%`);this.isMaskReady=true;this.logger.state("DIMENSIONES_MASCARA_ACTUALIZADAS",{video:{width:e,height:i},displayed:{width:o,height:r},mask:{widthPercent:p,heightPercent:m},center:{x:g,y:x},offset:{x:n,y:c}})}initializeCanvasPool(){this.preprocessCanvas=document.createElement("canvas");this.preprocessCanvas.width=this.INPUT_SIZE;this.preprocessCanvas.height=this.INPUT_SIZE;this.preprocessCtx=this.preprocessCanvas.getContext("2d",{alpha:false,willReadFrequently:true});this.captureCanvas=document.createElement("canvas");this.captureCtx=this.captureCanvas.getContext("2d",{alpha:false});this.logger.state("CANVAS_POOL_INICIALIZADO",{preprocessCanvasSize:this.INPUT_SIZE})}disconnectedCallback(){this.cleanup()}async getCapturedImages(){if(this.captureStep!=="completed"){throw new Error("El proceso de captura no ha sido completado")}return{front:{fullFrame:this.capturedFullFrame,cropped:this.capturedCroppedId},back:{fullFrame:this.capturedBackFullFrame,cropped:this.capturedBackCroppedId},metadata:{hasBackCapture:!!(this.capturedBackFullFrame&&this.capturedBackCroppedId),totalImages:this.capturedBackFullFrame&&this.capturedBackCroppedId?4:2}}}async isProcessCompleted(){return this.captureStep==="completed"}async startCapture(){await this.startDetection()}async stopCapture(){this.exitSession()}async resetCapture(){this.resetDetection()}async getStatus(){return{isVideoActive:this.isVideoActive,captureStep:this.captureStep,statusMessage:this.statusMessage,hasImages:!!(this.capturedFullFrame||this.capturedBackFullFrame),isProcessCompleted:this.captureStep==="completed",isModelPreloaded:this.isModelPreloaded}}async preloadModel(){if(this.isModelPreloaded||this.session){this.logger.state("MODELO_YA_PRECARGADO",{sessionExists:!!this.session,modelPreloaded:this.isModelPreloaded});return{success:true,message:"Model already loaded"}}try{this.isLoading=true;this.statusMessage="Precargando modelos...";this.statusColor="#007bff";const t=this.MODEL_PATH;this.logger.state("PRECARGANDO_MODELO_DETECCION",{modelPath:t});const e=this.getSessionOptions();const i=this.getDeviceMemoryInfo();try{this.session=await window.ort.InferenceSession.create(t,e)}catch(e){if(e.message.includes("failed to allocate a buffer")){this.logger.warn("Fallo en asignación de buffer durante precarga, intentando con configuración mínima");const e={executionProviders:["wasm"],graphOptimizationLevel:"disabled",logSeverityLevel:4,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1};this.session=await window.ort.InferenceSession.create(t,e)}else{throw e}}if(this.useDocumentClassification){if(i.isLowMemory){this.logger.state("CARGA_SECUENCIAL_MODELOS",{reason:"low memory device"});await new Promise((t=>setTimeout(t,1e3)))}await this.loadMobileNetModel()}this.isModelPreloaded=true;this.isLoading=false;this.statusMessage="Modelos precargados. Listo para comenzar detección";this.statusColor="#28a745";this.emitReadyEvent();this.logger.state("MODELOS_PRECARGADOS_EXITOSAMENTE",{detectionModel:!!this.session,classificationModel:!!this.mobileNetSession,useClassification:this.useDocumentClassification});return{success:true,message:"Models preloaded successfully"}}catch(t){this.logger.error("Error al precargar modelos:",t);this.isLoading=false;this.statusMessage="Error al precargar los modelos";this.statusColor="#ff6b6b";return{success:false,error:t.message}}}async skipBackCapture(){if(this.captureStep==="back"&&this.capturedFullFrame){this.completeProcess(true)}}async getCameraInfo(){return{availableCameras:this.availableCameras.map((t=>({id:t.deviceId,label:t.label||"Unknown Camera",selected:t.deviceId===this.selectedCameraId}))),selectedCameraId:this.selectedCameraId,deviceType:this.deviceType,isMultipleCamerasAvailable:this.isMultipleCamerasAvailable,preferredFacing:this.preferredCameraFacing,userPreferredCamera:this.preferredCamera}}async setPreferredCamera(t){this.preferredCamera=t;this.logger.state("PREFERENCIA_CAMARA_CAMBIADA",{newPreference:t});await this.enumerateAndDetectCameras();if(this.isVideoActive&&this.selectedCameraId){await this.switchCamera(this.selectedCameraId)}return{success:true,selectedCamera:this.selectedCameraId,availableCameras:this.availableCameras.length}}async loadMobileNetModel(){try{this.logger.state("CARGANDO_MODELO_MOBILENET",{path:this.MOBILENET_MODEL_PATH});const t=await fetch(this.MOBILENET_CLASSES_PATH);if(!t.ok){throw new Error(`Failed to load class map: ${this.MOBILENET_CLASSES_PATH}`)}this.mobileNetClassMap=await t.json();this.logger.state("CLASES_MOBILENET_CARGADAS",{classCount:Object.keys(this.mobileNetClassMap).length});const e=this.getSessionOptions();try{this.mobileNetSession=await window.ort.InferenceSession.create(this.MOBILENET_MODEL_PATH,e)}catch(t){if(t.message.includes("failed to allocate a buffer")){this.logger.warn("Fallo en asignación de buffer de MobileNet, intentando con configuración mínima");const t={executionProviders:["wasm"],graphOptimizationLevel:"disabled",logSeverityLevel:4,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1};this.mobileNetSession=await window.ort.InferenceSession.create(this.MOBILENET_MODEL_PATH,t)}else{throw t}}this.logger.state("MODELO_MOBILENET_CARGADO_EXITOSAMENTE",{sessionCreated:!!this.mobileNetSession})}catch(t){this.logger.error("Error al cargar modelo MobileNet:",t);throw t}}preprocessMobileNet(t){const e=document.createElement("canvas");e.width=224;e.height=224;const i=e.getContext("2d");i.drawImage(t,0,0,224,224);const s=i.getImageData(0,0,224,224);const a=s.data;const o=224*224;const r=new Float32Array(3*o);for(let t=0;t<o;t++){r[t]=(a[t*4+0]/255-.5)/.5;r[o+t]=(a[t*4+1]/255-.5)/.5;r[2*o+t]=(a[t*4+2]/255-.5)/.5}return new window.ort.Tensor("float32",r,[1,3,224,224])}async classifyDocument(t){if(!this.mobileNetSession||!this.mobileNetClassMap){this.logger.warn("Modelo MobileNet no está cargado, saltando clasificación");return null}try{this.logger.state("CLASIFICANDO_DOCUMENTO",{timestamp:Date.now()});const e=this.preprocessMobileNet(t);const i={input:e};const s=await this.mobileNetSession.run(i);const a=s[Object.keys(s)[0]].data;const o=a.reduce(((t,e,i,s)=>e>s[t]?i:t),0);const r=a[o];const n=this.mobileNetClassMap[o.toString()]||"unknown";this.logger.state("DOCUMENTO_CLASIFICADO",{class:n,confidence:r.toFixed(3),classIndex:o,timestamp:Date.now()});return{class:n,confidence:r,classIndex:o}}catch(t){this.logger.error("Error al clasificar documento:",t);return null}}cleanup(){if(this.animationId){cancelAnimationFrame(this.animationId)}if(this.videoStream){this.videoStream.getTracks().forEach((t=>t.stop()))}if(this.canvasRef){const t=this.canvasRef.getContext("2d");if(t){t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}}this.cleanupCanvasPool()}cleanupCanvasPool(){if(this.preprocessCanvas){this.preprocessCtx=undefined;this.preprocessCanvas=undefined}if(this.captureCanvas){this.captureCtx=undefined;this.captureCanvas=undefined}if(this.session){this.session.release?.();this.session=undefined}if(this.mobileNetSession){this.mobileNetSession.release?.();this.mobileNetSession=undefined}this.mobileNetClassMap=undefined;this.isModelPreloaded=false;this.logger.state("CANVAS_POOL_LIMPIADO",{timestamp:Date.now()})}async getMaxResolution(){try{const t={};if(this.selectedCameraId){t.deviceId={exact:this.selectedCameraId}}else if(this.preferredCameraFacing){t.facingMode=this.preferredCameraFacing}else{t.facingMode="environment"}const e=await navigator.mediaDevices.getUserMedia({video:t});const i=e.getVideoTracks()[0];const s=i.getCapabilities();e.getTracks().forEach((t=>t.stop()));const a={};if(this.selectedCameraId){a.deviceId={exact:this.selectedCameraId}}else if(this.preferredCameraFacing){a.facingMode=this.preferredCameraFacing}else{a.facingMode="environment"}if(s.width&&s.height){const t=Math.min(s.width.max,1920);const e=Math.min(s.height.max,1080);const i=/iPad|Android/i.test(navigator.userAgent)&&window.innerWidth>=768;if(i){a.width={ideal:Math.min(t,1280)};a.height={ideal:Math.min(e,720)}}else{a.width={ideal:t};a.height={ideal:e}}this.logger.state("CAPACIDADES_RESOLUCION_DETECTADAS",{maxWidth:s.width.max,maxHeight:s.height.max,selectedWidth:a.width.ideal,selectedHeight:a.height.ideal,isTablet:i,deviceType:this.deviceType})}return a}catch(t){this.logger.warn("No se pudieron obtener capacidades de cámara, usando configuración de respaldo");const e=/iPad|Android/i.test(navigator.userAgent)&&window.innerWidth>=768;const i={width:{ideal:e?1280:1920},height:{ideal:e?720:1080}};if(this.selectedCameraId){i.deviceId={exact:this.selectedCameraId}}else if(this.preferredCameraFacing){i.facingMode=this.preferredCameraFacing}else{i.facingMode="environment"}return i}}async setupCamera(){try{const t=await this.getMaxResolution();const e=await navigator.mediaDevices.getUserMedia({video:t,audio:false});if(this.videoRef){this.videoRef.srcObject=e;this.videoStream=e;const t=this.isRearCamera(e);this.shouldMirrorVideo=!t;this.logger.state("CAMARA_CONFIGURADA",{isRearCamera:t,shouldMirrorVideo:this.shouldMirrorVideo,videoActive:this.isVideoActive});return new Promise((t=>{this.videoRef.onloadedmetadata=async()=>{await this.videoRef.play();this.isVideoActive=true;if(this.canvasRef){const t=this.canvasRef.parentElement;const e=t.getBoundingClientRect();this.updateMaskDimensions(e)}t()}}))}}catch(t){this.logger.error("No se pudo acceder a la cámara:",t);this.handleCameraPermissionError(t)}}preprocess(t){if(!this.preprocessCanvas||!this.preprocessCtx){this.initializeCanvasPool()}this.preprocessCtx.clearRect(0,0,this.INPUT_SIZE,this.INPUT_SIZE);this.preprocessCtx.drawImage(t,0,0,this.INPUT_SIZE,this.INPUT_SIZE);const e=this.preprocessCtx.getImageData(0,0,this.INPUT_SIZE,this.INPUT_SIZE);const[i,s,a]=[[],[],[]];const{data:o}=e;for(let t=0;t<o.length;t+=4){i.push(o[t]/255);s.push(o[t+1]/255);a.push(o[t+2]/255)}const r=new Float32Array(i.concat(s,a));return new window.ort.Tensor("float32",r,[1,3,this.INPUT_SIZE,this.INPUT_SIZE])}getDeviceMemoryInfo(){const t=navigator;const e=t.deviceMemory||t.hardwareConcurrency||4;const i=t.connection||t.mozConnection||t.webkitConnection;const s=i&&(i.effectiveType==="slow-2g"||i.effectiveType==="2g");return{estimatedRAM:e,isLowMemory:e<=4,isSlowConnection:s}}getSessionOptions(){const t=this.getDeviceMemoryInfo();if(t.isLowMemory){return{executionProviders:["wasm"],graphOptimizationLevel:"basic",logSeverityLevel:4,logVerbosityLevel:0,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1}}return{executionProviders:["webgl","wasm"],graphOptimizationLevel:"all",logSeverityLevel:this.debug?2:4,logVerbosityLevel:0,enableCpuMemArena:true,enableMemPattern:true,executionMode:"parallel",interOpNumThreads:2,intraOpNumThreads:2}}async startDetection(){this.logger.state("INICIANDO_DETECCION",{sessionExists:!!this.session,modelPreloaded:this.isModelPreloaded,videoActive:this.isVideoActive,captureStep:this.captureStep});try{if(!this.session){this.isLoading=true;if(this.debug){this.statusMessage="Cargando modelo de detección...";this.statusColor="#007bff"}else{this.statusMessage="Cargando modelos...";this.statusColor="#007bff"}const t=this.MODEL_PATH;this.logger.state("CARGANDO_MODELO_DETECCION",{modelPath:t});const e=this.getSessionOptions();try{this.session=await window.ort.InferenceSession.create(t,e)}catch(e){if(e.message.includes("failed to allocate a buffer")){this.logger.warn("Fallo en asignación de buffer, intentando con configuración mínima");const e={executionProviders:["wasm"],graphOptimizationLevel:"disabled",logSeverityLevel:4,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1};this.session=await window.ort.InferenceSession.create(t,e)}else{throw e}}if(this.useDocumentClassification&&!this.mobileNetSession){if(this.debug){this.statusMessage="Cargando modelo de clasificación..."}await this.loadMobileNetModel()}this.isModelPreloaded=true;if(this.debug){this.statusMessage="Modelos cargados exitosamente"}this.emitReadyEvent()}else{this.logger.state("USANDO_MODELOS_PRECARGADOS",{sessionExists:!!this.session,modelPreloaded:this.isModelPreloaded});if(this.debug){this.statusMessage="Usando modelos precargados...";this.statusColor="#007bff"}}if(this.debug){this.statusMessage="Configurando cámara..."}await this.setupCamera();this.startTime=Date.now();this.isLoading=false;if(this.debug){this.statusMessage="Detección activa - Busque su identificación";this.statusColor="#28a745"}this.detectFrame()}catch(t){this.logger.error("Error al inicializar detección:",t);this.statusMessage="Error al inicializar el detector";this.statusColor="#ff6b6b";this.isLoading=false}}async detectFrame(){try{if(!this.videoRef||!this.canvasRef||!this.session)return;if(this.isDetectionPaused){if(this.captureStep!=="completed"){this.animationId=requestAnimationFrame((()=>this.detectFrame()))}return}this.frameSkipCounter++;if(this.frameSkipCounter<=this.FRAME_SKIP){if(this.captureStep!=="completed"){this.animationId=requestAnimationFrame((()=>this.detectFrame()))}return}this.frameSkipCounter=0;const t=Date.now();if(t-this.lastInferenceTime<this.MIN_INFERENCE_INTERVAL){if(this.captureStep!=="completed"){this.animationId=requestAnimationFrame((()=>this.detectFrame()))}return}this.lastInferenceTime=t;const e=this.canvasRef.getContext("2d");const i=this.preprocess(this.videoRef);const s={[this.session.inputNames[0]]:i};const a=await this.session.run(s);const o=a[this.session.outputNames[0]].data;const r=[];for(let t=0;t<o.length;t+=6){const[e,i,s,a,n,c]=o.slice(t,t+6);if(n>this.CONFIDENCE_THRESHOLD){r.push({x:e,y:i,w:s-e,h:a-i,score:n,classId:c});if(this.startTime&&Date.now()-this.startTime<5e3){const t={x:e,y:i,w:s-e,h:a-i,score:n};const o=this.isCardInFrame(t);const r=o?n*1.2:n;if(r>this.bestScore){this.bestScore=r}}}}if(r.length===0){this.consecutiveFailures++}else{this.consecutiveFailures=0}e.clearRect(0,0,this.canvasRef.width,this.canvasRef.height);if(this.debug){this.drawDetections(e,r)}this.updateGuidanceStatus(r);this.updateMaskColor(r);if(this.captureStep!=="completed"){if(this.consecutiveFailures>this.MAX_FAILURES){setTimeout((()=>this.detectFrame()),200)}else{this.animationId=requestAnimationFrame((()=>this.detectFrame()))}}}catch(t){this.logger.error("Error en inferencia de modelo:",t);if(this.captureStep!=="completed"){setTimeout((()=>this.detectFrame()),100)}}}isCardInFrame(t){const e=t.x+t.w/2;const i=t.y+t.h/2;const s=this.INPUT_SIZE/2;const a=this.INPUT_SIZE/2;const o=40;const r=30;const n=Math.abs(e-s)<o&&Math.abs(i-a)<r;const c=t.w>150&&t.w<300&&t.h>90&&t.h<200;return n&&c}checkSideAlignment(t){if(!this.videoRef)return{top:false,right:false,bottom:false,left:false};const e=this.videoRef.videoWidth;const i=this.videoRef.videoHeight;if(e===0||i===0){return{top:false,right:false,bottom:false,left:false}}const s=e/i;const a=1;let o,r;if(s>a){o=this.INPUT_SIZE;r=this.INPUT_SIZE/s}else{r=this.INPUT_SIZE;o=this.INPUT_SIZE*s}const n=r*this.ID1_ASPECT_RATIO;let c,h;const d=this.maskSize/100;if(n<=o){h=r*d;c=h*this.ID1_ASPECT_RATIO}else{c=o*d;h=c/this.ID1_ASPECT_RATIO}const l=c*(this.INPUT_SIZE/o);const f=h*(this.INPUT_SIZE/r);const p=this.INPUT_SIZE/2;const m=this.INPUT_SIZE/2;const b=p-l/2;const u=p+l/2;const g=m-f/2;const x=m+f/2;let w=t.x;let A=t.x+t.w;const y=t.y;const v=t.y+t.h;if(this.shouldMirrorVideo){const t=w;const e=A;w=this.INPUT_SIZE-e;A=this.INPUT_SIZE-t}const C=this.alignmentTolerance;return{top:Math.abs(y-g)<=C,right:Math.abs(A-u)<=C,bottom:Math.abs(v-x)<=C,left:Math.abs(w-b)<=C}}areAllSidesAligned(t){return t.top&&t.right&&t.bottom&&t.left}updateMaskColor(t){const e=this.el.shadowRoot?.querySelector(".card-outline");const i=this.el.shadowRoot?.querySelectorAll(".corner");const s=this.el.shadowRoot?.querySelector(".side-top");const a=this.el.shadowRoot?.querySelector(".side-right");const o=this.el.shadowRoot?.querySelector(".side-bottom");const r=this.el.shadowRoot?.querySelector(".side-left");let n=null;let c={top:false,right:false,bottom:false,left:false};if(t.length>0){n=t.reduce(((t,e)=>e.score>t.score?e:t));c=this.checkSideAlignment(n);this.sideAlignment=c}else{this.sideAlignment={top:false,right:false,bottom:false,left:false}}s?.classList.toggle("aligned",c.top);a?.classList.toggle("aligned",c.right);o?.classList.toggle("aligned",c.bottom);r?.classList.toggle("aligned",c.left);const h=this.areAllSidesAligned(c);if(h&&n){e?.classList.add("perfect-match");i?.forEach((t=>t.classList.add("perfect-match")));if(!this.hasScreenshotTaken){this.lastDetectedBox=n;this.takeScreenshot().catch((t=>{this.logger.error("Error al tomar captura de pantalla:",t)}));this.hasScreenshotTaken=true;setTimeout((()=>{this.hasScreenshotTaken=false}),2e3)}}else{e?.classList.remove("perfect-match");i?.forEach((t=>t.classList.remove("perfect-match")))}}updateGuidanceStatus(t){if(t.length===0){this.statusMessage="Posicione la identificación dentro del marco";this.statusColor="#ff6b6b";this.logger.debug("Sin detección de documento en el frame")}else{const e=t.reduce(((t,e)=>e.score>t.score?e:t));const i=this.checkSideAlignment(e);const s=[i.top,i.right,i.bottom,i.left].filter(Boolean).length;const a=this.areAllSidesAligned(i);if(a){this.statusMessage="Identificación perfectamente alineada. Mantenga inmóvil";this.statusColor="#00ff00";this.logger.state("DOCUMENTO_PERFECTAMENTE_ALINEADO",{score:e.score,boxDimensions:{width:e.w,height:e.h},alignedSides:4})}else if(s>0){this.statusMessage=`Alinee los lados restantes (${s}/4 lados correctos)`;this.statusColor="#ffb366"}else if(e.w<150){this.statusMessage="Identificación detectada. Acerque al marco";this.statusColor="#ffb366"}else{this.statusMessage="Identificación detectada. Alinee con el marco";this.statusColor="#ffb366"}}}drawDetections(t,e){if(!this.videoRef)return;const i=this.videoRef.videoWidth;const s=this.videoRef.videoHeight;const a=this.canvasRef.width;const o=this.canvasRef.height;if(i===0||s===0)return;const r=i/s;const n=a/o;let c,h;let d=0,l=0;if(r>n){c=a;h=a/r;l=(o-h)/2}else{h=o;c=o*r;d=(a-c)/2}const f=c/this.INPUT_SIZE;const p=h/this.INPUT_SIZE;e.forEach((e=>{const i=e.x*f+d;const s=e.y*p+l;const a=e.w*f;const o=e.h*p;t.strokeStyle="#32406C";t.lineWidth=2;t.strokeRect(i,s,a,o)}))}async takeScreenshot(){if(!this.videoRef||!this.lastDetectedBox)return;this.logger.state("INICIANDO_CAPTURA",{captureStep:this.captureStep,detectedBox:this.lastDetectedBox,videoResolution:{width:this.videoRef.videoWidth,height:this.videoRef.videoHeight}});this.triggerCaptureAnimation();if(!this.captureCanvas||!this.captureCtx){this.initializeCanvasPool()}this.captureCanvas.width=this.videoRef.videoWidth;this.captureCanvas.height=this.videoRef.videoHeight;this.captureCtx.drawImage(this.videoRef,0,0,this.captureCanvas.width,this.captureCanvas.height);const t=this.videoRef.videoWidth/this.INPUT_SIZE;const e=this.videoRef.videoHeight/this.INPUT_SIZE;const i=Math.max(0,this.lastDetectedBox.x*t-this.cropMargin);const s=Math.max(0,this.lastDetectedBox.y*e-this.cropMargin);const a=Math.min(this.lastDetectedBox.w*t+2*this.cropMargin,this.videoRef.videoWidth-i);const o=Math.min(this.lastDetectedBox.h*e+2*this.cropMargin,this.videoRef.videoHeight-s);const r=document.createElement("canvas");r.width=a;r.height=o;const n=r.getContext("2d",{alpha:false});n.drawImage(this.videoRef,i,s,a,o,0,0,a,o);if(this.captureStep==="front"){this.capturedFullFrame=this.captureCanvas.toDataURL("image/png");this.capturedCroppedId=r.toDataURL("image/png");if(this.useDocumentClassification){if(!this.mobileNetSession){try{await this.loadMobileNetModel()}catch(t){this.logger.warn("Fallo al cargar modelo de clasificación, continuando sin clasificación:",t)}}if(this.mobileNetSession){const t=await this.classifyDocument(r);if(t&&t.class==="passport"){this.logger.state("PASAPORTE_DETECTADO_SALTANDO_REVERSO",{classification:t?.class});this.completeProcess(true);return}}}this.captureStep="back";this.statusMessage="Voltee la identificación y muestre la parte trasera";this.statusColor="#007bff";this.isDetectionPaused=true;setTimeout((()=>{this.showFlipAnimation=true;setTimeout((()=>{this.showFlipAnimation=false;this.isDetectionPaused=false}),3e3)}),800);this.logger.state("CAPTURA_FRENTE_COMPLETADA",{captureStep:this.captureStep,hasFullFrame:!!this.capturedFullFrame,hasCroppedId:!!this.capturedCroppedId})}else if(this.captureStep==="back"){this.capturedBackFullFrame=this.captureCanvas.toDataURL("image/png");this.capturedBackCroppedId=r.toDataURL("image/png");this.completeProcess(false);this.logger.state("CAPTURA_TRASERA_COMPLETADA",{captureStep:this.captureStep,hasBackFullFrame:!!this.capturedBackFullFrame,hasBackCroppedId:!!this.capturedBackCroppedId,processCompleted:true})}}triggerCaptureAnimation(){this.isCapturing=true;const t=this.el.shadowRoot?.querySelector(".card-outline");t?.classList.add("capturing");setTimeout((()=>{this.isCapturing=false;t?.classList.remove("capturing")}),600)}stopDetection(){if(this.animationId){cancelAnimationFrame(this.animationId);this.animationId=undefined}if(this.canvasRef){const t=this.canvasRef.getContext("2d");t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}this.logger.state("DETECTOR_DETENIDO",{timestamp:Date.now()})}resetDetection(){this.bestScore=0;this.startTime=Date.now();this.statusMessage="Sistema reiniciado. Posicione la identificación";this.statusColor="#aaa";this.hasScreenshotTaken=false;this.capturedFullFrame=null;this.capturedCroppedId=null;this.capturedBackFullFrame=null;this.capturedBackCroppedId=null;this.captureStep="front";this.isCapturing=false;this.showFlipAnimation=false;this.showSuccessAnimation=false;this.isDetectionPaused=false;this.isLoading=false;this.lastDetectedBox=undefined;this.isModelPreloaded=false;this.frameSkipCounter=0;this.consecutiveFailures=0;this.lastInferenceTime=0;if(this.canvasRef){const t=this.canvasRef.getContext("2d");t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}if(this.isVideoActive&&this.session){this.detectFrame()}}completeProcess(t=false){this.captureStep="completed";this.statusMessage=t?"Proceso completado (solo frente capturado)":"Proceso de captura completado exitosamente";this.statusColor="#28a745";this.logger.state("PROCESO_COMPLETADO",{skippedBack:t,hasFrontImages:!!(this.capturedFullFrame&&this.capturedCroppedId),hasBackImages:!!(this.capturedBackFullFrame&&this.capturedBackCroppedId),totalImages:t?2:4,timestamp:(new Date).toISOString()});this.stopDetection();const e={front:{fullFrame:this.capturedFullFrame,cropped:this.capturedCroppedId},back:{fullFrame:this.capturedBackFullFrame,cropped:this.capturedBackCroppedId},timestamp:(new Date).toISOString(),metadata:{totalImages:t?2:4,processCompleted:true,backCaptureSkipped:t}};this.captureCompleted.emit(e);setTimeout((()=>{this.showSuccessAnimation=true;setTimeout((()=>{this.showSuccessAnimation=false}),3e3)}),800)}exitSession(){if(this.videoStream){this.videoStream.getTracks().forEach((t=>t.stop()));this.videoStream=undefined;this.isVideoActive=false;if(this.debug){this.statusMessage="Cámara desactivada - Listo para nueva sesión";this.statusColor="#6c757d"}else{this.statusMessage="Presione el botón para activar la cámara";this.statusColor="#aaa"}}this.isLoading=false;if(this.canvasRef){const t=this.canvasRef.getContext("2d");t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}this.cleanup()}render(){return s("div",{key:"87e2e2065012b5792b52b18349490492b5bdc80c",class:"detector-container"},s("div",{key:"04b8bba38297d39c84ddc01f5a9bf72c65b9bef4",class:"video-container"},s("video",{key:"905b99e1670fccb2ff5555818f91d0b0241fa29d",ref:t=>this.videoRef=t,autoplay:true,muted:true,playsinline:true,class:this.shouldMirrorVideo?"mirror":"",style:{display:this.isVideoActive?"block":"none"}}),s("canvas",{key:"3f219b649b8d4f961b15256b8586451c2a737eb8",ref:t=>this.canvasRef=t,class:this.shouldMirrorVideo?"mirror":""}),this.isMaskReady&&s("div",{key:"f8d6742689d4446897ca48c2407cb3d3fab643e9",class:"overlay-mask"},s("div",{key:"630a06c530f168cc0b71286adbf48fd922eb710d",class:"card-outline"},s("div",{key:"ce8c043ad41d5574cd0c4d737dec08b9f7fee927",class:"side side-top"}),s("div",{key:"e90ead592f84e5df98143bc88714e70f32684204",class:"side side-right"}),s("div",{key:"31d6778c5036e42a3addb26c732149abc5a18ef7",class:"side side-bottom"}),s("div",{key:"f85c31e77f024f9070c706b06b91d62a7fdbc357",class:"side side-left"}),s("div",{key:"27b362711bc53019483c0d36742d97e10ae9b9ce",class:"corner corner-tl"}),s("div",{key:"03b55893610684d690987c2eacf3c4e5d0c3bbe5",class:"corner corner-tr"}),s("div",{key:"b6bf31327925c45a7fa8e1fd5ab2f25b824a03a2",class:"corner corner-bl"}),s("div",{key:"0737e0c82f8ad9703ce2546f3e594db6d50cafde",class:"corner corner-br"}),!this.showFlipAnimation&&!this.showSuccessAnimation&&s("div",{key:"145f8383c496e151bd6ef4f5841292adeba083c4",class:"guide-text"},this.statusMessage)),this.captureStep==="back"&&!this.showFlipAnimation&&!this.showSuccessAnimation&&s("button",{key:"fcdedebc31eddd21b978dd63e93c348d324b47da",class:"skip-button",onClick:()=>this.skipBackCapture(),type:"button"},"Saltar reverso"),this.isVideoActive&&s("div",{key:"dc9157bf7bed3b6439db742055201e2c4eddec84",class:"camera-controls"},this.isMultipleCamerasAvailable&&s("button",{key:"6b052562ccb203dbf3cc8b627f31ed2435559f80",class:"flip-camera-button",onClick:()=>this.flipCamera(),type:"button",title:"Cambiar cámara"},"Girar cámara"),s("button",{key:"f9fad1757d01f0cb45f65bb2088bd1f0bc0e4e8d",class:"camera-selector-button",onClick:()=>this.toggleCameraSelector(),type:"button",title:"Seleccionar cámara"},"Cámaras"),this.debug&&s("div",{key:"5362fb33508c7f903b09f65fdb449b608804260d",style:{position:"absolute",top:"50px",right:"0",background:"rgba(0,0,0,0.8)",color:"white",padding:"8px",fontSize:"10px",borderRadius:"4px",whiteSpace:"nowrap"}},"Cámaras: ",this.availableCameras.length,s("br",{key:"5ead451a54a59c885f62740d0a0ce43ba8b674e4"}),"Múltiples: ",this.isMultipleCamerasAvailable?"Sí":"No",s("br",{key:"9a92514d07576ed7052eaa3a418c00013ef7c479"}),"Selector: ",this.showCameraSelector?"Visible":"Oculto",s("br",{key:"d06abebad3b2e3c19aa22e511e0c4cfd4425b8b2"}),"Video: ",this.isVideoActive?"Activo":"Inactivo")),this.showCameraSelector&&this.availableCameras.length>0&&s("div",{key:"93a09ce3bb108175b55944a71c21e86e58de55be",class:"camera-selector-dropdown"},s("div",{key:"7ceb4c8826945ab2a9da106a88a44cbb5490e92a",class:"camera-selector-header"},s("span",{key:"fa98621700584d8021ff57eca6f804b6eb792c5b"},"Seleccionar Cámara"),s("button",{key:"ce6477a1494f58fb5974dd7c9e62bd7d041572c5",class:"close-selector",onClick:()=>this.toggleCameraSelector(),type:"button"},"×")),s("div",{key:"eff226b006c95fafce2566947155e13ee68f9a02",class:"camera-list"},this.availableCameras.map((t=>s("button",{key:t.deviceId,class:`camera-option ${this.selectedCameraId===t.deviceId?"selected":""}`,onClick:()=>{this.switchCamera(t.deviceId);this.toggleCameraSelector()},type:"button"},s("span",{class:"camera-label"},t.label||`Cámara ${this.availableCameras.indexOf(t)+1}`),this.selectedCameraId===t.deviceId&&s("span",{class:"selected-indicator"},"✓"))))),s("div",{key:"617d33caa5d3b3e6dca56d479b27c0ac7ed19c2c",class:"device-info"},s("small",{key:"fba56ac1238c33864f8dba1d8bd9a5661e11d770"},"Dispositivo: ",this.deviceType)))),this.isCapturing&&s("div",{key:"b46982a0b949ee9d50d0a819c59b24dceec9d7b2",class:"capture-animation"}),this.showFlipAnimation&&s("div",{key:"c82773fffca8ec53949197a105e1e11bf0f9b294",class:"flip-animation"},s("div",{key:"ad52c9ec91132bf5ed94e36f621489a66b0bf680",class:"id-card-icon"}),s("div",{key:"2be407ee84beddc5ce968a9a94d9014f416cde54",class:"flip-text"},"¡Voltea tu identificación!")),this.showSuccessAnimation&&s("div",{key:"f20b6be925178a123de99e535e893b7c09391dee",class:"success-animation"},s("div",{key:"d3ae65d40943f73bc92e9529764ded454adc5dbf",class:"check-icon"}),s("div",{key:"f2b03082a106c69f09d384ba3b1cb4a636d3a189",class:"success-text"},"¡Proceso completado!")),this.isLoading&&s("div",{key:"65736e303d9eb1c3f6f2dccb5cc0d27c571ac9c8",class:"loading-overlay"},s("div",{key:"5863d855d1caea9202a9f3d0a29919985ddbb926",class:"loading-spinner"}),s("div",{key:"aa5a16c96ac6bfa43846ba06346fad6dce39dfbb",class:"loading-text"},this.statusMessage)),this.debug&&s("div",{key:"308c664b07d2c2427c38f766fc9eb78d27843f67",class:"status-bar"},s("div",{key:"3884b311710d7f373a508eb492771e503e68f648",class:"status-message",style:{color:this.statusColor}},this.statusMessage)),s("div",{key:"3125cfecda03d3ab9e80e0d9d5674f1cc167e2f8",class:"watermark"},s("img",{key:"5ef43a18aea74f570db0d61f4fd86c3becf1d23e",src:"https://storage.googleapis.com/jaak-static/commons/powered-by-jaak.png",alt:"Powered by Jaak"}))))}};o.style=a;export{o as jaak_stamps};
2
- //# sourceMappingURL=p-28adb830.entry.js.map
1
+ import{r as t,c as e,a as i,h as s}from"./p-BP1Q4KOg.js";const a=":host{display:block;width:100%;height:100%;font-family:system-ui, -apple-system, sans-serif;color:#1a1a1a}.detector-container{display:flex;flex-direction:column;align-items:center;width:100%;height:100%}h1{font-size:24px;font-weight:500;color:#333;margin:0 0 24px 0}.video-container{position:relative;width:100%;height:100%;background:#333;border:1px solid #e0e0e0;border-radius:8px;overflow:hidden}video,canvas{position:absolute;width:100%;height:100%;border-radius:8px}video.mirror,canvas.mirror{transform:rotateY(180deg)}canvas{z-index:1}video{z-index:0}.status{margin-top:16px;font-size:12px;color:#666}.overlay-mask{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;display:block;pointer-events:none}.card-outline{position:absolute;top:var(--mask-center-y, 50%);left:var(--mask-center-x, 50%);transform:translate(-50%, -50%);width:var(--mask-width, 88%);height:var(--mask-height, 55%);border:none;border-radius:4px;background:transparent;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7);opacity:0.8}.card-outline.perfect-match{box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7)}.side{position:absolute;background:#999;transition:background-color 0.3s ease}.side.aligned{background:#28a745}.side-top{top:0;left:0;width:100%;height:3px}.side-right{top:0;right:0;width:3px;height:100%}.side-bottom{bottom:0;left:0;width:100%;height:3px}.side-left{top:0;left:0;width:3px;height:100%}.corner{position:absolute;width:20px;height:20px;border:2px solid #999;z-index:12}.corner-tl{top:-10px;left:-10px;border-right:none;border-bottom:none}.corner-tr{top:-10px;right:-10px;border-left:none;border-bottom:none}.corner-bl{bottom:-10px;left:-10px;border-right:none;border-top:none}.corner-br{bottom:-10px;right:-10px;border-left:none;border-top:none}.corner.perfect-match{border-color:#28a745}.guide-text{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);color:#fff;font-size:14px;font-weight:600;text-align:center;white-space:normal;background:rgba(128, 128, 128, 0.8);padding:12px 20px;border-radius:20px;max-width:300px;z-index:20}.capture-animation{position:absolute;top:0;left:0;width:100%;height:100%;background:#fff;opacity:0;z-index:30;pointer-events:none;animation:captureFlash 0.6s ease-out}@keyframes captureFlash{0%{opacity:0}15%{opacity:0.8}30%{opacity:0}45%{opacity:0.4}60%{opacity:0}100%{opacity:0}}.card-outline.capturing{animation:pulseGreen 0.6s ease-out}@keyframes pulseGreen{0%{border-color:#28a745;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 0 4px rgba(40, 167, 69, 0)}50%{border-color:#28a745;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 0 8px rgba(40, 167, 69, 0.6)}100%{border-color:#28a745;box-shadow:0 0 0 9999px rgba(0, 0, 0, 0.7), 0 0 0 4px rgba(40, 167, 69, 0)}}.flip-animation{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);z-index:35;pointer-events:none;opacity:0;animation:showFlipInstruction 3s ease-in-out;display:flex;flex-direction:column;align-items:center;justify-content:center}.id-card-icon{width:80px;height:50px;background:linear-gradient(135deg, #6c757d 0%, #495057 100%);border-radius:8px;position:relative;animation:flipCard 2s ease-in-out infinite;box-shadow:0 4px 12px rgba(0, 0, 0, 0.3)}.id-card-icon::before{content:'';position:absolute;top:8px;left:8px;width:16px;height:12px;background:rgba(255, 255, 255, 0.9);border-radius:2px}.id-card-icon::after{content:'';position:absolute;top:25px;left:8px;width:64px;height:3px;background:rgba(255, 255, 255, 0.7);border-radius:1px;box-shadow:0 6px 0 rgba(255, 255, 255, 0.7), 0 12px 0 rgba(255, 255, 255, 0.7)}.flip-text{margin-top:12px;color:#fff;font-size:14px;font-weight:600;text-align:center;background:rgba(128, 128, 128, 0.8);padding:12px 20px;border-radius:20px;max-width:300px}@keyframes showFlipInstruction{0%{opacity:0;transform:translate(-50%, -50%) scale(0.8)}15%{opacity:1;transform:translate(-50%, -50%) scale(1)}85%{opacity:1;transform:translate(-50%, -50%) scale(1)}100%{opacity:0;transform:translate(-50%, -50%) scale(0.8)}}@keyframes flipCard{0%{transform:rotateY(0deg)}50%{transform:rotateY(180deg)}100%{transform:rotateY(360deg)}}.success-animation{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);z-index:35;pointer-events:none;opacity:0;animation:showSuccessMessage 3s ease-in-out;display:flex;flex-direction:column;align-items:center;justify-content:center}.check-icon{width:80px;height:80px;background:linear-gradient(135deg, #6c757d 0%, #495057 100%);border-radius:50%;position:relative;animation:bounceSuccess 0.6s ease-out;box-shadow:0 4px 16px rgba(108, 117, 125, 0.4);display:flex;align-items:center;justify-content:center}.check-icon::before{content:'';position:absolute;width:20px;height:35px;border:4px solid #fff;border-top:none;border-left:none;transform:rotate(45deg);animation:drawCheck 0.4s ease-out 0.2s both}.success-text{margin-top:16px;color:#fff;font-size:14px;font-weight:600;text-align:center;background:rgba(128, 128, 128, 0.8);padding:12px 20px;border-radius:20px;max-width:300px;animation:fadeInUp 0.5s ease-out 0.4s both}@keyframes showSuccessMessage{0%{opacity:0;transform:translate(-50%, -50%) scale(0.5)}15%{opacity:1;transform:translate(-50%, -50%) scale(1)}85%{opacity:1;transform:translate(-50%, -50%) scale(1)}100%{opacity:0;transform:translate(-50%, -50%) scale(0.9)}}@keyframes bounceSuccess{0%{transform:scale(0)}50%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes drawCheck{0%{width:0;height:0}50%{width:20px;height:0}100%{width:20px;height:35px}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}100%{opacity:1;transform:translateY(0)}}.skip-button{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);z-index:25;pointer-events:auto;background:#fff;color:#333;border:none;border-radius:25px;padding:12px 24px;font-size:14px;font-weight:600;cursor:pointer;transition:all 0.3s ease}.skip-button:hover{background:#f8f9fa}.skip-button:active{background:#e9ecef;transform:translateX(-50%) translateY(0)}.camera-controls{position:absolute;top:16px;right:16px;z-index:25;display:flex;gap:8px;pointer-events:auto}.flip-camera-button{height:40px;padding:0 16px;border:none;border-radius:8px;background:rgba(0, 0, 0, 0.6);backdrop-filter:blur(12px);color:#ffffff;font-size:12px;font-weight:500;cursor:pointer;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255, 255, 255, 0.1);white-space:nowrap;min-width:fit-content}.camera-selector-button{height:40px;padding:0 16px;border:none;border-radius:8px;background:rgba(0, 0, 0, 0.6);backdrop-filter:blur(12px);color:#ffffff;font-size:12px;font-weight:500;cursor:pointer;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255, 255, 255, 0.1);white-space:nowrap;min-width:fit-content}.flip-camera-button:hover,.camera-selector-button:hover{background:rgba(0, 0, 0, 0.8);border-color:rgba(255, 255, 255, 0.2);transform:translateY(-1px)}.flip-camera-button:active,.camera-selector-button:active{transform:translateY(0);background:rgba(0, 0, 0, 0.9)}.camera-selector-dropdown{position:absolute;top:56px;right:16px;z-index:30;background:rgba(0, 0, 0, 0.85);backdrop-filter:blur(20px);border-radius:12px;min-width:260px;max-width:300px;border:1px solid rgba(255, 255, 255, 0.1);overflow:hidden;pointer-events:auto;animation:slideInFromTop 0.3s ease-out}@keyframes slideInFromTop{0%{opacity:0;transform:translateY(-8px) scale(0.95)}100%{opacity:1;transform:translateY(0) scale(1)}}.camera-selector-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid rgba(255, 255, 255, 0.1)}.camera-selector-header span{font-weight:500;color:#ffffff;font-size:13px;opacity:0.9}.close-selector{width:20px;height:20px;border:none;background:none;color:rgba(255, 255, 255, 0.7);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all 0.2s ease}.close-selector:hover{background:rgba(255, 255, 255, 0.1);color:#ffffff}.camera-list{padding:4px 0;max-height:240px;overflow-y:auto}.camera-option{width:100%;padding:10px 16px;border:none;background:none;text-align:left;cursor:pointer;transition:all 0.2s ease;display:flex;justify-content:space-between;align-items:center;color:rgba(255, 255, 255, 0.9)}.camera-option:hover{background:rgba(255, 255, 255, 0.08)}.camera-option.selected{background:rgba(255, 255, 255, 0.12);color:#ffffff}.camera-label{font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px;font-weight:400}.selected-indicator{font-size:14px;color:#ffffff;opacity:0.9}.device-info{padding:8px 16px;border-top:1px solid rgba(255, 255, 255, 0.1);background:rgba(255, 255, 255, 0.05)}.device-info small{color:rgba(255, 255, 255, 0.6);font-size:11px;text-transform:capitalize;font-weight:400}@media (max-width: 480px){.camera-controls{top:12px;right:12px;gap:6px}.flip-camera-button{height:36px;padding:0 12px;font-size:11px;border-radius:6px}.camera-selector-button{height:36px;padding:0 12px;font-size:11px;border-radius:6px}.camera-selector-dropdown{right:12px;top:48px;min-width:240px;max-width:calc(100vw - 24px)}.camera-selector-header{padding:10px 14px}.camera-option{padding:8px 14px}.device-info{padding:6px 14px}}.watermark{position:absolute;bottom:12px;right:12px;z-index:15;pointer-events:none;opacity:0.7}.watermark img{height:24px;width:auto;filter:drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3))}.loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.8);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:30;border-radius:20px}.loading-spinner{width:60px;height:60px;border:4px solid rgba(255, 255, 255, 0.2);border-top:4px solid #007bff;border-radius:50%;animation:spin 1s linear infinite;margin-bottom:20px}.loading-text{color:white;font-size:16px;font-weight:500;text-align:center;opacity:0.9}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.status-bar{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);background:rgba(0, 0, 0, 0.7);border-radius:15px;padding:8px 16px;z-index:40;backdrop-filter:blur(5px);border:1px solid rgba(255, 255, 255, 0.1)}.status-message{font-size:12px;font-weight:500;text-align:center;color:#fff;white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}";const o=class{constructor(i){t(this,i);this.captureCompleted=e(this,"captureCompleted");this.isReady=e(this,"isReady")}get el(){return i(this)}debug=false;alignmentTolerance=10;maskSize=90;cropMargin=0;useDocumentClassification=false;preferredCamera="auto";captureCompleted;isReady;isVideoActive=false;statusMessage="Presione el botón para activar la cámara";statusColor="#aaa";bestScore=0;capturedFullFrame=null;capturedCroppedId=null;capturedBackFullFrame=null;capturedBackCroppedId=null;captureStep="front";isCapturing=false;showFlipAnimation=false;showSuccessAnimation=false;shouldMirrorVideo=true;sideAlignment={top:false,right:false,bottom:false,left:false};isDetectionPaused=false;isLoading=false;isModelPreloaded=false;isMaskReady=false;availableCameras=[];selectedCameraId=null;showCameraSelector=false;isMultipleCamerasAvailable=false;videoRef;canvasRef;session;startTime;videoStream;animationId;hasScreenshotTaken=false;lastDetectedBox;mobileNetSession;mobileNetClassMap;deviceType="desktop";preferredCameraFacing=null;frameSkipCounter=0;FRAME_SKIP=2;consecutiveFailures=0;MAX_FAILURES=30;lastInferenceTime=0;MIN_INFERENCE_INTERVAL=50;preprocessCanvas;preprocessCtx;captureCanvas;captureCtx;MODEL_PATH="https://storage.googleapis.com/jaak-static/web/component/stamps/ddmyp-v2.onnx";MOBILENET_MODEL_PATH="https://storage.googleapis.com/jaak-static/web/component/stamps/cdmmp-v1.onnx";MOBILENET_CLASSES_PATH="https://storage.googleapis.com/jaak-static/web/component/stamps/cdmmp-v1.json";INPUT_SIZE=320;CONFIDENCE_THRESHOLD=.6;ID1_ASPECT_RATIO=85.6/53.98;logger={info:(...t)=>{if(this.debug){console.log(`[JAAK-STAMPS] [INFO] [${(new Date).toLocaleTimeString()}]`,...t)}},warn:(...t)=>{if(this.debug){console.warn(`[JAAK-STAMPS] [WARN] [${(new Date).toLocaleTimeString()}]`,...t)}},error:(...t)=>{if(this.debug){console.error(`[JAAK-STAMPS] [ERROR] [${(new Date).toLocaleTimeString()}]`,...t)}},debug:(...t)=>{if(this.debug){console.debug(`[JAAK-STAMPS] [DEBUG] [${(new Date).toLocaleTimeString()}]`,...t)}},state:(t,e)=>{if(this.debug){console.log(`[JAAK-STAMPS] [STATE] [${(new Date).toLocaleTimeString()}] ${t}`,e||"")}},performance:(t,e)=>{if(this.debug){console.log(`[JAAK-STAMPS] [PERF] [${(new Date).toLocaleTimeString()}] ${t}: ${e}ms`)}}};validateMaskSize(){if(this.maskSize<50||this.maskSize>100){this.logger.warn(`Propiedad maskSize inválida. Valor: ${this.maskSize}, esperado: 50-100. Usando valor por defecto: 90`);this.maskSize=90}}validateCropMargin(){if(this.cropMargin<0||this.cropMargin>100){this.logger.warn(`Propiedad cropMargin inválida. Valor: ${this.cropMargin}, esperado: 0-100. Usando valor por defecto: 0`);this.cropMargin=0}}validatePreferredCamera(){const t=["auto","front","back"];if(!t.includes(this.preferredCamera)){this.logger.warn(`Propiedad preferredCamera inválida. Valor: ${this.preferredCamera}, esperado: ${t.join(", ")}. Usando valor por defecto: 'auto'`);this.preferredCamera="auto"}}emitReadyEvent(){const t=!!window.ort&&this.isModelPreloaded;this.isReady.emit(t);this.logger.state("COMPONENTE_LISTO",{ortLibraryLoaded:!!window.ort,modelPreloaded:this.isModelPreloaded,isReady:t})}isRearCamera(t){const e=t.getVideoTracks()[0];if(!e)return false;const i=e.getSettings();return i.facingMode==="environment"}async detectDeviceTypeAndCameras(){const t=navigator.userAgent;const e=/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(t);const i=/iPad|Android/i.test(t)&&window.innerWidth>=768;if(i){this.deviceType="tablet"}else if(e){this.deviceType="mobile"}else{this.deviceType="desktop"}this.logger.state("DISPOSITIVO_DETECTADO",{deviceType:this.deviceType,userAgent:navigator.userAgent,screenDimensions:{width:window.innerWidth,height:window.innerHeight}});await this.enumerateAndDetectCameras();this.loadCameraPreference()}async enumerateAndDetectCameras(){try{const t=await this.checkCameraPermission();if(t==="denied"){this.logger.error("Permiso de cámara denegado por el usuario");this.statusMessage="Permiso de cámara denegado";this.statusColor="#ff6b6b";return}if(t==="prompt"){const t=await navigator.mediaDevices.getUserMedia({video:true});t.getTracks().forEach((t=>t.stop()))}const e=await navigator.mediaDevices.enumerateDevices();this.availableCameras=e.filter((t=>t.kind==="videoinput"));this.isMultipleCamerasAvailable=this.availableCameras.length>1;this.logger.state("CAMARAS_DETECTADAS",{count:this.availableCameras.length,isMultipleCamerasAvailable:this.isMultipleCamerasAvailable,cameras:this.availableCameras.map((t=>({id:t.deviceId,label:t.label||"Unknown Camera"})))});this.setInitialCameraPreference()}catch(t){this.logger.error("Error al enumerar cámaras disponibles:",t);this.handleCameraPermissionError(t)}}async checkCameraPermission(){try{if(!navigator.permissions){return"prompt"}const t=await navigator.permissions.query({name:"camera"});return t.state}catch(t){this.logger.warn("No se pudo verificar permisos de cámara:",t);return"prompt"}}handleCameraPermissionError(t){if(t.name==="NotAllowedError"){this.statusMessage="Permiso de cámara denegado. Active el permiso en configuración.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}else if(t.name==="NotFoundError"){this.statusMessage="No se encontraron cámaras disponibles.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}else if(t.name==="NotReadableError"){this.statusMessage="Cámara en uso por otra aplicación.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}else{this.statusMessage="Error al acceder a las cámaras.";this.statusColor="#ff6b6b";this.availableCameras=[];this.isMultipleCamerasAvailable=false}}setInitialCameraPreference(){if(this.availableCameras.length===0)return;if(this.preferredCamera==="front"){this.preferredCameraFacing="user";const t=this.availableCameras.find((t=>t.label.toLowerCase().includes("front")||t.label.toLowerCase().includes("user")||t.label.toLowerCase().includes("selfie")||!t.label.toLowerCase().includes("back")&&!t.label.toLowerCase().includes("rear")));if(t){this.selectedCameraId=t.deviceId;this.logger.state("CAMARA_FRONTAL_SELECCIONADA",{label:t.label,deviceId:t.deviceId})}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.warn("Cámara frontal no encontrada, usando primera disponible:",this.availableCameras[0].label)}}else if(this.preferredCamera==="back"){this.preferredCameraFacing="environment";const t=this.availableCameras.find((t=>t.label.toLowerCase().includes("back")||t.label.toLowerCase().includes("rear")||t.label.toLowerCase().includes("environment")));if(t){this.selectedCameraId=t.deviceId;this.logger.state("CAMARA_TRASERA_SELECCIONADA",{label:t.label,deviceId:t.deviceId})}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.warn("Cámara trasera no encontrada, usando primera disponible:",this.availableCameras[0].label)}}else{if(this.deviceType==="mobile"||this.deviceType==="tablet"){this.preferredCameraFacing="environment";const t=this.availableCameras.find((t=>t.label.toLowerCase().includes("back")||t.label.toLowerCase().includes("rear")||t.label.toLowerCase().includes("environment")));if(t){this.selectedCameraId=t.deviceId;this.logger.state("CAMARA_AUTO_SELECCIONADA_MOBILE",{type:"rear",label:t.label,deviceId:t.deviceId})}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.warn("Cámara trasera no encontrada en mobile, usando primera disponible:",this.availableCameras[0].label)}}else{this.selectedCameraId=this.availableCameras[0].deviceId;this.logger.state("CAMARA_AUTO_SELECCIONADA_DESKTOP",{label:this.availableCameras[0].label,deviceId:this.availableCameras[0].deviceId})}}}loadCameraPreference(){try{const t=localStorage.getItem("jaak-stamps-camera-preference");if(t){const e=JSON.parse(t);const i=this.availableCameras.some((t=>t.deviceId===e.cameraId));if(i){this.selectedCameraId=e.cameraId;this.preferredCameraFacing=e.facing;this.logger.state("PREFERENCIA_CAMARA_CARGADA",e)}}}catch(t){this.logger.warn("Error al cargar preferencia de cámara:",t)}}saveCameraPreference(){try{const t={cameraId:this.selectedCameraId,facing:this.preferredCameraFacing,timestamp:Date.now()};localStorage.setItem("jaak-stamps-camera-preference",JSON.stringify(t));this.logger.state("PREFERENCIA_CAMARA_GUARDADA",t)}catch(t){this.logger.warn("Error al guardar preferencia de cámara:",t)}}async switchCamera(t){if(!this.isVideoActive||this.selectedCameraId===t)return;try{const e=this.availableCameras.find((e=>e.deviceId===t));if(!e){this.logger.warn("Cámara seleccionada no encontrada, re-enumerando dispositivos...");await this.enumerateAndDetectCameras();return}if(this.debug){this.statusMessage="Cambiando cámara...";this.statusColor="#007bff"}if(this.videoStream){this.videoStream.getTracks().forEach((t=>t.stop()))}this.selectedCameraId=t;const i=e.label.toLowerCase().includes("back")||e.label.toLowerCase().includes("rear")||e.label.toLowerCase().includes("environment");this.preferredCameraFacing=i?"environment":"user";this.saveCameraPreference();await this.setupCameraWithRetry();this.logger.state("CAMARA_CAMBIADA",{label:e.label,deviceId:e.deviceId})}catch(t){this.logger.error("Error al cambiar de cámara:",t);this.handleCameraPermissionError(t)}}async setupCameraWithRetry(t=3){for(let e=1;e<=t;e++){try{await this.setupCamera();if(this.debug){this.statusMessage="Cámara configurada correctamente";this.statusColor="#28a745"}return}catch(i){this.logger.error(`Intento ${e} de configuración de cámara fallido:`,i);if(e===t){this.statusMessage="Error al configurar la cámara";this.statusColor="#ff6b6b";this.handleCameraPermissionError(i);throw i}if(this.debug){this.statusMessage=`Reintentando configuración de cámara... (${e}/${t})`;this.statusColor="#ffb366"}await new Promise((t=>setTimeout(t,500*e)))}}}toggleCameraSelector(){this.showCameraSelector=!this.showCameraSelector;this.logger.state("SELECTOR_CAMARA_TOGGLE",{showCameraSelector:this.showCameraSelector,isMultipleCamerasAvailable:this.isMultipleCamerasAvailable,availableCameras:this.availableCameras.length,isVideoActive:this.isVideoActive})}async flipCamera(){if(!this.isMultipleCamerasAvailable)return;const t=this.availableCameras.findIndex((t=>t.deviceId===this.selectedCameraId));const e=(t+1)%this.availableCameras.length;const i=this.availableCameras[e];await this.switchCamera(i.deviceId)}async componentDidLoad(){this.logger.state("COMPONENTE_INICIALIZANDO",{debug:this.debug,maskSize:this.maskSize,cropMargin:this.cropMargin,useDocumentClassification:this.useDocumentClassification,preferredCamera:this.preferredCamera});if(this.debug){this.isLoading=true;this.statusMessage="Inicializando componente...";this.statusColor="#007bff";await new Promise((t=>setTimeout(t,500)))}this.validateMaskSize();this.validateCropMargin();this.validatePreferredCamera();if(this.debug){this.statusMessage="Detectando cámaras disponibles..."}await this.detectDeviceTypeAndCameras();if(!window.ort){if(this.debug){this.statusMessage="Cargando librerías de IA..."}const t=document.createElement("script");t.src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js";document.head.appendChild(t);t.onload=()=>{setTimeout((()=>{this.statusMessage="Presione el botón para activar la cámara";this.statusColor="#aaa";this.isLoading=false;this.emitReadyEvent()}),300)}}else{setTimeout((()=>{this.statusMessage="Presione el botón para activar la cámara";this.statusColor="#aaa";this.isLoading=false;this.emitReadyEvent()}),300)}this.initializeCanvasPool();this.setupResizeObserver()}setupResizeObserver(){if("ResizeObserver"in window&&this.canvasRef){const t=new ResizeObserver((()=>{this.handleResize()}));t.observe(this.canvasRef.parentElement)}}handleResize(){if(this.canvasRef){const t=this.canvasRef.parentElement;const e=t.getBoundingClientRect();this.canvasRef.width=e.width;this.canvasRef.height=e.height;this.updateMaskDimensions(e);this.logger.debug("Canvas redimensionado:",{width:e.width,height:e.height})}}updateMaskDimensions(t){if(!this.videoRef)return;const e=this.videoRef.videoWidth;const i=this.videoRef.videoHeight;if(e===0||i===0)return;const s=e/i;const a=t.width/t.height;let o,r;let n=0,c=0;if(s>a){o=t.width;r=t.width/s;c=(t.height-r)/2}else{r=t.height;o=t.height*s;n=(t.width-o)/2}const h=r*this.ID1_ASPECT_RATIO;let d,l;const f=this.maskSize/100;if(h<=o){l=r*f;d=l*this.ID1_ASPECT_RATIO}else{d=o*f;l=d/this.ID1_ASPECT_RATIO}const p=d/t.width*100;const m=l/t.height*100;const b=n+o/2;const u=c+r/2;const g=b/t.width*100;const x=u/t.height*100;this.el.style.setProperty("--mask-width",`${p}%`);this.el.style.setProperty("--mask-height",`${m}%`);this.el.style.setProperty("--mask-center-x",`${g}%`);this.el.style.setProperty("--mask-center-y",`${x}%`);this.isMaskReady=true;this.logger.state("DIMENSIONES_MASCARA_ACTUALIZADAS",{video:{width:e,height:i},displayed:{width:o,height:r},mask:{widthPercent:p,heightPercent:m},center:{x:g,y:x},offset:{x:n,y:c}})}initializeCanvasPool(){this.preprocessCanvas=document.createElement("canvas");this.preprocessCanvas.width=this.INPUT_SIZE;this.preprocessCanvas.height=this.INPUT_SIZE;this.preprocessCtx=this.preprocessCanvas.getContext("2d",{alpha:false,willReadFrequently:true});this.captureCanvas=document.createElement("canvas");this.captureCtx=this.captureCanvas.getContext("2d",{alpha:false});this.logger.state("CANVAS_POOL_INICIALIZADO",{preprocessCanvasSize:this.INPUT_SIZE})}disconnectedCallback(){this.cleanup()}async getCapturedImages(){if(this.captureStep!=="completed"){throw new Error("El proceso de captura no ha sido completado")}return{front:{fullFrame:this.capturedFullFrame,cropped:this.capturedCroppedId},back:{fullFrame:this.capturedBackFullFrame,cropped:this.capturedBackCroppedId},metadata:{hasBackCapture:!!(this.capturedBackFullFrame&&this.capturedBackCroppedId),totalImages:this.capturedBackFullFrame&&this.capturedBackCroppedId?4:2}}}async isProcessCompleted(){return this.captureStep==="completed"}async startCapture(){await this.startDetection()}async stopCapture(){this.exitSession()}async resetCapture(){this.resetDetection()}async getStatus(){return{isVideoActive:this.isVideoActive,captureStep:this.captureStep,statusMessage:this.statusMessage,hasImages:!!(this.capturedFullFrame||this.capturedBackFullFrame),isProcessCompleted:this.captureStep==="completed",isModelPreloaded:this.isModelPreloaded}}async preloadModel(){if(this.isModelPreloaded||this.session){this.logger.state("MODELO_YA_PRECARGADO",{sessionExists:!!this.session,modelPreloaded:this.isModelPreloaded});return{success:true,message:"Model already loaded"}}try{this.isLoading=true;this.statusMessage="Precargando modelos...";this.statusColor="#007bff";const t=this.MODEL_PATH;this.logger.state("PRECARGANDO_MODELO_DETECCION",{modelPath:t});const e=this.getSessionOptions();const i=this.getDeviceMemoryInfo();try{this.session=await window.ort.InferenceSession.create(t,e)}catch(e){if(e.message.includes("failed to allocate a buffer")){this.logger.warn("Fallo en asignación de buffer durante precarga, intentando con configuración mínima");const e={executionProviders:["wasm"],graphOptimizationLevel:"disabled",logSeverityLevel:4,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1};this.session=await window.ort.InferenceSession.create(t,e)}else{throw e}}if(this.useDocumentClassification){if(i.isLowMemory){this.logger.state("CARGA_SECUENCIAL_MODELOS",{reason:"low memory device"});await new Promise((t=>setTimeout(t,1e3)))}await this.loadMobileNetModel()}this.isModelPreloaded=true;this.isLoading=false;this.statusMessage="Modelos precargados. Listo para comenzar detección";this.statusColor="#28a745";this.emitReadyEvent();this.logger.state("MODELOS_PRECARGADOS_EXITOSAMENTE",{detectionModel:!!this.session,classificationModel:!!this.mobileNetSession,useClassification:this.useDocumentClassification});return{success:true,message:"Models preloaded successfully"}}catch(t){this.logger.error("Error al precargar modelos:",t);this.isLoading=false;this.statusMessage="Error al precargar los modelos";this.statusColor="#ff6b6b";return{success:false,error:t.message}}}async skipBackCapture(){if(this.captureStep==="back"&&this.capturedFullFrame){this.completeProcess(true)}}async getCameraInfo(){return{availableCameras:this.availableCameras.map((t=>({id:t.deviceId,label:t.label||"Unknown Camera",selected:t.deviceId===this.selectedCameraId}))),selectedCameraId:this.selectedCameraId,deviceType:this.deviceType,isMultipleCamerasAvailable:this.isMultipleCamerasAvailable,preferredFacing:this.preferredCameraFacing,userPreferredCamera:this.preferredCamera}}async setPreferredCamera(t){this.preferredCamera=t;this.logger.state("PREFERENCIA_CAMARA_CAMBIADA",{newPreference:t});await this.enumerateAndDetectCameras();if(this.isVideoActive&&this.selectedCameraId){await this.switchCamera(this.selectedCameraId)}return{success:true,selectedCamera:this.selectedCameraId,availableCameras:this.availableCameras.length}}async loadMobileNetModel(){try{this.logger.state("CARGANDO_MODELO_MOBILENET",{path:this.MOBILENET_MODEL_PATH});const t=await fetch(this.MOBILENET_CLASSES_PATH);if(!t.ok){throw new Error(`Failed to load class map: ${this.MOBILENET_CLASSES_PATH}`)}this.mobileNetClassMap=await t.json();this.logger.state("CLASES_MOBILENET_CARGADAS",{classCount:Object.keys(this.mobileNetClassMap).length});const e=this.getSessionOptions();try{this.mobileNetSession=await window.ort.InferenceSession.create(this.MOBILENET_MODEL_PATH,e)}catch(t){if(t.message.includes("failed to allocate a buffer")){this.logger.warn("Fallo en asignación de buffer de MobileNet, intentando con configuración mínima");const t={executionProviders:["wasm"],graphOptimizationLevel:"disabled",logSeverityLevel:4,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1};this.mobileNetSession=await window.ort.InferenceSession.create(this.MOBILENET_MODEL_PATH,t)}else{throw t}}this.logger.state("MODELO_MOBILENET_CARGADO_EXITOSAMENTE",{sessionCreated:!!this.mobileNetSession})}catch(t){this.logger.error("Error al cargar modelo MobileNet:",t);throw t}}preprocessMobileNet(t){const e=document.createElement("canvas");e.width=224;e.height=224;const i=e.getContext("2d");i.drawImage(t,0,0,224,224);const s=i.getImageData(0,0,224,224);const a=s.data;const o=224*224;const r=new Float32Array(3*o);for(let t=0;t<o;t++){r[t]=(a[t*4+0]/255-.5)/.5;r[o+t]=(a[t*4+1]/255-.5)/.5;r[2*o+t]=(a[t*4+2]/255-.5)/.5}return new window.ort.Tensor("float32",r,[1,3,224,224])}async classifyDocument(t){if(!this.mobileNetSession||!this.mobileNetClassMap){this.logger.warn("Modelo MobileNet no está cargado, saltando clasificación");return null}try{this.logger.state("CLASIFICANDO_DOCUMENTO",{timestamp:Date.now()});const e=this.preprocessMobileNet(t);const i={input:e};const s=await this.mobileNetSession.run(i);const a=s[Object.keys(s)[0]].data;const o=a.reduce(((t,e,i,s)=>e>s[t]?i:t),0);const r=a[o];const n=this.mobileNetClassMap[o.toString()]||"unknown";this.logger.state("DOCUMENTO_CLASIFICADO",{class:n,confidence:r.toFixed(3),classIndex:o,timestamp:Date.now()});return{class:n,confidence:r,classIndex:o}}catch(t){this.logger.error("Error al clasificar documento:",t);return null}}cleanup(){if(this.animationId){cancelAnimationFrame(this.animationId)}if(this.videoStream){this.videoStream.getTracks().forEach((t=>t.stop()))}if(this.canvasRef){const t=this.canvasRef.getContext("2d");if(t){t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}}this.cleanupCanvasPool()}cleanupCanvasPool(){if(this.preprocessCanvas){this.preprocessCtx=undefined;this.preprocessCanvas=undefined}if(this.captureCanvas){this.captureCtx=undefined;this.captureCanvas=undefined}if(this.session){this.session.release?.();this.session=undefined}if(this.mobileNetSession){this.mobileNetSession.release?.();this.mobileNetSession=undefined}this.mobileNetClassMap=undefined;this.isModelPreloaded=false;this.logger.state("CANVAS_POOL_LIMPIADO",{timestamp:Date.now()})}async getMaxResolution(){try{const t={};if(this.selectedCameraId){t.deviceId={exact:this.selectedCameraId}}else if(this.preferredCameraFacing){t.facingMode=this.preferredCameraFacing}else{t.facingMode="environment"}const e=await navigator.mediaDevices.getUserMedia({video:t});const i=e.getVideoTracks()[0];const s=i.getCapabilities();e.getTracks().forEach((t=>t.stop()));const a={};if(this.selectedCameraId){a.deviceId={exact:this.selectedCameraId}}else if(this.preferredCameraFacing){a.facingMode=this.preferredCameraFacing}else{a.facingMode="environment"}if(s.width&&s.height){const t=Math.min(s.width.max,1920);const e=Math.min(s.height.max,1080);const i=/iPad|Android/i.test(navigator.userAgent)&&window.innerWidth>=768;if(i){a.width={ideal:Math.min(t,1280)};a.height={ideal:Math.min(e,720)}}else{a.width={ideal:t};a.height={ideal:e}}this.logger.state("CAPACIDADES_RESOLUCION_DETECTADAS",{maxWidth:s.width.max,maxHeight:s.height.max,selectedWidth:a.width.ideal,selectedHeight:a.height.ideal,isTablet:i,deviceType:this.deviceType})}return a}catch(t){this.logger.warn("No se pudieron obtener capacidades de cámara, usando configuración de respaldo");const e=/iPad|Android/i.test(navigator.userAgent)&&window.innerWidth>=768;const i={width:{ideal:e?1280:1920},height:{ideal:e?720:1080}};if(this.selectedCameraId){i.deviceId={exact:this.selectedCameraId}}else if(this.preferredCameraFacing){i.facingMode=this.preferredCameraFacing}else{i.facingMode="environment"}return i}}async setupCamera(){try{const t=await this.getMaxResolution();const e=await navigator.mediaDevices.getUserMedia({video:t,audio:false});if(this.videoRef){this.videoRef.srcObject=e;this.videoStream=e;const t=this.isRearCamera(e);this.shouldMirrorVideo=!t;this.logger.state("CAMARA_CONFIGURADA",{isRearCamera:t,shouldMirrorVideo:this.shouldMirrorVideo,videoActive:this.isVideoActive});return new Promise((t=>{this.videoRef.onloadedmetadata=async()=>{await this.videoRef.play();this.isVideoActive=true;if(this.canvasRef){const t=this.canvasRef.parentElement;const e=t.getBoundingClientRect();this.updateMaskDimensions(e)}t()}}))}}catch(t){this.logger.error("No se pudo acceder a la cámara:",t);this.handleCameraPermissionError(t)}}preprocess(t){if(!this.preprocessCanvas||!this.preprocessCtx){this.initializeCanvasPool()}this.preprocessCtx.clearRect(0,0,this.INPUT_SIZE,this.INPUT_SIZE);this.preprocessCtx.drawImage(t,0,0,this.INPUT_SIZE,this.INPUT_SIZE);const e=this.preprocessCtx.getImageData(0,0,this.INPUT_SIZE,this.INPUT_SIZE);const[i,s,a]=[[],[],[]];const{data:o}=e;for(let t=0;t<o.length;t+=4){i.push(o[t]/255);s.push(o[t+1]/255);a.push(o[t+2]/255)}const r=new Float32Array(i.concat(s,a));const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++){n[t]=this.float32ToFloat16(r[t])}return new window.ort.Tensor("float16",n,[1,3,this.INPUT_SIZE,this.INPUT_SIZE])}float32ToFloat16(t){const e=new ArrayBuffer(4);const i=new DataView(e);i.setFloat32(0,t,true);const s=i.getUint32(0,true);const a=s>>31&1;const o=s>>23&255;const r=s&8388607;let n=o-127+15;if(o===0){n=0}else if(o===255){n=31}else if(n>=31){n=31;return a<<15|n<<10}else if(n<=0){return a<<15}return a<<15|n<<10|r>>13}getDeviceMemoryInfo(){const t=navigator;const e=t.deviceMemory||t.hardwareConcurrency||4;const i=t.connection||t.mozConnection||t.webkitConnection;const s=i&&(i.effectiveType==="slow-2g"||i.effectiveType==="2g");return{estimatedRAM:e,isLowMemory:e<=4,isSlowConnection:s}}getSessionOptions(){const t=this.getDeviceMemoryInfo();if(t.isLowMemory){return{executionProviders:["wasm"],graphOptimizationLevel:"basic",logSeverityLevel:4,logVerbosityLevel:0,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1}}return{executionProviders:["webgl","wasm"],graphOptimizationLevel:"all",logSeverityLevel:this.debug?2:4,logVerbosityLevel:0,enableCpuMemArena:true,enableMemPattern:true,executionMode:"parallel",interOpNumThreads:2,intraOpNumThreads:2}}async startDetection(){this.logger.state("INICIANDO_DETECCION",{sessionExists:!!this.session,modelPreloaded:this.isModelPreloaded,videoActive:this.isVideoActive,captureStep:this.captureStep});try{if(!this.session){this.isLoading=true;if(this.debug){this.statusMessage="Cargando modelo de detección...";this.statusColor="#007bff"}else{this.statusMessage="Cargando modelos...";this.statusColor="#007bff"}const t=this.MODEL_PATH;this.logger.state("CARGANDO_MODELO_DETECCION",{modelPath:t});const e=this.getSessionOptions();try{this.session=await window.ort.InferenceSession.create(t,e)}catch(e){if(e.message.includes("failed to allocate a buffer")){this.logger.warn("Fallo en asignación de buffer, intentando con configuración mínima");const e={executionProviders:["wasm"],graphOptimizationLevel:"disabled",logSeverityLevel:4,enableCpuMemArena:false,enableMemPattern:false,executionMode:"sequential",interOpNumThreads:1,intraOpNumThreads:1};this.session=await window.ort.InferenceSession.create(t,e)}else{throw e}}if(this.useDocumentClassification&&!this.mobileNetSession){if(this.debug){this.statusMessage="Cargando modelo de clasificación..."}await this.loadMobileNetModel()}this.isModelPreloaded=true;if(this.debug){this.statusMessage="Modelos cargados exitosamente"}this.emitReadyEvent()}else{this.logger.state("USANDO_MODELOS_PRECARGADOS",{sessionExists:!!this.session,modelPreloaded:this.isModelPreloaded});if(this.debug){this.statusMessage="Usando modelos precargados...";this.statusColor="#007bff"}}if(this.debug){this.statusMessage="Configurando cámara..."}await this.setupCamera();this.startTime=Date.now();this.isLoading=false;if(this.debug){this.statusMessage="Detección activa - Busque su identificación";this.statusColor="#28a745"}this.detectFrame()}catch(t){this.logger.error("Error al inicializar detección:",t);this.statusMessage="Error al inicializar el detector";this.statusColor="#ff6b6b";this.isLoading=false}}async detectFrame(){try{if(!this.videoRef||!this.canvasRef||!this.session)return;if(this.isDetectionPaused){if(this.captureStep!=="completed"){this.animationId=requestAnimationFrame((()=>this.detectFrame()))}return}this.frameSkipCounter++;if(this.frameSkipCounter<=this.FRAME_SKIP){if(this.captureStep!=="completed"){this.animationId=requestAnimationFrame((()=>this.detectFrame()))}return}this.frameSkipCounter=0;const t=Date.now();if(t-this.lastInferenceTime<this.MIN_INFERENCE_INTERVAL){if(this.captureStep!=="completed"){this.animationId=requestAnimationFrame((()=>this.detectFrame()))}return}this.lastInferenceTime=t;const e=this.canvasRef.getContext("2d");const i=this.preprocess(this.videoRef);const s={[this.session.inputNames[0]]:i};const a=await this.session.run(s);const o=a[this.session.outputNames[0]].data;const r=[];for(let t=0;t<o.length;t+=6){const[e,i,s,a,n,c]=o.slice(t,t+6);if(n>this.CONFIDENCE_THRESHOLD){r.push({x:e,y:i,w:s-e,h:a-i,score:n,classId:c});if(this.startTime&&Date.now()-this.startTime<5e3){const t={x:e,y:i,w:s-e,h:a-i,score:n};const o=this.isCardInFrame(t);const r=o?n*1.2:n;if(r>this.bestScore){this.bestScore=r}}}}if(r.length===0){this.consecutiveFailures++}else{this.consecutiveFailures=0}e.clearRect(0,0,this.canvasRef.width,this.canvasRef.height);if(this.debug){this.drawDetections(e,r)}this.updateGuidanceStatus(r);this.updateMaskColor(r);if(this.captureStep!=="completed"){if(this.consecutiveFailures>this.MAX_FAILURES){setTimeout((()=>this.detectFrame()),200)}else{this.animationId=requestAnimationFrame((()=>this.detectFrame()))}}}catch(t){this.logger.error("Error en inferencia de modelo:",t);if(this.captureStep!=="completed"){setTimeout((()=>this.detectFrame()),100)}}}isCardInFrame(t){const e=t.x+t.w/2;const i=t.y+t.h/2;const s=this.INPUT_SIZE/2;const a=this.INPUT_SIZE/2;const o=40;const r=30;const n=Math.abs(e-s)<o&&Math.abs(i-a)<r;const c=t.w>150&&t.w<300&&t.h>90&&t.h<200;return n&&c}checkSideAlignment(t){if(!this.videoRef)return{top:false,right:false,bottom:false,left:false};const e=this.videoRef.videoWidth;const i=this.videoRef.videoHeight;if(e===0||i===0){return{top:false,right:false,bottom:false,left:false}}const s=e/i;const a=1;let o,r;if(s>a){o=this.INPUT_SIZE;r=this.INPUT_SIZE/s}else{r=this.INPUT_SIZE;o=this.INPUT_SIZE*s}const n=r*this.ID1_ASPECT_RATIO;let c,h;const d=this.maskSize/100;if(n<=o){h=r*d;c=h*this.ID1_ASPECT_RATIO}else{c=o*d;h=c/this.ID1_ASPECT_RATIO}const l=c*(this.INPUT_SIZE/o);const f=h*(this.INPUT_SIZE/r);const p=this.INPUT_SIZE/2;const m=this.INPUT_SIZE/2;const b=p-l/2;const u=p+l/2;const g=m-f/2;const x=m+f/2;let w=t.x;let A=t.x+t.w;const y=t.y;const v=t.y+t.h;if(this.shouldMirrorVideo){const t=w;const e=A;w=this.INPUT_SIZE-e;A=this.INPUT_SIZE-t}const C=this.alignmentTolerance;return{top:Math.abs(y-g)<=C,right:Math.abs(A-u)<=C,bottom:Math.abs(v-x)<=C,left:Math.abs(w-b)<=C}}areAllSidesAligned(t){return t.top&&t.right&&t.bottom&&t.left}updateMaskColor(t){const e=this.el.shadowRoot?.querySelector(".card-outline");const i=this.el.shadowRoot?.querySelectorAll(".corner");const s=this.el.shadowRoot?.querySelector(".side-top");const a=this.el.shadowRoot?.querySelector(".side-right");const o=this.el.shadowRoot?.querySelector(".side-bottom");const r=this.el.shadowRoot?.querySelector(".side-left");let n=null;let c={top:false,right:false,bottom:false,left:false};if(t.length>0){n=t.reduce(((t,e)=>e.score>t.score?e:t));c=this.checkSideAlignment(n);this.sideAlignment=c}else{this.sideAlignment={top:false,right:false,bottom:false,left:false}}s?.classList.toggle("aligned",c.top);a?.classList.toggle("aligned",c.right);o?.classList.toggle("aligned",c.bottom);r?.classList.toggle("aligned",c.left);const h=this.areAllSidesAligned(c);if(h&&n){e?.classList.add("perfect-match");i?.forEach((t=>t.classList.add("perfect-match")));if(!this.hasScreenshotTaken){this.lastDetectedBox=n;this.takeScreenshot().catch((t=>{this.logger.error("Error al tomar captura de pantalla:",t)}));this.hasScreenshotTaken=true;setTimeout((()=>{this.hasScreenshotTaken=false}),2e3)}}else{e?.classList.remove("perfect-match");i?.forEach((t=>t.classList.remove("perfect-match")))}}updateGuidanceStatus(t){if(t.length===0){this.statusMessage="Posicione la identificación dentro del marco";this.statusColor="#ff6b6b";this.logger.debug("Sin detección de documento en el frame")}else{const e=t.reduce(((t,e)=>e.score>t.score?e:t));const i=this.checkSideAlignment(e);const s=[i.top,i.right,i.bottom,i.left].filter(Boolean).length;const a=this.areAllSidesAligned(i);if(a){this.statusMessage="Identificación perfectamente alineada. Mantenga inmóvil";this.statusColor="#00ff00";this.logger.state("DOCUMENTO_PERFECTAMENTE_ALINEADO",{score:e.score,boxDimensions:{width:e.w,height:e.h},alignedSides:4})}else if(s>0){this.statusMessage=`Alinee los lados restantes (${s}/4 lados correctos)`;this.statusColor="#ffb366"}else if(e.w<150){this.statusMessage="Identificación detectada. Acerque al marco";this.statusColor="#ffb366"}else{this.statusMessage="Identificación detectada. Alinee con el marco";this.statusColor="#ffb366"}}}drawDetections(t,e){if(!this.videoRef)return;const i=this.videoRef.videoWidth;const s=this.videoRef.videoHeight;const a=this.canvasRef.width;const o=this.canvasRef.height;if(i===0||s===0)return;const r=i/s;const n=a/o;let c,h;let d=0,l=0;if(r>n){c=a;h=a/r;l=(o-h)/2}else{h=o;c=o*r;d=(a-c)/2}const f=c/this.INPUT_SIZE;const p=h/this.INPUT_SIZE;e.forEach((e=>{const i=e.x*f+d;const s=e.y*p+l;const a=e.w*f;const o=e.h*p;t.strokeStyle="#32406C";t.lineWidth=2;t.strokeRect(i,s,a,o)}))}async takeScreenshot(){if(!this.videoRef||!this.lastDetectedBox)return;this.logger.state("INICIANDO_CAPTURA",{captureStep:this.captureStep,detectedBox:this.lastDetectedBox,videoResolution:{width:this.videoRef.videoWidth,height:this.videoRef.videoHeight}});this.triggerCaptureAnimation();if(!this.captureCanvas||!this.captureCtx){this.initializeCanvasPool()}this.captureCanvas.width=this.videoRef.videoWidth;this.captureCanvas.height=this.videoRef.videoHeight;this.captureCtx.drawImage(this.videoRef,0,0,this.captureCanvas.width,this.captureCanvas.height);const t=this.videoRef.videoWidth/this.INPUT_SIZE;const e=this.videoRef.videoHeight/this.INPUT_SIZE;const i=Math.max(0,this.lastDetectedBox.x*t-this.cropMargin);const s=Math.max(0,this.lastDetectedBox.y*e-this.cropMargin);const a=Math.min(this.lastDetectedBox.w*t+2*this.cropMargin,this.videoRef.videoWidth-i);const o=Math.min(this.lastDetectedBox.h*e+2*this.cropMargin,this.videoRef.videoHeight-s);const r=document.createElement("canvas");r.width=a;r.height=o;const n=r.getContext("2d",{alpha:false});n.drawImage(this.videoRef,i,s,a,o,0,0,a,o);if(this.captureStep==="front"){this.capturedFullFrame=this.captureCanvas.toDataURL("image/png");this.capturedCroppedId=r.toDataURL("image/png");if(this.useDocumentClassification){if(!this.mobileNetSession){try{await this.loadMobileNetModel()}catch(t){this.logger.warn("Fallo al cargar modelo de clasificación, continuando sin clasificación:",t)}}if(this.mobileNetSession){const t=await this.classifyDocument(r);if(t&&t.class==="passport"){this.logger.state("PASAPORTE_DETECTADO_SALTANDO_REVERSO",{classification:t?.class});this.completeProcess(true);return}}}this.captureStep="back";this.statusMessage="Voltee la identificación y muestre la parte trasera";this.statusColor="#007bff";this.isDetectionPaused=true;setTimeout((()=>{this.showFlipAnimation=true;setTimeout((()=>{this.showFlipAnimation=false;this.isDetectionPaused=false}),3e3)}),800);this.logger.state("CAPTURA_FRENTE_COMPLETADA",{captureStep:this.captureStep,hasFullFrame:!!this.capturedFullFrame,hasCroppedId:!!this.capturedCroppedId})}else if(this.captureStep==="back"){this.capturedBackFullFrame=this.captureCanvas.toDataURL("image/png");this.capturedBackCroppedId=r.toDataURL("image/png");this.completeProcess(false);this.logger.state("CAPTURA_TRASERA_COMPLETADA",{captureStep:this.captureStep,hasBackFullFrame:!!this.capturedBackFullFrame,hasBackCroppedId:!!this.capturedBackCroppedId,processCompleted:true})}}triggerCaptureAnimation(){this.isCapturing=true;const t=this.el.shadowRoot?.querySelector(".card-outline");t?.classList.add("capturing");setTimeout((()=>{this.isCapturing=false;t?.classList.remove("capturing")}),600)}stopDetection(){if(this.animationId){cancelAnimationFrame(this.animationId);this.animationId=undefined}if(this.canvasRef){const t=this.canvasRef.getContext("2d");t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}this.logger.state("DETECTOR_DETENIDO",{timestamp:Date.now()})}resetDetection(){this.bestScore=0;this.startTime=Date.now();this.statusMessage="Sistema reiniciado. Posicione la identificación";this.statusColor="#aaa";this.hasScreenshotTaken=false;this.capturedFullFrame=null;this.capturedCroppedId=null;this.capturedBackFullFrame=null;this.capturedBackCroppedId=null;this.captureStep="front";this.isCapturing=false;this.showFlipAnimation=false;this.showSuccessAnimation=false;this.isDetectionPaused=false;this.isLoading=false;this.lastDetectedBox=undefined;this.isModelPreloaded=false;this.frameSkipCounter=0;this.consecutiveFailures=0;this.lastInferenceTime=0;if(this.canvasRef){const t=this.canvasRef.getContext("2d");t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}if(this.isVideoActive&&this.session){this.detectFrame()}}completeProcess(t=false){this.captureStep="completed";this.statusMessage=t?"Proceso completado (solo frente capturado)":"Proceso de captura completado exitosamente";this.statusColor="#28a745";this.logger.state("PROCESO_COMPLETADO",{skippedBack:t,hasFrontImages:!!(this.capturedFullFrame&&this.capturedCroppedId),hasBackImages:!!(this.capturedBackFullFrame&&this.capturedBackCroppedId),totalImages:t?2:4,timestamp:(new Date).toISOString()});this.stopDetection();const e={front:{fullFrame:this.capturedFullFrame,cropped:this.capturedCroppedId},back:{fullFrame:this.capturedBackFullFrame,cropped:this.capturedBackCroppedId},timestamp:(new Date).toISOString(),metadata:{totalImages:t?2:4,processCompleted:true,backCaptureSkipped:t}};this.captureCompleted.emit(e);setTimeout((()=>{this.showSuccessAnimation=true;setTimeout((()=>{this.showSuccessAnimation=false}),3e3)}),800)}exitSession(){if(this.videoStream){this.videoStream.getTracks().forEach((t=>t.stop()));this.videoStream=undefined;this.isVideoActive=false;if(this.debug){this.statusMessage="Cámara desactivada - Listo para nueva sesión";this.statusColor="#6c757d"}else{this.statusMessage="Presione el botón para activar la cámara";this.statusColor="#aaa"}}this.isLoading=false;if(this.canvasRef){const t=this.canvasRef.getContext("2d");t.clearRect(0,0,this.canvasRef.width,this.canvasRef.height)}this.cleanup()}render(){return s("div",{key:"a09694bc3b5f78bc792ea101d470ada1a438a57b",class:"detector-container"},s("div",{key:"c673c10d3311a44479d4462f3efbb4b6257ec6a9",class:"video-container"},s("video",{key:"c9faf3f111c50f945bce9d566fea2bd6b249fa78",ref:t=>this.videoRef=t,autoplay:true,muted:true,playsinline:true,class:this.shouldMirrorVideo?"mirror":"",style:{display:this.isVideoActive?"block":"none"}}),s("canvas",{key:"bdc04a389f6b956f7ca138d9fe74db38a6c8812c",ref:t=>this.canvasRef=t,class:this.shouldMirrorVideo?"mirror":""}),this.isMaskReady&&s("div",{key:"317156579b40924a7bb96c89dd247713f87f1aa9",class:"overlay-mask"},s("div",{key:"71cfc3c3bbfdae49f05fd563e14f56181440fafa",class:"card-outline"},s("div",{key:"3f940eeb59d783f47e2e2651ccf1a7be19f1d8b9",class:"side side-top"}),s("div",{key:"f07e54e9542811897191e9a9a08f91b9e4785cc6",class:"side side-right"}),s("div",{key:"5b6a323213ddff52071b3469068cba0b31930ea0",class:"side side-bottom"}),s("div",{key:"44cf6567819855ab915fcee51cec7d08cb8654a8",class:"side side-left"}),s("div",{key:"8f866542b2d1a399418d1c8cb58ea856d5f3b9e7",class:"corner corner-tl"}),s("div",{key:"a6567d410c755553d4be5b77dfc965e63b4ef07f",class:"corner corner-tr"}),s("div",{key:"255636461627f2deb61c9feacda3c9379abaaf29",class:"corner corner-bl"}),s("div",{key:"dd029757b1ccc49c44bedee12c19b9485ef16545",class:"corner corner-br"}),!this.showFlipAnimation&&!this.showSuccessAnimation&&s("div",{key:"37aef58019835eac5883042554c648b89cd305ac",class:"guide-text"},this.statusMessage)),this.captureStep==="back"&&!this.showFlipAnimation&&!this.showSuccessAnimation&&s("button",{key:"541f6d35d0655093f767423fc6851b521a5b43cd",class:"skip-button",onClick:()=>this.skipBackCapture(),type:"button"},"Saltar reverso"),this.isVideoActive&&s("div",{key:"73f2232b7c79f8b935cc78f2e5de1f064e4a3472",class:"camera-controls"},this.isMultipleCamerasAvailable&&s("button",{key:"3c176f9848dc4bf3b7144e2d68225562ae3780c0",class:"flip-camera-button",onClick:()=>this.flipCamera(),type:"button",title:"Cambiar cámara"},"Girar cámara"),s("button",{key:"9460ad4c42872324141ab19b516e7fa026afdd37",class:"camera-selector-button",onClick:()=>this.toggleCameraSelector(),type:"button",title:"Seleccionar cámara"},"Cámaras"),this.debug&&s("div",{key:"961d825eaba6077189f32193d527fe98a6d4e1e1",style:{position:"absolute",top:"50px",right:"0",background:"rgba(0,0,0,0.8)",color:"white",padding:"8px",fontSize:"10px",borderRadius:"4px",whiteSpace:"nowrap"}},"Cámaras: ",this.availableCameras.length,s("br",{key:"f7e12d21177478d03f6df0490dfc91df12bd1225"}),"Múltiples: ",this.isMultipleCamerasAvailable?"Sí":"No",s("br",{key:"1f1cc8cf92e10b9b902fd981875621fa8dbe70f2"}),"Selector: ",this.showCameraSelector?"Visible":"Oculto",s("br",{key:"c119c6567b28fc33e99b59f76e53e9359491ab77"}),"Video: ",this.isVideoActive?"Activo":"Inactivo")),this.showCameraSelector&&this.availableCameras.length>0&&s("div",{key:"c230990e87f3b6133263c42fc1b568c0caf076e2",class:"camera-selector-dropdown"},s("div",{key:"44c224e93c5832eea498e756a446e12ce8255e61",class:"camera-selector-header"},s("span",{key:"64d951db4843164378424f2d8d2ed2802eb35170"},"Seleccionar Cámara"),s("button",{key:"0575a7d0a9a99d665d42c6a7f7d8ceff53da9bd2",class:"close-selector",onClick:()=>this.toggleCameraSelector(),type:"button"},"×")),s("div",{key:"4aceed8bcf821710af343611f1b31efdfe61438e",class:"camera-list"},this.availableCameras.map((t=>s("button",{key:t.deviceId,class:`camera-option ${this.selectedCameraId===t.deviceId?"selected":""}`,onClick:()=>{this.switchCamera(t.deviceId);this.toggleCameraSelector()},type:"button"},s("span",{class:"camera-label"},t.label||`Cámara ${this.availableCameras.indexOf(t)+1}`),this.selectedCameraId===t.deviceId&&s("span",{class:"selected-indicator"},"✓"))))),s("div",{key:"d6d691cc499a35f40e348cf61d8f81a380e6fe98",class:"device-info"},s("small",{key:"ed38304b9dcac5b99d7b32f5733c59b335433f61"},"Dispositivo: ",this.deviceType)))),this.isCapturing&&s("div",{key:"ad19c6c3a2cb761a67b80e52761b2b9cb14d251d",class:"capture-animation"}),this.showFlipAnimation&&s("div",{key:"480615ac9b8ceb5cfc2d821d5777b213c2e86d83",class:"flip-animation"},s("div",{key:"45e74e5ef254bce75f51d2d12a5961722fb0af03",class:"id-card-icon"}),s("div",{key:"38b9274a67fa8cf1f83bd4b06a3d4ef3d03cdb14",class:"flip-text"},"¡Voltea tu identificación!")),this.showSuccessAnimation&&s("div",{key:"a6344502e3bbbe298dfb509b41354a54038826aa",class:"success-animation"},s("div",{key:"579f89d7c8d0ff76e42af611286d96a35d3dbfb9",class:"check-icon"}),s("div",{key:"5bb5c155c70f4bf7a04a62d10142e413763fa1fa",class:"success-text"},"¡Proceso completado!")),this.isLoading&&s("div",{key:"664113d7266be3c4171291faede143e736efadf0",class:"loading-overlay"},s("div",{key:"b699ad30f1784e1a92657391c080b91e017f7420",class:"loading-spinner"}),s("div",{key:"287f8e13229e4d14de31b0c5ad7d89a202eca5f9",class:"loading-text"},this.statusMessage)),this.debug&&s("div",{key:"ba649b0414153cb28b2c6e3c5451b324a990ec63",class:"status-bar"},s("div",{key:"55b11462af7ef04d293757e2e45344f9206352ac",class:"status-message",style:{color:this.statusColor}},this.statusMessage)),s("div",{key:"3b24a505519d8b483fad2b2f66ef8159d458e1b4",class:"watermark"},s("img",{key:"d61f9366631661835e1dd9500500c2b7a7334581",src:"https://storage.googleapis.com/jaak-static/commons/powered-by-jaak.png",alt:"Powered by Jaak"}))))}};o.style=a;export{o as jaak_stamps};
2
+ //# sourceMappingURL=p-b62b53f8.entry.js.map