{"version":3,"sources":["webpack://Liveness/./src/Livenessv5.9.js","webpack://Liveness/webpack/bootstrap","webpack://Liveness/webpack/startup"],"names":["module","exports","constructor","videoWrapper","config","this","uploadInProgress","requestType","windowWidth","window","innerWidth","width","height","Math","floor","token","faceapi","configFrameBox","frameBox","cssOrientationStyle","document","createElement","innerText","cssOrientationLock","head","appendChild","brightnessControl","luminanceControl","faceapiPath","isShowPreview","errorCallback","successCallback","livenessUrlBase","displaySize","livenessConfirmEndpoint","ellipseStrokeStyleDefault","ellipseStrokeStyle","activatedEllipseStrokeStyle","boxMessageBackgroundColor","boxMessageTextColor","configEyesBoxHeight","requestAnimationFrame","setUseBase64","setUseFormData","setMinBrightness","value","setMinLuminance","setFrameBoxesWidth","eyesInner","eyesOutter","box","setDimensionsRequestImage","dimensions","toggleDebug","isDebug","canvas","getContext","clearRect","setEyesBoxHeight","pixels","stop","video","pause","stream","getTracks","forEach","track","clearInterval","timer","timerBackground","callback","startCallbackFunction","setLiveness","loadFaceApi","setLoading","createModalConfirmationWrapper","createModalConfirmation","createVideoElement","startVideo","destroyLiveness","removeCanvas","resetVideoWrapper","resetLiveness","closePreviewModal","base64","removeLoading","createCanvasBackground","canvasBackground","clientWidth","getDevicePixelRatio","clientHeight","style","display","sweepVideo","data","luminanceAvg","brightnessSum","luminanceArray","x","length","r","g","b","sweepBrightness","sweepLuminance","checkBrightness","isMobile","test","navigator","userAgent","brightness","canvasLuminance","calcLuminance","push","luminance","colorFactor","colorArray","i","pow","mediaQuery","isFirefox","toLowerCase","indexOf","undefined","devicePixelRatio","matchMedia","matches","script","faceJS","src","append","onload","async","loadFaceApiModels","setTimeout","Promise","all","nets","faceLandmark68Net","loadFromUri","faceExpressionNet","faceRecognitionNet","then","tinyFaceDetector","console","log","catch","e","error","mediaDevices","getUserMedia","constraints","webkitGetUserMedia","mozGetUserMedia","resolve","reject","call","Error","enumerateDevices","devices","frameRate","facingMode","backCamera","filter","device","kind","label","includes","deviceId","querySelector","streamLiveness","srcObject","URL","createObjectURL","err","transform","setAttribute","position","addEventListener","createMessageBox","loop","getElementById","innerHTML","getElementsByTagName","remove","responsiveFrameBoxEyesOutterWidth","createCanvasFromMedia","left","top","matchDimensions","boxesWidth","ellipseMaskWidth","ellipseMaskHeight","ellipseMaskTop","ellipseMaskLeft","ellipseMaskLineWidth","ctx","translate","scale","drawEllipse","draw","isBackgroundOK","setInterval","checkBackground","state","counter","inProgress","done","canvasPosition","getBoundingClientRect","onLine","setHasNoNetwork","detections","detectSingleFace","TinyFaceDetectorOptions","withFaceLandmarks","withFaceExpressions","blockMask","resizedDetections","resizeResults","expressions","expression","getExpression","detection","pose","getPose","jaw","landmarks","getJawOutline","isRotatedFace","beginPath","lineWidth","strokeStyle","moveTo","y","lineTo","stroke","leftEye","meanPosition","isInside","outterBox","innerBox","rightEye","activateEllipseMask","takePicture","deactivateEllipseMask","rect","w","h","ellipse","PI","expArr","key","Object","entries","confidence","exp","sort","a","pop","res","eye_right","getMeanPosition","getRightEye","eye_left","getLeftEye","nose","getNose","mouth","getMouth","rx","getTop","ry","score","p1","p2","abs","atan2","l","map","reduce","min","message","msg","elMessage","textContent","context","createFlashMask","drawImage","fillStyle","fillRect","pictureData","getImageData","putImageData","toDataURL","removeFlashMask","openPreviewModal","confirmPicture","table","brilho","atual","parseFloat","toFixed","flash","background","zIndex","id","body","modalWrapper","modalConfirmation","confirmButton","cancelButton","footer","cancelPicture","image","modal","downloadImage","anchor","click","insertAdjacentHTML","setLoadingProgress","spinner","endpoint","xhr","XMLHttpRequest","open","setRequestHeader","upload","loaded","total","onreadystatechange","readyState","DONE","response","JSON","parse","status","sendBase64","sendFormData","send","stringify","toB64","formData","toFormData","FormData","responseFetch","fetch","blob","split","sendPictureByXmlRequest","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"mappings":"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","file":"liveness.js","sourcesContent":["\"use strict\";\nclass Liveness {\n\n constructor (videoWrapper, config) {\n this.uploadInProgress = 0.00\n this.requestType = 'b64'\n const windowWidth = window.innerWidth\n this.config = config\n if (config.width >= windowWidth) {\n config.width = windowWidth\n }\n\n config.height = Math.floor(config.width * 0.7778)\n this.token = config.token\n this.videoWrapper = videoWrapper\n this.faceapi = null\n this.configFrameBox = config.frameBox\n\n const cssOrientationStyle = document.createElement('style')\n cssOrientationStyle.innerText = this.cssOrientationLock()\n document.head.appendChild(cssOrientationStyle)\n \n if (config.brightnessControl) this.brightnessControl = config.brightnessControl\n else this.brightnessControl = 95\n\n if (config.luminanceControl) this.luminanceControl = config.luminanceControl\n else this.luminanceControl = 23\n\n this.faceapiPath = config.faceapiPath\n this.isShowPreview = config.isShowPreview\n this.errorCallback = config.errorCallback\n this.successCallback = config.successCallback\n this.livenessUrlBase = config.livenessUrlBase\n this.displaySize = { width: config.width, height: config.height }\n this.livenessConfirmEndpoint = config.livenessConfirmEndpoint || '/liveness/v2'\n this.ellipseStrokeStyleDefault = config.ellipseStrokeStyle || '#D02780'\n this.activatedEllipseStrokeStyle = config.activatedEllipseStrokeStyle || '#46E3C3'\n this.boxMessageBackgroundColor = config.boxMessageBackgroundColor || '#D02780'\n this.boxMessageTextColor = config.boxMessageTextColor || '#f3f3f5'\n this.configEyesBoxHeight = config.configEyesBoxHeight || 100\n this.requestAnimationFrame = window.requestAnimationFrame\n }\n\n setUseBase64 () {\n this.requestType = \"b64\"\n }\n\n setUseFormData () {\n this.requestType = \"formData\"\n }\n\n setMinBrightness (value) {\n this.brightnessControl = value\n }\n\n setMinLuminance (value) {\n this.luminanceControl = value\n }\n\n setFrameBoxesWidth (eyesInner, eyesOutter, box) {\n this.configFrameBox = {\n eyesInner,\n eyesOutter,\n box\n }\n }\n setDimensionsRequestImage (width, height) {\n this.config.dimensions = {\n width,\n height\n }\n }\n toggleDebug () {\n this.config.isDebug = !this.config.isDebug\n if (!this.config.isDebug) {\n const ctx = this.canvas.getContext('2d')\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n }\n }\n\n setEyesBoxHeight (pixels) {\n this.configEyesBoxHeight = pixels\n }\n\n stop () {\n this.video.pause()\n const tracks = this.stream.getTracks()\n tracks.forEach(track => track.stop())\n clearInterval(this.timer)\n clearInterval(this.timerBackground)\n }\n\n async start (callback) {\n this.startCallbackFunction = callback\n if (!window.faceapi) {\n await this.loadFaceApi()\n } else {\n this.faceapi = window.faceapi\n this.setLiveness()\n }\n }\n\n setLiveness () {\n this.setLoading()\n this.createModalConfirmationWrapper()\n .createModalConfirmation()\n .createVideoElement()\n .startVideo()\n }\n\n destroyLiveness () {\n this.stop()\n this.removeCanvas()\n this.resetVideoWrapper()\n }\n\n resetLiveness () {\n this.stop()\n this.removeCanvas()\n this.resetVideoWrapper()\n this.closePreviewModal()\n this.base64 = ''\n this.removeLoading()\n this.setLiveness()\n }\n\n cssOrientationLock () {\n return '@media screen and (min-width: 320px) and (max-width: 767px) and (orientation: landscape) { html { transform: rotate(-90deg);transform-origin: left top;width: 100vh;overflow-x: hidden;position: absolute;top: 100%;left: 0;}}'\n }\n\n createCanvasBackground () {\n this.canvasBackground = document.createElement('canvas')\n const width = this.videoWrapper.clientWidth * this.getDevicePixelRatio()\n const height = this.videoWrapper.clientHeight * this.getDevicePixelRatio()\n if (window.innerWidth < 720) {\n this.canvasBackground.width = width * 2\n this.canvasBackground.height = height * 2\n } else {\n this.canvasBackground.width = width\n this.canvasBackground.height = height\n }\n \n if (this.config.dimensions) {\n this.canvasBackground.width = this.config.dimensions.width\n this.canvasBackground.height = this.config.dimensions.height\n }\n\n this.canvasBackground.style.display = 'none'\n }\n\n sweepVideo (data) {\n this.luminanceAvg = 0\n this.brightnessSum = 0 \n this.luminanceArray = []\n\n for (let x = 0; x < data.length; x += 4) {\n const r = data[x]\n const g = data[x + 1]\n const b = data[x + 2]\n this.sweepBrightness(r, g, b)\n this.sweepLuminance(r, g, b)\n }\n this.checkBrightness()\n }\n\n isMobile () {\n const acceptedBrowser = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i\n return acceptedBrowser.test(navigator.userAgent)\n }\n\n checkBrightness () {\n this.brightness = Math.floor(this.brightnessSum / (this.canvasLuminance.width * this.canvasLuminance.height))\n }\n\n sweepBrightness (r, g, b) {\n this.brightnessSum += Math.floor((r + g + b) / 3)\n }\n\n sweepLuminance (r, g, b) {\n this.luminanceAvg += this.calcLuminance(r, g, b)\n this.luminanceArray.push(this.calcLuminance(r, g, b)) \n\n this.luminance = (this.luminanceAvg / this.luminanceArray?.length) * 100\n }\n\n calcLuminance (r, g, b) {\n let colorArray = [r, g, b]\n let colorFactor\n for (let i = 0; i < colorArray.length; i++) {\n colorFactor = colorArray[i] / 255\n if (colorFactor <= 0.03928) {\n colorFactor = colorFactor / 12.92\n } else {\n colorFactor = Math.pow(((colorFactor + 0.055) / 1.055), 2.4)\n }\n colorArray[i] = colorFactor\n }\n return (colorArray[0] * 0.2126 + colorArray[1] * 0.7152 + colorArray[2] * 0.0722) + 0.05\n }\n getDevicePixelRatio () {\n let mediaQuery\n const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1\n if (window.devicePixelRatio !== undefined && !isFirefox) {\n return window.devicePixelRatio\n } else if (window.matchMedia) {\n mediaQuery = \"(-webkit-min-device-pixel-ratio: 1.5),\\\n (min--moz-device-pixel-ratio: 1.5),\\\n (-o-min-device-pixel-ratio: 3/2),\\\n (min-resolution: 1.5dppx)\"\n if (window.matchMedia(mediaQuery).matches) {\n return 1.5\n }\n mediaQuery = \"(-webkit-min-device-pixel-ratio: 2),\\\n (min--moz-device-pixel-ratio: 2),\\\n (-o-min-device-pixel-ratio: 2/1),\\\n (min-resolution: 2dppx)\"\n if (window.matchMedia(mediaQuery).matches) {\n return 2\n }\n mediaQuery = \"(-webkit-min-device-pixel-ratio: 0.75),\\\n (min--moz-device-pixel-ratio: 0.75),\\\n (-o-min-device-pixel-ratio: 3/4),\\\n (min-resolution: 0.75dppx)\"\n if (window.matchMedia(mediaQuery).matches) {\n return 1.5\n }\n } else {\n return 1\n }\n }\n\n async loadFaceApi () {\n const script = document.createElement('script')\n const faceJS = `${this.faceapiPath}/face-api.min.js`\n script.src = faceJS\n document.head.append(script)\n script.onload = async () => {\n await this.loadFaceApiModels()\n }\n return this\n }\n async loadFaceApiModels () {\n setTimeout(async () => {\n Promise.all([\n window.faceapi.nets.faceLandmark68Net.loadFromUri(this.faceapiPath),\n window.faceapi.nets.faceExpressionNet.loadFromUri(this.faceapiPath),\n window.faceapi.nets.faceRecognitionNet.loadFromUri(this.faceapiPath)\n ])\n .then(async () => {\n await window.faceapi.nets.tinyFaceDetector.loadFromUri(this.faceapiPath)\n console.log('Models were loaded')\n this.faceapi = faceapi\n this.setLiveness()\n })\n .catch(e => console.error('error', e))\n }, 100)\n return this\n }\n\n startVideo () {\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {}\n }\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = function(constraints) {\n const getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia\n if (!getUserMedia) {\n return Promise.reject(new Error('getUserMedia não implementado nesse browser'))\n }\n return new Promise(function(resolve, reject) {\n getUserMedia.call(navigator, constraints, resolve, reject)\n })\n }\n }\n navigator.mediaDevices.enumerateDevices().then(devices => {\n const constraints = {\n video: { \n width: this.config.width,\n height: this.config.height,\n frameRate: 24\n }\n }\n if (this.isMobile()) constraints.video = { facingMode: 'user' }\n else {\n const backCamera = devices.filter(device => device.kind === 'videoinput' && !device.label.includes('m-de:vice'))[0]\n if (backCamera) constraints.video.deviceId = backCamera.deviceId\n }\n\n navigator.mediaDevices.getUserMedia(constraints).then((stream) => {\n const video = document.querySelector('video')\n\n if (!video) return\n\n this.stream = stream\n navigator.streamLiveness = stream\n if (\"srcObject\" in video) {\n video.srcObject = stream\n } else {\n video.src = window.URL.createObjectURL(stream)\n }\n !!this.startCallbackFunction && this.startCallbackFunction()\n\n }).catch(err => console.error(err))\n })\n\n return this\n }\n createVideoElement () {\n this.video = document.createElement('video')\n this.video.style.width = '100%'\n this.video.style.height = '100%'\n this.video.style.transform = 'scaleX(-1)'\n this.video.setAttribute('muted', true)\n this.video.setAttribute('autoplay', true)\n this.video.setAttribute('playsinline', '')\n this.videoWrapper.style.position = 'relative'\n this.videoWrapper.style.width = this.config.width\n this.videoWrapper.style.height = this.config.height\n this.videoWrapper.append(this.video)\n this.video.addEventListener('play', () => {\n this.createMessageBox()\n this.loop()\n this.createCanvasBackground()\n })\n return this\n }\n resetVideoWrapper () {\n const videoWrapper = document.getElementById('video-wrapper')\n if(videoWrapper) videoWrapper.innerHTML = ''\n }\n\n removeCanvas () {\n const canvas = document.getElementsByTagName('canvas')[0]\n if(canvas) canvas.remove()\n }\n\n responsiveFrameBoxEyesOutterWidth (windowWidth) {\n switch (windowWidth) {\n case 315:\n return {\n eyesInner: 0.74,\n eyesOutter: 0.78,\n box: 0.55\n }\n break;\n \n default:\n return {\n eyesInner: 0.52,\n eyesOutter: 0.82,\n box: 0.60\n }\n break;\n }\n }\n loop () {\n if (this.video.style.width.includes('%')) {\n this.displaySize.width = this.video.style.width = this.video.clientWidth\n this.displaySize.height = this.video.style.height = this.video.clientHeight\n }\n this.canvas = this.faceapi.createCanvasFromMedia(this.video)\n\n this.canvas.style.position = 'absolute'\n this.canvas.style.left = 0\n this.canvas.style.top = 0\n\n this.videoWrapper.append(this.canvas)\n this.faceapi.matchDimensions(this.canvas, this.displaySize)\n this.boxesWidth = this.responsiveFrameBoxEyesOutterWidth(window.innerWidth)\n\n if (this.configFrameBox) this.boxesWidth = this.configFrameBox\n\n const frameBox = {\n width: Math.floor(this.config.width * this.boxesWidth.box),\n height: Math.floor(this.config.height * .922)\n }\n frameBox.left = Math.floor((this.canvas.width / 2) - (frameBox.width / 2))\n frameBox.top = Math.floor( (this.videoWrapper.clientHeight / 2) - (frameBox.height / 2) )\n\n const height = frameBox.height + this.configEyesBoxHeight\n const eyesOutter = {\n width: Math.floor((frameBox.width * this.boxesWidth.eyesOutter)),\n height: Math.floor((height / 5))\n }\n eyesOutter.left = Math.floor((frameBox.left + (frameBox.width / 1.95) - (eyesOutter.width / 1.95)))\n eyesOutter.top = Math.floor(frameBox.top + (frameBox.height * 0.3))\n\n const eyesInner = {\n width: Math.floor((frameBox.width * this.boxesWidth.eyesInner)),\n height: Math.floor((height / 5))\n }\n eyesInner.left = Math.floor((frameBox.left + (frameBox.width / 1.96) - (eyesInner.width / 1.96)))\n eyesInner.top = Math.floor(frameBox.top + (frameBox.height * 0.3))\n\n this.ellipseMaskWidth = eyesInner.height + (eyesInner.height * 0.3)\n this.ellipseMaskHeight = frameBox.width / 2\n this.ellipseMaskTop = eyesOutter.top + (eyesOutter.height / 1.4)\n this.ellipseMaskLeft = eyesOutter.left + (eyesOutter.width / 2)\n this.ellipseMaskLineWidth = 2\n\n const ctx = this.canvas.getContext('2d')\n ctx.translate(this.canvas.width, 0)\n ctx.scale(-1, 1)\n this.drawEllipse(ctx)\n // DEBUG\n if (this.config.isDebug) {\n this.draw(ctx, this.canvas, frameBox, eyesInner, eyesOutter)\n }\n\n if (!this.isMobile()) {\n this.timerBackground = setInterval(() => {\n this.checkBackground()\n }, 1000);\n } else this.isBackgroundOK = true\n\n \n const state = {\n counter: 0,\n inProgress: false,\n done: false\n }\n \n const canvasPosition = this.canvas.getBoundingClientRect()\n this.timer = setInterval(async () => {\n if (!navigator.onLine) {\n this.setHasNoNetwork()\n return\n }\n if (state.inProgress || state.done) {\n return\n }\n state.inProgress = true\n\n const detections = await this.faceapi.detectSingleFace(this.video, new this.faceapi.TinyFaceDetectorOptions())\n .withFaceLandmarks()\n .withFaceExpressions()\n\n this.removeLoading()\n\n if (!detections) {\n this.blockMask('Face não encontrada', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n state.counter = 0\n state.inProgress = false\n return\n }\n\n const resizedDetections = this.faceapi.resizeResults(detections, this.displaySize)\n\n if (resizedDetections && resizedDetections.expressions) { \n const expression = this.getExpression(resizedDetections.expressions)\n if (expression !== 'neutral') {\n if (this.config.isDebug) {\n this.blockMask(`Mantenha expressão neutra >> ${expression}`, canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n } else {\n this.blockMask('Mantenha expressão neutra', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n }\n state.counter = 0\n state.inProgress = false\n return\n }\n }\n \n if (resizedDetections.detection) {\n\n // POSE\n const pose = this.getPose(resizedDetections)\n if (pose !== 'front') {\n if (this.config.isDebug) {\n this.blockMask(`Centralize seu rosto >> ${pose}`, canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n } else {\n this.blockMask('Centralize seu rosto', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n }\n state.counter = 0\n state.inProgress = false\n return\n }\n\n // ANGLE\n const jaw = resizedDetections.landmarks.getJawOutline()\n const rotated = this.isRotatedFace(jaw[0], jaw[16])\n if (rotated) {\n if (this.config.isDebug) {\n this.blockMask('Centralize seu rosto >> rotacionado', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n } else {\n this.blockMask('Centralize seu rosto', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n }\n state.counter = 0\n state.inProgress = false\n return\n }\n\n // DEBUG\n if (this.config.isDebug) {\n this.draw(ctx, this.canvas, frameBox, eyesInner, eyesOutter)\n ctx.beginPath()\n ctx.lineWidth = '5'\n ctx.strokeStyle = '#FFFF00'\n ctx.moveTo(jaw[0].x, jaw[0].y)\n ctx.lineTo(jaw[16].x, jaw[16].y)\n ctx.stroke()\n }\n\n\n const leftEye = {\n meanPosition: [jaw[0].x, jaw[0].y],\n frameBox: { isInside: false },\n outterBox: { isInside: false },\n innerBox: { isInside: false }\n }\n const rightEye = { \n meanPosition: [jaw[16].x, jaw[16].y],\n frameBox: { isInside: false },\n outterBox: { isInside: false },\n innerBox: { isInside: false }\n }\n\n leftEye.frameBox.isInside = this.isInside(leftEye.meanPosition, { top: frameBox.top, left: frameBox.left, width: frameBox.width, height: frameBox.height })\n rightEye.frameBox.isInside = this.isInside(rightEye.meanPosition, { top: frameBox.top, left: frameBox.left, width: frameBox.width, height: frameBox.height })\n\n leftEye.outterBox.isInside = this.isInside(leftEye.meanPosition, { top: eyesOutter.top, left: eyesOutter.left, width: eyesOutter.width, height: eyesOutter.height })\n rightEye.outterBox.isInside = this.isInside(rightEye.meanPosition, { top: eyesOutter.top, left: eyesOutter.left, width: eyesOutter.width, height: eyesOutter.height })\n\n leftEye.innerBox.isInside = this.isInside(leftEye.meanPosition, { top: eyesInner.top, left: eyesInner.left, width: eyesInner.width, height: eyesInner.height })\n rightEye.innerBox.isInside = this.isInside(rightEye.meanPosition, { top: eyesInner.top, left: eyesInner.left, width: eyesInner.width, height: eyesInner.height })\n\n\n if (!this.isBackgroundOK) {\n this.blockMask('O ambiente está escuro', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n state.counter = 0\n state.inProgress = false\n return\n }\n\n if (!leftEye.frameBox.isInside || !rightEye.frameBox.isInside) {\n this.blockMask('Posicione seu rosto dentro da moldura', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n state.counter = 0\n state.inProgress = false\n return\n }\n\n if (!leftEye.outterBox.isInside || !rightEye.outterBox.isInside) {\n this.blockMask('Afaste seu rosto', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n state.counter = 0\n state.inProgress = false\n return\n }\n\n if (leftEye.innerBox.isInside || rightEye.innerBox.isInside) {\n this.blockMask('Aproxime seu rosto', canvasPosition, frameBox.left, frameBox.top, frameBox.height, frameBox.width)\n state.counter = 0\n state.inProgress = false\n return\n }\n\n this.ellipseMaskLineWidth *= 2\n this.activateEllipseMask()\n \n state.counter += 1\n state.inProgress = false\n if (state.counter >= 2) {\n state.done = true\n this.takePicture()\n clearInterval(this.timer)\n !!this.timerBackground && clearInterval(this.timerBackground)\n }\n }\n \n }, 150)\n }\n\n activateEllipseMask () {\n const ctx = this.canvas.getContext('2d')\n this.drawEllipse(ctx, this.activatedEllipseStrokeStyle)\n }\n\n deactivateEllipseMask () {\n const ctx = this.canvas.getContext('2d')\n this.ellipseMaskLineWidth = 3\n this.drawEllipse(ctx)\n }\n \n draw (ctx, canvas, frameBox, eyesInner, eyesOutter) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.beginPath()\n ctx.lineWidth = 3\n ctx.strokeStyle = 'blue'\n ctx.rect(frameBox.left, frameBox.top, frameBox.width, frameBox.height)\n ctx.stroke()\n \n ctx.beginPath()\n ctx.lineWidth = 2\n ctx.strokeStyle = 'yellow'\n ctx.rect(eyesInner.left, eyesInner.top, eyesInner.width, eyesInner.height)\n ctx.stroke()\n \n ctx.beginPath()\n ctx.lineWidth = 2\n ctx.strokeStyle = 'red'\n ctx.rect(eyesOutter.left, eyesOutter.top, eyesOutter.width, eyesOutter.height)\n ctx.stroke()\n this.drawEllipse(ctx)\n }\n\n\n drawEllipse(ctx, style) {\n const x = this.ellipseMaskLeft\n const y = this.ellipseMaskTop\n const w = this.ellipseMaskWidth\n const h = this.ellipseMaskHeight\n\n ctx.beginPath()\n ctx.lineWidth = this.ellipseMaskLineWidth\n\n ctx.ellipse(x, y, w, h, 0, 0, Math.PI * 2)\n ctx.strokeStyle = style || this.ellipseStrokeStyleDefault\n\n ctx.stroke();\n }\n getExpression (expressions) {\n const expArr = []\n for (const [key, value] of Object.entries(expressions)) {\n expArr.push({ expression: key, confidence: value })\n }\n const exp = expArr.sort((a, b) => a.confidence - b.confidence).pop()\n return (exp && exp.expression) ? exp.expression : null\n }\n getPose(res) {\n const eye_right = this.getMeanPosition(res.landmarks.getRightEye())\n const eye_left = this.getMeanPosition(res.landmarks.getLeftEye())\n const nose = this.getMeanPosition(res.landmarks.getNose())\n const mouth = this.getMeanPosition(res.landmarks.getMouth())\n const jaw = this.getTop(res.landmarks.getJawOutline())\n const rx = (jaw - mouth[1]) / res.detection.box.height + 0.45\n const ry = (eye_left[0] + (eye_right[0] - eye_left[0]) / 2 - nose[0]) / res.detection.box.width\n let state = 'undetected'\n\n if (res.detection.score > 0.3) {\n state = 'front'\n if (rx > 0.2) {\n state = 'top'\n } else if (rx < -0.1) {\n state = 'bottom'\n } else {\n if (ry < -0.04) {\n state = 'left'\n }\n if (ry > 0.04) {\n state = 'right'\n }\n }\n }\n return state\n }\n isRotatedFace (p1, p2) {\n const angleDeg = Math.abs(Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI)\n return angleDeg > 7\n }\n getMeanPosition (l) {\n return l\n .map((a) => [a.x, a.y])\n .reduce((a, b) => [a[0] + b[0], a[1] + b[1]])\n .map((a) => a / l.length)\n }\n getTop (l) {\n return l\n .map((a) => a.y)\n .reduce((a, b) => Math.min(a, b))\n }\n isInside (a = [], b = {}) {\n if (a[1] < b.top) {\n return false\n }\n if (a[0] < b.left) {\n return false\n }\n if (a[1] > b.top + b.height) {\n return false\n }\n if (a[0] > b.left + b.width) {\n return false\n }\n return true\n }\n blockMask (message, canvasPosition, left, top, height, width) {\n const MASK_WHITE_BORDER = 50\n const dimensions = {\n width: 230,\n height: 35\n }\n dimensions.top = top + height + 20\n dimensions.left = (left + (width / 2)) - (dimensions.width / 2)\n\n\n this.deactivateEllipseMask()\n\n this.msg.innerHTML = ''\n const elMessage = document.createElement('span')\n elMessage.textContent = message\n elMessage.style = \n `\n display: flex;\n color: ${this.boxMessageTextColor};\n z-index: 20;\n font-size: 1.1rem;\n padding: 10px 20px;\n text-align: center;\n align-items: center;\n background: ${this.boxMessageBackgroundColor};\n border-radius: 7px;\n justify-content: center;\n width: ${dimensions.width}px;\n height: ${dimensions.height}px;\n font-family: Prompt, sans-serif;\n `\n this.msg.style.display = 'flex'\n this.msg.appendChild(elMessage)\n }\n takePicture () {\n const context = this.canvasBackground.getContext('2d')\n this.canvasBackground.style.display = 'none;'\n this.createFlashMask()\n context.drawImage(this.video, 0, 0, this.canvasBackground.width, this.canvasBackground.height)\n context.fillStyle = \"rgb(71,84,68)\"\n context.fillRect(20, 50, 1, 1)\n context.fillStyle = \"rgb(211,190,124)\"\n context.fillRect(422, 522, 1, 1)\n const pictureData = context.getImageData(0,0,this.canvasBackground.width,this.canvasBackground.height)\n context.putImageData(pictureData, 0, 0)\n this.base64 = this.canvasBackground.toDataURL('image/png')\n\n setTimeout(() => {\n this.removeFlashMask()\n\n if(this.isShowPreview) {\n this.openPreviewModal()\n }\n else {\n this.confirmPicture()\n }\n \n }, 300)\n }\n checkBackground () {\n this.canvasLuminance = document.createElement('canvas')\n const width = this.videoWrapper.clientWidth / 2\n const height = this.videoWrapper.clientHeight / 2\n\n const context = this.canvasLuminance.getContext('2d')\n\n context.drawImage(this.video, 0, 0, this.canvasLuminance.width, this.canvasLuminance.height)\n const pictureData = context.getImageData(0,0,this.canvasLuminance.width,this.canvasLuminance.height)\n this.sweepVideo(pictureData.data)\n\n this.isBackgroundOK = (this.brightness >= this.brightnessControl && this.luminance >= this.luminanceControl)\n\n if (this.config.isDebug) {\n const table = {\n brilho: {\n atual: this.brightness,\n 'mín aceitável': this.brightnessControl,\n },\n 'luminânia': {\n atual: parseFloat(this.luminance.toFixed(2)),\n 'mín aceitável': this.luminanceControl\n }\n }\n console.table(table)\n }\n }\n createFlashMask () {\n const flash = document.createElement('div')\n flash.style.width = '100%'\n flash.style.height = '100vh'\n flash.style.position = 'fixed'\n flash.style.background = 'white'\n flash.style.zIndex = 30\n flash.style.top = 0\n flash.style.left = 0\n flash.id = 'flash'\n document.body.append(flash)\n }\n removeFlashMask () {\n const flash = document.getElementById('flash')\n flash.remove()\n }\n createMessageBox () {\n this.msg = document.createElement('div')\n this.msg.style = `\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n background: transparent;\n position: absolute;\n bottom: 0;\n `\n this.videoWrapper.append(this.msg)\n return this\n }\n createModalConfirmationWrapper () {\n this.modalWrapper = document.createElement('div')\n this.modalWrapper.style = `\n top: 0;\n left: 0;\n z-index: 21;\n width: 100%;\n height: 100%;\n display: none;\n position: fixed;\n align-items: flex-start;\n justify-content: center;\n background: rgba(20, 20, 20, 0.95);\n `\n this.modalWrapper.id = 'modalWrapper'\n document.body.append(this.modalWrapper)\n return this\n }\n createModalConfirmation () {\n this.modalConfirmation = document.createElement('div')\n this.modalConfirmation.style = `\n padding: 7px;\n display: flex;\n max-width: 720px;\n background: white;\n max-height: 560px;\n border-radius: 7px;\n position: relative;\n align-items: center;\n justify-content: center;\n `\n const confirmButton = document.createElement('button')\n confirmButton.textContent = 'Confirmar'\n confirmButton.style = `\n color: #555;\n right: 10px;\n width: 160px;\n height: 50px;\n bottom: 10px;\n cursor: pointer;\n background: #fff;\n font-weight: 600;\n border-radius: 7px;\n margin-right: 10px;\n border: 1px solid #222;\n `\n const cancelButton = document.createElement('button')\n cancelButton.textContent = 'Cancelar'\n cancelButton.style = `\n color: #444;\n right: 10px;\n width: 160px;\n height: 50px;\n bottom: 10px;\n cursor: pointer;\n background: #fff;\n font-weight: 600;\n border-radius: 7px;\n margin-right: 10px;\n border: 1px solid #222;\n `\n const footer = document.createElement('div')\n footer.style = `\n right: 0;\n bottom: 0;\n z-index: 1;\n width: 100%;\n display: flex;\n padding: 10px 0;\n position: absolute;\n justify-content: center;\n `\n footer.append(cancelButton)\n footer.append(confirmButton)\n this.modalConfirmation.append(footer)\n this.modalWrapper.append(this.modalConfirmation)\n confirmButton.addEventListener('click', () => {\n this.closePreviewModal()\n this.confirmPicture()\n })\n cancelButton.addEventListener('click', () => {\n this.cancelPicture()\n })\n return this\n }\n\n openPreviewModal () {\n const image = document.createElement('img')\n image.src = this.base64\n image.style = `\n width: 100%;\n height: 100%;\n max-width: ${this.videoWrapper.clientWidth};\n object-fit: cover;\n border-radius: 7px;\n transform: scaleX(-1);\n `\n this.modalConfirmation.append(image)\n this.modalWrapper.style.display = 'flex'\n }\n\n closePreviewModal () {\n const modal = document.getElementById('modalWrapper')\n if (modal) modal.remove()\n }\n\n cancelPicture () {\n this.resetLiveness()\n }\n\n downloadImage () {\n const anchor = createElement('a')\n anchor.setAttribute('download', 'image.png')\n anchor.setAttribute('href', this.base64)\n anchor.click()\n setTimeout(() => {\n anchor.remove()\n }, 1000);\n }\n\n setLoading () {\n const hasSpinner = document.getElementById('spinner')\n if (!!hasSpinner) return \n\n const spinner = `
\n
\n
\n
\n
\n
\n \n
`\n this.videoWrapper.insertAdjacentHTML('beforeend', spinner)\n }\n\n setLoadingProgress () { \n const hasSpinner = document.getElementById('spinner')\n if (!!hasSpinner) return \n\n const spinner = `
\n

\n ${\n this.uploadInProgress === 100\n ? 'Aguarde enquanto estamos
analisando a sua selfie
'\n : `Fazendo upload da selfie...
(${this.uploadInProgress?.toFixed(0)}% enviados)`\n }\n

\n \n \n
`\n this.videoWrapper.insertAdjacentHTML('beforeend', spinner)\n }\n\n removeLoading () {\n const spinner = document.getElementById('spinner')\n if(spinner) spinner.remove()\n }\n\n setHasNoNetwork () {\n const hasSpinner = document.getElementById('spinner')\n if (!!hasSpinner) return \n\n const spinner = `
\n
\n
\n
\n
\n

Estamos sem conexão
com a internet

\n \n
`\n this.videoWrapper.insertAdjacentHTML('beforeend', spinner)\n }\n\n async sendPictureByXmlRequest () {\n const endpoint = `${this.livenessUrlBase}${this.livenessConfirmEndpoint}`\n const xhr = new XMLHttpRequest()\n xhr.open('POST', endpoint, true)\n\n xhr.setRequestHeader('Authorization', `Bearer ${this.token}`)\n\n xhr.upload.addEventListener('progress', (e) => {\n this.uploadInProgress = (e.loaded / e.total) * 100\n\n this.removeLoading()\n this.setLoadingProgress()\n })\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n const response = JSON.parse(xhr?.response)\n switch (xhr.status) {\n case 200:\n this.successCallback({...response, base64: this.base64})\n break;\n case 401:\n this.errorCallback({ error: response, base64: this.base64})\n break;\n default:\n this.errorCallback({ error: response, base64: this.base64})\n break;\n }\n this.resetLiveness()\n this.removeLoading()\n }\n }\n if (this.requestType === 'b64') {\n await this.sendBase64(xhr)\n } else {\n await this.sendFormData(xhr)\n }\n }\n\n async sendBase64 (xhr) {\n xhr.setRequestHeader('Content-Type', 'application/json')\n xhr.send(JSON.stringify({\n base64: {\n key: this.toB64()\n }\n }))\n }\n async sendFormData (xhr) {\n const formData = await this.toFormData()\n xhr.send(formData)\n }\n async toFormData () {\n const formData = new FormData()\n const responseFetch = await fetch(this.base64)\n const blob = await responseFetch.blob()\n formData.append('selfie', blob, 'image.png')\n return formData\n }\n\n toB64 () {\n const base64Local = this.base64\n return base64Local.split(',')[1]\n }\n\n confirmPicture () {\n this.sendPictureByXmlRequest()\n }\n}\n\nmodule.exports = Liveness\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(939);\n"],"sourceRoot":""}