Add files via upload

This commit is contained in:
Steve Seguin
2021-08-29 03:56:56 -04:00
committed by GitHub
parent a1b2cea991
commit a95affcf8a
26 changed files with 4436 additions and 0 deletions

328
thirdparty/jeeliz/JeelizResizer.js vendored Normal file
View File

@@ -0,0 +1,328 @@
/*
This helper can help for:
* adjusting the canvas resolution to the good size -> this is crucial to
optimize the code because if the canvas is too large,
there are too much pixels to compute => it will be slow
* to mirror horizontally or not the canvas -> if the front camera is used we
need it flipped (mirror effect), while if the rear camera is used we need it not flipped
* to get the best camera resolution (either above the canvas resolution or closer)
to balance between performance and quality
*/
"use strict";
const JeelizResizer = (function(){
// private vars:
let _domCanvas = null,
_whCanvasPx = null,
_isApplyCSS = false,
_resizeAttemptsCounter = 0,
_overSamplingFactor = 1,
_isFullScreen = false,
_timerFullScreen = null,
_callbackResize = null,
_isInvFullscreenWH = false;
const _cameraResolutions = [ // all resolutions should be in landscape mode
[640,480],
[768,480],
[800,600],
[960,640],
[960,720],
[1024,768],
[1280,720],
[1920, 1080]
];
//private functions
function add_CSStransform(domElement, CSS){
const CSStransform = domElement.style.transform;
if (CSStransform.indexOf(CSS) !== -1) return;
domElement.style.transform = CSS + ' ' + CSStransform;
}
// Compute overlap between 2 rectangles A and B
// characterized by their width and their height in pixels
// the rectangles are centered
// return the ratio (pixels overlaped)/(total pixels)
function compute_overlap(whA, whB){
const aspectRatioA = whA[0] / whA[1];
const aspectRatioB = whB[0] / whB[1]; //higher aspectRatio -> more landscape
var whLandscape, whPortrait;
if (aspectRatioA > aspectRatioB){
whLandscape = whA, whPortrait = whB;
} else {
whLandscape = whB, whPortrait = whA;
}
// The overlapped area will be always a rectangle
const areaOverlap = Math.min(whLandscape[0], whPortrait[0]) * Math.min(whLandscape[1], whPortrait[1]);
var areaTotal;
if (whLandscape[0]>=whPortrait[0] && whLandscape[1]>=whPortrait[1]){ //union is a rectangle
areaTotal = whLandscape[0]*whLandscape[1];
} else if (whPortrait[0]>whLandscape[0] && whPortrait[1]>whLandscape[1]){ //union is a rectangle
areaTotal = whPortrait[0]*whPortrait[1];
} else { //union is a cross
areaTotal = whLandscape[0]*whLandscape[1];
areaTotal += (whPortrait[1]-whLandscape[1])*whPortrait[0];
}
return areaOverlap / areaTotal;
} //end compute_overlap()
function update_sizeCanvas(){
const domRect = _domCanvas.getBoundingClientRect();
apply_sizeCanvas(domRect.width, domRect.height);
}
function apply_sizeCanvas(width, height){
_whCanvasPx = [
Math.round(_overSamplingFactor * width),
Math.round(_overSamplingFactor * height)
];
// set canvas resolution:
_domCanvas.setAttribute('width', _whCanvasPx[0]);
_domCanvas.setAttribute('height', _whCanvasPx[1]);
// canvas display size:
if (_isApplyCSS){
_domCanvas.style.width = width.toString() + 'px';
_domCanvas.style.height = height.toString() + 'px';
}
}
function on_windowResize(){
// avoid to resize too often using a timer
// (it can create weird bug with some browsers)
if (_timerFullScreen){
clearTimeout(_timerFullScreen);
}
_timerFullScreen = setTimeout(resize_fullScreen, 50);
}
function resize_canvasToFullScreen(){
const wh = [window['innerWidth'], window['innerHeight']];
if (_isInvFullscreenWH){
wh.reverse();
}
apply_sizeCanvas(wh[0], wh[1]);
}
function resize_fullScreen(){
resize_canvasToFullScreen();
JEELIZFACEFILTER.resize();
_timerFullScreen = null;
if (_callbackResize) {
_callbackResize();
}
}
// public methods:
const that = {
// return true or false if the device is in portrait or landscape mode
// see https://stackoverflow.com/questions/4917664/detect-viewport-orientation-if-orientation-is-portrait-display-alert-message-ad
is_portrait: function(){
try{
if (window['matchMedia']("(orientation: portrait)")['matches']){
return true;
} else {
return false;
}
} catch(e){
return (window['innerHeight'] > window['innerWidth']);
}
},
// check whether the user is using IOS or not
// see https://stackoverflow.com/questions/9038625/detect-if-device-is-ios
check_isIOS: function(){
const isIOS = /iPad|iPhone|iPod/.test(navigator['userAgent']) && !window['MSStream'];
return isIOS;
},
// Should be called only if IOS was detected
// see https://stackoverflow.com/questions/8348139/detect-ios-version-less-than-5-with-javascript
get_IOSVersion: function(){
const v = (navigator['appVersion']).match(/OS (\d+)_(\d+)_?(\d+)?/);
return (v.length > 2) ? [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)] : [0, 0, 0];
},
// Check whether the user is using Android or not
// see https://stackoverflow.com/questions/6031412/detect-android-phone-via-javascript-jquery
check_isAndroid: function(){
const ua = navigator['userAgent'].toLowerCase();
return (ua.indexOf('android') !== -1);
},
// Should be called only if Android was detected
// see https://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript
get_androidVersion: function(){
const ua = navigator['userAgent'].toLowerCase();
const match = ua.match(/android\s([0-9\.]*)/i);
if (!match || match.length<2){
return [0,0,0];
}
const v = match[1].split('.');
return [
parseInt(v[0], 10),
parseInt(v[1], 10),
parseInt(v[2] || 0, 10)
];
},
// to get a video of 480x640 (480 width and 640 height)
// with a mobile phone in portrait mode, the default implementation
// should require a 480x640 video (Chrome, Firefox)
// but bad implementations needs to always request landscape resolutions (so 640x480)
// see https://github.com/jeeliz/jeelizFaceFilter/issues/144
require_flipVideoWHIfPortrait: function(){
// disabled because of https://github.com/jeeliz/jeelizFaceFilter/issues/144
// seems quite a mess though...
/* if (that.check_isIOS()){
//the user is using IOS
const version = that.get_IOSVersion();
if (version[0] >= 13){
if (version[1] <= 1 // IOS 13.0.X
|| (version[1] === 1 && version[2] < 3)){ // IOS 13.1.X with X<3
return false;
}
}
}
if (that.check_isAndroid()){
const version = that.get_androidVersion();
if (version[0] >= 9){ // Android 9+
return false;
}
} */
// normal implementation
return false;
},
// size canvas to the right resolution
// should be called after the page loading
// when the canvas has already the right size
// options:
// - <string> canvasId: id of the canvas
// - <HTMLCanvasElement> canvas: if canvasId is not provided
// - <function> callback: function to launch if there was an error or not
// - <float> overSamplingFactor: facultative. If 1, same resolution than displayed size (default).
// If 2, resolution twice higher than real size
// - <boolean> CSSFlipX: if we should flip the canvas or not. Default: false
// - <boolean> isFullScreen: if we should set the canvas fullscreen. Default: false
// - <function> onResize: function called when the window is resized. Only enabled if isFullScreen = true
// - <boolean> isInvWH: if we should invert width and height for fullscreen mode only. default = false
// - <boolean> isApplyCSS: if we should also apply canvas dimensions as CSS. default = false
size_canvas: function(optionsArg){
const options = Object.assign({
canvasId: 'undefinedCanvasId',
canvas: null,
overSamplingFactor: window.devicePixelRatio || 1,
isFullScreen: false,
isInvWH: false,
CSSFlipX: false,
isApplyCSS: false,
onResize: null,
callback: function(){}
}, optionsArg);
_domCanvas = (options.canvas) ? options.canvas : document.getElementById(options.canvasId);
_isFullScreen = options.isFullScreen;
_isInvFullscreenWH = options.isInvWH;
_isApplyCSS = options.isApplyCSS;
_overSamplingFactor = options.overSamplingFactor;
if (_isFullScreen){
// we are in fullscreen mode
_callbackResize = options.onResize;
resize_canvasToFullScreen();
window.addEventListener('resize', on_windowResize, false);
window.addEventListener('orientationchange', on_windowResize, false);
} else { // not fullscreen mode
// get display size of the canvas:
const domRect = _domCanvas.getBoundingClientRect();
if (domRect.width===0 || domRect.height===0){
console.log('WARNING in JeelizResize.size_canvas(): the canvas has its width or its height null, Retry a bit later...');
if (++_resizeAttemptsCounter > 20){
options.callback('CANNOT_RESIZECANVAS');
return;
}
setTimeout(that.size_canvas.bind(null, options), 50);
return;
}
// do resize canvas:
_resizeAttemptsCounter = 0;
update_sizeCanvas();
}
// flip horizontally if required:
if (options.CSSFlipX){
add_CSStransform(_domCanvas, 'rotateY(180deg)');
}
// compute the best camera resolutions:
const allResolutions = _cameraResolutions.map(function(x){
return x.slice(0)
});
// if we are in portrait mode, the camera is also in portrait mode
// so we need to set all resolutions to portrait mode
if (that.is_portrait() && that.require_flipVideoWHIfPortrait()){
allResolutions.forEach(function(wh){
wh.reverse();
});
}
// sort camera resolutions from the best to the worst:
allResolutions.sort(function(resA, resB){
return compute_overlap(resB, _whCanvasPx) - compute_overlap(resA, _whCanvasPx);
});
// pick the best camera resolution:
const bestCameraResolution = {
'idealWidth': allResolutions[0][0],
'idealHeight': allResolutions[0][1]
};
console.log('INFO in JeelizResizer: bestCameraResolution =', bestCameraResolution);
// launch the callback function after a small interval to let it
// some time to size:
setTimeout(options.callback.bind(null, false, bestCameraResolution), 1);
}, //end size_canvas()
// Should be called if the canvas is resized to update the canvas resolution:
resize_canvas: function(){
if (_isFullScreen){
resize_canvasToFullScreen()
} else {
update_sizeCanvas();
}
},
get_canvasSize: function(){
return _whCanvasPx;
}
}; //end that
return that;
})();
// Export ES6 module:
try {
module.exports = JeelizResizer;
} catch(e){
console.log('JeelizResizer ES6 Module not exported');
window.JeelizResizer = JeelizResizer;
}

438
thirdparty/jeeliz/JeelizThreeHelper.js vendored Normal file
View File

@@ -0,0 +1,438 @@
/*
Helper for Three.js
*/
const JeelizThreeHelper = (function(){
// internal settings:
const _settings = {
rotationOffsetX: 0.0, // negative -> look upper. in radians
pivotOffsetYZ: [0.2, 0.6],// YZ of the distance between the center of the cube and the pivot
detectionThreshold: 0.8, // sensibility, between 0 and 1. Less -> more sensitive
detectionHysteresis: 0.02,
//tweakMoveYRotateX: 0,//0.5, // tweak value: move detection window along Y axis when rotate the face around X (look up <-> down)
cameraMinVideoDimFov: 35 // Field of View for the smallest dimension of the video in degrees
};
// private vars:
let _threeRenderer = null,
_threeScene = null,
_threeVideoMesh = null,
_threeVideoTexture = null,
_threeTranslation = null;
let _maxFaces = -1,
_isMultiFaces = false,
_detectCallback = null,
_isVideoTextureReady = false,
_isSeparateThreeCanvas = false,
_faceFilterCv = null,
_videoElement = null,
_isDetected = false,
_scaleW = 1,
_canvasAspectRatio = -1;
const _threeCompositeObjects = [];
let _gl = null,
_glVideoTexture = null,
_glShpCopyCut = null,
_glShpCopyCutVideoMatUniformPointer = null;
let _videoTransformMat2 = null;
// private funcs:
function destroy(){
_isVideoTextureReady = false;
_threeCompositeObjects.splice(0);
if (_threeVideoTexture){
_threeVideoTexture.dispose();
_threeVideoTexture = null;
}
}
function create_threeCompositeObjects(){
for (let i=0; i<_maxFaces; ++i){
// COMPOSITE OBJECT WHICH WILL TRACK A DETECTED FACE
const threeCompositeObject = new THREE.Object3D();
threeCompositeObject.frustumCulled = false;
threeCompositeObject.visible = false;
_threeCompositeObjects.push(threeCompositeObject);
_threeScene.add(threeCompositeObject);
}
}
function create_videoScreen(){
const videoScreenVertexShaderSource = "attribute vec2 position;\n\
uniform mat2 videoTransformMat2;\n\
varying vec2 vUV;\n\
void main(void){\n\
gl_Position = vec4(position, 0., 1.);\n\
vUV = 0.5 + videoTransformMat2 * position;\n\
}";
const videoScreenFragmentShaderSource = "precision lowp float;\n\
uniform sampler2D samplerVideo;\n\
varying vec2 vUV;\n\
void main(void){\n\
gl_FragColor = texture2D(samplerVideo, vUV);\n\
}";
if (_isSeparateThreeCanvas){
const compile_shader = function(source, type, typeString) {
const glShader = _gl.createShader(type);
_gl.shaderSource(glShader, source);
_gl.compileShader(glShader);
if (!_gl.getShaderParameter(glShader, _gl.COMPILE_STATUS)) {
alert("ERROR IN " + typeString + " SHADER: " + _gl.getShaderInfoLog(glShader));
return null;
}
return glShader;
};
const glShaderVertex = compile_shader(videoScreenVertexShaderSource, _gl.VERTEX_SHADER, 'VERTEX');
const glShaderFragment = compile_shader(videoScreenFragmentShaderSource, _gl.FRAGMENT_SHADER, 'FRAGMENT');
_glShpCopyCut = _gl.createProgram();
_gl.attachShader(_glShpCopyCut, glShaderVertex);
_gl.attachShader(_glShpCopyCut, glShaderFragment);
_gl.linkProgram(_glShpCopyCut);
const samplerVideo = _gl.getUniformLocation(_glShpCopyCut, 'samplerVideo');
_glShpCopyCutVideoMatUniformPointer = _gl.getUniformLocation(_glShpCopyCut, 'videoTransformMat2');
return;
}
// init video texture with red:
_threeVideoTexture = new THREE.DataTexture( new Uint8Array([255,0,0]), 1, 1, THREE.RGBFormat);
_threeVideoTexture.needsUpdate = true;
// CREATE THE VIDEO BACKGROUND:
const videoMaterial = new THREE.RawShaderMaterial({
depthWrite: false,
depthTest: false,
vertexShader: videoScreenVertexShaderSource,
fragmentShader: videoScreenFragmentShaderSource,
uniforms:{
samplerVideo: {value: _threeVideoTexture},
videoTransformMat2: {
value: _videoTransformMat2
}
}
});
const videoGeometry = new THREE.BufferGeometry()
const videoScreenCorners = new Float32Array([-1,-1, 1,-1, 1,1, -1,1]);
videoGeometry.addAttribute( 'position', new THREE.BufferAttribute( videoScreenCorners, 2 ) );
videoGeometry.setIndex(new THREE.BufferAttribute(new Uint16Array([0,1,2, 0,2,3]), 1));
_threeVideoMesh = new THREE.Mesh(videoGeometry, videoMaterial);
that.apply_videoTexture(_threeVideoMesh);
_threeVideoMesh.renderOrder = -1000; // render first
_threeVideoMesh.frustumCulled = false;
_threeScene.add(_threeVideoMesh);
} //end create_videoScreen()
function detect(detectState){
_threeCompositeObjects.forEach(function(threeCompositeObject, i){
_isDetected = threeCompositeObject.visible;
const ds = detectState[i];
if (_isDetected && ds.detected < _settings.detectionThreshold-_settings.detectionHysteresis){
// DETECTION LOST
if (_detectCallback) _detectCallback(i, false);
threeCompositeObject.visible = false;
} else if (!_isDetected && ds.detected > _settings.detectionThreshold+_settings.detectionHysteresis){
// FACE DETECTED
if (_detectCallback) _detectCallback(i, true);
threeCompositeObject.visible = true;
}
}); //end loop on all detection slots
}
function update_poses(ds, threeCamera){
// tan( <horizontal FoV> / 2 ):
const halfTanFOVX = Math.tan(threeCamera.aspect * threeCamera.fov * Math.PI/360); //tan(<horizontal FoV>/2), in radians (threeCamera.fov is vertical FoV)
_threeCompositeObjects.forEach(function(threeCompositeObject, i){
if (!threeCompositeObject.visible) return;
const detectState = ds[i];
// tweak Y position depending on rx:
//const tweak = _settings.tweakMoveYRotateX * Math.tan(detectState.rx);
const cz = Math.cos(detectState.rz), sz = Math.sin(detectState.rz);
// relative width of the detection window (1-> whole width of the detection window):
const W = detectState.s * _scaleW;
// distance between the front face of the cube and the camera:
const DFront = 1 / ( 2 * W * halfTanFOVX );
// D is the distance between the center of the unit cube and the camera:
const D = DFront + 0.5;
// coords in 2D of the center of the detection window in the viewport:
const xv = detectState.x * _scaleW;
const yv = detectState.y * _scaleW;
// coords in 3D of the center of the cube (in the view coordinates system):
const z = -D; // minus because view coordinate system Z goes backward
const x = xv * D * halfTanFOVX;
const y = yv * D * halfTanFOVX / _canvasAspectRatio;
// set position before pivot:
threeCompositeObject.position.set(-sz*_settings.pivotOffsetYZ[0], -cz*_settings.pivotOffsetYZ[0], -_settings.pivotOffsetYZ[1]);
// set rotation and apply it to position:
threeCompositeObject.rotation.set(detectState.rx+_settings.rotationOffsetX, detectState.ry, detectState.rz, "ZYX");
threeCompositeObject.position.applyEuler(threeCompositeObject.rotation);
// add translation part:
_threeTranslation.set(x, y+_settings.pivotOffsetYZ[0], z+_settings.pivotOffsetYZ[1]);
threeCompositeObject.position.add(_threeTranslation);
}); //end loop on composite objects
}
//public methods:
const that = {
// launched with the same spec object than callbackReady. set spec.threeCanvasId to the ID of the threeCanvas to be in 2 canvas mode:
init: function(spec, detectCallback){
destroy();
_maxFaces = spec.maxFacesDetected;
_glVideoTexture = spec.videoTexture;
_videoTransformMat2 = spec.videoTransformMat2;
_gl = spec.GL;
_faceFilterCv = spec.canvasElement;
_isMultiFaces = (_maxFaces>1);
_videoElement = spec.videoElement;
// enable 2 canvas mode if necessary:
let threeCanvas = null;
if (spec.threeCanvasId){
_isSeparateThreeCanvas = true;
// adjust the threejs canvas size to the threejs canvas:
threeCanvas = document.getElementById(spec.threeCanvasId);
threeCanvas.setAttribute('width', _faceFilterCv.width);
threeCanvas.setAttribute('height', _faceFilterCv.height);
} else {
threeCanvas = _faceFilterCv;
}
if (typeof(detectCallback) !== 'undefined'){
_detectCallback = detectCallback;
}
// init THREE.JS context:
_threeRenderer = new THREE.WebGLRenderer({
context: (_isSeparateThreeCanvas) ? null : _gl,
canvas: threeCanvas,
alpha: (_isSeparateThreeCanvas || spec.alpha) ? true : false
});
_threeScene = new THREE.Scene();
_threeTranslation = new THREE.Vector3();
create_threeCompositeObjects();
create_videoScreen();
// handle device orientation change:
window.addEventListener('orientationchange', function(){
setTimeout(JEELIZFACEFILTER.resize, 1000);
}, false);
const returnedDict = {
videoMesh: _threeVideoMesh,
renderer: _threeRenderer,
scene: _threeScene
};
if (_isMultiFaces){
returnedDict.faceObjects = _threeCompositeObjects
} else {
returnedDict.faceObject = _threeCompositeObjects[0];
}
return returnedDict;
}, //end that.init()
detect: function(detectState){
const ds = (_isMultiFaces) ? detectState : [detectState];
// update detection states:
detect(ds);
},
get_isDetected: function() {
return _isDetected;
},
render: function(detectState, threeCamera){
const ds = (_isMultiFaces) ? detectState : [detectState];
// update detection states then poses:
detect(ds);
update_poses(ds, threeCamera);
if (_isSeparateThreeCanvas){
// render the video texture on the faceFilter canvas:
_gl.viewport(0, 0, _faceFilterCv.width, _faceFilterCv.height);
_gl.useProgram(_glShpCopyCut);
_gl.uniformMatrix2fv(_glShpCopyCutVideoMatUniformPointer, false, _videoTransformMat2);
_gl.activeTexture(_gl.TEXTURE0);
_gl.bindTexture(_gl.TEXTURE_2D, _glVideoTexture);
_gl.drawElements(_gl.TRIANGLES, 3, _gl.UNSIGNED_SHORT, 0);
} else {
// reinitialize the state of THREE.JS because JEEFACEFILTER have changed stuffs:
// -> can be VERY costly !
_threeRenderer.state.reset();
}
// trigger the render of the THREE.JS SCENE:
_threeRenderer.render(_threeScene, threeCamera);
},
sortFaces: function(bufferGeometry, axis, isInv){ // sort faces long an axis
// Useful when a bufferGeometry has alpha: we should render the last faces first
const axisOffset = {X:0, Y:1, Z:2}[axis.toUpperCase()];
const sortWay = (isInv) ? -1 : 1;
// fill the faces array:
const nFaces = bufferGeometry.index.count/3;
const faces = new Array(nFaces);
for (let i=0; i<nFaces; ++i){
faces[i] = [bufferGeometry.index.array[3*i], bufferGeometry.index.array[3*i+1], bufferGeometry.index.array[3*i+2]];
}
// compute centroids:
const aPos = bufferGeometry.attributes.position.array;
const centroids = faces.map(function(face, faceIndex){
return [
(aPos[3*face[0]]+aPos[3*face[1]]+aPos[3*face[2]])/3, // X
(aPos[3*face[0]+1]+aPos[3*face[1]+1]+aPos[3*face[2]+1])/3, // Y
(aPos[3*face[0]+2]+aPos[3*face[1]+2]+aPos[3*face[2]+2])/3, // Z
face
];
});
// sort centroids:
centroids.sort(function(ca, cb){
return (ca[axisOffset]-cb[axisOffset]) * sortWay;
});
// reorder bufferGeometry faces:
centroids.forEach(function(centroid, centroidIndex){
const face = centroid[3];
bufferGeometry.index.array[3*centroidIndex] = face[0];
bufferGeometry.index.array[3*centroidIndex+1] = face[1];
bufferGeometry.index.array[3*centroidIndex+2] = face[2];
});
}, //end sortFaces
get_threeVideoTexture: function(){
return _threeVideoTexture;
},
apply_videoTexture: function(threeMesh){
if (_isVideoTextureReady){
return;
}
threeMesh.onAfterRender = function(){
// Replace _threeVideoTexture.__webglTexture by the real video texture:
try {
_threeRenderer.properties.update(_threeVideoTexture, '__webglTexture', _glVideoTexture);
_threeVideoTexture.magFilter = THREE.LinearFilter;
_threeVideoTexture.minFilter = THREE.LinearFilter;
_isVideoTextureReady = true;
} catch(e){
console.log('WARNING in JeelizThreeHelper: the glVideoTexture is not fully initialized');
}
delete(threeMesh.onAfterRender);
};
},
// create an occluder, IE a transparent object which writes on the depth buffer:
create_threejsOccluder: function(occluderURL, callback){
const occluderMesh = new THREE.Mesh();
new THREE.BufferGeometryLoader().load(occluderURL, function(occluderGeometry){
const mat = new THREE.ShaderMaterial({
vertexShader: THREE.ShaderLib.basic.vertexShader,
fragmentShader: "precision lowp float;\n void main(void){\n gl_FragColor=vec4(1.,0.,0.,1.);\n }",
uniforms: THREE.ShaderLib.basic.uniforms,
colorWrite: false
});
occluderMesh.renderOrder = -1; //render first
occluderMesh.material = mat;
occluderMesh.geometry = occluderGeometry;
if (typeof(callback)!=='undefined' && callback) callback(occluderMesh);
});
return occluderMesh;
},
set_pivotOffsetYZ: function(pivotOffset) {
_settings.pivotOffsetYZ = pivotOffset;
},
create_camera: function(zNear, zFar){
const threeCamera = new THREE.PerspectiveCamera(1, 1, (zNear) ? zNear : 0.1, (zFar) ? zFar : 100);
that.update_camera(threeCamera);
return threeCamera;
},
update_camera: function(threeCamera){
// compute aspectRatio:
const canvasElement = _threeRenderer.domElement;
const cvw = canvasElement.width;
const cvh = canvasElement.height;
_canvasAspectRatio = cvw / cvh;
// compute vertical field of view:
const vw = _videoElement.videoWidth;
const vh = _videoElement.videoHeight;
const videoAspectRatio = vw / vh;
const fovFactor = (vh > vw) ? (1.0 / videoAspectRatio) : 1.0;
const fov = _settings.cameraMinVideoDimFov * fovFactor;
console.log('INFO in JeelizThreeHelper - update_camera(): Estimated vertical video FoV is', fov);
// compute X and Y offsets in pixels:
let scale = 1.0;
if (_canvasAspectRatio > videoAspectRatio) {
// the canvas is more in landscape format than the video, so we crop top and bottom margins:
scale = cvw / vw;
} else {
// the canvas is more in portrait format than the video, so we crop right and left margins:
scale = cvh / vh;
}
const cvws = vw * scale, cvhs = vh * scale;
const offsetX = (cvws - cvw) / 2.0;
const offsetY = (cvhs - cvh) / 2.0;
_scaleW = cvw / cvws;
// apply parameters:
threeCamera.aspect = _canvasAspectRatio;
threeCamera.fov = fov;
console.log('INFO in JeelizThreeHelper.update_camera(): camera vertical estimated FoV is', fov, 'deg');
threeCamera.setViewOffset(cvws, cvhs, offsetX, offsetY, cvw, cvh);
threeCamera.updateProjectionMatrix();
// update drawing area:
_threeRenderer.setSize(cvw, cvh, false);
_threeRenderer.setViewport(0, 0, cvw, cvh);
}, //end update_camera()
resize: function(w, h, threeCamera){
_threeRenderer.domElement.width = w;
_threeRenderer.domElement.height = h;
JEELIZFACEFILTER.resize();
if (threeCamera){
that.update_camera(threeCamera);
}
}
}
return that;
})();
window.JeelizThreeHelper = JeelizThreeHelper;

2
thirdparty/jeeliz/Tween.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,151 @@
"use strict";
const _states = {
idle : 0,
loading : 1,
dragging : 2
}
let _state = _states.idle; // MT217 : initialize your state always (even with a loading value)
let _dP = new window.THREE.Vector3();
let _x0 = -1; let _y0 = -1;
let _scenes = null;
let _boundFunction = null;
function updateMeshPosition(canvas, event) {
const MOUSEVECTOR = new window.THREE.Vector3();
const DIRECTIONVECTOR = new window.THREE.Vector3();
const VIEWPORTVECTOR = new window.THREE.Vector3();
const _headCenterZ = -1;
if (_state !== _states.dragging) return; // MT217
const isTouch = !!((event.touches && event.touches.length));// MT217 is touch or mouse event ?
const xPx = (isTouch) ? event.touches[0].clientX : event.clientX; // MT217 : make the distinction between touch and mouse event
const yPx = (isTouch) ? event.touches[0].clientY : event.clientY; // if touch event, consider only the first finger
const dxPx = xPx - _x0; // in pixels
const dyPx = yPx - _y0; // in pixels too
_x0 = xPx;
_y0 = yPx;
// calcul des coo de dxPx, dyPx dans le viewport
// les offsets du canvas s'annulent -> que facteur d'échelle a appliquer
const dx = -dxPx / canvas.offsetWidth;
const dy = -dyPx / canvas.offsetHeight;
// Only check intersects if object is visible
// If there is only 1 object, we don't check intersections too
const mesh = (_scenes.length === 1) ? _scenes[0] : _scenes.find( function(scene){
if (!scene.parent.visible) {
return false;
}
// TODO: Check if a child geometry is an occlusion object. If so remove it from the intersection list
MOUSEVECTOR.set(-(xPx / canvas.offsetWidth) * 2 + 1, -(yPx / canvas.offsetHeight) * 2 + 1, 0.5);
const raycaster = new window.THREE.Raycaster();
raycaster.setFromCamera(MOUSEVECTOR, window.THREECAMERA);
const intersects = raycaster.intersectObjects(scene.children);
return (intersects.length > 0);
});
if (!mesh) {
return;
}
VIEWPORTVECTOR.set(dx, dy, 1);
DIRECTIONVECTOR.copy(VIEWPORTVECTOR);
if (!window.THREECAMERA){
throw new Error('Cannot find the THREE.js camera. Please check that window.THREECAMERA is the default scene camera');
}
DIRECTIONVECTOR.unproject(window.THREECAMERA);
DIRECTIONVECTOR.sub(window.THREECAMERA.position);
DIRECTIONVECTOR.normalize();
// we calculate the coefficient that will allow us to find our mesh's position
const k = _headCenterZ / DIRECTIONVECTOR.z;
// _dP = displacement in the scene (=world) ref :
_dP.copy(DIRECTIONVECTOR).multiplyScalar(k);
_dP.setZ(0); // bcoz we only want to displace in the (0xy) plane
const _quat = new window.THREE.Quaternion();
const _eul = new window.THREE.Euler();
_eul.setFromQuaternion(_quat);
// convert _dP to mesh ref to apply it directly to mesh.position :
// _dP is a vector so apply only the rotation part (not the translation)
_dP.applyEuler(mesh.getWorldQuaternion(_eul));
// Boost movement to follow better the mouse/touch
_dP.multiplyScalar(10);
// apply _dP
mesh.position.add(_dP);
}
function setMousePosition0(event) { // save initial position of the mouse
const isTouch = !!((event.touches && event.touches.length));// MT217 is touch or mouse event ?
if (isTouch && event.touches.length > 1) return; // MT217 if the user put a second finger while dragging
_x0 = (isTouch) ? event.touches[0].clientX : event.clientX; // MT217
_y0 = (isTouch) ? event.touches[0].clientY : event.clientY;
}
function mouseDown(event) {
setMousePosition0(event); // MANTIS201
_state = _states.dragging;
}
function mouseUp() {
_state = _states.idle;
}
function addDragEventListener(scenes, canvasId, remove) {
_scenes = Array.isArray(scenes) ? scenes : [scenes];
const canvas = document.getElementById((typeof(canvasId) === 'undefined') ? 'jeeFaceFilterCanvas' : canvasId);
_state = _states.idle; // MT217 : initialize your state always (even with a loading value)
_dP = new window.THREE.Vector3();
_x0 = undefined; _y0 = undefined;
if (remove) {
// REMOVE OUR LISTENERS
canvas.removeEventListener('mousemove', _boundFunction, true);
canvas.removeEventListener('touchmove', _boundFunction, true);
// BEGINNING OF THE INTERACTION
canvas.removeEventListener('mousedown', mouseDown);
canvas.removeEventListener('touchstart', mouseDown);
// END OF THE INTERACTION
canvas.removeEventListener('mouseup', mouseUp);
canvas.removeEventListener('touchend', mouseUp);
// ALSO END BUT IN CASE LEAVING CANVAS OR ALERT BOX ECT...
canvas.removeEventListener('mouseout', mouseUp);
canvas.removeEventListener('touchcancel', mouseUp);
} else {
// SET OUR LISTENERS
_boundFunction = updateMeshPosition.bind(this, canvas)
canvas.addEventListener('mousemove', _boundFunction, true);
// canvas.addEventListener('touchmove', createTouchEvent, true)
canvas.addEventListener('touchmove', _boundFunction, true); // MT217
// BEGINNING OF THE INTERACTION
canvas.addEventListener('mousedown', mouseDown);
canvas.addEventListener('touchstart', mouseDown);
// END OF THE INTERACTION
canvas.addEventListener('mouseup', mouseUp);
canvas.addEventListener('touchend', mouseUp);
// ALSO END BUT IN CASE LEAVING CANVAS OR ALERT BOX ECT...
canvas.addEventListener('mouseout', mouseUp);
canvas.addEventListener('touchcancel', mouseUp);
}
}

View File

@@ -0,0 +1,75 @@
function addVideoRecordingEffect(canvas) {
var viewWidth,
viewHeight,
canvas = document.getElementById("canvasVideoEffect"),
ctx;
// change these settings
var patternSize = 64,
patternScaleX = 3,
patternScaleY = 1,
patternRefreshInterval = 8,
patternAlpha = 25; // int between 0 and 255,
var patternPixelDataLength = patternSize * patternSize * 4,
patternCanvas,
patternCtx,
patternData,
frame = 0;
// create a canvas which will render the grain
function initCanvas() {
viewWidth = canvas.width = canvas.clientWidth;
viewHeight = canvas.height = canvas.clientHeight;
ctx = canvas.getContext('2d');
ctx.scale(patternScaleX, patternScaleY);
}
// create a canvas which will be used as a pattern
function initGrain() {
patternCanvas = document.createElement('canvas');
patternCanvas.width = patternSize;
patternCanvas.height = patternSize;
patternCtx = patternCanvas.getContext('2d');
patternData = patternCtx.createImageData(patternSize, patternSize);
}
// put a random shade of gray into every pixel of the pattern
function update() {
var value;
for (var i = 0; i < patternPixelDataLength; i += 1) {
value = (Math.random() * 155) | 0;
patternData.data[i ] = value;
patternData.data[i + 10] = value;
patternData.data[i + 15] = value;
patternData.data[i + 11] = patternAlpha;
}
patternCtx.putImageData(patternData, 0, 0);
}
// fill the canvas using the pattern
function draw() {
ctx.clearRect(0, 0, viewWidth, viewHeight);
ctx.fillStyle = ctx.createPattern(patternCanvas, 'repeat');
ctx.fillRect(0, 0, viewWidth, viewHeight);
}
function loop() {
if (++frame % patternRefreshInterval === 0) {
update();
draw();
}
requestAnimationFrame(loop);
}
initCanvas();
initGrain();
requestAnimationFrame(loop);
}

View File

@@ -0,0 +1,263 @@
/*
Use JEELIZ FACE FILTER API to control the movements of a camera
This script has been put into shared because it can be used with different 3D engines
We have at least 2 integration examples:
- with CesiumJS for a head controlled Google Earth like demo
- with THREE.JS for a camera controller (THREE.HeadControls)
==== INITIALIZATION ====
HeadControls.init(spec) with spec =
spec (*-> mandatory):
- settings: object. override default settings if specified
- canvasId*: id of the canvas where the JEELIZVTO will be initialized. We will draw the face tracking on it
- callbackReady: callback launched when the controller is ready. launched with errCode if error, false otherwise
- callbackMove*: function to move the camera
- disableRestPosition: do not offset the face position with a rest position. Default: false
- NNCPath*: path of the NN net
==== OTHER METHODS ====
HeadControls.toggle(<boolean>onOff): toggle on or off the HeadControls
*/
var HeadControls = (function(){
const _defaultSettings = {
detectionThreshold: 0.85, // sensibility, between 0 and 1. Less -> more sensitive
detectionHysteresis: 0.05,
tol: {
rx: 5,// do not move if head turn more than this value (in degrees) from head rest position
ry: 5,
s: 5 // do not move forward/backward if head is larger/smaller than this percent from the rest position
},
sensibility: {
rx: 1,
ry: 1,
s: 1
}
};
// private variables:
let _settings = null;
const _returnValue = {
dRx:0, dRy: 0,
dZ: 0
};
// internal state:
const _state = {
isLoaded: false,
isDetected:false,
isEnabled: false,
restHeadPosition: { // position of the head matching with No Move
needsUpdate: false,
s: 0,
rx: 0,
ry: 0
}
};
let _lastTimestamp = 0;
let _gl = null, _cv = null, _videoTexture = null, _videoTransformMat2 = null, _glHeadSearchDrawShaderProgram = null;
let _headSearchUniformXys = null, _headSearchUniformVideoTransformMat2 = null;
let _disableRestPosition = false;
// private functions:
function compute_delta(ref, val, tol, sensibility){
if (Math.abs(ref-val)<tol){
return 0;
}
return (val-ref) * sensibility;
}
function compile_shader(source, glType, typeString) {
const glShader = _gl.createShader(glType);
_gl.shaderSource(glShader, source);
_gl.compileShader(glShader);
if (!_gl.getShaderParameter(glShader, _gl.COMPILE_STATUS)) {
alert("ERROR IN " + typeString + " SHADER: " + _gl.getShaderInfoLog(glShader));
return null;
}
return glShader;
};
function init_headSearchDraw(){
// build _glHeadSearchDrawShaderProgram:
const shaderVertexSource = "\n\
attribute vec2 aat_position;\n\
varying vec2 vUV;\n\
\n\
void main(void) {\n\
gl_Position = vec4(aat_position, 0., 1.);\n\
vUV = 0.5 + 0.5 * aat_position;\n\
vUV.x = 1.-vUV.x; // mirror diplay\n\
}";
const shaderFragmentSource = "\n\
precision lowp float;\n\
varying vec2 vUV;\n\
\n\
uniform sampler2D samplerVideo;\n\
uniform mat2 videoTransformMat2;\n\
uniform vec3 uxys;\n\
\n\
void main(void) {\n\
vec2 uvVideoCentered = 2.0 * videoTransformMat2 * (vUV - 0.5);\n\
vec2 uvVideo = uvVideoCentered + 0.5;\n\
vec3 colorVideo = texture2D(samplerVideo, uvVideo).rgb;\n\
vec2 pos = vUV*2.-vec2(1.,1.);\n\
vec2 isInside = step(uxys.xy-uxys.z*vec2(1.,1.), pos);\n\
isInside *= step(pos, uxys.xy+uxys.z*vec2(1.,1.));\n\
vec2 blendCenterFactor = abs(pos-uxys.xy) / uxys.z;\n\
float alpha = isInside.x * isInside.y * pow(max(blendCenterFactor.x, blendCenterFactor.y), 3.);\n\
vec3 color = mix(colorVideo, vec3(0.,0.6,1.), alpha);\n\
gl_FragColor = vec4(color,1.);\n\
}";
const glShaderVertex = compile_shader(shaderVertexSource, _gl.VERTEX_SHADER, 'VERTEX');
const glShaderFragment = compile_shader(shaderFragmentSource, _gl.FRAGMENT_SHADER, 'FRAGMENT');
_glHeadSearchDrawShaderProgram = _gl.createProgram();
_gl.attachShader(_glHeadSearchDrawShaderProgram, glShaderVertex);
_gl.attachShader(_glHeadSearchDrawShaderProgram, glShaderFragment);
_gl.linkProgram(_glHeadSearchDrawShaderProgram);
const samplerVideo = _gl.getUniformLocation(_glHeadSearchDrawShaderProgram, 'samplerVideo');
_headSearchUniformXys = _gl.getUniformLocation(_glHeadSearchDrawShaderProgram, 'uxys');
_headSearchUniformVideoTransformMat2 = _gl.getUniformLocation(_glHeadSearchDrawShaderProgram, 'videoTransformMat2');
_gl.useProgram(_glHeadSearchDrawShaderProgram);
_gl.uniform1i(samplerVideo, 0);
} //end init_headSearchDraw()
function draw_headSearch(detectState){
// unbind the current FBO and set the viewport as the whole canvas:
_gl.viewport(0, 0, _cv.width, _cv.height);
// use the head draw shader program and sync uniforms:
_gl.useProgram(_glHeadSearchDrawShaderProgram);
_gl.activeTexture(_gl.TEXTURE0);
_gl.bindTexture(_gl.TEXTURE_2D, _videoTexture);
_gl.uniform3f(_headSearchUniformXys, detectState.x, detectState.y, detectState.s);
_gl.uniformMatrix2fv(_headSearchUniformVideoTransformMat2, false, _videoTransformMat2);
// draw the square looking for the head
// the VBO filling the whole screen is still bound to the context
// fill the viewPort:
_gl.drawElements(_gl.TRIANGLES, 3, _gl.UNSIGNED_SHORT, 0);
}
function compute_cameraMove(detectState){
if (_state.isDetected && detectState.detected<_settings.detectionThreshold-_settings.detectionHysteresis){
// DETECTION LOST
_state.isDetected = false;
_returnValue.dRx = 0;
_returnValue.dRy = 0;
_returnValue.dZ = 0;
} else if (!_state.isDetected && detectState.detected>_settings.detectionThreshold+_settings.detectionHysteresis){
// FACE DETECTED
_state.isDetected = true;
}
if (_state.isEnabled){
draw_headSearch(detectState);
}
if (!_state.isEnabled || !_state.isDetected || !_state.isLoaded){
return _returnValue; // no camera move
}
if (_state.restHeadPosition.needsUpdate && !_disableRestPosition){
_state.restHeadPosition.needsUpdate = false;
_state.restHeadPosition.rx = detectState.rx;
_state.restHeadPosition.ry = detectState.ry;
_state.restHeadPosition.s = detectState.s;
_lastTimestamp = Date.now();
}
// compute movement of the camera
const ts = Date.now();
const dt = ts - _lastTimestamp;
_returnValue.dRx = dt * compute_delta(_state.restHeadPosition.rx, detectState.rx, _settings.tol.rx, _settings.sensibility.rx);
_returnValue.dRy = dt * compute_delta(_state.restHeadPosition.ry, detectState.ry, _settings.tol.ry, _settings.sensibility.ry);
_returnValue.dZ = dt * compute_delta(_state.restHeadPosition.s, detectState.s, _settings.tol.s, _settings.sensibility.s);
_lastTimestamp = ts;
return _returnValue;
} //end compute_cameraMove()
// public methods:
const that = {
init: function(spec){
// set settings:
if (typeof(spec.settings)==='undefined') spec.settings={};
_disableRestPosition = (typeof(spec.disableRestPosition)==='undefined') ? false : spec.disableRestPosition;
_settings = Object.assign({}, _defaultSettings, spec.settings);
_settings.tol.rx *= Math.PI / 180; // convert from degrees to radians
_settings.tol.ry *= Math.PI / 180;
_settings.tol.s /= 100;
// init the API:
JEELIZFACEFILTER.init({
canvasId: spec.canvasId,
NNCPath: spec.NNCPath, // root of NNC.json file
callbackReady: function(errCode, jeeFaceFilterObj){
if (errCode){
console.log('AN ERROR HAPPENS. SORRY BRO :( . ERR =', errCode);
if (spec.callbackReady){
spec.callbackReady(errCode);
}
return;
}
_gl = jeeFaceFilterObj['GL'];
_videoTexture = jeeFaceFilterObj['videoTexture'];
_videoTransformMat2 = jeeFaceFilterObj['videoTransformMat2'];
_cv = jeeFaceFilterObj['canvasElement'];
init_headSearchDraw();
if (spec.callbackReady){
spec.callbackReady(false);
}
_state.isLoaded = true;
}, //end callbackReady()
// called at each render iteration (drawing loop):
callbackTrack: function(detectState){
const mv = compute_cameraMove(detectState);
mv.expressions = detectState.expressions;
if (!_state.isEnabled){
return;
}
if (mv.dRx!==0 || mv.dRy!==0 || mv.dZ!==0){
spec.callbackMove(mv);
}
}
}); //end JEELIZFACEFILTER.init call
}, //end init()
toggle: function(isEnabled){
if (_state.isEnabled===isEnabled){
return true;
} else if (!isEnabled){ //disable
_state.isEnabled = false;
return true;
} else {
_state.isEnabled = true;
_state.restHeadPosition.needsUpdate = true;
return true;
}
},
reset_restHeadPosition: function(){
_state.restHeadPosition.needsUpdate = true;
}
}; //end that
return that;
})();
// Export ES6 module:
try {
module.exports = HeadControls;
} catch(e){
console.log('HeadControls ES6 Module not exported');
}

View File

@@ -0,0 +1,141 @@
/*
Usage: JeelizCanvas2DHelper(spec) where spec is the returned object of the initialization function (callbackReady)
Return an object width these properties:
- canvas: the CANVAS element
- ctx: the canvas drawing context
- update_canvasTexture: function to launch each time the canvas has been updated (somethink has been drawn on it)
- draw: draw the video with the canvas above
- getCoordinates: transform the detectedState relative 2D viewport coords into canvas 2D pixel coordinates
- resize: to call if the HTML canvas size has changed
*/
const JeelizCanvas2DHelper = function(spec){
// some globalz:
let CV = null, CANVAS2D = null, CTX = null, GL = null, CANVASTEXTURE = null, CANVASTEXTURENEEDSUPDATE = null, SHADERCOPY = null, VIDEOTEXTURE = null;
let VIDEOTEXTURETRANSFORMMAT2 = null, UUVTRANSFORM = null;
const COORDINATES = {
x:0, y:0, s:0
};
//BEGIN WEBGL HELPERS
// compile a shader:
function compile_shader(source, glType, typeString) {
const glShader = GL.createShader(glType);
GL.shaderSource(glShader, source);
GL.compileShader(glShader);
if (!GL.getShaderParameter(glShader, GL.COMPILE_STATUS)) {
alert("ERROR IN " + typeString + " SHADER: " + GL.getShaderInfoLog(glShader));
return null;
}
return glShader;
};
// helper function to build the shader program:
function build_shaderProgram(shaderVertexSource, shaderFragmentSource, id) {
// compile both shader separately:
const glShaderVertex = compile_shader(shaderVertexSource, GL.VERTEX_SHADER, "VERTEX " + id);
const glShaderFragment = compile_shader(shaderFragmentSource, GL.FRAGMENT_SHADER, "FRAGMENT " + id);
const glShaderProgram = GL.createProgram();
GL.attachShader(glShaderProgram, glShaderVertex);
GL.attachShader(glShaderProgram, glShaderFragment);
// start the linking stage:
GL.linkProgram(glShaderProgram);
return glShaderProgram;
}
//END WEBGL HELPERS
// affect some globalz:
GL = spec.GL;
CV = spec.canvasElement;
VIDEOTEXTURE = spec.videoTexture;
VIDEOTEXTURETRANSFORMMAT2 = spec.videoTransformMat2;
// create and size the 2D canvas and its drawing context:
CANVAS2D = document.createElement('canvas');
CANVAS2D.width = CV.width;
CANVAS2D.height = CV.height;
CTX = CANVAS2D.getContext('2d');
// create the WebGL texture with the canvas:
CANVASTEXTURE = GL.createTexture();
GL.bindTexture(GL.TEXTURE_2D, CANVASTEXTURE);
GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, GL.RGBA, GL.UNSIGNED_BYTE, CANVAS2D);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE);
// build the copy shader program:
const copyVertexShaderSource = "attribute vec2 position;\n\
uniform mat2 UVTransformMat2;\n\
varying vec2 vUV;\n\
void main(void){\n\
gl_Position = vec4(position, 0., 1.);\n\
vUV = vec2(0.5,0.5) + UVTransformMat2 * position;\n\
}";
const copyFragmentShaderSource = "precision lowp float;\n\
uniform sampler2D samplerImage;\n\
varying vec2 vUV;\n\
\n\
void main(void){\n\
gl_FragColor = texture2D(samplerImage, vUV);\n\
}";
SHADERCOPY = build_shaderProgram(copyVertexShaderSource, copyFragmentShaderSource, 'VIDEO');
const uSampler = GL.getUniformLocation(SHADERCOPY, 'samplerImage');
UUVTRANSFORM = GL.getUniformLocation(SHADERCOPY, 'UVTransformMat2');
GL.useProgram(SHADERCOPY);
GL.uniform1i(uSampler, 0);
return {
canvas: CANVAS2D,
ctx: CTX,
update_canvasTexture: function(){
CANVASTEXTURENEEDSUPDATE = true;
},
draw: function(){ // draw the video and the canvas above
GL.viewport(0, 0, CV.width, CV.height);
GL.useProgram(SHADERCOPY);
// enable blending:
GL.enable(GL.BLEND);
GL.blendFunc(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA);
// draw the video first:
GL.bindTexture(GL.TEXTURE_2D, VIDEOTEXTURE);
GL.uniformMatrix2fv(UUVTRANSFORM, false, VIDEOTEXTURETRANSFORMMAT2);
GL.drawElements(GL.TRIANGLES, 3, GL.UNSIGNED_SHORT, 0);
// then draw the canvas:
GL.bindTexture(GL.TEXTURE_2D, CANVASTEXTURE);
GL.uniformMatrix2fv(UUVTRANSFORM, false, [0.5, 0, 0, 0.5]);
if (CANVASTEXTURENEEDSUPDATE) {
GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, GL.RGBA, GL.UNSIGNED_BYTE, CANVAS2D);
}
GL.drawElements(GL.TRIANGLES, 3, GL.UNSIGNED_SHORT, 0);
GL.disable(GL.BLEND);
},
getCoordinates: function(detectedState){
COORDINATES.x = Math.round((0.5+0.5*detectedState.x-0.5*detectedState.s)*CV.width);
COORDINATES.y = Math.round((0.5+0.5*detectedState.y-0.5*detectedState.s)*CV.height);
COORDINATES.w = Math.round(detectedState.s*CV.width);
COORDINATES.h = COORDINATES.w;
return COORDINATES;
},
resize: function(){
CANVAS2D.width = CV.width;
CANVAS2D.height = CV.height;
}
}; //end Canvas2DDisplay return value
} //end JeelizCanvas2DHelper()

View File

@@ -0,0 +1,416 @@
/*
This helper is usefull to cut faces (in 2D)
It is used for example in the faceSwap demo
It can:
- handle basic vanilla WebGL helpers like compiling shaders
- handle search display
- handle face cut
It does not handle the 3D aspect (no matrix stories)
*/
const JeelizFaceCut = (function(){
// settings:
const FACECUTSETTINGS = {
scale: [1.1, 1.7], // scale of the face cut area. Relative to initial square detection area
offset: [0.01,0.10], // relative. 1-> 100% scale mask width of the image (or height)
smoothEdge: 0.15, // crop smooth edge
headForheadY: 0.7, // forhead start when Y>this value. Max: 1
headJawY: 0.5, // lower jaw start when Y<this value. Max: 1
ryDriftDx: -0.1,
rzDriftDx: 0.1 // drift along X axis if rotation around Z (depth). tweak
};
// private variables:
let GL = null, __canvas = null, __glVideoTexture = null, __videoTransformMat2 = null;
const __shps = {};
let __fboDrawTarget = null, __fbo = null;
// private functions:
// BEGIN VANILLA WEBGL HELPERS
// compile a shader:
function compile_shader(source, glType, typeString) {
const glShader = GL.createShader(glType);
GL.shaderSource(glShader, source);
GL.compileShader(glShader);
if (!GL.getShaderParameter(glShader, GL.COMPILE_STATUS)) {
alert("ERROR IN " + typeString + " SHADER: " + GL.getShaderInfoLog(glShader));
console.log('Buggy shader source: \n', source);
return null;
}
return glShader;
};
// build the shader program:
function build_shaderProgram(shaderVertexSource, shaderFragmentSource, id) {
// compile both shader separately:
const glShaderVertex = compile_shader(shaderVertexSource, GL.VERTEX_SHADER, "VERTEX " + id);
const glShaderFragment = compile_shader(shaderFragmentSource, GL.FRAGMENT_SHADER, "FRAGMENT " + id);
const glShaderProgram = GL.createProgram();
GL.attachShader(glShaderProgram, glShaderVertex);
GL.attachShader(glShaderProgram, glShaderFragment);
// start the linking stage:
GL.linkProgram(glShaderProgram);
const aPos = GL.getAttribLocation(glShaderProgram, "position");
GL.enableVertexAttribArray(aPos);
return {
program: glShaderProgram,
uniforms:{}
};
}
//END VANILLA WEBGL HELPERS
// builds shader programs:
function build__shps(){
const copyVertexShaderSource = "attribute vec2 position;\n\
varying vec2 vUV;\n\
void main(void){\n\
gl_Position = vec4(position, 0., 1.);\n\
vUV = 0.5 + 0.5*position;\n\
}";
const copyFragmentShaderSource = "precision lowp float;\n\
uniform sampler2D samplerImage;\n\
varying vec2 vUV;\n\
\n\
void main(void){\n\
gl_FragColor = texture2D(samplerImage, vUV);\n\
}";
// Copy shader program: simply copy a texture
__shps.copy = build_shaderProgram(copyVertexShaderSource, copyFragmentShaderSource, 'COPY');
__shps.copy.uniforms.samplerImage = GL.getUniformLocation(__shps.copy.program, 'samplerImage');
GL.useProgram(__shps.copy.program);
GL.uniform1i(__shps.copy.uniforms.samplerImage, 0);
// search shp: display a search square on the head
// we play on the viewport position to positionnate it
const searchFragmentShaderSource = "precision lowp float;\n\
uniform float detected;\n\
varying vec2 vUV;\n\
\n\
void main(void){\n\
vec3 color = mix(vec3(0.1,0.1,0.1), vec3(0.,0.6,1.), detected);\n\
vec2 blendCenterFactor = 2. * abs(vUV-vec2(0.5,0.5));\n\
float alpha = pow(max(blendCenterFactor.x, blendCenterFactor.y), 3.);\n\
gl_FragColor = vec4(color, alpha*0.5);\n\
}";
__shps.search = build_shaderProgram(copyVertexShaderSource, searchFragmentShaderSource, 'SEARCH');
__shps.search.uniforms.detected = GL.getUniformLocation(__shps.search.program, 'detected');
// faceCut shp: cut the face and put the result into a texture with alpha:
const copyRotateVertexShaderSource = "attribute vec2 position;\n\
uniform float rz, aspectRatio;\n\
varying vec2 vUV, vUVrot;\n\
void main(void){\n\
float cz=cos(rz+0.2),sz=sin(rz);\n\
vec2 posRz=mat2(cz, sz*aspectRatio, -sz/aspectRatio, cz)*position;\n\
gl_Position=vec4(position, 0., 1.);\n\
vUV = 0.5 + 0.5 * position;\n\
vUVrot = 0.5 + 0.5 * posRz;\n\
}";
const faceCutFragmentShaderSource = "precision lowp float;\n\
uniform sampler2D samplerImage;\n\
uniform mat2 videoTransformMat2;\n\
uniform vec2 offset, scale;\n\
varying vec2 vUV, vUVrot;\n\
\n\
const float UPPERHEADY = " + FACECUTSETTINGS.headForheadY.toFixed(2) + ";\n\
const float LOWERHEADY = " + FACECUTSETTINGS.headJawY.toFixed(2) + ";\n\
const float SMOOTHEDGE = " + FACECUTSETTINGS.smoothEdge.toFixed(2) + ";\n\
\n\
\n\
void main(void){\n\
\n\
float alpha = 0.;\n\
vec2 uv = vUVrot; // uv normalized in the face\n\
if (uv.y>UPPERHEADY){ // upper head: circle arc\n\
vec2 uvc = (uv-vec2(0.5,UPPERHEADY))*vec2(1., 0.5/(1.-UPPERHEADY));\n\
float alphaBorder = smoothstep(0.5-SMOOTHEDGE, 0.5, length(uvc));\n\
float alphaCenter = smoothstep(UPPERHEADY, 1., uv.y);\n\
alpha = mix(alphaCenter, alphaBorder, smoothstep(0.3, 0.45, abs(uv.x-0.5)));\n\
} else if (uv.y<LOWERHEADY){ // lower head: circle arc \n\
vec2 uvc = (uv-vec2(0.5, LOWERHEADY))*vec2(1., 0.5/LOWERHEADY);\n\
alpha = smoothstep(0.5-SMOOTHEDGE, 0.5, length(uvc));\n\
} else { // middle head: straight\n\
vec2 uvc = vec2(uv.x-0.5, 0.);\n\
alpha = smoothstep(0.5-SMOOTHEDGE, 0.5,length(uvc));\n\
}\n\
\n\
vec2 uvCol = offset + (vUV+vec2(-0.5,-0.5))*scale;\n\
// go from canvas ref to video or image ref:\n\
vec2 uvImageCentered = 2.0 * videoTransformMat2 * (uvCol - 0.5);\n\
vec3 color = texture2D(samplerImage, uvImageCentered + 0.5).rgb;\n\
\n\
float grayScale = dot(color, vec3(0.33,0.33,0.33));\n\
if (alpha>0.01){\n\
alpha = mix(pow(alpha, 0.5), pow(alpha, 1.5), smoothstep(0.1,0.5,grayScale));\n\
}\n\
//color = vec3(1.,0.,0.); //FOR DEBUG: DISPLAY IN RED\n\
gl_FragColor = vec4(color, 1.-alpha);\n\
\n\
}";
__shps.faceCut = build_shaderProgram(copyRotateVertexShaderSource, faceCutFragmentShaderSource, 'FACECUT');
__shps.faceCut.uniforms.rz = GL.getUniformLocation(__shps.faceCut.program, 'rz');
__shps.faceCut.uniforms.offset = GL.getUniformLocation(__shps.faceCut.program, 'offset');
__shps.faceCut.uniforms.scale = GL.getUniformLocation(__shps.faceCut.program, 'scale');
__shps.faceCut.uniforms.videoTransformMat2 = GL.getUniformLocation(__shps.faceCut.program, 'videoTransformMat2');
__shps.faceCut.uniforms.aspectRatio = GL.getUniformLocation(__shps.faceCut.program, 'aspectRatio');
__shps.faceCut.uniforms.samplerImage = GL.getUniformLocation(__shps.faceCut.program, 'samplerImage');
GL.useProgram(__shps.faceCut.program);
GL.uniform1i(__shps.faceCut.uniforms.samplerImage, 0);
// renderFace shp: make color correction
const renderFaceFragmentShaderSource = "precision lowp float;\n\
uniform sampler2D samplerImage, samplerHueSrc, samplerHueDst;\n\
varying vec2 vUV, vUVrot;\n\
const vec2 EPSILON2=vec2(0.001, 0.001);\n\
\n\
vec3 rgb2hsv(vec3 c) { //from http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl\n\
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n\
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n\
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\
float d = q.x - min(q.w, q.y);\n\
float e = 1.0e-10;\n\
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n\
}\n\
\n\
vec3 hsv2rgb(vec3 c) { //from https://github.com/hughsk/glsl-hsv2rgb \n\
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \n\
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); \n\
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); \n\
//return c.z * normalize(mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y));\n\
} \n\
\n\
void main(void){\n\
vec2 uv = vUVrot;\n\
// get color in HSV format:\n\
vec2 uvCut = uv;\n\
vec4 colorImage = texture2D(samplerImage, uvCut);\n\
vec3 colorRGB = colorImage.rgb;\n\
vec3 colorHSV = rgb2hsv(colorRGB);\n\
// compute color transform:\n\
vec3 srcRGB = texture2D(samplerHueSrc, uv).rgb;\n\
vec3 dstRGB = texture2D(samplerHueDst, uv).rgb;\n\
vec3 srcHSV = rgb2hsv(srcRGB);\n\
vec3 dstHSV = rgb2hsv(dstRGB);\n\
// apply the transform:\n\
vec2 factorSV = vec2(1.,0.8)*dstHSV.yz/(srcHSV.yz+EPSILON2);\n\
factorSV = clamp(factorSV, vec2(0.3,0.3), vec2(3,3.));\n\
float dHue = dstHSV.x - srcHSV.x;\n\
vec3 colorHSVout = vec3(mod(1.0+colorHSV.x+dHue, 1.0), colorHSV.yz*factorSV);\n\
colorHSVout = clamp(colorHSVout, vec3(0.,0.,0.), vec3(1.,1.,1));\n\
// reconvert to RGB and output the color:\n\
colorRGB = hsv2rgb(colorHSVout);\n\
gl_FragColor = vec4(colorRGB, colorImage.a);\n\
}";
__shps.renderFace = build_shaderProgram(copyRotateVertexShaderSource, renderFaceFragmentShaderSource, 'RENDERFACE');
__shps.renderFace.uniforms.rz = GL.getUniformLocation(__shps.renderFace.program, 'rz');
__shps.renderFace.uniforms.aspectRatio = GL.getUniformLocation(__shps.renderFace.program, 'aspectRatio');
__shps.renderFace.uniforms.samplerImage = GL.getUniformLocation(__shps.renderFace.program, 'samplerImage');
__shps.renderFace.uniforms.samplerHueSrc = GL.getUniformLocation(__shps.renderFace.program, 'samplerHueSrc');
__shps.renderFace.uniforms.samplerHueDst = GL.getUniformLocation(__shps.renderFace.program, 'samplerHueDst');
GL.useProgram(__shps.renderFace.program);
GL.uniform1i(__shps.renderFace.uniforms.samplerImage, 0);
GL.uniform1i(__shps.renderFace.uniforms.samplerHueSrc, 2);
GL.uniform1i(__shps.renderFace.uniforms.samplerHueDst, 1);
} //end build__shps()
function fill_viewport(){ // FILL VIEWPORT. A VBO with 1 big triangle is already bound to the context by Facefilter API
GL.drawElements(GL.TRIANGLES, 3, GL.UNSIGNED_SHORT, 0);
}
function build__fbo(){ // we need to create a FBO to do render to texture for color corrections
__fbo = GL.createFramebuffer();
__fboDrawTarget = (GL.DRAW_FRAMEBUFFER)?GL.DRAW_FRAMEBUFFER:GL.FRAMEBUFFER; //depending on WebGL1 or WebGL2
}
function create_emptyTexture(w, h){
const tex = GL.createTexture();
GL.bindTexture(GL.TEXTURE_2D, tex);
GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, w, h, 0, GL.RGBA, GL.UNSIGNED_BYTE, null);
GL.texParameteri( GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE );
GL.texParameteri( GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE );
return tex;
};
function create_emptyLinearTexture(w, h){
const tex = create_emptyTexture(w,h);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR);
return tex;
};
//create the artpainting and userCrop hue textures:
function create_emptyMipmapTexture(w,h){
const tex = create_emptyTexture(w,h);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR);
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR_MIPMAP_NEAREST);
return tex;
};
// public static methods:
const superThat = {
init: function(spec){
GL = spec.GL;
__canvas = spec.canvasElement;
__glVideoTexture = spec.videoTexture;
__videoTransformMat2 = spec.videoTransformMat2;
build__shps();
build__fbo();
},
draw_video: function(){ // draw the video texture as background
JEELIZFACEFILTER.render_video();
},
draw_search: function(detectStates){
superThat.draw_video();
GL.enable(GL.BLEND);
GL.blendFunc(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA);
GL.useProgram(__shps.search.program);
detectStates.forEach(function(detectState){
GL.uniform1f(__shps.search.uniforms.detected, detectState.detected);
const xPx = ((detectState.x+1)*0.5*__canvas.width),
yPx = ((detectState.y+1)*0.5*__canvas.height),
wPx = Math.round(detectState.s*__canvas.width);
GL.viewport(Math.round(xPx-wPx/2), Math.round(yPx-wPx/2), wPx, wPx);
fill_viewport();
});
},
instance: function(specFaceCut){
// Initialize a facecut object
// default parameters if not specified
specFaceCut.sizePx = specFaceCut.sizePx || 64; // should be POT - size of the cut face texture
specFaceCut.hueSizePx = specFaceCut.hueSizePx || 4; // should be POT - size of the texture used for color correction
// create the face cut POT texture which will be used later to compute the hue Texture:
const _glFaceCutTexture = create_emptyMipmapTexture(specFaceCut.sizePx,specFaceCut.sizePx);
// create the hue Texture which will be used for color correction:
const _glHueTexture = create_emptyLinearTexture(specFaceCut.hueSizePx, specFaceCut.hueSizePx);
// normalized detection parameters:
const _faceOffset = [0,0], _faceScale = [0,0];
let _rz = 0.0;
function compute_faceScaleOffset(detectState){
_rz = detectState.rz;
_faceOffset[0] = detectState.x*0.5 + 0.5 + detectState.s*FACECUTSETTINGS.offset[0]*Math.sin(detectState.ry); //normalized x position
_faceOffset[1] = detectState.y*0.5 + 0.5 + detectState.s*FACECUTSETTINGS.offset[1];
_faceScale[0] = detectState.s * FACECUTSETTINGS.scale[0];
_faceScale[1] = detectState.s * FACECUTSETTINGS.scale[1]*__canvas.width/__canvas.height;
// tweaks:
_faceOffset[0] += _faceScale[0] * FACECUTSETTINGS.ryDriftDx*Math.sin(detectState.ry);
_faceOffset[0] += _faceScale[0] * FACECUTSETTINGS.rzDriftDx*Math.sin(detectState.rz);
}
// public dynamic methods:
const that = {
// getters:
get_faceScale: function(){
return _faceScale;
},
get_faceOffset: function(){
return _faceOffset;
},
get_rz: function(){
return _rz;
},
bind_hueTexture: function(){
GL.bindTexture(GL.TEXTURE_2D, _glHueTexture);
},
cut: function(detectState){
GL.bindFramebuffer(__fboDrawTarget, __fbo); // for RTT
GL.disable(GL.BLEND);
// compute normalized detection parameters:
compute_faceScaleOffset(detectState);
// cut the face:
GL.useProgram(__shps.faceCut.program);
GL.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, _glFaceCutTexture, 0);
GL.viewport(0, 0, specFaceCut.sizePx, specFaceCut.sizePx);
GL.uniform1f(__shps.faceCut.uniforms.rz, -_rz);
GL.uniform1f(__shps.faceCut.uniforms.aspectRatio, FACECUTSETTINGS.scale[0]/FACECUTSETTINGS.scale[1]);
GL.uniform2fv(__shps.faceCut.uniforms.offset, _faceOffset);
GL.uniform2fv(__shps.faceCut.uniforms.scale, _faceScale);
GL.uniformMatrix2fv(__shps.faceCut.uniforms.videoTransformMat2, false, __videoTransformMat2);
GL.bindTexture(GL.TEXTURE_2D, __glVideoTexture);
fill_viewport();
// compute the color correction texture:
GL.useProgram(__shps.copy.program);
GL.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, _glHueTexture, 0);
GL.viewport(0, 0, specFaceCut.hueSizePx, specFaceCut.hueSizePx);
GL.bindTexture(GL.TEXTURE_2D, _glFaceCutTexture);
GL.generateMipmap(GL.TEXTURE_2D);
fill_viewport();
}, //end cut()
render: function(faceCutPos){ // render this faceCut on the same place than faceCutPos
// set good blending:
GL.enable(GL.BLEND);
GL.blendFunc(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA);
GL.blendEquationSeparate( GL.FUNC_ADD, GL.FUNC_ADD );
GL.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA );
// compute normalized detection parameters:
const faceScale = faceCutPos.get_faceScale();
const faceOffset = faceCutPos.get_faceOffset();
// play on the viewport to render at a specific position:
const vpx = faceOffset[0]*__canvas.width; // in pixels
const vpy = faceOffset[1]*__canvas.height;
const vpw = faceScale[0]*__canvas.width;
const vph = faceScale[1]*__canvas.height;
GL.viewport(Math.round(vpx-vpw/2), Math.round(vpy-vph/2), Math.round(vpw), Math.round(vph));
GL.useProgram(__shps.renderFace.program);
GL.uniform1f(__shps.renderFace.uniforms.rz, _rz-faceCutPos.get_rz());
GL.uniform1f(__shps.renderFace.uniforms.aspectRatio, FACECUTSETTINGS.scale[0]/FACECUTSETTINGS.scale[1]);
GL.activeTexture(GL.TEXTURE2); // hue source
GL.bindTexture(GL.TEXTURE_2D, _glHueTexture);
GL.activeTexture(GL.TEXTURE1); // hue destination
faceCutPos.bind_hueTexture();
GL.activeTexture(GL.TEXTURE0); // faceCut image
GL.bindTexture(GL.TEXTURE_2D, _glFaceCutTexture);
fill_viewport();
GL.disable(GL.BLEND);
}
}; //end that;
return that;
} //end instance()
}; //end superThat
return superThat;
})();
// Export ES6 module:
try {
module.exports = JeelizFaceCut;
} catch(e){
console.log('JeelizFaceCut ES6 Module not exported');
}

View File

@@ -0,0 +1,328 @@
/*
This helper can help for:
* adjusting the canvas resolution to the good size -> this is crucial to
optimize the code because if the canvas is too large,
there are too much pixels to compute => it will be slow
* to mirror horizontally or not the canvas -> if the front camera is used we
need it flipped (mirror effect), while if the rear camera is used we need it not flipped
* to get the best camera resolution (either above the canvas resolution or closer)
to balance between performance and quality
*/
"use strict";
const JeelizResizer = (function(){
// private vars:
let _domCanvas = null,
_whCanvasPx = null,
_isApplyCSS = false,
_resizeAttemptsCounter = 0,
_overSamplingFactor = 1,
_isFullScreen = false,
_timerFullScreen = null,
_callbackResize = null,
_isInvFullscreenWH = false;
const _cameraResolutions = [ // all resolutions should be in landscape mode
[640,480],
[768,480],
[800,600],
[960,640],
[960,720],
[1024,768],
[1280,720],
[1920, 1080]
];
//private functions
function add_CSStransform(domElement, CSS){
const CSStransform = domElement.style.transform;
if (CSStransform.indexOf(CSS) !== -1) return;
domElement.style.transform = CSS + ' ' + CSStransform;
}
// Compute overlap between 2 rectangles A and B
// characterized by their width and their height in pixels
// the rectangles are centered
// return the ratio (pixels overlaped)/(total pixels)
function compute_overlap(whA, whB){
const aspectRatioA = whA[0] / whA[1];
const aspectRatioB = whB[0] / whB[1]; //higher aspectRatio -> more landscape
var whLandscape, whPortrait;
if (aspectRatioA > aspectRatioB){
whLandscape = whA, whPortrait = whB;
} else {
whLandscape = whB, whPortrait = whA;
}
// The overlapped area will be always a rectangle
const areaOverlap = Math.min(whLandscape[0], whPortrait[0]) * Math.min(whLandscape[1], whPortrait[1]);
var areaTotal;
if (whLandscape[0]>=whPortrait[0] && whLandscape[1]>=whPortrait[1]){ //union is a rectangle
areaTotal = whLandscape[0]*whLandscape[1];
} else if (whPortrait[0]>whLandscape[0] && whPortrait[1]>whLandscape[1]){ //union is a rectangle
areaTotal = whPortrait[0]*whPortrait[1];
} else { //union is a cross
areaTotal = whLandscape[0]*whLandscape[1];
areaTotal += (whPortrait[1]-whLandscape[1])*whPortrait[0];
}
return areaOverlap / areaTotal;
} //end compute_overlap()
function update_sizeCanvas(){
const domRect = _domCanvas.getBoundingClientRect();
apply_sizeCanvas(domRect.width, domRect.height);
}
function apply_sizeCanvas(width, height){
_whCanvasPx = [
Math.round(_overSamplingFactor * width),
Math.round(_overSamplingFactor * height)
];
// set canvas resolution:
_domCanvas.setAttribute('width', _whCanvasPx[0]);
_domCanvas.setAttribute('height', _whCanvasPx[1]);
// canvas display size:
if (_isApplyCSS){
_domCanvas.style.width = width.toString() + 'px';
_domCanvas.style.height = height.toString() + 'px';
}
}
function on_windowResize(){
// avoid to resize too often using a timer
// (it can create weird bug with some browsers)
if (_timerFullScreen){
clearTimeout(_timerFullScreen);
}
_timerFullScreen = setTimeout(resize_fullScreen, 50);
}
function resize_canvasToFullScreen(){
const wh = [window['innerWidth'], window['innerHeight']];
if (_isInvFullscreenWH){
wh.reverse();
}
apply_sizeCanvas(wh[0], wh[1]);
}
function resize_fullScreen(){
resize_canvasToFullScreen();
JEELIZFACEFILTER.resize();
_timerFullScreen = null;
if (_callbackResize) {
_callbackResize();
}
}
// public methods:
const that = {
// return true or false if the device is in portrait or landscape mode
// see https://stackoverflow.com/questions/4917664/detect-viewport-orientation-if-orientation-is-portrait-display-alert-message-ad
is_portrait: function(){
try{
if (window['matchMedia']("(orientation: portrait)")['matches']){
return true;
} else {
return false;
}
} catch(e){
return (window['innerHeight'] > window['innerWidth']);
}
},
// check whether the user is using IOS or not
// see https://stackoverflow.com/questions/9038625/detect-if-device-is-ios
check_isIOS: function(){
const isIOS = /iPad|iPhone|iPod/.test(navigator['userAgent']) && !window['MSStream'];
return isIOS;
},
// Should be called only if IOS was detected
// see https://stackoverflow.com/questions/8348139/detect-ios-version-less-than-5-with-javascript
get_IOSVersion: function(){
const v = (navigator['appVersion']).match(/OS (\d+)_(\d+)_?(\d+)?/);
return (v.length > 2) ? [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)] : [0, 0, 0];
},
// Check whether the user is using Android or not
// see https://stackoverflow.com/questions/6031412/detect-android-phone-via-javascript-jquery
check_isAndroid: function(){
const ua = navigator['userAgent'].toLowerCase();
return (ua.indexOf('android') !== -1);
},
// Should be called only if Android was detected
// see https://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript
get_androidVersion: function(){
const ua = navigator['userAgent'].toLowerCase();
const match = ua.match(/android\s([0-9\.]*)/i);
if (!match || match.length<2){
return [0,0,0];
}
const v = match[1].split('.');
return [
parseInt(v[0], 10),
parseInt(v[1], 10),
parseInt(v[2] || 0, 10)
];
},
// to get a video of 480x640 (480 width and 640 height)
// with a mobile phone in portrait mode, the default implementation
// should require a 480x640 video (Chrome, Firefox)
// but bad implementations needs to always request landscape resolutions (so 640x480)
// see https://github.com/jeeliz/jeelizFaceFilter/issues/144
require_flipVideoWHIfPortrait: function(){
// disabled because of https://github.com/jeeliz/jeelizFaceFilter/issues/144
// seems quite a mess though...
/* if (that.check_isIOS()){
//the user is using IOS
const version = that.get_IOSVersion();
if (version[0] >= 13){
if (version[1] <= 1 // IOS 13.0.X
|| (version[1] === 1 && version[2] < 3)){ // IOS 13.1.X with X<3
return false;
}
}
}
if (that.check_isAndroid()){
const version = that.get_androidVersion();
if (version[0] >= 9){ // Android 9+
return false;
}
} */
// normal implementation
return false;
},
// size canvas to the right resolution
// should be called after the page loading
// when the canvas has already the right size
// options:
// - <string> canvasId: id of the canvas
// - <HTMLCanvasElement> canvas: if canvasId is not provided
// - <function> callback: function to launch if there was an error or not
// - <float> overSamplingFactor: facultative. If 1, same resolution than displayed size (default).
// If 2, resolution twice higher than real size
// - <boolean> CSSFlipX: if we should flip the canvas or not. Default: false
// - <boolean> isFullScreen: if we should set the canvas fullscreen. Default: false
// - <function> onResize: function called when the window is resized. Only enabled if isFullScreen = true
// - <boolean> isInvWH: if we should invert width and height for fullscreen mode only. default = false
// - <boolean> isApplyCSS: if we should also apply canvas dimensions as CSS. default = false
size_canvas: function(optionsArg){
const options = Object.assign({
canvasId: 'undefinedCanvasId',
canvas: null,
overSamplingFactor: window.devicePixelRatio || 1,
isFullScreen: false,
isInvWH: false,
CSSFlipX: false,
isApplyCSS: false,
onResize: null,
callback: function(){}
}, optionsArg);
_domCanvas = (options.canvas) ? options.canvas : document.getElementById(options.canvasId);
_isFullScreen = options.isFullScreen;
_isInvFullscreenWH = options.isInvWH;
_isApplyCSS = options.isApplyCSS;
_overSamplingFactor = options.overSamplingFactor;
if (_isFullScreen){
// we are in fullscreen mode
_callbackResize = options.onResize;
resize_canvasToFullScreen();
window.addEventListener('resize', on_windowResize, false);
window.addEventListener('orientationchange', on_windowResize, false);
} else { // not fullscreen mode
// get display size of the canvas:
const domRect = _domCanvas.getBoundingClientRect();
if (domRect.width===0 || domRect.height===0){
console.log('WARNING in JeelizResize.size_canvas(): the canvas has its width or its height null, Retry a bit later...');
if (++_resizeAttemptsCounter > 20){
options.callback('CANNOT_RESIZECANVAS');
return;
}
setTimeout(that.size_canvas.bind(null, options), 50);
return;
}
// do resize canvas:
_resizeAttemptsCounter = 0;
update_sizeCanvas();
}
// flip horizontally if required:
if (options.CSSFlipX){
add_CSStransform(_domCanvas, 'rotateY(180deg)');
}
// compute the best camera resolutions:
const allResolutions = _cameraResolutions.map(function(x){
return x.slice(0)
});
// if we are in portrait mode, the camera is also in portrait mode
// so we need to set all resolutions to portrait mode
if (that.is_portrait() && that.require_flipVideoWHIfPortrait()){
allResolutions.forEach(function(wh){
wh.reverse();
});
}
// sort camera resolutions from the best to the worst:
allResolutions.sort(function(resA, resB){
return compute_overlap(resB, _whCanvasPx) - compute_overlap(resA, _whCanvasPx);
});
// pick the best camera resolution:
const bestCameraResolution = {
'idealWidth': allResolutions[0][0],
'idealHeight': allResolutions[0][1]
};
console.log('INFO in JeelizResizer: bestCameraResolution =', bestCameraResolution);
// launch the callback function after a small interval to let it
// some time to size:
setTimeout(options.callback.bind(null, false, bestCameraResolution), 1);
}, //end size_canvas()
// Should be called if the canvas is resized to update the canvas resolution:
resize_canvas: function(){
if (_isFullScreen){
resize_canvasToFullScreen()
} else {
update_sizeCanvas();
}
},
get_canvasSize: function(){
return _whCanvasPx;
}
}; //end that
return that;
})();
// Export ES6 module:
try {
module.exports = JeelizResizer;
} catch(e){
console.log('JeelizResizer ES6 Module not exported');
window.JeelizResizer = JeelizResizer;
}

View File

@@ -0,0 +1,446 @@
/*
Helper for Three.js
*/
const JeelizThreeHelper = (function(){
// internal settings:
const _settings = {
rotationOffsetX: 0.0, // negative -> look upper. in radians
pivotOffsetYZ: [0.2, 0.6],// YZ of the distance between the center of the cube and the pivot
detectionThreshold: 0.8, // sensibility, between 0 and 1. Less -> more sensitive
detectionHysteresis: 0.02,
//tweakMoveYRotateX: 0,//0.5, // tweak value: move detection window along Y axis when rotate the face around X (look up <-> down)
cameraMinVideoDimFov: 35 // Field of View for the smallest dimension of the video in degrees
};
// private vars:
let _threeRenderer = null,
_threeScene = null,
_threeVideoMesh = null,
_threeVideoTexture = null,
_threeTranslation = null;
let _maxFaces = -1,
_isMultiFaces = false,
_detectCallback = null,
_isVideoTextureReady = false,
_isSeparateThreeCanvas = false,
_faceFilterCv = null,
_videoElement = null,
_isDetected = false,
_scaleW = 1,
_canvasAspectRatio = -1;
const _threeCompositeObjects = [];
let _gl = null,
_glVideoTexture = null,
_glShpCopyCut = null,
_glShpCopyCutVideoMatUniformPointer = null;
let _videoTransformMat2 = null;
// private funcs:
function destroy(){
_isVideoTextureReady = false;
_threeCompositeObjects.splice(0);
if (_threeVideoTexture){
_threeVideoTexture.dispose();
_threeVideoTexture = null;
}
}
function create_threeCompositeObjects(){
for (let i=0; i<_maxFaces; ++i){
// COMPOSITE OBJECT WHICH WILL TRACK A DETECTED FACE
const threeCompositeObject = new THREE.Object3D();
threeCompositeObject.frustumCulled = false;
threeCompositeObject.visible = false;
_threeCompositeObjects.push(threeCompositeObject);
_threeScene.add(threeCompositeObject);
}
}
function create_videoScreen(){
const videoScreenVertexShaderSource = "attribute vec2 position;\n\
uniform mat2 videoTransformMat2;\n\
varying vec2 vUV;\n\
void main(void){\n\
gl_Position = vec4(position, 0., 1.);\n\
vUV = 0.5 + videoTransformMat2 * position;\n\
}";
const videoScreenFragmentShaderSource = "precision lowp float;\n\
uniform sampler2D samplerVideo;\n\
varying vec2 vUV;\n\
void main(void){\n\
gl_FragColor = texture2D(samplerVideo, vUV);\n\
}";
if (_isSeparateThreeCanvas){
const compile_shader = function(source, type, typeString) {
const glShader = _gl.createShader(type);
_gl.shaderSource(glShader, source);
_gl.compileShader(glShader);
if (!_gl.getShaderParameter(glShader, _gl.COMPILE_STATUS)) {
alert("ERROR IN " + typeString + " SHADER: " + _gl.getShaderInfoLog(glShader));
return null;
}
return glShader;
};
const glShaderVertex = compile_shader(videoScreenVertexShaderSource, _gl.VERTEX_SHADER, 'VERTEX');
const glShaderFragment = compile_shader(videoScreenFragmentShaderSource, _gl.FRAGMENT_SHADER, 'FRAGMENT');
_glShpCopyCut = _gl.createProgram();
_gl.attachShader(_glShpCopyCut, glShaderVertex);
_gl.attachShader(_glShpCopyCut, glShaderFragment);
_gl.linkProgram(_glShpCopyCut);
const samplerVideo = _gl.getUniformLocation(_glShpCopyCut, 'samplerVideo');
_glShpCopyCutVideoMatUniformPointer = _gl.getUniformLocation(_glShpCopyCut, 'videoTransformMat2');
return;
}
// init video texture with red:
_threeVideoTexture = new THREE.DataTexture( new Uint8Array([255,0,0]), 1, 1, THREE.RGBFormat);
_threeVideoTexture.needsUpdate = true;
// CREATE THE VIDEO BACKGROUND:
const videoMaterial = new THREE.RawShaderMaterial({
depthWrite: false,
depthTest: false,
vertexShader: videoScreenVertexShaderSource,
fragmentShader: videoScreenFragmentShaderSource,
uniforms:{
samplerVideo: {value: _threeVideoTexture},
videoTransformMat2: {
value: _videoTransformMat2
}
}
});
const videoGeometry = new THREE.BufferGeometry()
const videoScreenCorners = new Float32Array([-1,-1, 1,-1, 1,1, -1,1]);
videoGeometry.addAttribute( 'position', new THREE.BufferAttribute( videoScreenCorners, 2 ) );
videoGeometry.setIndex(new THREE.BufferAttribute(new Uint16Array([0,1,2, 0,2,3]), 1));
_threeVideoMesh = new THREE.Mesh(videoGeometry, videoMaterial);
that.apply_videoTexture(_threeVideoMesh);
_threeVideoMesh.renderOrder = -1000; // render first
_threeVideoMesh.frustumCulled = false;
_threeScene.add(_threeVideoMesh);
} //end create_videoScreen()
function detect(detectState){
_threeCompositeObjects.forEach(function(threeCompositeObject, i){
_isDetected = threeCompositeObject.visible;
const ds = detectState[i];
if (_isDetected && ds.detected < _settings.detectionThreshold-_settings.detectionHysteresis){
// DETECTION LOST
if (_detectCallback) _detectCallback(i, false);
threeCompositeObject.visible = false;
} else if (!_isDetected && ds.detected > _settings.detectionThreshold+_settings.detectionHysteresis){
// FACE DETECTED
if (_detectCallback) _detectCallback(i, true);
threeCompositeObject.visible = true;
}
}); //end loop on all detection slots
}
function update_poses(ds, threeCamera){
// tan( <horizontal FoV> / 2 ):
const halfTanFOVX = Math.tan(threeCamera.aspect * threeCamera.fov * Math.PI/360); //tan(<horizontal FoV>/2), in radians (threeCamera.fov is vertical FoV)
_threeCompositeObjects.forEach(function(threeCompositeObject, i){
if (!threeCompositeObject.visible) return;
const detectState = ds[i];
// tweak Y position depending on rx:
//const tweak = _settings.tweakMoveYRotateX * Math.tan(detectState.rx);
const cz = Math.cos(detectState.rz), sz = Math.sin(detectState.rz);
// relative width of the detection window (1-> whole width of the detection window):
const W = detectState.s * _scaleW;
// distance between the front face of the cube and the camera:
const DFront = 1 / ( 2 * W * halfTanFOVX );
// D is the distance between the center of the unit cube and the camera:
const D = DFront + 0.5;
// coords in 2D of the center of the detection window in the viewport:
const xv = detectState.x * _scaleW;
const yv = detectState.y * _scaleW;
// coords in 3D of the center of the cube (in the view coordinates system):
const z = -D; // minus because view coordinate system Z goes backward
const x = xv * D * halfTanFOVX;
const y = yv * D * halfTanFOVX / _canvasAspectRatio;
// set position before pivot:
threeCompositeObject.position.set(-sz*_settings.pivotOffsetYZ[0], -cz*_settings.pivotOffsetYZ[0], -_settings.pivotOffsetYZ[1]);
// set rotation and apply it to position:
threeCompositeObject.rotation.set(detectState.rx+_settings.rotationOffsetX, detectState.ry, detectState.rz, "ZYX");
threeCompositeObject.position.applyEuler(threeCompositeObject.rotation);
// add translation part:
_threeTranslation.set(x, y+_settings.pivotOffsetYZ[0], z+_settings.pivotOffsetYZ[1]);
threeCompositeObject.position.add(_threeTranslation);
}); //end loop on composite objects
}
//public methods:
const that = {
// launched with the same spec object than callbackReady. set spec.threeCanvasId to the ID of the threeCanvas to be in 2 canvas mode:
init: function(spec, detectCallback){
destroy();
_maxFaces = spec.maxFacesDetected;
_glVideoTexture = spec.videoTexture;
_videoTransformMat2 = spec.videoTransformMat2;
_gl = spec.GL;
_faceFilterCv = spec.canvasElement;
_isMultiFaces = (_maxFaces>1);
_videoElement = spec.videoElement;
// enable 2 canvas mode if necessary:
let threeCanvas = null;
if (spec.threeCanvasId){
_isSeparateThreeCanvas = true;
// adjust the threejs canvas size to the threejs canvas:
threeCanvas = document.getElementById(spec.threeCanvasId);
threeCanvas.setAttribute('width', _faceFilterCv.width);
threeCanvas.setAttribute('height', _faceFilterCv.height);
} else {
threeCanvas = _faceFilterCv;
}
if (typeof(detectCallback) !== 'undefined'){
_detectCallback = detectCallback;
}
// init THREE.JS context:
_threeRenderer = new THREE.WebGLRenderer({
context: (_isSeparateThreeCanvas) ? null : _gl,
canvas: threeCanvas,
alpha: (_isSeparateThreeCanvas || spec.alpha) ? true : false
});
_threeScene = new THREE.Scene();
_threeTranslation = new THREE.Vector3();
create_threeCompositeObjects();
create_videoScreen();
// handle device orientation change:
window.addEventListener('orientationchange', function(){
setTimeout(JEELIZFACEFILTER.resize, 1000);
}, false);
const returnedDict = {
videoMesh: _threeVideoMesh,
renderer: _threeRenderer,
scene: _threeScene
};
if (_isMultiFaces){
returnedDict.faceObjects = _threeCompositeObjects
} else {
returnedDict.faceObject = _threeCompositeObjects[0];
}
return returnedDict;
}, //end that.init()
detect: function(detectState){
const ds = (_isMultiFaces) ? detectState : [detectState];
// update detection states:
detect(ds);
},
get_isDetected: function() {
return _isDetected;
},
render: function(detectState, threeCamera){
const ds = (_isMultiFaces) ? detectState : [detectState];
// update detection states then poses:
detect(ds);
update_poses(ds, threeCamera);
if (_isSeparateThreeCanvas){
// render the video texture on the faceFilter canvas:
_gl.viewport(0, 0, _faceFilterCv.width, _faceFilterCv.height);
_gl.useProgram(_glShpCopyCut);
_gl.uniformMatrix2fv(_glShpCopyCutVideoMatUniformPointer, false, _videoTransformMat2);
_gl.activeTexture(_gl.TEXTURE0);
_gl.bindTexture(_gl.TEXTURE_2D, _glVideoTexture);
_gl.drawElements(_gl.TRIANGLES, 3, _gl.UNSIGNED_SHORT, 0);
} else {
// reinitialize the state of THREE.JS because JEEFACEFILTER have changed stuffs:
// -> can be VERY costly !
_threeRenderer.state.reset();
}
// trigger the render of the THREE.JS SCENE:
_threeRenderer.render(_threeScene, threeCamera);
},
sortFaces: function(bufferGeometry, axis, isInv){ // sort faces long an axis
// Useful when a bufferGeometry has alpha: we should render the last faces first
const axisOffset = {X:0, Y:1, Z:2}[axis.toUpperCase()];
const sortWay = (isInv) ? -1 : 1;
// fill the faces array:
const nFaces = bufferGeometry.index.count/3;
const faces = new Array(nFaces);
for (let i=0; i<nFaces; ++i){
faces[i] = [bufferGeometry.index.array[3*i], bufferGeometry.index.array[3*i+1], bufferGeometry.index.array[3*i+2]];
}
// compute centroids:
const aPos = bufferGeometry.attributes.position.array;
const centroids = faces.map(function(face, faceIndex){
return [
(aPos[3*face[0]]+aPos[3*face[1]]+aPos[3*face[2]])/3, // X
(aPos[3*face[0]+1]+aPos[3*face[1]+1]+aPos[3*face[2]+1])/3, // Y
(aPos[3*face[0]+2]+aPos[3*face[1]+2]+aPos[3*face[2]+2])/3, // Z
face
];
});
// sort centroids:
centroids.sort(function(ca, cb){
return (ca[axisOffset]-cb[axisOffset]) * sortWay;
});
// reorder bufferGeometry faces:
centroids.forEach(function(centroid, centroidIndex){
const face = centroid[3];
bufferGeometry.index.array[3*centroidIndex] = face[0];
bufferGeometry.index.array[3*centroidIndex+1] = face[1];
bufferGeometry.index.array[3*centroidIndex+2] = face[2];
});
}, //end sortFaces
get_threeVideoTexture: function(){
return _threeVideoTexture;
},
apply_videoTexture: function(threeMesh){
if (_isVideoTextureReady){
return;
}
threeMesh.onAfterRender = function(){
// Replace _threeVideoTexture.__webglTexture by the real video texture:
try {
_threeRenderer.properties.update(_threeVideoTexture, '__webglTexture', _glVideoTexture);
_threeVideoTexture.magFilter = THREE.LinearFilter;
_threeVideoTexture.minFilter = THREE.LinearFilter;
_isVideoTextureReady = true;
} catch(e){
console.log('WARNING in JeelizThreeHelper: the glVideoTexture is not fully initialized');
}
delete(threeMesh.onAfterRender);
};
},
// create an occluder, IE a transparent object which writes on the depth buffer:
create_threejsOccluder: function(occluderURL, callback){
const occluderMesh = new THREE.Mesh();
new THREE.BufferGeometryLoader().load(occluderURL, function(occluderGeometry){
const mat = new THREE.ShaderMaterial({
vertexShader: THREE.ShaderLib.basic.vertexShader,
fragmentShader: "precision lowp float;\n void main(void){\n gl_FragColor=vec4(1.,0.,0.,1.);\n }",
uniforms: THREE.ShaderLib.basic.uniforms,
colorWrite: false
});
occluderMesh.renderOrder = -1; //render first
occluderMesh.material = mat;
occluderMesh.geometry = occluderGeometry;
if (typeof(callback)!=='undefined' && callback) callback(occluderMesh);
});
return occluderMesh;
},
set_pivotOffsetYZ: function(pivotOffset) {
_settings.pivotOffsetYZ = pivotOffset;
},
create_camera: function(zNear, zFar){
const threeCamera = new THREE.PerspectiveCamera(1, 1, (zNear) ? zNear : 0.1, (zFar) ? zFar : 100);
that.update_camera(threeCamera);
return threeCamera;
},
update_camera: function(threeCamera){
// compute aspectRatio:
const canvasElement = _threeRenderer.domElement;
const cvw = canvasElement.width;
const cvh = canvasElement.height;
_canvasAspectRatio = cvw / cvh;
// compute vertical field of view:
const vw = _videoElement.videoWidth;
const vh = _videoElement.videoHeight;
const videoAspectRatio = vw / vh;
const fovFactor = (vh > vw) ? (1.0 / videoAspectRatio) : 1.0;
const fov = _settings.cameraMinVideoDimFov * fovFactor;
console.log('INFO in JeelizThreeHelper - update_camera(): Estimated vertical video FoV is', fov);
// compute X and Y offsets in pixels:
let scale = 1.0;
if (_canvasAspectRatio > videoAspectRatio) {
// the canvas is more in landscape format than the video, so we crop top and bottom margins:
scale = cvw / vw;
} else {
// the canvas is more in portrait format than the video, so we crop right and left margins:
scale = cvh / vh;
}
const cvws = vw * scale, cvhs = vh * scale;
const offsetX = (cvws - cvw) / 2.0;
const offsetY = (cvhs - cvh) / 2.0;
_scaleW = cvw / cvws;
// apply parameters:
threeCamera.aspect = _canvasAspectRatio;
threeCamera.fov = fov;
console.log('INFO in JeelizThreeHelper.update_camera(): camera vertical estimated FoV is', fov, 'deg');
threeCamera.setViewOffset(cvws, cvhs, offsetX, offsetY, cvw, cvh);
threeCamera.updateProjectionMatrix();
// update drawing area:
_threeRenderer.setSize(cvw, cvh, false);
_threeRenderer.setViewport(0, 0, cvw, cvh);
}, //end update_camera()
resize: function(w, h, threeCamera){
_threeRenderer.domElement.width = w;
_threeRenderer.domElement.height = h;
JEELIZFACEFILTER.resize();
if (threeCamera){
that.update_camera(threeCamera);
}
}
}
return that;
})();
// Export ES6 module:
try {
module.exports = JeelizThreeHelper;
} catch(e){
console.error(e);
console.log('JeelizThreeHelper ES6 Module not exported');
window.JeelizThreeHelper = JeelizThreeHelper;
}

9
thirdparty/jeeliz/helpers/README.md vendored Normal file
View File

@@ -0,0 +1,9 @@
# Helpers
Helper scripts used by several categories of demos. They can hide the complexity of the lib.
* `Canvas2DDisplay.js`: see [canvas 2D - face detection and tracking demo](https://jeeliz.com/demos/faceFilter/demos/canvas2D/faceTrack/). Helper for Canvas2D rendering.
* `HeadControls.js`: see Head controlled demos ([Head controlled Pacman](https://jeeliz.com/demos/faceFilter/demos/pacman/) for example)
* `JeelizThreeHelper.js`: cf [THREE.JS multiple face tracking demo](https://jeeliz.com/demos/faceFilter/demos/threejs/multiCubes/)
* `JeelizResize.js`: Helper to find the best canvas and webcam resolutions. Explained [in the Optimization section of the main README](https://github.com/jeeliz/jeelizFaceFilter#optimization)
* `JeelizFaceCut.js`: Helper to cut the face in 2D from the video, and processing color correction. It is used in the [FaceSwap demo](https://jeeliz.com/demos/faceFilter/demos/faceReplacement/faceSwap/)

View File

@@ -0,0 +1,151 @@
"use strict";
const _states = {
idle : 0,
loading : 1,
dragging : 2
}
let _state = _states.idle; // MT217 : initialize your state always (even with a loading value)
let _dP = new window.THREE.Vector3();
let _x0 = -1; let _y0 = -1;
let _scenes = null;
let _boundFunction = null;
function updateMeshPosition(canvas, event) {
const MOUSEVECTOR = new window.THREE.Vector3();
const DIRECTIONVECTOR = new window.THREE.Vector3();
const VIEWPORTVECTOR = new window.THREE.Vector3();
const _headCenterZ = -1;
if (_state !== _states.dragging) return; // MT217
const isTouch = !!((event.touches && event.touches.length));// MT217 is touch or mouse event ?
const xPx = (isTouch) ? event.touches[0].clientX : event.clientX; // MT217 : make the distinction between touch and mouse event
const yPx = (isTouch) ? event.touches[0].clientY : event.clientY; // if touch event, consider only the first finger
const dxPx = xPx - _x0; // in pixels
const dyPx = yPx - _y0; // in pixels too
_x0 = xPx;
_y0 = yPx;
// calcul des coo de dxPx, dyPx dans le viewport
// les offsets du canvas s'annulent -> que facteur d'échelle a appliquer
const dx = -dxPx / canvas.offsetWidth;
const dy = -dyPx / canvas.offsetHeight;
// Only check intersects if object is visible
// If there is only 1 object, we don't check intersections too
const mesh = (_scenes.length === 1) ? _scenes[0] : _scenes.find( function(scene){
if (!scene.parent.visible) {
return false;
}
// TODO: Check if a child geometry is an occlusion object. If so remove it from the intersection list
MOUSEVECTOR.set(-(xPx / canvas.offsetWidth) * 2 + 1, -(yPx / canvas.offsetHeight) * 2 + 1, 0.5);
const raycaster = new window.THREE.Raycaster();
raycaster.setFromCamera(MOUSEVECTOR, window.THREECAMERA);
const intersects = raycaster.intersectObjects(scene.children);
return (intersects.length > 0);
});
if (!mesh) {
return;
}
VIEWPORTVECTOR.set(dx, dy, 1);
DIRECTIONVECTOR.copy(VIEWPORTVECTOR);
if (!window.THREECAMERA){
throw new Error('Cannot find the THREE.js camera. Please check that window.THREECAMERA is the default scene camera');
}
DIRECTIONVECTOR.unproject(window.THREECAMERA);
DIRECTIONVECTOR.sub(window.THREECAMERA.position);
DIRECTIONVECTOR.normalize();
// we calculate the coefficient that will allow us to find our mesh's position
const k = _headCenterZ / DIRECTIONVECTOR.z;
// _dP = displacement in the scene (=world) ref :
_dP.copy(DIRECTIONVECTOR).multiplyScalar(k);
_dP.setZ(0); // bcoz we only want to displace in the (0xy) plane
const _quat = new window.THREE.Quaternion();
const _eul = new window.THREE.Euler();
_eul.setFromQuaternion(_quat);
// convert _dP to mesh ref to apply it directly to mesh.position :
// _dP is a vector so apply only the rotation part (not the translation)
_dP.applyEuler(mesh.getWorldQuaternion(_eul));
// Boost movement to follow better the mouse/touch
_dP.multiplyScalar(10);
// apply _dP
mesh.position.add(_dP);
}
function setMousePosition0(event) { // save initial position of the mouse
const isTouch = !!((event.touches && event.touches.length));// MT217 is touch or mouse event ?
if (isTouch && event.touches.length > 1) return; // MT217 if the user put a second finger while dragging
_x0 = (isTouch) ? event.touches[0].clientX : event.clientX; // MT217
_y0 = (isTouch) ? event.touches[0].clientY : event.clientY;
}
function mouseDown(event) {
setMousePosition0(event); // MANTIS201
_state = _states.dragging;
}
function mouseUp() {
_state = _states.idle;
}
function addDragEventListener(scenes, canvasId, remove) {
_scenes = Array.isArray(scenes) ? scenes : [scenes];
const canvas = document.getElementById((typeof(canvasId) === 'undefined') ? 'jeeFaceFilterCanvas' : canvasId);
_state = _states.idle; // MT217 : initialize your state always (even with a loading value)
_dP = new window.THREE.Vector3();
_x0 = undefined; _y0 = undefined;
if (remove) {
// REMOVE OUR LISTENERS
canvas.removeEventListener('mousemove', _boundFunction, true);
canvas.removeEventListener('touchmove', _boundFunction, true);
// BEGINNING OF THE INTERACTION
canvas.removeEventListener('mousedown', mouseDown);
canvas.removeEventListener('touchstart', mouseDown);
// END OF THE INTERACTION
canvas.removeEventListener('mouseup', mouseUp);
canvas.removeEventListener('touchend', mouseUp);
// ALSO END BUT IN CASE LEAVING CANVAS OR ALERT BOX ECT...
canvas.removeEventListener('mouseout', mouseUp);
canvas.removeEventListener('touchcancel', mouseUp);
} else {
// SET OUR LISTENERS
_boundFunction = updateMeshPosition.bind(this, canvas)
canvas.addEventListener('mousemove', _boundFunction, true);
// canvas.addEventListener('touchmove', createTouchEvent, true)
canvas.addEventListener('touchmove', _boundFunction, true); // MT217
// BEGINNING OF THE INTERACTION
canvas.addEventListener('mousedown', mouseDown);
canvas.addEventListener('touchstart', mouseDown);
// END OF THE INTERACTION
canvas.addEventListener('mouseup', mouseUp);
canvas.addEventListener('touchend', mouseUp);
// ALSO END BUT IN CASE LEAVING CANVAS OR ALERT BOX ECT...
canvas.addEventListener('mouseout', mouseUp);
canvas.addEventListener('touchcancel', mouseUp);
}
}

186
thirdparty/jeeliz/jeelizFaceFilter.js vendored Normal file
View File

@@ -0,0 +1,186 @@
/**
* Jeeliz Face Filter - https://github.com/jeeliz/jeelizFaceFilter
*
* Copyright 2020 WebAR.rocks ( https://webar.rocks )
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var JEELIZFACEFILTER=(function(){window.JEELIZFACEFILTERGEN=function(){function Fb(a){var c=null,d=null,e=null,m=0;this.A=function(n){this.Cf(n.pb);e.Be({qc:n.qc,nc:n.nc})};this.We=function(n){return c[n]};this.Cf=function(n){var q=null;m=n.length;c=n.map(function(r,l){r=Object.assign({},r,{index:l,parent:this,vb:q,ff:l===m-1});return q=l=0===l?Gb.instance(r):Hb.instance(r)});d=c[0];e=c[m-1];c.forEach(function(r,l){0!==l&&r.uf()})};this.V=function(n){var q=n;c.forEach(function(r){q=r.V(q,!1)});return q};this.Ve=function(){return d.F()};
this.Xb=function(){return e.Xe()};this.nd=function(){return e.nd()};this.m=function(){c&&(c.forEach(function(n){n.m()}),e=d=c=null,m=0)};"undefined"!==typeof a&&this.A(a)}function db(a,c){var d=c%8;return a[(c-d)/8]>>7-d&1}function Ib(a){var c=JSON.parse(a);a=c.ne;var d=c.nf,e=c.n;var m="undefined"===typeof btoa?Buffer.from(c.data,"base64").toString("latin1"):atob(c.data);var n=m.length;c=new Uint8Array(n);for(var q=0;q<n;++q)c[q]=m.charCodeAt(q);m=new Float32Array(e);n=new Float32Array(d);q=a+d+
1;for(var r=0;r<e;++r){for(var l=q*r,v=0===db(c,l)?1:-1,C=l+1,E=1,g=0,t=C+a-1;t>=C;--t)g+=E*db(c,t),E*=2;C=g;l=l+1+a;E=n.length;g=0;for(t=l;t<l+E;++t)n[g]=db(c,t,!0),++g;for(E=l=0;E<d;++E)l+=n[E]*Math.pow(2,-E-1);m[r]=0===l&&0===C?0:v*(1+l)*Math.pow(2,1+C-Math.pow(2,a-1))}return m}function Ya(){return-1!==[ia.ready,ia.play,ia.pause].indexOf(na)}function eb(){if(na===ia.play)return!1;na=ia.play;Ma.stop();qb(0)}function rb(){if(na!==ia.play)return!1;Ma.stop();na=ia.pause;return!0}function Fa(a,c,d,
e,m){a=4*(3*c+a)+d;return e+(X.buffer[a]/255+X.buffer[a+12]/65025)*(m-e)}function fb(){b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1);va.ha();U.reset();Y.reset();A.R();A.ad();b.disable(b.DEPTH_TEST);b.disable(b.BLEND);U.Ja();A.Ba()}function Jb(){va.P();b.viewport(0,0,3,2*O.o);A.set("s53");X.Da.g(0);U.l(!1,!1);return aa.xb(0,0,3,2*O.o,X.buffer)}function qb(){na!==ia.pause&&(ea.isCleanGLStateAtEachIteration&&(A.ad(),U.reset(),U.Ja(),b.disable(b.DEPTH_TEST),b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1),A.Ba()),pa.rc(Kb,
Jb,Lb,Mb,ea.animateProcessOrder))}function Kb(){va.ha();if(!B.kb)if(B.jb)B.element.needsUpdate&&(B.N.Rf(B.element.arrayBuffer),B.element.needsUpdate=!1);else{var a=B.element.currentTime,c=a-B.wb;0>c&&(B.wb=a);1E3*c<ba.Tf||(B.wb+=c,B.N.refresh())}a=pa.od();if(O.W.length>a)O.W.splice(0,O.W.length-a);else for(;O.W.length<a;)O.W.push(0);if(1!==O.o)if(qa.every(Nb)){for(var d=0,e=c=0;e<qa.length;++e)qa[e].detected>d&&(d=qa[e].detected,c=0);for(d=0;d<a;++d)O.W[d]=c}else{c=Math.round(ba.pf*a);c=Math.min(1,
c);d=O.Fd;for(var m=e=0;e<a;++e){if(!gb(qa[d])&&++m>c){do++d===O.o&&(d=0);while(!gb(qa[d]))}O.W[e]=d++;d%=O.o}O.Fd=d}for(a=0;a<pa.od();++a)O.pa=O.W[a],O.mc=(.5+O.pa)/O.o,O.Ad=O.W.lastIndexOf(O.pa)===a,A.set("s55"),c=qa[O.pa],A.G("u43",1+Na.uc*(Math.cos(c.ry)-1)),Q.ua&&A.G("u42",c.rz),1!==O.o&&A.G("u41",O.mc),Z.xa.da(),B.N.g(0),X.Da.g(1),U.l(!1,!1),Z.xa.g(0),Oa.V(Z.xa);pa.ae()}function Lb(){for(var a=0;a<O.o;++a)if(-1!==O.W.indexOf(a)){var c=a,d=Sa[c],e=[c],m=qa[c],n=hb[c],q=2*c;d.Wa=Fa(1,q,3,0,1);
m.detected=wa.$(m.detected,d.Wa,ba.ke);if(d.Wa<ea.multiDetectionThresholdFactors[0]*ea.threshold)d.Aa=Math.floor(d.Aa/2),Q.ua&&(m.rz=0,m.ry=0);else{var r=X.Pa;d.x=Fa(0,q,1,-1,1);d.y=Fa(0,q,2,-1,1);d.ca=Fa(0,q,3,0,1);d.sc=Fa(1,q,0,-r[0],r[0]);d.tc=Fa(1,q,1,-r[1],r[1]);d.Qa=Fa(1,q,2,-r[2],r[2]);for(r=0;r<X.aa;++r)d.hd[r]=X.Na[r](Fa(2,q,r,0,1));e.Rb=d.x-m.xRaw;e.Sb=d.y-m.yRaw;e.Qb=d.ca-m.sRaw;e.Nb=d.sc-m.rx;e.Ob=d.tc-m.ry;e.Pb=Q.ua?d.Qa:d.Qa-m.rz;q=pa.Qe();e=(1-Za.qb(sa.translationFactorRange[0],sa.translationFactorRange[1],
Math.sqrt(e.Rb*e.Rb+e.Sb*e.Sb+e.Qb*e.Qb)/q))*(1-Za.qb(sa.rotationFactorRange[0],sa.rotationFactorRange[1],Math.sqrt(e.Nb*e.Nb+e.Ob*e.Ob+e.Pb*e.Pb)/q))*Za.qb(sa.qualityFactorRange[0],sa.qualityFactorRange[1],d.Wa);c=n[++ib[c]%n.length]=e;for(q=0;q<n.length;++q)c=Math.min(c,n[q]);c=Math.max(.5,c);e=Math.min(c,e);n=wa.$(sa.alphaRange[1],sa.alphaRange[0],Math.pow(e,ba.me));m.xRaw=wa.$(m.xRaw,d.x,n);m.yRaw=wa.$(m.yRaw,d.y,n);m.sRaw=wa.$(m.sRaw,d.ca,n);m.rx=wa.$(m.rx,d.sc,n);m.ry=wa.$(m.ry,d.tc,n);m.rz=
Q.ua?m.rz+sa.followZRotAlphaFactor*n*d.Qa:wa.$(m.rz,d.Qa,n);c=m.sRaw*Na.Mb*Math.sin(m.ry);e=Math.sin(m.rz)*c/Pa;m.x=m.xRaw+Math.cos(m.rz)*c;m.y=m.yRaw+e;m.s=m.sRaw;n=Math.max(n,ba.le);for(c=0;c<X.aa;++c)m.expressions[c]=wa.$(m.expressions[c],d.hd[c],n);++d.Aa}}va.Pf();ea.isCleanGLStateAtEachIteration&&(va.reset(),Y.reset(),b.enable(b.DEPTH_TEST));Q.Va&&(1===O.o?Q.Va(qa[0]):Q.Va(qa));ea.isCleanGLStateAtEachIteration&&b.disable(b.BLEND)}function Mb(){na===ia.play&&Ma.rc(qb)}function sb(){Z.xa=Y.instance({isPot:!0,
isFloat:!1,width:Oa.Ve()});for(var a=ba.Yd,c=O.o,d=new Float32Array([0,.5,.5,0,0,0,0,0,0,0,0,0]),e=new Float32Array(d.length*O.o),m=0,n;m<O.o;++m)for(n=0;n<d.length;++n)e[m*d.length+n]=d[n];X.Da=Ob.instance({width:a,height:c,isFloat:!0,isPot:!1,array:e})}function Pb(){function a(c){for(var d=[],e=0;e<O.o;++e)d.push(JSON.parse(JSON.stringify(c)));return d}X.buffer=new Uint8Array(8*ba.Yd*O.o);Sa=a({Wa:0,x:0,y:0,ca:1,sc:0,tc:0,Qa:0,hd:new Float32Array(X.aa),Aa:0});qa=a({detected:0,x:0,y:0,s:1,xRaw:0,
yRaw:0,sRaw:1,rx:0,ry:0,rz:0,expressions:new Float32Array(X.aa)});a({Rb:0,Sb:0,Qb:0,Nb:0,Ob:0,Pb:0})}function jb(){A.T("s55",[{type:"1i",name:"u1",value:0},{type:"1i",name:"u39",value:1},{type:"2f",name:"u40",value:Z.H},{type:"1f",name:"u41",value:.5},{type:"1f",name:"u42",value:0}]);A.T("s56",[{type:"1i",name:"u44",value:0},{type:"1i",name:"u39",value:1},{type:"1f",name:"u47",value:ba.Nf},{type:"1f",name:"u48",value:ea.threshold},{type:"3f",name:"u46",value:[X.O[0]*Z.H[0],X.O[1]*Z.H[1],X.O[2]]},
{type:"1f",name:"u41",value:.5},{type:"1f",name:"u49",value:1},{type:"1f",name:"u42",value:0}]);var a=[{type:"1i",name:"u44",value:0}];A.T("s57",a);A.T("s58",a);A.T("s53",[{type:"1i",name:"u39",value:0},{type:"1f",name:"u52",value:Z.H[0]},{type:"2f",name:"u51",value:[0,.5/O.o]}])}function kb(){Z.H[0]=1;Z.H[1]=Z.D/Z.M;tb.A({ub:ea.overlapFactors,Kd:ea.nScaleLevels,D:Z.D,M:Z.M,Td:ea.scale0Factor,O:X.O,Ud:ea.scanCenterFirst})}function Qb(a){if(Q.Fa)ub("string"===typeof Q.Fa?JSON.parse(Q.Fa):Q.Fa,a);else{var c=
Q.Mc;"JSON"!==c.toUpperCase().split(".").pop()&&(c+=ba.neuralNetworkPath);vb.get(c,function(d){d=JSON.parse(d);ub(d,a)})}}function ub(a,c){if(a.exportData){var d=a.exportData;d.rotationEulerAnglesFactors&&(X.Pa=d.rotationEulerAnglesFactors);d.translationScalingFactors&&(X.O=d.translationScalingFactors);"undefined"!==typeof d.nExpressions&&(X.aa=d.nExpressions);Na.uc=.4;Na.Mb=.7;"undefined"!==typeof d.fgScaleXFactor&&(Na.uc=d.fgScaleXFactor);"undefined"!==typeof d.fgDisplaceXFactor&&(Na.Mb=d.fgDisplaceXFactor)}X.aa||
(X.aa=ba.Jd);if(!X.Na)for(X.Na=[],d=0;d<X.aa;++d)X.Na.push(ba.Ke);c(a)}function Rb(){if(Qa.A({Jb:Q.ia,width:Z.D,height:Z.M,debug:!1,Ld:function(){Ha("GLCONTEXT_LOST")},antialias:Q.antialias,premultipliedAlpha:!0}))return!0;Ha("GL_INCOMPATIBLE");return!1}function gb(a){return a.detected>ea.multiDetectionThresholdFactors[1]*ea.threshold}function Nb(a){return!gb(a)}function wb(a,c,d,e){return d>a?Math.max(0,a+c/2-(d-e/2)):Math.max(0,d+e/2-(a-c/2))}function Sb(){return Sa.some(function(a,c){if(c===O.pa)return!1;
c=Sa[O.pa];if(c.Aa>a.Aa||3>a.Aa||wb(c.x,c.ca,a.x,a.ca)<ba.Hd*c.ca)return!1;var d=Z.D/Z.M;return wb(c.y,c.ca*d,a.y,a.ca*d)>ba.Hd*c.ca*d})}function Tb(){var a=O.pa;X.Da.Bf(1);1!==O.o&&(b.viewport(0,0,3,O.o),A.set("s0"),A.Xd("u1",1),U.l(!1,!1),A.Xd("u1",0));b.viewport(0,a,1,1);A.set("s56");Q.ua&&A.G("u42",qa[a].rz);1!==O.o&&A.G("u41",O.mc);if(1<O.o){var c=Sb()?0:1;A.G("u49",c)}A.Gf("u45",tb.get());U.l(!1,!1);O.Ad&&(b.viewport(1,a,1,1),A.set("s57"),A.G("u49",1),U.l(!1,!1),b.viewport(2,a,1,1),A.set("s58"),
U.l(!1,!1))}function xb(){B.N&&B.N.remove();B.jb=B.element.isFakeVideo?!0:!1;if(B.jb){var a=yb();a={isFlipY:!1,array:B.element.arrayBuffer,width:a.w,height:a.wa,isKeepArray:!0}}else a={I:B.element};B.zc=Y.instance(Object.assign({isPot:!1,isLinear:!0,isFloat:!1},a));B.N=B.zc}function Ia(){var a=[{type:"mat2",name:"u38",value:B.v}];A.T("s54",[{type:"1i",name:"u1",value:0}].concat(a));A.T("s55",a)}function Ja(){B.L[0]=.5;B.L[1]=.5;var a=B.H[1]/B.H[0];Pa=Qa.U()/Qa.F();90===Math.abs(oa.rotate)&&(a=1/a);
a>Pa?B.L[1]*=Pa/a:B.L[0]*=a/Pa;A.T("s56",[{name:"u50",type:"1f",value:Pa}]);B.v[0]=0;B.v[1]=0;B.v[2]=0;B.v[3]=0;switch(oa.rotate){case 0:B.v[0]=B.L[0];B.v[3]=B.L[1];break;case 180:B.v[0]=-B.L[0];B.v[3]=-B.L[1];break;case 90:B.v[1]=B.L[0];B.v[2]=-B.L[1];break;case -90:B.v[1]=-B.L[0],B.v[2]=B.L[1]}oa.flipX&&(B.v[0]*=-1,B.v[2]*=-1);B.kb||(B.v[1]*=-1,B.v[3]*=-1)}function yb(){var a={w:B.element.videoWidth||B.element.width,wa:B.element.videoHeight||B.element.height};if(!a.w||!a.wa||4>a.w||4>a.wa)throw Error("INVALID VIDEO DIMENSIONS - width = "+
a.w+" height = "+a.wa);return a}function lb(){var a=yb(),c=B.H[0]!==a.w||B.H[1]!==a.wa;c&&(B.H[0]=a.w,B.H[1]=a.wa);return c}function $a(a,c){if(na===ia.error)return!1;B.element=a;lb();c&&c();return!0}function zb(a,c,d){a&&a();B.La={video:{facingMode:{exact:oa.facingMode},width:{min:oa.minWidth,max:oa.maxWidth,ideal:oa.idealWidth},height:{min:oa.minHeight,max:oa.maxHeight,ideal:oa.idealHeight}},audio:!1};W.Oc(B.La,oa.deviceId);W.get(B.element?B.element:W.Ze(),function(e){c&&c(e);d(e)},function(){Ha("WEBCAM_UNAVAILABLE")},
B.La)}function Ha(a){na!==ia.error&&(na=ia.error,Q.Ka&&Q.Ka(a))}var wa={Qg:function(a){return Math.ceil(Math.log2(a))},jh:function(a){return Math.log2(a)},fh:function(a){return 0===Math.log2(a)%1},dg:function(a){var c=[0,0,0,0];a.forEach(function(d){c[0]+=d[0];c[1]+=d[1];c[2]+=d[2];c[3]+=d[3]});return c},eg:function(a,c,d){return Math.min(Math.max(a,c),d)},hg:function(a){return a*Math.PI/180},oh:function(a,c){c=Math.pow(10,c);return Math.round(a*c)/c},ph:function(a){return Math.round(1E6*a)/1E6},
Rg:function(a,c){return(100*a/c).toFixed(3)},$:function(a,c,d){return a*(1-d)+c*d},Ge:function(a,c){return wa.ye(a-c)},ye:function(a){for(;a>Math.PI;)a-=2*Math.PI;for(;a<=-Math.PI;)a+=2*Math.PI;return a},kg:function(a,c){return Math.abs(wa.Ge(a,c))},Uf:function(a,c){return Math.atan2(Math.sin(a)+Math.sin(c),Math.cos(a)+Math.cos(c))}},vb={get:function(a,c,d){var e=new XMLHttpRequest;e.open("GET",a,!0);e.withCredentials=!1;e.onreadystatechange=function(){4===e.readyState&&(200===e.status||0===e.status?
c(e.responseText):"undefined"!==typeof d&&d(e.status))};e.send()},Ng:function(a,c){vb.get(a,function(d){c(JSON.parse(d))})},lh:function(a,c,d){var e=new XMLHttpRequest;e.open("POST",a,!0);e.setRequestHeader("Content-type","application/x-www-form-urlencoded");e.onreadystatechange=function(){4!==e.readyState||200!==e.status&&0!==e.status||d(e.responseText)};e.send(c)},Bg:function(a,c){var d=new XMLHttpRequest;d.open("POST",a,!0);d.responseType="arraybuffer";d.onload=function(){c(d.response)};d.send()}},
Ub={create:function(a,c){for(var d=Array(c),e=0;e<c;++e)d[e]=a;return d},ig:function(a,c){for(var d=0;d<a.length;++d)c[d]=a[d]},clone:function(a){for(var c=Array(a.length),d=0;d<a.length;++d)c[d]=a[d];return c},sh:function(a,c,d){a.forEach(function(e,m){c[m]=e*d})},Ch:function(a){for(var c=a.length-1;0<c;--c){var d=Math.floor(Math.random()*(c+1)),e=a[c];a[c]=a[d];a[d]=e}},Mf:function(a){return Array.isArray(a)||a.constructor===Float32Array||a.constructor===Uint8Array}},mb={Kb:function(a,c){if(0===
c||"object"!==typeof a)return a;a=Object.assign({},a);c=void 0===c||-1===c?-1:c-1;for(var d in a)a[d]=mb.Kb(a[d],c);return a}},Za={Dh:function(a,c,d){a=Math.min(Math.max((d-a)/(c-a),0),1);return a*a*(3-2*a)},qb:function(a,c,d){return Math.min(Math.max((d-a)/(c-a),0),1)},vg:function(a,c,d,e){return Math.pow(Math.min(Math.max((e-a)/(c-a),0),1),d)},Hh:function(){return 0},kh:function(){return 1},ih:function(a){return a},sg:function(a){return a*a},xg:function(a){return a*(2-a)},pg:function(a){return.5>
a?2*a*a:-1+(4-2*a)*a},ng:function(a){return a*a*a},wg:function(a){return--a*a*a+1},og:function(a){return.5>a?4*a*a*a:(a-1)*(2*a-2)*(2*a-2)+1},tg:function(a){return a*a*a*a},yg:function(a){return 1- --a*a*a*a},qg:function(a){return.5>a?8*a*a*a*a:1-8*--a*a*a*a},ug:function(a){return a*a*a*a*a},zg:function(a){return 1+--a*a*a*a*a},rg:function(a){return.5>a?16*a*a*a*a*a:1+16*--a*a*a*a*a}},Vb={Me:function(a,c,d){switch(a){case "relu":return d+"=max(vec4(0.,0.,0.,0.),"+c+");";case "elu":return d+"=mix(exp(-abs("+
c+"))-vec4(1.,1.,1.,1.),"+c+",step(0.,"+c+"));";case "elu01":return d+"=mix(0.1*exp(-abs("+c+"))-vec4(0.1,0.1,0.1,0.1),"+c+",step(0.,"+c+"));";case "arctan":return d+"=atan(3.14159265359*texture2D(u0,vUV))/3.14159265359;";case "copy":return"";default:return!1}}},A=function(){function a(u,f,y){f=u.createShader(f);u.shaderSource(f,y);u.compileShader(f);return u.getShaderParameter(f,u.COMPILE_STATUS)?f:!1}function c(u,f,y){f=a(u,u.VERTEX_SHADER,f);y=a(u,u.FRAGMENT_SHADER,y);u===b&&q.push(f,y);var G=
u.createProgram();u.attachShader(G,f);u.attachShader(G,y);u.linkProgram(G);return G}function d(u,f){f.C=f.C?!0:!1;if(!f.C){void 0===f.ta&&(f.ta="precision lowp float;attribute vec2 a0;varying vec2 vv0;void main(){gl_Position=vec4(a0,0.,1.),vv0=a0*.5+vec2(.5,.5);}");void 0===f.Ta&&(f.Ta=["a0"]);void 0===f.Ha&&(f.Ha=[2]);if(void 0===f.precision||"highp"===f.precision)f.precision=E;f.id=v++;void 0!==f.Vd&&(f.Vd.forEach(function(G,L){f.h=f.h.replace(G,f.yb[L])}),f.Vd.splice(0));f.Hc=0;f.Ha.forEach(function(G){f.Hc+=
4*G});f.ra=c(u,f.ta,"precision "+f.precision+" float;\n"+f.h);f.B={};f.i.forEach(function(G){f.B[G]=u.getUniformLocation(f.ra,G)});f.attributes={};f.Ia=[];f.Ta.forEach(function(G){var L=u.getAttribLocation(f.ra,G);f.attributes[G]=L;f.Ia.push(L)});if(f.j){u.useProgram(f.ra);l=f;r=f.id;for(var y in f.j)u.uniform1i(f.B[y],f.j[y])}f.qa=!0}}function e(u){xa.Ff(M);r!==u.id&&(M.R(),r=u.id,l=u,b.useProgram(u.ra),u.Ia.forEach(function(f){0!==f&&b.enableVertexAttribArray(f)}))}function m(u,f,y){d(u,f,y);u.useProgram(f.ra);
u.enableVertexAttribArray(0);r=-1;return l=f}function n(){return{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:["u1"],j:{u1:0}}}var q=[],r=-1,l=null,v=0,C=!1,E="highp",g=["u1"],t=["u0"],x={u1:0},k={u0:0},p={u1:0,u2:1},H={u3:0},I={s0:n(),s1:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:g,j:x,precision:"lowp"},s2:{h:"uniform sampler2D u1,u2;varying vec2 vv0;void main(){vec4 a=texture2D(u2,vv0),b=texture2D(u1,vv0);gl_FragColor=a*b;}",
i:["u1","u2"],j:p},s3:{h:"uniform sampler2D u1;uniform vec2 u4,u5;varying vec2 vv0;void main(){vec2 a=vv0*u4+u5;gl_FragColor=texture2D(u1,a);}",i:["u1","u4","u5"],j:x,C:!0},s4:{h:"uniform sampler2D u1;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=a.r*f;}",i:g,j:x},s5:{h:"uniform sampler2D u1,u2;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u2,vv0),b=texture2D(u1,vv0);gl_FragColor=a.a*b.r*f;}",i:["u1","u2"],j:p},s6:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vec2(1.-vv0.x,vv0.y));}",
i:g,j:x},s7:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vec2(vv0.x,1.-vv0.y));}",i:g,j:x},s8:{h:"uniform sampler2D u0;uniform float u4;varying vec2 vv0;void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=a*u4;}",i:["u0","u4"],j:k},s9:{h:"uniform sampler2D u0;uniform float u4;varying vec2 vv0;const vec4 f=vec4(.25,.25,.25,.25),g=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0);float b=dot(a*u4,f);gl_FragColor=b*g;}",i:["u0","u4"],j:k},s10:{h:"uniform sampler2D u1;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.);void main(){float a=.25*dot(e,texture2D(u1,vv0));gl_FragColor=a*e;}",
i:g,j:x},s11:{h:"uniform sampler2D u1,u6;uniform float u7;const vec4 f=vec4(1.,1.,1.,1.);varying vec2 vv0;void main(){vec4 a=texture2D(u1,vv0),b=texture2D(u6,vv0);gl_FragColor=mix(b,a,u7*f);}",i:["u1","u6","u7"],j:{u1:0,u6:1}},s12:{h:"uniform sampler2D u1;uniform vec2 u8;varying vec2 vv0;void main(){gl_FragColor=.25*(texture2D(u1,vv0+u8)+texture2D(u1,vv0+u8*vec2(1.,-1.))+texture2D(u1,vv0+u8*vec2(-1.,-1.))+texture2D(u1,vv0+u8*vec2(-1.,1.)));}",i:["u1","u8"],j:x},s13:{h:"uniform sampler2D u1;uniform vec4 u9;varying vec2 vv0;float g(float a,float b){a=floor(a)+.5;return floor(a/exp2(b));}float h(float a,float b){return floor(a*exp2(b)+.5);}float i(float a,float b){return mod(a,h(1.,b));}float e(float c,float a,float b){a=floor(a+.5),b=floor(b+.5);return i(g(c,a),b-a);}vec4 j(float a){if(a==0.)return vec4(0.,0.,0.,0.);float k=128.*step(a,0.);a=abs(a);float c=floor(log2(a)),l=c+127.,b=(a/exp2(c)-1.)*8388608.,d=l/2.,m=fract(d)*2.,n=floor(d),o=e(b,0.,8.),p=e(b,8.,16.),q=m*128.+e(b,16.,23.),r=k+n;return vec4(o,p,q,r)/255.;}void main(){float a=dot(texture2D(u1,vv0),u9);gl_FragColor=j(a);}",
i:["u1","u9"],j:x},s14:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=e/(e+exp(-a));gl_FragColor=b;}",i:t,j:k,C:!0},s15:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(0.,0.,0.,0.);void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=max(f,a);}",i:t,j:k},s16:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=mix(exp(-abs(a))-f,a,step(0.,a));}",i:t,j:k},
s17:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=exp(-abs(a))-f;gl_FragColor=mix(.1*b,a,step(0.,a));}",i:t,j:k},s18:{h:"uniform sampler2D u0,u7,u10;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),c=texture2D(u7,vv0),d=texture2D(u10,vv0),b=a/d;gl_FragColor=c*mix(exp(-abs(b))-f,b,step(0.,a));}",i:["u0","u7","u10"],j:{u0:0,u7:1,u10:2},C:!0},s19:{h:"uniform sampler2D u0;const float e=3.141593;varying vec2 vv0;void main(){gl_FragColor=atan(e*texture2D(u0,vv0))/e;}",
i:t,j:k},s20:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=log(f+a);gl_FragColor=b;}",i:t,j:k,C:!0},s21:{h:"uniform sampler2D u0,u11;uniform float u12;const vec2 e=vec2(.5,.5);const float f=1e-5;const vec4 g=vec4(1.,1.,1.,1.),i=vec4(0.,0.,0.,0.);varying vec2 vv0;void main(){vec4 a=texture2D(u11,e);float b=u12*u12;vec4 c=max(b*a,f*g);gl_FragColor=texture2D(u0,vv0)/c;}",i:["u0","u11","u12"],j:{u0:0,u11:1},C:!0},s22:{h:"uniform sampler2D u1;uniform vec2 u13;varying vec2 vv0;void main(){float a=u13.x*u13.y;vec2 b=floor(vv0*a)/a,c=fract(vv0*a),d=floor(b*u13.y),f=floor(u13.x*fract(b*u13.y)),g=(f*u13.y+d)/a;gl_FragColor=texture2D(u1,g+c/a);}",
i:["u1","u13"],j:x},s23:{h:"uniform sampler2D u14,u15,u16;varying vec2 vv0;void main(){vec4 a=texture2D(u16,vv0);vec2 b=a.rg,c=a.ba;vec4 d=texture2D(u14,b),f=texture2D(u15,c);gl_FragColor=d*f;}",i:["u14","u15","u16"],j:{u15:0,u14:1,u16:2},C:!0},s24:{h:"uniform float u17;uniform sampler2D u14,u15;varying vec2 vv0;void main(){vec2 a=fract(vv0*u17);vec4 b=texture2D(u14,vv0),c=texture2D(u15,a);gl_FragColor=b*c;}",i:["u15","u14","u17"],j:{u15:0,u14:1}},s25:{h:"uniform float u17;uniform sampler2D u14,u15,u18,u19,u20,u21;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.),g=vec4(1e-3,1e-3,1e-3,1e-3);void main(){vec2 h=vv0*u17,l=floor(h),c=h-l;vec4 m=texture2D(u14,vv0),d=texture2D(u15,c),a=texture2D(u21,vv0);a=a*255.;vec4 n=texture2D(u18,c),o=texture2D(u19,c),p=texture2D(u20,c),i=step(-g,-a),b=e-i,j=b*step(-e-g,-a);b*=e-j;vec4 k=b*step(-2.*e-g,-a);b*=e-k;vec4 q=b;d=i*d+j*n+k*o+q*p,gl_FragColor=m*d;}",
i:"u14 u15 u17 u21 u18 u19 u20".split(" "),j:{u15:0,u14:1,u21:3,u18:4,u19:5,u20:6},C:!0},s26:{h:"uniform sampler2D u14,u15,u22;uniform float u17,u23,u24,u25;varying vec2 vv0;const vec2 j=vec2(1.,1.);void main(){vec2 a=floor(u23*vv0),b=u23*vv0-a;float c=u17/u23;vec2 d=floor(b*c),f=b*c-d,g=(a+f)/u23;float k=u23*u25/u17;vec2 l=k*d,h=(l+f*u24)/u25,i=step(h,j);vec4 m=texture2D(u14,g),n=texture2D(u15,h),o=m*n*i.x*i.y,p=texture2D(u22,g);gl_FragColor=o*u24*u24+p;}",i:"u14 u15 u17 u23 u24 u25 u22".split(" "),
j:{u15:0,u14:1,u22:2}},s27:{h:"uniform sampler2D u14,u15;varying vec2 vv0;void main(){vec4 a=texture2D(u14,vv0),b=texture2D(u15,vv0);gl_FragColor=a*b;}",i:["u14","u15"],j:{u15:0,u14:1},C:!0},s28:{h:"uniform sampler2D u1,u22;uniform float u26;varying vec2 vv0;void main(){gl_FragColor=texture2D(u22,vv0)+u26*texture2D(u1,vv0);}",i:["u1","u22","u26"],j:{u1:0,u22:1}},s29:{h:"varying vec2 vv0;uniform sampler2D u1;const vec4 f=vec4(1.,1.,1.,1.),g=vec4(.299,.587,.114,0.);void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=dot(a,g)*f;}",
i:g,j:x,precision:"lowp"},s30:{h:"varying vec2 vv0;uniform sampler2D u1;uniform float u27;const vec3 f=vec3(.299,.587,.114);void main(){vec3 a=texture2D(u1,vv0).rgb,b=texture2D(u1,vv0+vec2(0.,u27)).rgb,c=texture2D(u1,vv0+vec2(u27,u27)).rgb,d=texture2D(u1,vv0+vec2(u27,0.)).rgb;gl_FragColor=vec4(dot(a,f),dot(b,f),dot(c,f),dot(d,f));}",i:["u1","u27"],j:x,precision:"lowp"},s31:{h:"varying vec2 vv0;uniform sampler2D u1;uniform float u27;const vec3 f=vec3(.299,.587,.114);void main(){vec3 a=texture2D(u1,vv0).rgb,b=texture2D(u1,vv0+vec2(0.,u27)).rgb,c=texture2D(u1,vv0+vec2(u27,u27)).rgb,d=texture2D(u1,vv0+vec2(u27,0.)).rgb;gl_FragColor=vec4(a.r,b.g,c.b,dot(d,f));}",
i:["u1","u27"],j:x,precision:"lowp"},s32:{h:"varying vec2 vv0;uniform sampler2D u1,u2;uniform float u28;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=vec4(0.);a-=texture2D(u1,vec2(vv0.x-u28,vv0.y-u28))*1.,a-=texture2D(u1,vec2(vv0.x-u28,vv0.y))*2.,a-=texture2D(u1,vec2(vv0.x-u28,vv0.y+u28))*1.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y-u28))*1.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y))*2.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y+u28))*1.;vec4 b=vec4(0.);b-=texture2D(u1,vec2(vv0.x-u28,vv0.y-u28))*1.,b-=texture2D(u1,vec2(vv0.x,vv0.y-u28))*2.,b-=texture2D(u1,vec2(vv0.x+u28,vv0.y-u28))*1.,b+=texture2D(u1,vec2(vv0.x-u28,vv0.y+u28))*1.,b+=texture2D(u1,vec2(vv0.x,vv0.y+u28))*2.,b+=texture2D(u1,vec2(vv0.x+u28,vv0.y+u28))*1.;vec3 c=sqrt(a.rgb*a.rgb+b.rgb*b.rgb);vec4 e=vec4(c,texture2D(u1,vv0).a),g=texture2D(u2,vv0);gl_FragColor=g.a*e.r*f;}",
i:["u1","u2","u28"],j:p,C:!0},s33:{h:"varying vec2 vv0;uniform sampler2D u1,u2;uniform float u28;const vec4 j=vec4(1.,1.,1.,1.);const vec2 k=vec2(1.,1.);void main(){float h=0.;vec2 l=k*u28,a,b;float c,d,i=0.;for(float e=-4.;e<=4.;e+=1.)for(float f=-4.;f<=4.;f+=1.)a=vec2(e,f),c=length(a)/2.,d=exp(-c*c),b=vv0+l*a,h+=d*texture2D(u1,b).r,i+=d;vec4 m=texture2D(u2,vv0);gl_FragColor=m.a*(texture2D(u1,b).r-h/i)*j;}",i:["u1","u2","u28"],j:p,C:!0},s34:{h:"uniform sampler2D u3;uniform vec2 u8;varying vec2 vv0;vec4 e(vec4 a,vec4 b){vec4 c=step(a,b);return mix(a,b,c);}const vec2 g=vec2(.5,.5),h=vec2(1.,0.),i=vec2(0.,1.);void main(){vec2 a=vv0-u8*g;vec4 b=texture2D(u3,a),c=texture2D(u3,a+u8*h),d=texture2D(u3,a+u8*i),j=texture2D(u3,a+u8),k=e(b,c),l=e(d,j);gl_FragColor=e(k,l);}",
i:["u3","u8"],j:H},s35:{h:"uniform sampler2D u3;uniform vec2 u8;varying vec2 vv0;const vec2 k=vec2(1.,0.),l=vec2(0.,1.),m=vec2(2.,0.),n=vec2(0.,2.);vec4 e(vec4 a,vec4 b){vec4 c=step(a,b);return mix(a,b,c);}vec4 f(vec2 a){vec4 b=texture2D(u3,a),c=texture2D(u3,a+u8*k),d=texture2D(u3,a+u8*l),g=texture2D(u3,a+u8),h=e(b,c),i=e(d,g);return e(h,i);}void main(){vec2 a=vv0+u8*vec2(-.55,-1.05);vec4 b=f(a),c=f(a+u8*m),d=f(a+u8*2.),g=f(a+u8*n),h=e(b,c),i=e(d,g);gl_FragColor=e(h,i);}",i:["u3","u8"],j:H,C:!0},
s36:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=a*a;}",i:["u1"],j:x,precision:"lowp",C:!0},s37:{h:"uniform sampler2D u1;uniform vec2 u8;varying vec2 vv0;const float e=15444.;void main(){vec4 a=1001./e*texture2D(u1,vv0-3.*u8)+2002./e*texture2D(u1,vv0-2.*u8)+3003./e*texture2D(u1,vv0-u8)+3432./e*texture2D(u1,vv0)+3003./e*texture2D(u1,vv0+u8)+2002./e*texture2D(u1,vv0+2.*u8)+1001./e*texture2D(u1,vv0+3.*u8);gl_FragColor=a;}",i:["u8","u1"],j:x,precision:"lowp",
C:!0},s38:{h:"uniform sampler2D u1,u11,u29;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);const float g=.1;void main(){vec4 a=texture2D(u11,vv0),b=texture2D(u29,vv0),c=texture2D(u1,vv0),d=max(f*g,b-a*a),h=sqrt(d);gl_FragColor=(c-a)/h;}",i:["u1","u11","u29"],j:{u1:0,u11:1,u29:2},C:!0}},N={s39:{h:"uniform float u17,u30;uniform sampler2D u14,u15,u22;varying vec2 vv0;const vec2 ZERO2=vec2(0.,0.),ONE2=vec2(1.,1.),HALF2=vec2(.5,.5),EPS2=vec2(1e-5,1e-5);void main(){vec4 sum=texture2D(u22,vv0);float toSparsity=1.1111;vec2 uvFrom,uvWeight,xyPatch=ZERO2,eps2=EPS2/u17,xyTo=floor(vv0*u17+eps2);float weightSize=toSparsity*u17;vec2 halfFromSparsity=ONE2*(toSparsity-1.)/2.;for(float patch_x=0.;patch_x<1.1111;patch_x+=1.){xyPatch.x=patch_x;for(float patch_y=0.;patch_y<1.1111;patch_y+=1.)xyPatch.y=patch_y,uvFrom=(xyTo+HALF2+u30*(xyPatch-halfFromSparsity))/u17,uvFrom+=step(uvFrom,-eps2),uvFrom-=step(ONE2-eps2,uvFrom),uvWeight=(xyTo*toSparsity+xyPatch+HALF2)/weightSize,sum+=texture2D(u14,uvWeight)*texture2D(u15,uvFrom);}gl_FragColor=sum,gl_FragColor*=2.2222;}",
i:["u17","u14","u15","u22","u30"],yb:["1.1111","gl_FragColor\\*=2.2222;"]},s40:{h:"uniform float u17,u30,u25;uniform sampler2D u14,u15,u22;varying vec2 vv0;const vec2 ZERO2=vec2(0.,0.),ONE2=vec2(1.,1.),HALF2=vec2(.5,.5),EPS2=vec2(1e-4,1e-4);void main(){vec4 sum=texture2D(u22,vv0);float fromSparsity=1.1111,shrinkFactor=3.3333;vec2 uvFrom,uvWeight,xyFrom,xyPatchTo,xyPatch=ZERO2,xyShrink=ZERO2,eps2=EPS2/u25,xyTo=floor(vv0*u17+eps2);float weightSize=fromSparsity*u25;vec2 halfFromSparsity=ONE2*(fromSparsity-1.)/2.;float toSparsity=weightSize/u17;vec2 xyFrom0=xyTo*shrinkFactor;for(float patch_x=0.;patch_x<1.1111;patch_x+=1.){xyPatch.x=patch_x;for(float patch_y=0.;patch_y<1.1111;patch_y+=1.){xyPatch.y=patch_y;for(float shrink_x=0.;shrink_x<3.3333;shrink_x+=1.){xyShrink.x=shrink_x;for(float shrink_y=0.;shrink_y<3.3333;shrink_y+=1.)xyShrink.y=shrink_y,xyFrom=xyFrom0+xyShrink+shrinkFactor*u30*(xyPatch-halfFromSparsity),uvFrom=(xyFrom+HALF2)/u25,uvFrom+=step(uvFrom,-eps2),uvFrom-=step(ONE2-eps2,uvFrom),xyPatchTo=xyPatch*shrinkFactor+xyShrink,uvWeight=(xyTo*toSparsity+xyPatchTo+HALF2)/weightSize,sum+=texture2D(u14,uvWeight)*texture2D(u15,uvFrom);}}}gl_FragColor=sum,gl_FragColor*=2.2222;}",
i:"u17 u25 u14 u15 u22 u30".split(" "),yb:["1.1111","gl_FragColor\\*=2.2222;","3.3333"]}},z=null,J=null,M={nb:function(){return C},A:function(){if(!C){z=mb.Kb(I,2);J=mb.Kb(N,2);E="highp";for(var u in z)d(b,z[u],u);A.set("s0");b.enableVertexAttribArray(0);C=!0}},Qc:function(u){u.forEach(function(f){M.Pc(f)})},Pc:function(u){z[u.id]=u;d(b,u,u.id)},sd:function(u,f,y){f||(f=u);z[f]=Object.create(J[u]);z[f].ef=!0;J[u].yb&&J[u].yb.forEach(function(G,L){z[f].h=z[f].h.replace(new RegExp(G,"g"),y[L])});d(b,
z[f],f)},set:function(u){var f=z[u];f.C&&(f.C=!1,d(b,f,u));e(f)},Ra:function(u){return m(u,n(),"s41")},wc:function(u){return m(u,{h:"void main(){gl_FragColor=vec4(.5,.5,.5,.5);}",i:[],precision:"highp"},"s42")},Je:function(u){return"undefined"===typeof z[u]?!1:z[u].qa},R:function(){-1!==r&&(r=-1,l.Ia.forEach(function(u){0!==u&&b.disableVertexAttribArray(u)}))},yc:function(){var u=0;l.Ia.forEach(function(f,y){y=l.Ha[y];b.vertexAttribPointer(f,y,b.FLOAT,!1,l.Hc,u);u+=4*y})},ad:function(){b.enableVertexAttribArray(0)},
Ba:function(){M.zb(b)},zb:function(u){u.vertexAttribPointer(l.Ia[0],2,u.FLOAT,!1,8,0)},Xd:function(u,f){b.uniform1i(l.B[u],f)},G:function(u,f){b.uniform1f(l.B[u],f)},sa:function(u,f,y){b.uniform2f(l.B[u],f,y)},wh:function(u,f){b.uniform2fv(l.B[u],f)},Gf:function(u,f){b.uniform3fv(l.B[u],f)},xh:function(u,f,y,G){b.uniform3f(l.B[u],f,y,G)},yh:function(u,f,y,G,L){b.uniform4f(l.B[u],f,y,G,L)},xc:function(u,f){b.uniform4fv(l.B[u],f)},zh:function(u,f){b.uniformMatrix2fv(l.B[u],!1,f)},Ah:function(u,f){b.uniformMatrix3fv(l.B[u],
!1,f)},Bh:function(u,f){b.uniformMatrix4fv(l.B[u],!1,f)},T:function(u,f){M.set(u);f.forEach(function(y){switch(y.type){case "4f":b.uniform4fv(l.B[y.name],y.value);break;case "3f":b.uniform3fv(l.B[y.name],y.value);break;case "2f":b.uniform2fv(l.B[y.name],y.value);break;case "1f":b.uniform1f(l.B[y.name],y.value);break;case "1i":b.uniform1i(l.B[y.name],y.value);break;case "mat2":b.uniformMatrix2fv(l.B[y.name],!1,y.value);break;case "mat3":b.uniformMatrix3fv(l.B[y.name],!1,y.value);break;case "mat4":b.uniformMatrix4fv(l.B[y.name],
!1,y.value)}})},Pg:function(){return"lowp"},m:function(){b.disableVertexAttribArray(0);M.R();for(var u in z){var f=z[u];f.qa&&(f.qa=!1,b.deleteProgram(f.ra));f.ef&&delete z[u]}q.forEach(function(y){b.deleteShader(y)});q.splice(0);v=0;C=!1;l=null;r=-1}};return M}(),b=null,Qa=function(){function a(g){console.log("ERROR in ContextFF: ",g);return!1}function c(g){function t(){Ca.m();aa.reset();k.getExtension("WEBGL_lose_context").loseContext()}if(navigator.userAgent&&-1!==navigator.userAgent.indexOf("forceWebGL1"))return!1;
var x=document.createElement("canvas");x.setAttribute("width",5);x.setAttribute("height",5);var k=null;try{k=x.getContext("webgl2",g)}catch(p){return!1}if(!k)return!1;d(k);aa.bd(k);g=aa.Lb(k);if(!g.ja&&!g.ka)return t(),!1;g=Ca.Tc(k,g);t();return g?!0:!1}function d(g){g.clearColor(0,0,0,0);g.disable(g.DEPTH_TEST);g.disable(g.BLEND);g.disable(g.DITHER);g.disable(g.STENCIL_TEST);g.disable(g.CULL_FACE);g.GENERATE_MIPMAP_HINT&&g.hint(g.GENERATE_MIPMAP_HINT,g.FASTEST);g.disable(g.SAMPLE_ALPHA_TO_COVERAGE);
g.disable(g.SAMPLE_COVERAGE);g.depthFunc(g.LEQUAL);g.clearDepth(1)}var e=null,m=null,n=null,q=null,r=!0,l=null,v=null,C=[],E={F:function(){return e.width},U:function(){return e.height},Gg:function(){return e},Eg:function(){return b},la:function(){return r},flush:function(){b.flush()},Pe:function(){l||(l=new Uint8Array(e.width*e.height*4));b.readPixels(0,0,e.width,e.height,b.RGBA,b.UNSIGNED_BYTE,l);return l},Ig:function(){return e.toDataURL("image/jpeg")},Jg:function(){va.P();m||(m=document.createElement("canvas"),
n=m.getContext("2d"));m.width=e.width;m.height=e.height;for(var g=E.Pe(),t=n.createImageData(m.width,m.height),x=m.width,k=m.height,p=t.data,H=0;H<k;++H)for(var I=k-H-1,N=0;N<x;++N){var z=4*(H*x+N),J=4*(I*x+N);p[z]=g[J];p[z+1]=g[J+1];p[z+2]=g[J+2];p[z+3]=g[J+3]}n.putImageData(t,0,0);return m.toDataURL("image/png")},Hg:function(g){!m&&g&&(m=document.createElement("canvas"),n=m.getContext("2d"));var t=g?m:document.createElement("canvas");t.width=e.width;t.height=e.height;(g?n:t.getContext("2d")).drawImage(e,
0,0);return t},A:function(g){g.Ce&&!g.Jb?e=document.getElementById(g.Ce):g.Jb&&(e=g.Jb);e||(e=document.createElement("canvas"));e.width=g&&void 0!==g.width?g.width:512;e.height=g&&void 0!==g.height?g.height:512;"undefined"===typeof g&&(g={});void 0===g.premultipliedAlpha&&(g.premultipliedAlpha=!1);void 0===g.wd&&(g.wd=!0);void 0===g.antialias&&(g.antialias=!1);if(b)r=b instanceof WebGL2RenderingContext;else{r=!0;var t={antialias:g.antialias,alpha:!0,preserveDrawingBuffer:!0,premultipliedAlpha:g.premultipliedAlpha,
stencil:!1,depth:g.wd};navigator&&navigator.userAgent&&-1!==navigator.userAgent.indexOf("noAntialiasing")&&(t.antialias=!1);var x=c(t);!x&&t.antialias&&(t.antialias=!1,x=c(t));x&&(b=e.getContext("webgl2",t));b?r=!0:((b=e.getContext("webgl",t))||(b=e.getContext("experimental-webgl",t)),r=!1)}if(!b)return a("WebGL1 and 2 are not enabled");(q=b.getExtension("WEBGL_lose_context"))&&g.Ld&&(v=g.Ld,e.addEventListener("webglcontextlost",v,!1));if(!aa.A())return a("Not enough GL capabilities");d(b);A.A();
U.A();if(!Ca.Tc(b,aa.Oe()))return a("Cannot filter float textures");C.forEach(function(k){k(b)});C.splice(0);return!0},$f:function(){return new Promise(function(g){b?g(b):C.push(g)})},m:function(){b&&(aa.m(),A.m(),Ca.m());q&&v&&(e.removeEventListener("webglcontextlost",v,!1),q=v=null);b=l=n=m=e=null;C.splice(0)}};return E}(),xa=function(){function a(){null===c&&("undefined"!==typeof A?c=A:"undefined"!==typeof JEShaders&&(c=JEShaders))}var c=null;a();return{reset:function(){c=null},Ff:function(d){c!==
d&&(c&&c.R(),c=d)},nb:function(){return c.nb()},Ba:function(){return c.Ba()},zb:function(d){return c.zb(d)},yc:function(){return c.yc()},R:function(){return c.R()},set:function(d){return c.set(d)},Ra:function(d){a();return c.Ra(d)},wc:function(d){a();return c.wc(d)}}}(),Ba=function(){function a(h){b.bindTexture(b.TEXTURE_2D,h)}function c(h){f[0]=h;h=y[0];var F=h>>16&32768,K=h>>12&2047,P=h>>23&255;return 103>P?F:142<P?F|31744|((255==P?0:1)&&h&8388607):113>P?(K|=2048,F|(K>>114-P)+(K>>113-P&1)):F=(F|
P-112<<10|K>>1)+(K&1)}function d(h){var F=new Uint16Array(h.length);h.forEach(function(K,P){F[P]=c(K)});return F}function e(){if(null!==G.$b)return G.$b;var h=n(d([.5,.5,.5,.5]));return null===h?!0:G.$b=h}function m(){if(null!==G.ac)return G.ac;var h=n(new Uint8Array([127,127,127,127]));return null===h?!0:G.ac=h}function n(h){if(!xa.nb()||!k)return null;var F=null,K=Math.sqrt(h.length/4);try{var P=b.getError();if("FUCKING_BIG_ERROR"===P)return!1;F=L.instance({isFloat:!1,S:!0,array:h,width:K});P=b.getError();
if(P!==b.NO_ERROR)return!1}catch(ra){return!1}la.P();b.viewport(0,0,K,K);b.clearColor(0,0,0,0);b.clear(b.COLOR_BUFFER_BIT);xa.set("s0");F.Rc(0);ma.l(!0,!0);h=4*K*K;P=new Uint8Array(h);b.readPixels(0,0,K,K,b.RGBA,b.UNSIGNED_BYTE,P);K=!0;for(var da=0;da<h;++da)K=K&&3>Math.abs(P[da]-127);F.remove();la.ha();return K}var q=0,r=null,l=0,v=null,C=null,E=null,g=null,t=null,x=null,k=!1,p=[],H={isFloat:!1,isPot:!0,isLinear:!1,isMipmap:!1,isAnisotropicFiltering:!1,isMirrorX:!1,isMirrorY:!1,isSrgb:!1,isKeepArray:!1,
isFlipY:null,width:0,height:0,url:null,array:null,data:null,I:null,Zb:null,df:!1,S:!1,oa:null,sb:4,ic:0},I=!1,N=null,z=null,J=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],M=!1,u=!1,f=new Float32Array(1),y=new Int32Array(f.buffer),G={$b:null,ac:null},L={A:function(){k||(t=[b.RGBA,null,b.RGBA,b.RGBA],x=[b.RGBA,null,b.RGBA,b.RGBA],r=[b.TEXTURE0,b.TEXTURE1,b.TEXTURE2,b.TEXTURE3,b.TEXTURE4,b.TEXTURE5,b.TEXTURE6,b.TEXTURE7],M="undefined"!==typeof JEContext,u="undefined"!==typeof aa,M&&JEContext.gh()&&r.push(b.TEXTURE8,
b.TEXTURE9),v=[-1,-1,-1,-1,-1,-1,-1,-1],g=[b.UNSIGNED_BYTE,b.FLOAT,b.FLOAT],k=!0)},af:function(){if(!C){for(var h=new Float32Array(16384),F=0;16384>F;++F)h[F]=2*Math.random()-1;C={random:L.instance({isFloat:!0,isPot:!0,array:h,width:64}),de:L.instance({isFloat:!1,isPot:!0,width:1,array:new Uint8Array([0,0,0,0])})}}L.Sf()},Xg:function(){return C.de},Sf:function(){g[1]=aa.Vb(b)},Df:function(){x=t=[b.RGBA,b.RGBA,b.RGBA,b.RGBA]},Sd:function(h){A.set("s1");la.P();var F=h.F(),K=h.U();b.viewport(0,0,F,K);
h.g(0);ma.l(!1,!1)},mh:function(h,F){L.Sd(h);b.readPixels(0,0,h.F(),h.U(),b.RGBA,b.UNSIGNED_BYTE,F)},nh:function(h,F){L.Sd(h);return aa.xb(0,0,h.F(),h.U(),F)},kd:function(h,F,K,P,da,ra,za){h.activeTexture(h.TEXTURE0);var w=h.createTexture();h.bindTexture(h.TEXTURE_2D,w);da=da instanceof Float32Array?da:new Float32Array(da);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,
h.NEAREST);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST);h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,ra);h.texImage2D(h.TEXTURE_2D,0,h.RGBA,K,P,0,h.RGBA,h.FLOAT,da);h.bindTexture(h.TEXTURE_2D,null);h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,!1);za&&(la.ha(),A.Ra(h));h.viewport(0,0,K,P);h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,F,0);h.bindTexture(h.TEXTURE_2D,w);za?ma.l(!0,!0):U.ab(h);h.deleteTexture(w);k&&(v[0]=-1,E=null,q=0)},Fb:function(h){h!==q&&(b.activeTexture(r[h]),
q=h)},instance:function(h){function F(){R=void 0!==w.I.videoWidth?w.I.videoWidth:w.I.width;T=void 0!==w.I.videoHeight?w.I.videoHeight:w.I.height}function K(D){var S=b.getError();if("FUCKING_BIG_ERROR"===S)return!1;b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D);S=b.getError();S!==b.NO_ERROR&&fa!==b.RGBA&&(fa=b.RGBA,b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D));return!0}function P(){if(!Ab){a(ta);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,Aa);w.isPot?(b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,w.isMirrorX?b.MIRRORED_REPEAT:
b.REPEAT),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,w.isMirrorY?b.MIRRORED_REPEAT:b.REPEAT)):(b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE));w.isAnisotropicFiltering&&"undefined"!==typeof JESETTINGS&&b.texParameterf(b.TEXTURE_2D,JEContext.Kg().TEXTURE_MAX_ANISOTROPY_EXT,JESETTINGS.Wf);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,w.isLinear?b.LINEAR:b.NEAREST);w.isLinear?b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,
w.isMipmap&&!Ka?b.NEAREST_MIPMAP_LINEAR:b.LINEAR):b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,w.isMipmap&&!Ka?b.NEAREST_MIPMAP_NEAREST:b.NEAREST);fa=t[w.sb-1];ja=x[w.sb-1];ha=g[nb];if(aa.la()){var D=aa.Re();fa===b.RGBA&&ha===b.FLOAT?w.isMipmap||w.isLinear?ja=Ca.Te(b):aa.Uc()?D&&(ja=D):ja=b.RGBA16F||b.RGBA:fa===b.RGB&&ha===b.FLOAT&&D&&(ja=D,fa=b.RGBA)}if(w.S&&!w.isFloat||w.isFloat&&w.isMipmap&&Ca.hf())ja=aa.Se(),ha=aa.Vb(b);w.ic&&(ab=w.ic);w.isSrgb&&4===w.sb&&(fa=JEContext.Vg());if(w.I)K(w.I);
else if(w.url)K(Ga);else if(ua){D=ua;try{"FUCKING_BIG_ERROR"!==b.getError()&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,D),b.getError()!==b.NO_ERROR&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null),b.getError()!==b.NO_ERROR&&b.texImage2D(b.TEXTURE_2D,0,b.RGBA,R,T,0,b.RGBA,b.UNSIGNED_BYTE,null)))}catch(hc){b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null)}w.isKeepArray||(ua=null)}else D=b.getError(),"FUCKING_BIG_ERROR"!==D&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null),D=b.getError(),D!==b.NO_ERROR&&
(fa=b.RGBA,w.S&&ha!==b.FLOAT&&(ha=b.FLOAT,b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null))));if(w.isMipmap)if(!Ka&&ca)ca.Ub(),bb=!0;else if(Ka){D=Math.log2(Math.min(R,T));Ra=Array(1+D);Ra[0]=ta;for(var S=1;S<=D;++S){var ka=Math.pow(2,S),V=R/ka;ka=T/ka;var La=b.createTexture();a(La);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texImage2D(b.TEXTURE_2D,0,ja,V,ka,0,fa,ha,null);a(null);Ra[S]=La}bb=!0}a(null);v[q]=-1;Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,
!1);Ta=!0;w.oa&&ca&&(w.oa(ca),w.oa=null)}}function da(){for(var D=R*T,S=2*D,ka=3*D,V=0;V<D;++V)ya[0][V]=Ua[V],ya[1][V]=Ua[V+D],ya[2][V]=Ua[V+S],ya[3][V]=Ua[V+ka]}function ra(){var D=R*T*4;Da=[new Uint8Array(D),new Uint8Array(D),new Uint8Array(D),new Uint8Array(D)];ya=[new Float32Array(Da[0].buffer),new Float32Array(Da[1].buffer),new Float32Array(Da[2].buffer),new Float32Array(Da[3].buffer)];cb=new Uint8Array(4*D);Ua=new Float32Array(cb.buffer);Va=!0}function za(){Ea.Gb=new Uint8Array(R*T*4);Ea.ld=
new Float32Array(Ea.buffer);Ea.Y=!0}var w=Object.assign({},H,h),Wa=l++;null===w.isFlipY&&(w.isFlipY=w.url||w.array?!0:!1);w.data&&(w.array="string"===typeof w.data?Ib(w.data):w.isFloat?new Float32Array(w.data):new Uint8Array(w.data),w.isFlipY=!1);var nb=0,Bb=w.I?!0:!1,Xa=null,ob=null,Cb=!1,pb=null;w.S=w.S||w.isFloat;w.S&&(nb=1);!w.df&&w.isFloat&&u&&!aa.Uc()&&(w.isFloat=!1);w.isFloat&&(nb=2);w.isAnisotropicFiltering&&M&&!JEContext.$g()&&(w.isAnisotropicFiltering=!1);var ta=w.Zb||b.createTexture(),
Ga=null,ua=!1,R=0,T=0,Ta=!1,Ab=!1,Va=!1,ya=null,Da=null,cb=null,Ua=null,ja=null,fa=null,ha=null,Aa=w.isFlipY,Wb=(h=w.S&&w.isMipmap)&&Ca.te(),Ka=h&&Wb?!0:!1,Ra=null,ab=-1,bb=!1,Ea={Y:!1,Gb:null,ld:null};w.width&&(R=w.width,T=w.height?w.height:R);var ca={get:function(){return ta},F:function(){return R},U:function(){return T},Yg:function(){return w.url},ah:function(){return w.isFloat},dh:function(){return w.S},eh:function(){return w.isLinear},Ub:function(){b.generateMipmap(b.TEXTURE_2D)},re:function(D,
S){Ka?(D||(D=ca.pd()),L.Fb(S),a(Ra[D]),v[S]=-1):ca.g(S)},pd:function(){-1===ab&&(ab=Math.log(R)/Math.log(2));return ab},Le:function(D){if(Ka){D||(D=ca.pd());A.set("s12");L.Fb(0);for(var S=R,ka=T,V=1;V<=D;++V)S/=2,ka/=2,A.sa("u8",.25/S,.25/ka),b.viewport(0,0,S,ka),a(Ra[V-1]),b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,Ra[V],0),ma.l(!1,1===V);v[0]=-1}else ca.Ub()},vh:function(D){(Bb=!Ub.Mf(D))?(ua=null,w.I=D,F()):ua=D},g:function(D){if(!Ta)return!1;L.Fb(D);if(v[D]===Wa)return!1;
a(ta);v[D]=Wa;return!0},Rc:function(D){b.activeTexture(r[D]);q=D;a(ta);v[D]=Wa},u:function(){E=ca;b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,ta,0)},da:function(){E=ca;b.viewport(0,0,R,T);b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,ta,0)},Fc:L.Fc,resize:function(D,S){R=D;T=S;P()},clone:function(D){D=L.instance({width:R,height:T,S:w.S,isFloat:w.isFloat,isLinear:w.isLinear,isMirrorY:w.isMirrorY,isFlipY:D?!Aa:Aa,isPot:w.isPot});xa.set("s0");la.ha();D.u();b.viewport(0,
0,R,T);ca.g(0);ma.l(!0,!0);return D},Hf:function(){b.viewport(0,0,R,T)},remove:function(){b.deleteTexture(ta);Ab=!0;p.splice(p.indexOf(ca),1);ca=null},refresh:function(){ca.Rc(0);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);Bb?b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,w.I):b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,ua);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},Rd:function(){Va||ra();b.readPixels(0,0,R,4*T,b.RGBA,b.UNSIGNED_BYTE,cb);da();return ya},xf:function(){Va||ra();return aa.xb(0,0,R,4*T,cb).then(function(){da();
return ya})},zf:function(){Ea.Y||za();b.readPixels(0,0,R,T,b.RGBA,b.UNSIGNED_BYTE,Ea.Gb);return Ea.ld},yf:function(){Ea.Y||za();return aa.xb(0,0,R,T,Ea.Gb)},Zc:function(D){la.P();A.set("s13");ca.g(0);if(D)b.viewport(0,0,R,T),A.xc("u9",.25,.25,.25,.25),ma.l(!1,!0);else for(D=0;4>D;++D)b.viewport(0,T*D,R,T),A.xc("u9",J[D]),ma.l(!1,0===D)},Rf:function(D){var S=ha===g[0]&&!m();a(ta);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);S?(Cb||(Xa=document.createElement("canvas"),Xa.width=R,Xa.height=T,ob=Xa.getContext("2d"),
pb=ob.createImageData(R,T),Cb=!0),pb.data.set(D),ob.putImageData(pb,0,0),b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,Xa)):b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,D);v[q]=Wa;Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},Gh:function(D,S){a(ta);S&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D);v[q]=Wa;S&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},th:function(D,S){var ka=R*T,V=4*ka;D=w.S?D?"RGBE":"JSON":"RGBA";S&&(D=S);S=aa.la()&&!1;var La=null;switch(D){case "RGBE":La="s43";
break;case "JSON":La=S?"s0":"s13";break;case "RGBA":case "RGBAARRAY":La="s7"}Va||("RGBA"===D||"RGBE"===D||"RGBAARRAY"===D?(Da=new Uint8Array(V),Va=!0):"JSON"!==D||S||ra());la.P();A.set(La);ca.g(0);V=null;if("RGBA"===D||"RGBE"===D||"RGBAARRAY"===D){b.viewport(0,0,R,T);ma.l(!0,!0);b.readPixels(0,0,R,T,b.RGBA,b.UNSIGNED_BYTE,Da);if("RGBAARRAY"===D)return{data:Da};I||(N=document.createElement("canvas"),z=N.getContext("2d"),I=!0);N.width=R;N.height=T;ka=z.createImageData(R,T);ka.data.set(Da);z.putImageData(ka,
0,0);V=N.toDataURL("image/png")}else if("JSON"===D)if(S)V=new Float32Array(ka),b.viewport(0,0,R,T),ma.l(!0,!0),b.readPixels(0,0,R,T,b.RGBA,b.FLOAT,V);else{for(V=0;4>V;++V)b.viewport(0,T*V,R,T),A.xc("u9",J[V]),ma.l(!V,!V);ca.Rd();V=Array(ka);for(S=0;S<ka;++S)V[4*S]=ya[0][S],V[4*S+1]=ya[1][S],V[4*S+2]=ya[2][S],V[4*S+3]=ya[3][S]}return{format:D,data:V,width:R,height:T,isMirrorY:w.isMirrorY,isFlipY:"RGBA"===D?w.isFlipY:!w.isFlipY}}};w.isMipmap&&!Ka&&Ta&&!bb&&(ca.Ub(),bb=!0);if(w.url)a(ta),b.texImage2D(b.TEXTURE_2D,
0,b.RGBA,1,1,0,b.RGBA,b.UNSIGNED_BYTE,null),Ga=new Image,Ga.jg="Anonymous",Ga.crossOrigin="Anonymous",Ga.src=w.url,Ga.onload=function(){R=Ga.width;T=Ga.height;P()};else if(w.I){var Db=function(){F();R?P():setTimeout(Db,1)};Db()}else w.array?(w.S&&!w.isFloat?w.array instanceof Uint16Array?(ua=w.array,P()):e()?(ua=d(w.array),P()):(P(),L.kd(b,ta,ca.F(),ca.U(),w.array,Aa,!0)):(ua=w.isFloat?w.array instanceof Float32Array?w.array:new Float32Array(w.array):w.array instanceof Uint8Array?w.array:new Uint8Array(w.array),
P()),w.isKeepArray||(ua&&ua!==w.array&&(ua=null),delete w.array)):w.Zb?Ta=!0:P();ca.Ug=ca.F;w.oa&&Ta&&(w.oa(ca),w.oa=null);p.push(ca);return ca},P:function(h){h!==q&&(b.activeTexture(r[h]),q=h);v[h]=-1;a(null)},Zf:function(h){C.random.g(h)},Fc:function(){E=null;b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,null,0)},reset:function(){0!==q&&b.activeTexture(r[0]);for(var h=0;h<r.length;++h)v[h]=-1;q=-1},qh:function(){q=-1},Of:function(){for(var h=0;h<r.length;++h)L.P(h)},md:function(){C&&
(C.random.remove(),C.de.remove())},Fh:function(h,F){if("RGBA"===h.format||"RGBE"===h.format){var K=new Image;K.src=h.data;K.onload=function(){L.instance({isMirrorY:h.isMirrorY,isFlipY:h.isFlipY,isFloat:!1,I:K,oa:function(P){if("RGBA"===h.format)F(P);else{var da=h.width,ra=h.height,za=L.instance({isMirrorY:h.isMirrorY,isFloat:!0,width:da,height:ra,isFlipY:h.isFlipY});la.ha();b.viewport(0,0,da,ra);A.set("s44");za.u();P.g(0);ma.l(!0,!0);L.P(0);F(za);b.flush();setTimeout(P.remove,50)}}})}}else"JSON"===
h.format?F(L.instance({isFloat:!0,isFlipY:h.isFlipY,width:h.width,height:h.height,array:new Float32Array(h.data)})):F(!1)},ze:d,m:function(){E&&(va.ha(),L.Fc(),va.P());L.Of();p.slice(0).forEach(function(h){h.remove()});p.splice(0);k=!1;l=0;"undefined"!==typeof Ca&&Ca.m();C=null}};return L}(),Ob=function(){return{instance:function(a){var c=[Ba.instance(a),Ba.instance(a)],d=[c[1],c[0]],e=d,m={Bf:function(n){e[1].u();e[0].g(n);m.Zd()},uh:function(n){e[1].da();e[0].g(n);m.Zd()},Zd:function(){e=e===c?
d:c},refresh:function(){e[0].refresh();e[1].refresh()},g:function(n){e[0].g(n)},Yf:function(n){e[1].g(n)},Og:function(){return e[0]},Sg:function(){return e[1]},remove:function(){e[0].remove();e[1].remove();e=null}};return m}}}(),ma=function(){function a(l){var v={ea:null,K:null};v.ea=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,v.ea);l.bufferData(l.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),l.STATIC_DRAW);v.K=l.createBuffer();l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,v.K);l.bufferData(l.ELEMENT_ARRAY_BUFFER,
new Uint16Array([0,1,2]),l.STATIC_DRAW);return v}var c=null,d=0,e=!1,m=[],n=-2,q=-2,r={reset:function(){q=n=-2},A:function(){e||(c=a(b),r.Ja(),e=!0)},instance:function(l){var v=d++,C=l.K?l.K.length:0,E="undefined"===typeof l.mode?b.STATIC_DRAW:l.mode,g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,l.ea instanceof Float32Array?l.ea:new Float32Array(l.ea),E);n=v;var t=null,x=null,k=null;if(l.K){t=b.createBuffer();b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,t);var p=null;65536>
l.K.length?(p=Uint16Array,x=b.UNSIGNED_SHORT,k=2):(p=Uint32Array,x=b.UNSIGNED_INT,k=4);p=l.K instanceof p?l.K:new p(l.K);b.bufferData(b.ELEMENT_ARRAY_BUFFER,p,E);q=v}var H={se:function(I){n!==v&&(b.bindBuffer(b.ARRAY_BUFFER,g),n=v);I&&xa.yc()},pe:function(){q!==v&&(b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,t),q=v)},bind:function(I){H.se(I);H.pe()},lg:function(){b.drawElements(b.TRIANGLES,C,x,0)},mg:function(I,N){b.drawElements(b.TRIANGLES,I,x,N*k)},remove:function(){b.deleteBuffer(g);l.K&&b.deleteBuffer(t);
H=null}};m.push(H);return H},Ja:function(){-1!==n&&(b.bindBuffer(b.ARRAY_BUFFER,c.ea),n=-1);-1!==q&&(b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,c.K),q=-1)},l:function(l,v){l&&ma.Ja();v&&xa.Ba();b.drawElements(b.TRIANGLES,3,b.UNSIGNED_SHORT,0)},ab:function(l){l=l||b;var v=a(l);l.bindBuffer(l.ARRAY_BUFFER,v.ea);l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,v.K);xa.zb(l);l.clear(l.COLOR_BUFFER_BIT);l.drawElements(l.TRIANGLES,3,l.UNSIGNED_SHORT,0);l.flush();l.bindBuffer(l.ARRAY_BUFFER,null);l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,
null);l.deleteBuffer(v.ea);l.deleteBuffer(v.K);r.reset();e&&(r.Ja(),xa.Ba())},md:function(){var l=b,v=c;l.deleteBuffer(v.ea);l.deleteBuffer(v.K)},m:function(){r.md();m.forEach(function(l){l.remove()});b.bindBuffer(b.ARRAY_BUFFER,null);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,null);r.reset();e=!1;m.splice(0);d=0}};return r}(),la=function(){var a=null,c=null,d=null,e=!1,m=[],n={J:-2,jd:1},q={nb:function(){return e},A:function(){if(!e){a=b.createFramebuffer();var r=aa.la();c=r&&b.DRAW_FRAMEBUFFER?b.DRAW_FRAMEBUFFER:
b.FRAMEBUFFER;d=r&&b.READ_FRAMEBUFFER?b.READ_FRAMEBUFFER:b.FRAMEBUFFER;e=!0}},Lg:function(){return c},Ue:function(){return d},eb:function(){return b.FRAMEBUFFER},Tg:function(){return n},Dg:function(){return a},instance:function(r){void 0===r.vd&&(r.vd=!1);var l=r.N?r.N:null,v=r.width,C=void 0!==r.height?r.height:r.width,E=a,g=null,t=!1,x=!1,k=0;l&&(v=v?v:l.F(),C=C?C:l.U());var p={Wd:function(){t||(E=b.createFramebuffer(),t=!0,k=n.jd++)},je:function(){p.Wd();p.u();g=b.createRenderbuffer();b.bindRenderbuffer(b.RENDERBUFFER,
g);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,v,C);b.framebufferRenderbuffer(c,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,g);b.clearDepth(1)},bind:function(H,I){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k);l&&l.u();I&&b.viewport(0,0,v,C);H&&b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)},Xf:function(){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k)},clear:function(){b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)},fg:function(){b.clear(b.COLOR_BUFFER_BIT)},gg:function(){b.clear(b.DEPTH_BUFFER_BIT)},Hf:function(){b.viewport(0,
0,v,C)},u:function(){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k)},rtt:function(H){l=H;n.J!==k&&(b.bindFramebuffer(b.FRAMEBUFFER,E),n.J=k);H.u()},P:function(){b.bindFramebuffer(c,null);n.J=-1},resize:function(H,I){v=H;C=I;g&&(b.bindRenderbuffer(b.RENDERBUFFER,g),b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,v,C))},remove:function(){E===a||x||(b.bindFramebuffer(c,E),b.framebufferTexture2D(c,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,null,0),g&&b.framebufferRenderbuffer(c,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,
null),b.bindFramebuffer(c,null),b.deleteFramebuffer(E),g&&b.deleteRenderbuffer(g));x=!0}};r.vd&&p.je();m.push(p);return p},P:function(){b.bindFramebuffer(c,null);n.J=-1},Pf:function(){b.bindFramebuffer(c,null);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);b.viewport(0,0,aa.F(),aa.U());n.J=-1},reset:function(){n.J=-2},ha:function(){0!==n.J&&(b.bindFramebuffer(c,a),n.J=0)},clear:function(){b.viewport(0,0,aa.F(),aa.U());b.clear(b.COLOR_BUFFER_BIT)},m:function(){q.P();m.forEach(function(r){r.remove()});
null!==a&&(b.deleteFramebuffer(a),a=null);q.reset();e=!1;m.splice(0);n.jd=1}};return q}(),aa=function(){function a(){e="undefined"===typeof Qa?JEContext:Qa;m=!0}function c(k,p){for(var H=0;H<k.length;++H){var I=p.getExtension(k[H]);if(I)return I}return null}function d(){null!==g.Cb&&(clearInterval(g.Cb),g.Cb=null);g.Oa=!1}var e=null,m=!1,n={xd:!1,Ac:null,Bc:null,Bd:!1,gf:!1,Cc:null,Cd:!1,Dc:null,yd:!1,Hb:null,bf:!1,Ib:null,cf:!1},q=null,r={ja:!0,ka:!0,Tb:!0,Qd:!1},l=null,v=!0,C=null,E=null,g={Oa:!1,
va:null,ib:null,Yb:-1,X:null,Cb:null},t="undefined"===typeof window?{}:window,x={A:function(){if(m)return!0;x.reset();m||a();var k=b;if(!q.xd){q.Ac=x.ed(k);t.GL_EXT_FLOAT=q.Ac;q.Bd=q.Ac?!0:!1;if(q.Bd||x.la())q.Bc=x.fd(k),q.gf=q.Bc?!0:!1,t.GL_EXT_FLOATLINEAR=q.Bc;q.xd=!0}if(!q.yd){q.Cc=x.Za(k);q.Cc&&(q.Cd=!0,t.GL_EXT_HALFFLOAT=q.Cc);if(q.Cd||x.la())q.Dc=x.gd(k),t.GL_EXT_HALFFLOATLINEAR=q.Dc;q.Zg=q.Dc?!0:!1;q.yd=!0}q.Hb=x.cd(k);q.bf=q.Hb?!0:!1;t.GL_EXT_COLORBUFFERFLOAT=q.Hb;q.Ib=x.dd(k);q.cf=q.Ib?!0:
!1;t.GL_EXT_COLORBUFFERHALFFLOAT=q.Ib;la.A();Ba.A();if(!x.De())return!1;ma.A();Ba.af();return!0},reset:function(){q=Object.assign({},n);l=Object.assign({},r)},F:function(){m||a();return e.F()},U:function(){m||a();return e.U()},la:function(){m||a();return e.la()},bd:function(k){x.cd(k);x.dd(k);x.ed(k);x.fd(k);x.Za(k);x.gd(k)},cd:c.bind(null,["EXT_color_buffer_float","WEBGL_color_buffer_float","OES_color_buffer_float"]),dd:c.bind(null,["EXT_color_buffer_half_float","WEBGL_color_buffer_half_float","OES_color_buffer_half_float"]),
ed:c.bind(null,["OES_texture_float","MOZ_OES_texture_float","WEBKIT_OES_texture_float"]),fd:c.bind(null,["OES_texture_float_linear","MOZ_OES_texture_float_linear","WEBKIT_OES_texture_float_linear"]),Za:c.bind(null,["OES_texture_half_float","MOZ_OES_texture_half_float","WEBKIT_OES_texture_half_float"]),gd:c.bind(null,["OES_texture_half_float_linear","MOZ_OES_texture_half_float_linear","WEBKIT_OES_texture_half_float_linear"]),Vb:function(k){var p=x.Za(k);return p&&p.HALF_FLOAT_OES?p.HALF_FLOAT_OES:
k.HALF_FLOAT||k.FLOAT},Re:function(){return E||b.RGBA32F||b.RGBA},Se:function(){return C||b.RGBA16F||b.RGBA},Oe:function(){return l},Uc:function(){return l.ja},bg:function(){return l.ka},ag:function(){return l.Tb},ue:function(){return l.Qd&&v},be:function(k){v=k;!k&&g.Oa&&(b.deleteSync(g.ib),b.bindBuffer(g.X,null),g.Oa=!1)},Ab:function(k,p,H){function I(){k.bindTexture(k.TEXTURE_2D,null);k.bindFramebuffer(N,null);k.deleteTexture(M);k.deleteFramebuffer(J)}var N=k.FRAMEBUFFER,z=k.NEAREST,J=k.createFramebuffer();
k.bindFramebuffer(N,J);var M=k.createTexture();k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,M);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,!1);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_MAG_FILTER,z);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_MIN_FILTER,z);k.texImage2D(k.TEXTURE_2D,0,p,3,3,0,k.RGBA,H,null);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,k.TEXTURE_2D,M,0);
if(k.checkFramebufferStatus(k.READ_FRAMEBUFFER||k.FRAMEBUFFER)!==k.FRAMEBUFFER_COMPLETE)return I(),!1;xa.wc(k);k.clearColor(0,0,0,0);k.viewport(0,0,3,3);k.disable(k.DEPTH_TEST);k.clear(k.COLOR_BUFFER_BIT);ma.ab(k);k.bindFramebuffer(N,null);xa.Ra(k);k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,M);ma.ab(k);p=new Uint8Array(36);k.readPixels(0,0,3,3,k.RGBA,k.UNSIGNED_BYTE,p);I();for(H=0;36>H;++H)if(3!==H%4&&3<Math.abs(p[H]-127))return!1;return!0},Lb:function(k){var p={ja:!1,ka:!1};k.disable(k.BLEND);
k.clearColor(0,0,0,0);k.clear(k.COLOR_BUFFER_BIT);k.RGBA32F&&x.Ab(k,k.RGBA32F,k.FLOAT)&&(p.ja=!0,E=k.RGBA32F);!p.ja&&x.Ab(k,k.RGBA,k.FLOAT)&&(p.ja=!0,E=k.RGBA);var H=x.Vb(k);C=null;k.RGBA16F&&x.Ab(k,k.RGBA16F,H)&&(p.ka=!0,C=k.RGBA16F);!p.ka&&x.Ab(k,k.RGBA,H)&&(p.ka=!0,C=k.RGBA);return p},Ee:function(){var k=la.instance({width:2});k.Wd();var p=Ba.instance({width:2,isFloat:!0,sb:3});k.u();p.u();b.flush();b.checkFramebufferStatus(la.Ue())!==b.FRAMEBUFFER_COMPLETE?(Ba.Df(),l.Tb=!1):l.Tb=!0;k.remove();
p.remove()},Fe:function(){var k=!1;x.la()&&(k="PIXEL_PACK_BUFFER STREAM_READ SYNC_GPU_COMMANDS_COMPLETE WAIT_FAILED fenceSync deleteSync createBuffer".split(" ").every(function(p){return"undefined"!==typeof b[p]}));l.Qd=k},De:function(){var k=x.Lb(b);Object.assign(l,k);if(!l.ja&&!l.ka)return!1;x.Ee();x.Fe();return!0},xb:function(k,p,H,I,N){if(!x.ue())return b.readPixels(k,p,H,I,b.RGBA,b.UNSIGNED_BYTE,N),Promise.resolve(N);null===g.va&&(g.X=b.PIXEL_PACK_BUFFER,g.va=b.createBuffer(),g.Yb=-1);b.bindBuffer(g.X,
g.va);N.byteLength!==g.Yb&&(b.bufferData(g.X,N.byteLength,b.STREAM_READ),g.Yb=N.byteLength);b.readPixels(k,p,H,I,b.RGBA,b.UNSIGNED_BYTE,0);g.ib=b.fenceSync(b.SYNC_GPU_COMMANDS_COMPLETE,0);b.flush();return new Promise(function(z,J){function M(){if(!g.Oa)return d(),J(),!1;switch(b.clientWaitSync(g.ib,0,0)){case b.TIMEOUT_EXPIRED:case b.WAIT_FAILED:return!1;default:return d(),b.deleteSync(g.ib),b.getBufferSubData(g.X,0,N),b.bindBuffer(g.X,null),z(N),!0}}d();g.Oa=!0;M()||(g.Cb=setInterval(M,0))})},m:function(){d();
Ba.m();la.m();ma.m();null!==g.va&&(b.deleteBuffer(g.va),g.va=null);xa.reset();m=!1}};return x}(),U=ma,va=la,Y=Ba,Ca=function(){function a(J,M,u,f){p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,f?p.NEAREST_MIPMAP_NEAREST:p.LINEAR);var y=null;if(null!==u)try{y=p.getError();if("FUCKING_BIG_ERROR"===y)return!1;p.texImage2D(p.TEXTURE_2D,0,J,4,4,0,p.RGBA,M,u);y=p.getError();if(y!==p.NO_ERROR)return!1}catch(G){return!1}f&&p.generateMipmap(p.TEXTURE_2D);p.clear(p.COLOR_BUFFER_BIT);U.ab(p);y=p.getError();
if("FUCKING_BIG_ERROR"===y)return!1;p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,C);y=p.getError();y===p.INVALID_OPERATION&&"undefined"!==typeof p.PIXEL_PACK_BUFFER&&(p.bindBuffer(p.PIXEL_PACK_BUFFER,null),p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,C),y=p.getError());if(y!==p.NO_ERROR)return!1;u=!0;for(f=0;16>f;++f)u=u&&4>Math.abs(C[f]-127);u&&(l.Nd=M,l.ud=J);return u}function c(J,M){return H.ja&&a(J,p.FLOAT,new Float32Array(E),M)?(r=q.Nc,!0):!1}function d(J,M,u){if(!H.ka)return!1;var f=Ba.ze(E),
y=aa.Za(p);if(y&&y.HALF_FLOAT_OES&&a(J,y.HALF_FLOAT_OES,f,M)||p.HALF_FLOAT&&a(J,p.HALF_FLOAT,f,M))return r=q.Ga,!0;f=new Float32Array(E);if(a(J,p.FLOAT,f,M))return r=q.Ga,!0;p.bindTexture(p.TEXTURE_2D,u);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,2,2,0,p.RGBA,p.UNSIGNED_BYTE,null);p.bindFramebuffer(l.Xa,z);Ba.kd(p,u,2,2,f,!1,!1);p.bindFramebuffer(l.Xa,null);p.bindTexture(p.TEXTURE_2D,u);return a(J,null,null,M)?(r=q.Ga,!0):!1}function e(J,M,u){v=!0;if(d(J,!0,u)||c(M,!0))return!0;v=!1;return d(J,!1,u)||c(M,
!1)?!0:!1}function m(J){if(r===q.R){p=J||b;r=q.RGBA8;v=!0;aa.bd(p);H||(H=aa.Lb(p));va.reset();z=p.createFramebuffer();l.Xa=p.DRAW_FRAMEBUFFER||p.FRAMEBUFFER;p.bindFramebuffer(l.Xa,null);p.clearColor(0,0,0,0);p.viewport(0,0,2,2);A.R();I=A.Ra(p);J=p.createTexture();p.activeTexture(p.TEXTURE0);p.bindTexture(p.TEXTURE_2D,J);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.REPEAT);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.REPEAT);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);N=J;var M=
J=p.RGBA,u=p.RGBA16F,f=p.RGBA32F;f&&(J=f);u&&(M=u);if((u||f)&&e(M,J,N))return n(),!0;J=M=p.RGBA;if(e(M,J,N))return n(),!0;r=q.RGBA8;n();return!1}}function n(){p.deleteProgram(I.ra);p.deleteTexture(N);N=I=null}for(var q={R:-1,Nc:3,Ga:2,RGBA8:0},r=q.R,l={Nd:null,ud:null,Xa:null},v=!0,C=new Uint8Array(16),E=Array(64),g=0;4>g;++g)for(var t=0;4>t;++t){var x=0===(t+g)%2?1:0,k=4*g+t;E[4*k]=x;E[4*k+1]=x;E[4*k+2]=x;E[4*k+3]=x}var p=null,H=null,I=null,N=null,z=null;return{te:function(J){m(J);return v},Tc:function(J,
M){r===q.R&&(typeof("undefined"!==M)&&(H=M),m(J));return r!==q.RGBA8},bh:function(J){m(J);return r===q.Nc},hf:function(J){m(J);return r===q.Ga},Mg:function(J){m(J);return l.Nd},Te:function(J){m(J);return l.ud},m:function(){p=null;v=!0;r=q.R;H=null}}}(),Xb=function(){return{instance:function(a){var c=Y.instance(a.alpha),d=Y.instance(a.beta);return{He:function(){c.g(1);d.g(2)}}}}}(),Gb=function(){return{instance:function(a){var c=null,d=!1,e=!1,m=null,n=!1,q=!1,r=null,l="undefined"===typeof a.preprocessing?
!1:a.preprocessing,v="undefined"===typeof a.preprocessingSize?a.size:a.preprocessingSize;a.mask&&(d=!0,ba&&void 0!==ba.oe&&(a.mask=ba.oe+a.mask),c=Y.instance({isFloat:!1,url:a.mask}));var C=!1;a.customInputShader&&(C="s45",A.Pc({name:"_",id:C,h:a.customInputShader,Eh:["uSource"],precision:"lowp"}),A.T(C,[{type:"1i",name:"_",value:0}]));switch(l){case "sobel":r="s32";n=!0;break;case "meanNormalization":r="s33";n=!0;break;case "grayScale":r="s29";n=!1;break;case "grayScaleTilt":r="s30";q=!0;n=!1;break;
case "rgbGrayTilt":r="s31";q=!0;n=!1;break;case "copy":r=C?C:"s0";break;case "inputLightRegulation":r=C?C:"s29";m=Yb.instance({td:v,Md:a.size,Id:a.nBlurPass,mb:!1});e=!0;break;case "inputMix0":r="none";m=Zb.instance({D:v,ee:a.varianceMin,Sc:a.blurKernelSizePx,mb:!1});e=!0;break;case "direct":case "none":r="abort";break;default:r="s4"}q&&A.T(r,[{name:"u27",type:"1f",value:a.tilt}]);d&&(r+="Mask");var E=Y.instance({isFloat:!1,isPot:!1,width:a.size}),g={F:function(){return v},Wb:function(){return g.F()},
Xe:function(){return e?m.Xb():E},V:function(t){va.ha();"abort"!==r&&("none"!==r&&(A.set(r),n&&A.G("u28",1/a.size),E.da(),d&&c.g(1),U.l(!1,!1),E.g(0),t=E),e&&m.process(t))},m:function(){E.remove();d&&c.remove()}};return g}}}(),Hb=function(){return{instance:function(a){function c(h){m.forEach(function(F,K){n[K][0]=h[0][F];n[K][1]=h[1][F];n[K][2]=h[2][F];n[K][3]=h[3][F]});return n}"undefined"===typeof a.normalize&&(a.normalize=!1);var d={input:null,Ua:null,bc:null,ba:null,tb:null,oc:null,pc:null},e=
null,m=[],n=[],q=!1,r=null,l=!0,v=-1,C=a.isReorganize?a.isReorganize:!1,E=a.kernelsCount?!0:!1,g=a.dynPelu?Xb.instance(a.dynPelu):!1,t=g?!0:!1,x={isEnabled:!1};a.ff?(a.sparsity="undefined"!==typeof a.sparsity?a.sparsity:a.vb.Wb(),l=!1):"full"===a.connectivityUp&&(a.sparsity=a.vb.Wb());var k={elu:"s16",elu01:"s17",relu:"s15",arctan:"s19",sigmoid:"s14",copy:"s0",softplus:"s20",dynPelu:"s18"}[a.activation],p=a.sparsity*a.sparsity,H=!1,I=a.size,N="";if(a.maxPooling){switch(a.maxPooling.size){case 2:N=
"s34";break;case 4:N="s35"}H=!0;I/=a.maxPooling.size;d.oc=Y.instance({isFloat:!0,isPot:!1,width:I})}var z=void 0!==a.rf&&a.rf?!0:!1,J=null,M=null,u=null;if(z){J="s46"+a.index.toString();A.sd("s46",J,[((a.normalization.n-1)/2).toFixed(1)]);A.T(J,[{type:"1i",name:"u1",value:0},{type:"2f",name:"u8",value:[1/a.size,1/a.size]},{type:"1f",name:"u7",value:a.normalization.alpha},{type:"1f",name:"u10",value:a.normalization.beta},{type:"1f",name:"u31",value:a.normalization.k}]);var f={isFloat:!0,isPot:!0,width:a.size};
M=Y.instance(f);u=Y.instance(f)}var y=-1,G=null;l&&(d.ba=Y.instance({isFloat:!0,isPot:!1,width:a.size}));d.Ua=Y.instance(a.bias);var L={F:function(){return a.size},Wb:function(){return I},nd:function(){return a.classesCount},qe:function(h){e.g(h)},uf:function(){a.remap&&a.remap.isEnabled&&(x={isEnabled:!0,kf:Y.instance({isFloat:!1,isFlipY:!1,array:new Uint8Array(a.remap.maskTexture.data),width:a.remap.maskTexture.width,isPot:!1}),pb:a.remap.layers.map(function(h){return a.parent.We(h)}),depth:a.remap.depth})},
Ef:function(){switch(a.connectivityUp){case "direct":G=$b.instance(a.connectivity);break;case "square":G=ac.instance(a.connectivity);break;case "squareFast":G=bc.instance(a.connectivity,a.activation);break;case "full":G=cc.instance(a.connectivity);break;case "conv":v=a.kernelsCount,G=dc.instance(a.connectivity),C&&(d.tb=Y.instance({width:I,isFloat:!0,isFlipY:!1,isPot:!1}))}if(G.Ca){var h=a.size*a.sparsity;y=Math.log(h/a.size)/Math.log(2);d.input=Y.instance({isMipmap:!0,isFloat:!0,isPot:!0,width:h,
ic:y});d.bc=Y.instance({isFloat:!0,isPot:!0,width:a.size})}},V:function(h,F){e=h;G.Ca?(d.input.da(),E&&d.Ua.g(2),G.V(x),d.input.g(0),d.input.Le(y),d.bc.da(),E?A.set("s0"):(A.set("s28"),A.G("u26",p),d.Ua.g(1)),d.input.re(y,0),U.l(!1,!1),A.set(k),z?M.u():d.ba.u(),d.bc.g(0),t&&g.He(),U.l(!1,!1)):(d.ba.da(),d.Ua.g(1),G.V());z&&(A.set(J),u.u(),M.g(0),U.l(!1,!1),A.set("s47"),A.G("u7",1),d.ba.u(),u.g(1),U.l(!1,!1));if(l)return H?(d.oc.da(),d.ba.g(0),A.set(N),A.sa("u8",1/a.size,1/a.size),U.l(!1,!1),F=d.oc):
F=d.ba,F.g(0),C&&(d.tb.u(),A.set("s22"),A.sa("u13",v,I/v),U.l(!1,!1),F=d.tb,d.tb.g(0)),F;var K=d.ba;a.normalize&&(A.set("gpuRawAvg"===q?"s9":"s8"),A.G("u4",1/a.size),d.pc.da(),d.ba.g(0),U.l(!1,!1),K=d.pc);h=null;switch(q){case "cpuRGBA2Float":K.Zc(!1);F?h=L.vf(K).then(r):(K=L.wf(K),r(K));break;case "cpuMeanFloat":K.Zc(!0);F?h=K.yf().then(r):(K=K.zf(),r(K));break;case "gpuRawAvg":case "gpuRaw":K.g(0);case "none":null!==r&&r(K)}F&&null===h&&(h=Promise.resolve());return h},Be:function(h){h&&(q=h.qc||
"none",r=h.nc||null);d.ba=Y.instance({isFloat:!0,isPot:!0,isMipmap:!1,width:a.size});h="undefined"!==typeof a.classesCount&&a.classesCount?a.classesCount:a.size*a.size;for(var F=0,K=0,P=0;F<h;++F)m.push(K+(a.size-1-P)*a.size),n.push([-1,-1,-1,-1]),++K,K===a.size&&(K=0,++P);a.normalize&&(d.pc=Y.instance({isFloat:!0,isPot:!0,width:a.size}))},vf:function(h){return h.xf().then(c)},wf:function(h){h=h.Rd();c(h);return n},m:function(){for(var h in d){var F=d[h];F&&F.remove()}G&&(G.m(),G=null)}};a.vb&&L.Ef(a.vb);
return L}}}(),$b=function(){return{instance:function(a){var c=Y.instance(a.weights);return{Ca:!0,cb:function(){return 1},m:function(){c.remove()},$e:function(){return c},V:function(){A.set("s27");c.g(1);U.l(!1,!1)}}}}}(),cc=function(){return{instance:function(a){var c=a.fromLayerSize,d=Y.instance(a.weights);return{Ca:!0,cb:function(){return c},m:function(){d.remove()},V:function(e){if(e.isEnabled){A.set("s25");e.kf.g(3);var m,n=Math.min(e.pb.length,e.depth);for(m=0;m<n;++m)e.pb[m].qe(4+m)}else A.set("s24");
A.G("u17",a.toLayerSize);d.g(1);U.l(!1,!1)}}}}}(),ac=function(){return{instance:function(a){for(var c=a.fromLayerSize,d=a.toLayerSize,e=a.toSparsity,m=e*d,n=m/c,q=c/d,r=0,l=0,v=0,C=Array(e*d*e*d*4),E=Array(e*d*e*d*4),g=Array(c*c),t=0;t<g.length;++t)g[t]=0;t=Math.floor(e/2);for(var x=.5/d,k=.5/c,p=.5/m,H=0;H<d;++H)for(var I=Math.round(H*q),N=0;N<d;++N){var z=Math.round(N*q),J=H/d,M=N/d;J+=x;M+=x;for(var u=0;u<e;++u){var f=I+u-t;0>f&&(f+=c);f>=c&&(f-=c);for(var y=0;y<e;++y){var G=r/m,L=l/m,h=z+y-t;
0>h&&(h+=c);h>=c&&(h-=c);var F=f/c,K=h/c;L=1-L-1/m;F+=k;K+=k;G+=p;L+=p;var P=H*e+u,da=N*e+y;da=d*e-da-1;P=da*d*e+P;C[4*P]=G;C[4*P+1]=L;C[4*P+2]=F;C[4*P+3]=K;K=g[h*c+f]++;P=K%n;F=f*n+P;h=h*n+(K-P)/n;h=c*n-1-h;h=h*c*n+F;E[4*h]=G;E[4*h+1]=L;E[4*h+2]=J;E[4*h+3]=M;++r>=m&&(r=0,++l);++v}}}g=null;var ra=Y.instance(a.weights);delete a.weights.data;var za=Y.instance({width:m,isFloat:!0,array:new Float32Array(E),isPot:!0});E=null;var w=Y.instance({width:m,isFloat:!0,array:new Float32Array(C),isPot:!0});C=null;
return{Ca:!0,cb:function(){return n},m:function(){za.remove();w.remove();ra.remove()},V:function(){A.set("s23");ra.g(1);w.g(2);U.l(!1,!1)}}}}}(),dc=function(){return{instance:function(a){var c=a.kernelsCount,d=a.toSparsity,e=d*a.toLayerSize/a.fromLayerSize,m=Y.instance(a.weights);return{Ca:!0,cb:function(){return e},Wg:function(){return d},$e:function(){return m},m:function(){m.remove()},V:function(){A.set("s26");A.G("u23",c);A.G("u24",d);A.G("u17",a.toLayerSize);A.G("u25",a.fromLayerSize);m.g(1);
U.l(!1,!1)}}}}}(),bc=function(){return{instance:function(a,c){var d=a.fromLayerSize,e=a.toLayerSize,m=a.toSparsity,n=a.stride?a.stride:1,q=m*e/d,r=e<d,l=d/e,v=Y.instance(a.weights),C="s48"+[d.toString(),e.toString(),m.toString(),n.toString(),c].join("_");A.Je(C)||(a=Vb.Me(c,"gl_FragColor","gl_FragColor"),e=[{type:"1f",name:"u17",value:e},{type:"1f",name:"u30",value:n}],r&&e.push({type:"1f",name:"u25",value:d}),d=[(r?q:m).toFixed(1),a],r&&d.push(l.toFixed(1)),A.sd(r?"s40":"s39",C,d),A.T(C,e.concat([{type:"1i",
name:"u15",value:0},{type:"1i",name:"u22",value:1},{type:"1i",name:"u14",value:3}])));return{Ca:!1,cb:function(){return q},m:function(){v.remove()},V:function(){A.set(C);v.g(3);U.l(!1,!1)}}}}}(),Yb=function(){return{instance:function(a){var c=a.Id?a.Id:3,d=a.td?a.td:64,e=a.Md?a.Md:64,m=a.mb?!0:!1;a={isFloat:!1,width:d,isPot:!1,isFlipY:!1};var n=Y.instance(a),q=Y.instance(a),r=Y.instance(a),l=Y.instance(a),v=Y.instance({isFloat:!0,width:e,isPot:!1,isFlipY:!1}),C=1/d;return{process:function(E){A.set("s36");
l.u();U.l(m,!1);A.set("s37");for(var g=0;g<c;++g)n.u(),A.sa("u8",C,0),U.l(m,!1),r.u(),l.g(0),U.l(m,!1),q.u(),n.g(0),A.sa("u8",0,C),U.l(m,!1),l.u(),r.g(0),U.l(m,!1),g!==c-1&&q.g(0);A.set("s38");v.u();E.g(0);q.g(1);l.g(2);U.l(m,!1);v.g(0)},Xb:function(){return v}}}}}(),Zb=function(){return{instance:function(a){function c(v){return Y.instance({isFloat:v,width:d.D,isPot:!1,isFlipY:!1})}var d=Object.assign({ee:.1,Sc:9,D:128,mb:!1},a),e=c(!1),m=[c(!1),c(!1),c(!1)],n=[c(!1),c(!1),c(!1)],q=c(!0),r=[e,n[0],
n[1]];a="uniform sampler2D u1;const float e=1.1111,g=2.2222;uniform vec2 u32;varying vec2 vv0;void main(){float b=0.,c=0.;for(float a=-e;a<=e;a+=1.){vec2 i=u32*a,j=vv0+i*g;float d=1.2*a/e,f=exp(-d*d);b+=f*texture2D(u1,j).r,c+=f;}b/=c,gl_FragColor=vec4(b,0.,0.,1.);}".replace("1.1111",Math.round((d.Sc-1)/2).toFixed(2)).replace("2.2222",(1/d.D).toFixed(6));var l={u1:0};A.Qc([{id:"s50",name:"_",h:"uniform sampler2D u1;varying vec2 vv0;const vec3 f=vec3(.2126,.7152,.0722),g=vec3(1.,1.,1.);void main(){vec3 b=texture2D(u1,vv0).rgb;float a=dot(b,f);gl_FragColor=vec4(a,a,a,a);}",
j:l,i:["u1"],precision:"lowp"},{id:"s51",name:"_",h:a,j:l,i:["u1","u32"],precision:"lowp"},{id:"s52",name:"_",h:"uniform sampler2D u33,u34,u35,u36;const float f=1.1111;const vec3 g=vec3(1.,1.,1.);varying vec2 vv0;void main(){vec3 a=texture2D(u33,vv0).rgb;float c=texture2D(u34,vv0).r,d=texture2D(u35,vv0).r,h=texture2D(u36,vv0).r,i=a.r*a.r;vec3 b=vec3(c,d,h),j=max(g*f,abs(i-b*b)),k=sqrt(j);gl_FragColor=vec4(a.r,(a-b)/k);}".replace("1.1111",d.ee.toFixed(4)),j:{u33:0,u34:1,u35:2,u36:3},i:["u33","u34",
"u35","u36"],precision:"highp"}]);return{process:function(){A.set("s50");e.da();U.l(d.mb,!1);A.set("s51");for(var v=0;3>v;++v)A.sa("u32",1,0),m[v].u(),r[v].g(0),U.l(!1,!1),A.sa("u32",0,1),n[v].u(),m[v].g(0),U.l(!1,!1);A.set("s52");q.u();e.g(0);n[0].g(1);n[1].g(2);n[2].g(3);U.l(!1,!1);q.g(0)},Xb:function(){return q}}}}}(),W={Ze:function(){return W.Yc()?document.createElement("video"):!1},Ma:function(a,c){a[c]=!0;a.setAttribute(c,"true")},xe:function(){var a=!1,c=navigator.userAgent||navigator.vendor||
window.opera;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(c)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(c.substr(0,
4)))a=!0;return a},Vc:function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream},Ne:function(){var a=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return a&&a.length&&2<a.length?[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3]||0,10)]:[0,0,0]},Dd:function(){try{return window.matchMedia("(orientation: portrait)").matches?!0:!1}catch(a){return window.innerHeight>window.innerWidth}},we:function(){return W.Wc()||W.Vc()},Wc:function(){var a=navigator.userAgent.toLowerCase();
return-1!==a.indexOf("safari")&&-1===a.indexOf("chrome")?!0:!1},Ag:function(){return W.xe()?W.Dd()?window.innerHeight/window.innerWidth*45:45:45},Yc:function(){return navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?!0:!1},pause:function(a){a.pause()},rh:function(a){a.play()},release:function(a){a.pause();a.videoStream&&a.videoStream.stop();a.videoStream=null},Xc:function(a){if(!a)return a;var c=null;if(a.video){var d=function(e){return e&&"object"===typeof e?Object.assign({},e):e};c={};
"undefined"!==typeof a.video.width&&(c.width=d(a.video.width));"undefined"!==typeof a.video.height&&(c.height=d(a.video.height));"undefined"!==typeof a.video.facingMode&&(c.facingMode=d(a.video.facingMode))}c={audio:a.audio,video:c};"undefined"!==typeof a.deviceId&&W.Oc(c,a.deviceId);return c},Oc:function(a,c){c&&(a.video=a.video||{},a.video.deviceId={exact:c},a.video.facingMode&&delete a.video.facingMode)},$d:function(a){var c=a.video.width;a.video.width=a.video.height;a.video.height=c;return a},
Ae:function(a){function c(g){return[480,576,640,648,720,768,800,960,1080,1152,1280,1366,1920].sort(function(t,x){return Math.abs(t-g)-Math.abs(x-g)})}function d(g){var t=W.Xc(a);g=g(t);m.push(g);e(g)}function e(g){if(g.video&&g.video.facingMode&&g.video.facingMode.exact){var t=g.video.facingMode.exact;g=W.Xc(g);delete g.video.facingMode.exact;g.video.facingMode.ideal=t;m.push(g)}}var m=[];if(!a||!a.video)return m;e(a);if(a.video.width&&a.video.height){if(a.video.width.ideal&&a.video.height.ideal){var n=
c(a.video.width.ideal).slice(0,3),q=c(a.video.height.ideal).slice(0,3),r={},l=0;for(r.na=void 0;l<n.length;r={na:r.na},++l){r.na=n[l];var v={},C=0;for(v.ma=void 0;C<q.length;v={ma:v.ma},++C)if(v.ma=q[C],r.na!==a.video.width.ideal||v.ma!==a.video.height.ideal){var E=Math.max(r.na,v.ma)/Math.min(r.na,v.ma);E<4/3-.1||E>16/9+.1||d(function(g,t){return function(x){x.video.width.ideal=g.na;x.video.height.ideal=t.ma;return x}}(r,v))}}}d(function(g){return W.$d(g)})}a.video.width&&a.video.height&&(a.video.width.ideal&&
a.video.height.ideal&&d(function(g){delete g.video.width.ideal;delete g.video.height.ideal;return g}),d(function(g){delete g.video.width;delete g.video.height;return g}));a.video.facingMode&&(d(function(g){delete g.video.facingMode;return g}),a.video.width&&a.video.height&&d(function(g){W.$d(g);delete g.video.facingMode;return g}));m.push({audio:a.audio,video:!0});return m},Lf:function(a){if(W.Dd()){if(!a||!a.video)return!1;var c=a.video.width,d=a.video.height;if(!c||!d)return!1;if(c.ideal&&d.ideal&&
c.ideal>d.ideal)return a.video.height=c,a.video.width=d,!0}return!1},rb:function(a){a.volume=0;W.Ma(a,"muted");if(W.Wc()){if(1===a.volume){var c=function(){a.volume=0;window.removeEventListener("mousemove",c,!1);window.removeEventListener("touchstart",c,!1)};window.addEventListener("mousemove",c,!1);window.addEventListener("touchstart",c,!1)}setTimeout(function(){a.volume=0;W.Ma(a,"muted")},5)}},ce:function(a,c,d){return null===a?Promise.resolve():new Promise(function(e,m){if(a.srcObject&&a.srcObject.getVideoTracks){var n=
a.srcObject.getVideoTracks();1!==n.length?m("INVALID_TRACKNUMBER"):(n=n[0],c?W.get(a,e,m,d):(n.stop(),e()))}else m("BAD_IMPLEMENTATION")})},qd:function(a,c,d,e){function m(q){n||(n=!0,d(q))}var n=!1;return navigator.mediaDevices.getUserMedia(e).then(function(q){function r(){setTimeout(function(){if(a.currentTime){var v=a.videoWidth,C=a.videoHeight;if(0===v||0===C)m("VIDEO_NULLSIZE");else{v&&(a.style.width=v.toString()+"px");C&&(a.style.height=C.toString()+"px");v={ve:null,If:null,lf:null};try{var E=
q.getVideoTracks()[0];E&&(v.lf=E,v.ve=E.getCapabilities(),v.If=E.getSettings())}catch(g){}W.we()?a.parentNode&&null!==a.parentNode?(n||c(a,q,v),setTimeout(function(){a.play()},100)):(document.body.appendChild(a),W.rb(a),n||c(a,q,v),setTimeout(function(){a.style.transform="scale(0.0001,0.0001)";a.style.position="fixed";a.style.bottom="0px";a.style.right="0px";W.rb(a);setTimeout(function(){a.play()},100)},80)):n||c(a,q,v)}}else m("VIDEO_NOTSTARTED")},700)}function l(){a.removeEventListener("loadeddata",
l,!1);var v=a.play();W.rb(a);"undefined"===typeof v?r():v.then(function(){r()}).catch(function(){m("VIDEO_PLAYPROMISEREJECTED")})}"undefined"!==typeof a.srcObject?a.srcObject=q:(a.src=window.URL.createObjectURL(q),a.videoStream=q);W.rb(a);a.addEventListener("loadeddata",l,!1)}).catch(function(q){m(q)})},get:function(a,c,d,e){if(!a)return d&&d("VIDEO_NOTPROVIDED"),!1;if(!W.Yc())return d&&d("MEDIASTREAMAPI_NOTFOUND"),!1;if(e&&e.video){if(W.Vc()){var m=W.Ne();0!==m[0]&&(12>m[0]||12===m[0]&&2>m[1])&&
W.Lf(e)}e.video.width&&e.video.width.ideal&&(a.style.width=e.video.width.ideal+"px");e.video.height&&e.video.height.ideal&&(a.style.height=e.video.height.ideal+"px")}W.Ma(a,"autoplay");W.Ma(a,"playsinline");e&&e.audio?a.volume=0:W.Ma(a,"muted");W.qd(a,c,function(){function n(r){if(0===r.length)d("INVALID_FALLBACKCONSTRAINTS");else{var l=r.shift();W.qd(a,c,function(){n(r)},l)}}var q=W.Ae(e);n(q)},e)},Ye:function(a){if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices)return a(!1,"NOTSUPPORTED"),
!1;navigator.mediaDevices.enumerateDevices().then(function(c){(c=c.filter(function(d){return d.kind&&-1!==d.kind.toLowerCase().indexOf("video")&&d.label&&d.deviceId}))&&c.length&&0<c.length?a(c,!1):a(!1,"NODEVICESFOUND")}).catch(function(){a(!1,"PROMISEREJECTED")})},cg:function(a,c,d){var e={};e[c]=d;c=[];c.push(e);a.applyConstraints({advanced:c}).catch(function(){})}},pa=function(){function a(t,x,k,p,H,I){if(I===H.length)p();else{switch(H[I]){case "D":t();break;case "S":x().then(function(){g.ae();
a(t,x,k,p,H,++I)}).catch(p);return;case "R":k()}a(t,x,k,p,H,++I)}}var c={n:5,kc:1,Gd:0,bb:[35,49],Ya:[2,200],k:.7,Qf:200,tf:.05},d=-1,e=null,m=-1,n=-1,q=0,r=-1,l=-1,v=0,C=0,E=c.Ya[1],g={od:function(){switch(d){case -1:return-1;case 0:return l+e.Gd;case 1:return v}},Fg:function(t){return Math.pow(Math.min(Math.max(r,0),e.n-1)/(e.n-1),t||1)},A:function(t){e=Object.assign({},c,t);r=l=e.kc;d=0;g.reset()},ae:function(t){t=("undefined"===typeof t?Date.now():t)||0;var x=Math.min(Math.max(t-C,e.Ya[0]),e.Ya[1]);
E=x;C=t;var k=-1===m?0:e.k;m=Math.min(Math.max(1E3/x,5),120)*(1-k)+m*k;t-n>e.Qf&&5<++q&&(x=e.k,r=r*(1-x)+(m<e.bb[0]?l-1:m>e.bb[1]?l+1:l)*x,Math.abs(r-l)>1-e.tf&&(x=Math.min(Math.max(Math.round(r),0),e.n-1),x!==l&&(r=l=x,m=(e.bb[1]-e.bb[0])/2)),n=t)},rc:function(t,x,k,p,H){a(t,x,k,p,H,0)},vc:function(t){v=t;d=1},Gc:function(){d=0;g.reset()},reset:function(){E=c.Ya[1];n=m=-1;q=0},Qe:function(){return E}};return g}(),Ma=function(){function a(){d(k+t.jc);p.port.postMessage("DONE")}function c(){var f=
t.ga;z.isEnabled&&(f=Math.max(f,z.ga));N.Sa=0===f?window.requestAnimationFrame(d):window.requestAnimationFrame(e)}function d(f){I.ya&&null!==x&&(f-=k,f=Math.min(Math.max(f,t.$c[0]),t.$c[1]),k+=f,n(),z.isEnabled&&z.Y&&I.Z&&k-z.fc>t.Lc&&(v(),z.fc=k),x(k))}function e(f){I.ya&&(N.timeout=window.setTimeout(d.bind(null,f),t.ga))}function m(){x=null;I.ya=!1;n()}function n(){N.Sa&&(window.cancelAnimationFrame(N.Sa),N.Sa=null);N.timeout&&(window.clearTimeout(N.timeout),N.timeout=null)}function q(f){f&&!I.Z?
(I.Z=!0,H&&pa.Gc(),p.port.postMessage("STOP"),aa.be(!0),c()):!f&&I.Z&&(I.Z=!1,H&&pa.vc(1),aa.be(!1),p.port.postMessage("START"))}function r(f){f.target.hidden?M():J()}function l(f,y,G){y=f.createShader(y);f.shaderSource(y,G);f.compileShader(y);return y}function v(){z.Y=!1;var f=z.fb,y=z.gb,G=z.hb,L=z.X;f.uniform1f(z.rd,Math.random());z.za?y.beginQueryEXT(L,G):f.beginQuery(L,G);f.drawElements(f.POINTS,1,f.UNSIGNED_SHORT,0);z.za?y.endQueryEXT(L):f.endQuery(L);f.flush();E().then(function(h){h=t.ge*t.Jc*
1E3/h;z.Db=(z.Db+1)%t.Ea;z.hc[z.Db]=h;if(++z.Ed>t.Ea){z.ob.set(z.hc);z.ob.sort();h=z.ob[Math.floor(t.Ea/2)];z.$a=Math.max(z.$a,h);var F;for(F=0;F<z.Ec&&!(h>z.$a*(1-(t.Kc[F]+t.he*(F>=z.Bb?1:-1))));++F)F===z.Ec-1&&++F;F!==z.Bb&&(console.log("THERMAL THROTTLING LEVEL = "+F.toString()),z.Bb=F,z.ga=0===F?0:t.fe[F-1],t.Ic&&t.Ic(F))}z.Y=!0}).catch(function(){z.Y=!0})}function C(f){var y=z.fb,G=z.gb,L=z.hb;L=z.za?G.Cg(L,G.QUERY_RESULT_AVAILABLE_EXT):y.getQueryParameter(L,y.QUERY_RESULT_AVAILABLE);y=y.getParameter(G.GPU_DISJOINT_EXT);
L?f(!y):setTimeout(C.bind(null,f),.1)}function E(){return new Promise(function(f,y){C(function(G){if(G){G=z.fb;var L=z.gb,h=z.hb;G=z.za?L.getQueryObjectEXT(h,L.QUERY_RESULT_EXT):G.getQueryParameter(h,G.QUERY_RESULT);f(G)}else y()})})}var g={zd:!0,$c:[1,200],jc:20,ga:0,ie:!1,Jc:50,ge:240,Lc:3E3,Ea:3,Kc:[.2,.35,.5],he:.05,fe:[8,20,40],Ic:null},t=null,x=null,k=0,p=null,H=!1,I={qa:!1,Z:!0,ec:!1,dc:!1,cc:!1,ya:!1},N={Sa:null,timeout:null},z={isEnabled:!1,Y:!1,fb:null,gb:null,hb:null,X:null,rd:null,za:!0,
Bb:0,Ec:0,ga:0,fc:0,Ed:0,hc:null,ob:null,Db:0,$a:0},J=q.bind(null,!0),M=q.bind(null,!1),u={A:function(f){t=Object.assign(g,f);Object.assign(I,{Z:!0,qa:!0,ya:!1});if(t.ie){f=document.createElement("canvas");f.setAttribute("width","1");f.setAttribute("height","1");var y={antialias:!1};f=f.getContext("webgl2",y)||f.getContext("webgl",y);if(y=f.getExtension("EXT_disjoint_timer_query")||f.getExtension("EXT_disjoint_timer_query_webgl2")){z.fb=f;z.gb=y;z.isEnabled=!0;z.za=y.beginQueryEXT?!0:!1;var G=l(f,
f.VERTEX_SHADER,"attribute vec4 a0;void main(){gl_Position=a0;}"),L=l(f,f.FRAGMENT_SHADER,"precision lowp float;uniform float u37;void main(){vec4 a=u37*vec4(1.,2.,3.,4.);for(int b=0;b<666;b+=1)a=cos(a);gl_FragColor=a;}".replace("666",t.Jc.toString())),h=f.createProgram();f.attachShader(h,G);f.attachShader(h,L);f.linkProgram(h);G=f.getAttribLocation(h,"a0");z.rd=f.getUniformLocation(h,"u37");f.useProgram(h);f.enableVertexAttribArray(G);h=f.createBuffer();f.bindBuffer(f.ARRAY_BUFFER,h);f.bufferData(f.ARRAY_BUFFER,
new Float32Array([.5,.5,0,1]),f.STATIC_DRAW);f.vertexAttribPointer(G,4,f.FLOAT,!1,16,0);h=f.createBuffer();f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,h);f.bufferData(f.ELEMENT_ARRAY_BUFFER,new Uint16Array([0]),f.STATIC_DRAW);f.disable(f.DEPTH_TEST);f.disable(f.DITHER);f.disable(f.STENCIL_TEST);f.viewport(0,0,1,1);h=z.za?y.createQueryEXT():f.createQuery();z.hb=h;z.X=y.TIME_ELAPSED_EXT||f.TIME_ELAPSED;z.Bb=0;z.Ec=t.Kc.length;z.ga=0;z.fc=-t.Lc;z.hc=new Float32Array(t.Ea);z.ob=new Float32Array(t.Ea);z.$a=0;
z.Db=0;z.Ed=0;z.Y=!0}}if(t.zd){f=!1;try{if("undefined"===typeof SharedWorker){var F=URL.createObjectURL(new Blob(["let handler = null;\n self.addEventListener('message', function(e){\n if (handler !== null){\n clearTimeout(handler);\n handler = null;\n }\n switch (e.data) {\n case 'START':\n case 'DONE':\n handler = setTimeout(function(){\n self.postMessage('TICK');\n }, "+t.jc.toString()+");\n break;\n case 'STOP':\n break;\n };\n }, false);"],
{type:"text/javascript"})),K=new Worker(F);K.addEventListener("message",a);p={Pd:K,port:K};I.ec=!0}else{var P=URL.createObjectURL(new Blob(["let handler = null;\n onconnect = function(e) {\n const port = e.ports[0];\n port.addEventListener('message', function(e) {\n \n if (handler !== null){\n clearTimeout(handler);\n handler = null;\n }\n switch (e.data) {\n case 'START':\n case 'DONE':\n handler = setTimeout(function(){\n port.postMessage('TICK');\n }, "+
t.jc.toString()+");\n break;\n case 'STOP':\n break;\n };\n \n });\n \n port.start();\n } // end onconnect()"],{type:"text/javascript"})),da=new SharedWorker(P);da.port.start();da.port.addEventListener("message",a);p={Pd:da,port:da.port};I.dc=!0}f=!0}catch(ra){}f&&("onvisibilitychange"in document?document.addEventListener("visibilitychange",r):(window.addEventListener("blur",M),window.addEventListener("focus",J)),I.cc=
!0)}H="undefined"!==typeof pa},m:function(){m();I.cc&&("onvisibilitychange"in document?document.removeEventListener("visibilitychange",r):(window.removeEventListener("blur",M),window.removeEventListener("focus",J)),I.cc=!1);I.dc?(p.port.close(),I.dc=!1):I.ec&&(p.Pd.terminate(),I.ec=!1);Object.assign(I,{Z:!0,qa:!1,ya:!1});x=null},hh:function(){return I.Z},update:function(f){Object.assign(t,f)},rc:function(f){I.qa||u.A({});n();I.ya=!0;x=f;I.Z&&c()},stop:m};return u}(),tb=function(){var a={Kd:4,ub:[1.5,
1.5,2],O:[.1,.1,.1],Td:1,D:-1,M:-1,Kf:2,sf:1,Ud:!0,Ie:.8},c=null,d=[],e=0,m=[.5,.5,1];return{A:function(n){c=Object.assign({},a,n);d.splice(0);n=c.ub[0]*c.O[0];var q=c.ub[1]*c.O[1],r=1/(1+c.ub[2]*c.O[2]),l=c.Td*Math.min(c.D,c.M),v=l/c.D;l/=c.M;var C=.5*c.Ie;C*=C;for(var E=0;E<c.Kd;++E){var g=Math.pow(r,E),t=v*g,x=l*g;g=t*n;var k=x*q,p=t/2;x/=2;for(var H=1+(1-p-p)/g,I=1+(1-x-x)/k,N=0;N<I;++N)for(var z=x+N*k,J=z-.5,M=0;M<H;++M){var u=p+M*g,f=u-.5;f*f+J*J>C||d.push([u,z,t*c.sf])}}c.Ud&&d.sort(function(y,
G){var L=y[0]-.5;y=y[1]-.5;var h=G[0]-.5;G=G[1]-.5;return L*L+y*y-(h*h+G*G)})},get:function(){var n=d.length;if(0===n)return m;e>=n&&(e=0);var q=d[Math.floor(e)];e=(e+1/c.Kf)%n;return q}}}(),ba={neuralNetworkPath:"NN_DEFAULT.json",fa:0,Eb:[2,8],Af:{threshold:1,nScaleLevels:2,scale0Factor:.8,overlapFactors:[2,2,3],scanCenterFirst:!0,nDetectsPerLoop:-1,multiDetectionThresholdFactors:[.5,.6],isCleanGLStateAtEachIteration:!0,animateProcessOrder:"DSR"},Nf:50,
Hd:.3,mf:8,pf:.3,Jf:{translationFactorRange:[.0015,.005],rotationFactorRange:[.003,.02],qualityFactorRange:[.9,.98],alphaRange:[.05,1],followZRotAlphaFactor:.8},Pa:[.65,1,.262],O:[.092,.092,.3],ke:.2,me:2,le:.1,qf:8,Jd:1,Ke:Za.qb.bind(null,.3,.7),Tf:20,Yd:3},oa={facingMode:"user",idealWidth:800,idealHeight:600,minWidth:480,maxWidth:1920,minHeight:480,maxHeight:1920,rotate:0,flipX:!1},ia={lc:-3,jf:-1,error:-2,ready:1,play:2,pause:3},na=ia.lc,B=null,ec={kb:!1,zc:null,element:null,N:null,H:[0,0],L:[.5,
.5],v:[.5,0,0,.5],wb:0,La:null,jb:!1},Q=null,fc={Ka:null,Va:null,antialias:!0,Mc:"./",Fa:null,ia:null,fa:ba.fa,Od:ba.fa,lb:!1,ua:!0},Oa=null,ea=null,sa=null,Pa=1,Na={uc:-1,Mb:-1},Z=null,gc={D:0,M:0,H:[0,0],xa:null},X={Da:null,buffer:null,O:null,Pa:null,aa:ba.Jd,Na:null},Sa=null,qa=null,O={o:1,pa:0,W:null,Ad:!1,Fd:0,mc:0},hb=[],ib=[],Eb={VERSION:"2.1.7",init:function(a){function c(){na!==ia.error&&2===++e&&(Ja(),xb(),Ia(),Q.Ka&&(na=ia.ready,Q.Ka(!1,{GL:b,canvasElement:Q.ia,videoTexture:B.N.get(),videoTransformMat2:B.v,
maxFacesDetected:O.o,videoElement:B.element}),fb()),eb())}if(na!==ia.lc)return a.callbackReady&&a.callbackReady("ALREADY_INITIALIZED"),!1;na=ia.jf;B=Object.assign({},ec);Q=Object.assign({},fc);Z=Object.assign({},gc);O.W=[0];X.O=ba.O.slice(0);X.Pa=ba.Pa.slice(0);"undefined"!==typeof a.antialias&&(Q.antialias=a.antialias);a.callbackReady&&(Q.Ka=a.callbackReady);a.callbackTrack&&(Q.Va=a.callbackTrack);a.nExpressions&&(X.aa=a.nExpressions);a.expressionsEasings&&(X.Na=a.expressionsEasings);"undefined"!==
typeof a.animateDelay&&(Q.fa=a.animateDelay);"undefined"!==typeof a.NNCPath&&(Q.Mc=a.NNCPath);"undefined"!==typeof a.NNC&&(Q.Fa=a.NNC);"undefined"!==typeof a.maxFacesDetected&&(O.o=Math.max(1,a.maxFacesDetected));"undefined"!==typeof a.followZRot&&(Q.ua=a.followZRot?!0:!1);if(O.o>ba.mf)return Ha("MAXFACES_TOOHIGH"),!1;if(!a.canvasId&&!a.canvas)return Ha("NO_CANVASID"),!1;Q.ia=a.canvas?a.canvas:document.getElementById(a.canvasId);if(!Q.ia)return Ha("INVALID_CANVASID"),!1;Z.D=Q.ia.width;Z.M=Q.ia.height;
if(!Z.D||!Z.M)return Ha("INVALID_CANVASDIMENSIONS"),!1;for(var d=0;d<O.o;++d)hb.push(new Float32Array(ba.qf)),ib.push(0);Ma.A({zd:a.isKeepRunningOnWinFocusLost||!1,ga:Q.fa});pa.A({kc:0,n:ba.Eb[1]-ba.Eb[0]+1,Gd:ba.Eb[0]});ea=Object.create(ba.Af);a.scanSettings&&(Object.assign(ea,a.scanSettings),-1!==ea.nDetectsPerLoop?pa.vc(ea.nDetectsPerLoop):pa.Gc());sa=Object.create(ba.Jf);a.stabilizationSettings&&Object.assign(sa,a.stabilizationSettings);var e=0;a.videoSettings&&a.videoSettings.videoElement?$a(a.videoSettings.videoElement,
c):(a.videoSettings&&Object.assign(oa,a.videoSettings),zb(a.onWebcamAsk,a.onWebcamGet,function(m){$a(m,c)}));Qb(function(m){if(!Rb())return!1;Oa=new Fb({pb:m.layers,qc:"gpuRawAvg",nc:Tb});A.Qc([{id:"s54",name:"_",ta:"attribute vec2 a0;uniform mat2 u38;varying vec2 vv0;void main(){gl_Position=vec4(a0,0.,1.),vv0=vec2(.5,.5)+u38*a0;}",Ta:["a0"],Ha:[2],h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:["u1","u38"],precision:"lowp"},{id:"s55",name:"_",h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",
ta:"attribute vec2 a0;uniform sampler2D u39;uniform mat2 u38;uniform vec2 u40;uniform float u41,u42,u43;varying vec2 vv0;void main(){vec4 a=texture2D(u39,vec2(.17,u41));vec2 f=a.gb,g=a.a*u40,b=a0;b.x*=u43;float c=cos(u42),d=sin(u42);vec2 h=mat2(c,d,-d,c)*b,i=f+h*.5*g,j=i-.5;vv0=.5+2.*u38*j,gl_Position=vec4(a0,0.,1.);}",Ta:["a0"],Ha:[2],i:"u1 u39 u40 u41 u42 u43 u38".split(" "),precision:"lowp"},{id:"s56",name:"_",h:"uniform sampler2D u44,u39;uniform vec3 u45,u46;uniform float u47,u48,u41,u49,u42,u50;const vec4 e=vec4(.25,.25,.25,.25);void main(){vec4 d=texture2D(u44,vec2(.625,.625)),f=texture2D(u44,vec2(.875,.625)),a=texture2D(u39,vec2(.17,u41));float g=dot(d-f,e);bool h=g>u48;h?a.r=2.:a.r>u47?a.r=0.:a.r>1.9?a.r+=1.:0.,a.r*=u49;if(a.r<.9)a=vec4(1.,u45);else{a.r*=step(1.9,a.r);float i=dot(e,texture2D(u44,vec2(.875,.875))),j=dot(e,texture2D(u44,vec2(.125,.625))),k=dot(e,texture2D(u44,vec2(.375,.625))),b=cos(u42),c=sin(u42);vec2 l=mat2(b,c*u50,-c/u50,b)*vec2(i,j);a.gba+=vec3(l,k)*u46*a.a;}gl_FragColor=a;}",
ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",i:"u44 u39 u45 u47 u46 u49 u42 u50 u48 u41".split(" ")},{id:"s57",name:"_",ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",h:"uniform sampler2D u44;uniform float u49;const vec4 e=vec4(.25,.25,.25,.25);const vec3 f=vec3(.5,.5,.5);void main(){float a=dot(e,texture2D(u44,vec2(.125,.875))),b=dot(e,texture2D(u44,vec2(.375,.875))),c=dot(e,texture2D(u44,vec2(.625,.875))),d=dot(e,texture2D(u44,vec2(.625,.625)));vec3 g=vec3(a,b,c)*.5+f;gl_FragColor=vec4(g,d*u49);}",
i:["u44","u49"]},{id:"s58",name:"_",ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",h:"uniform sampler2D u44;const vec4 e=vec4(.25,.25,.25,.25);void main(){float a=dot(e,texture2D(u44,vec2(.375,.375))),b=dot(e,texture2D(u44,vec2(.625,.375))),c=dot(e,texture2D(u44,vec2(.875,.375))),d=dot(e,texture2D(u44,vec2(.125,.125)));gl_FragColor=vec4(a,b,c,d);}",i:["u44"]},{id:"s53",name:"_",h:"uniform sampler2D u39;uniform vec2 u51;uniform float u52;varying vec2 vv0;void main(){float f=step(.5,mod(gl_FragCoord.y+1.5,2.)),c=step(.33,vv0.x);vec4 a=texture2D(u39,vv0+u51);a.a=mix(a.a*u52,a.a,c);vec4 d=floor(255.*a),g=255.*(255.*a-d),b=mix(d,g,f)/255.;b.x=mix(step(a.x,1.5),b.x,c),gl_FragColor=b;}",
i:["u39","u52","u51"]}]);sb();Pb();kb();jb();c()});return!0},destroy:function(){Ma.m();return new Promise(function(a){Eb.toggle_pause(!0,!0).finally(function(){Oa&&Oa.m();Qa.m();Oa=qa=Sa=null;hb.splice(0);ib.splice(0);Z.xa=null;X.Da=null;B.N=null;na=ia.lc;a()}).catch(function(){})})},toggle_pause:function(a,c){if(!Ya())return Promise.reject("NOT_READY");var d=null;d=B.jb?Promise.resolve():c?W.ce(B.element,!a,B.La):Promise.resolve();a?rb():d.then(function(){eb()});return d},update_videoSettings:function(a){rb();
return new Promise(function(c,d){W.ce(B.element,!1,B.La).then(function(){Object.assign(oa,a);zb(null,null,function(e){$a(e,function(){Ja();Ia();eb();c()})})}).catch(d)})},toggle_slow:function(a){Ya()&&na===ia.play&&(a&&!Q.lb?(Q.Od=Q.fa,ea.nDetectsPerLoop=1,this.set_animateDelay(ba.Vf),Q.lb=!0):!a&&Q.lb&&(ea.nDetectsPerLoop=-1,this.set_animateDelay(Q.Od),Q.lb=!1))},set_animateDelay:function(a){Q.fa=a;Ma.update({ga:Q.fa})},resize:function(){if(!Ya())return!1;var a=Q.ia.width,c=Q.ia.height;if(!lb()&&
a===Z.D&&c===Z.M)return!1;Z.D=a;Z.M=c;A.R();kb();jb();Ja();Ia();return!0},set_inputTexture:function(a,c,d){B.H[0]=c;B.H[1]=d;B.N=Y.instance({width:c,height:d,Zb:a});B.kb=!0;Ja();fb();Ia()},reset_GLState:function(){fb();Z.xa.remove();X.Da.remove();sb()},render_video:function(){va.P();A.set("s54");b.viewport(0,0,Z.D,Z.M);B.N.g(0);U.l(!0,!0)},reset_inputTexture:function(){B.kb=!1;B.N=B.zc;lb();Ja();Ia()},get_videoDevices:function(a){return W.Ye(a)},set_scanSettings:function(a){Object.assign(ea,a);-1!==
ea.nDetectsPerLoop?pa.vc(ea.nDetectsPerLoop):pa.Gc();kb();jb()},set_stabilizationSettings:function(a){Object.assign(sa,a)},set_videoOrientation:function(a,c){Ya()&&(oa.flipX=c,oa.rotate=a,Ja(),Ia())},update_videoElement:function(a,c){$a(a?a:B.element,function(){xb();Ja();Ia();c&&c()})},create_new:function(){return window.JEELIZFACEFILTERGEN()}};return Eb};window.JEELIZFACEFILTER=window.JEELIZFACEFILTERGEN();
;return JEELIZFACEFILTER||window.JEELIZFACEFILTER;})();

View File

@@ -0,0 +1,188 @@
/**
* Jeeliz Face Filter - https://github.com/jeeliz/jeelizFaceFilter
*
* Copyright 2020 WebAR.rocks ( https://webar.rocks )
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable */
const JEELIZFACEFILTERGEN=function(){function Fb(a){var c=null,d=null,e=null,m=0;this.A=function(n){this.Cf(n.pb);e.Be({qc:n.qc,nc:n.nc})};this.We=function(n){return c[n]};this.Cf=function(n){var q=null;m=n.length;c=n.map(function(r,l){r=Object.assign({},r,{index:l,parent:this,vb:q,ff:l===m-1});return q=l=0===l?Gb.instance(r):Hb.instance(r)});d=c[0];e=c[m-1];c.forEach(function(r,l){0!==l&&r.uf()})};this.V=function(n){var q=n;c.forEach(function(r){q=r.V(q,!1)});return q};this.Ve=function(){return d.F()};
this.Xb=function(){return e.Xe()};this.nd=function(){return e.nd()};this.m=function(){c&&(c.forEach(function(n){n.m()}),e=d=c=null,m=0)};"undefined"!==typeof a&&this.A(a)}function db(a,c){var d=c%8;return a[(c-d)/8]>>7-d&1}function Ib(a){var c=JSON.parse(a);a=c.ne;var d=c.nf,e=c.n;var m="undefined"===typeof btoa?Buffer.from(c.data,"base64").toString("latin1"):atob(c.data);var n=m.length;c=new Uint8Array(n);for(var q=0;q<n;++q)c[q]=m.charCodeAt(q);m=new Float32Array(e);n=new Float32Array(d);q=a+d+
1;for(var r=0;r<e;++r){for(var l=q*r,v=0===db(c,l)?1:-1,C=l+1,E=1,g=0,t=C+a-1;t>=C;--t)g+=E*db(c,t),E*=2;C=g;l=l+1+a;E=n.length;g=0;for(t=l;t<l+E;++t)n[g]=db(c,t,!0),++g;for(E=l=0;E<d;++E)l+=n[E]*Math.pow(2,-E-1);m[r]=0===l&&0===C?0:v*(1+l)*Math.pow(2,1+C-Math.pow(2,a-1))}return m}function Ya(){return-1!==[ia.ready,ia.play,ia.pause].indexOf(na)}function eb(){if(na===ia.play)return!1;na=ia.play;Ma.stop();qb(0)}function rb(){if(na!==ia.play)return!1;Ma.stop();na=ia.pause;return!0}function Fa(a,c,d,
e,m){a=4*(3*c+a)+d;return e+(X.buffer[a]/255+X.buffer[a+12]/65025)*(m-e)}function fb(){b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1);va.ha();U.reset();Y.reset();A.R();A.ad();b.disable(b.DEPTH_TEST);b.disable(b.BLEND);U.Ja();A.Ba()}function Jb(){va.P();b.viewport(0,0,3,2*O.o);A.set("s53");X.Da.g(0);U.l(!1,!1);return aa.xb(0,0,3,2*O.o,X.buffer)}function qb(){na!==ia.pause&&(ea.isCleanGLStateAtEachIteration&&(A.ad(),U.reset(),U.Ja(),b.disable(b.DEPTH_TEST),b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1),A.Ba()),pa.rc(Kb,
Jb,Lb,Mb,ea.animateProcessOrder))}function Kb(){va.ha();if(!B.kb)if(B.jb)B.element.needsUpdate&&(B.N.Rf(B.element.arrayBuffer),B.element.needsUpdate=!1);else{var a=B.element.currentTime,c=a-B.wb;0>c&&(B.wb=a);1E3*c<ba.Tf||(B.wb+=c,B.N.refresh())}a=pa.od();if(O.W.length>a)O.W.splice(0,O.W.length-a);else for(;O.W.length<a;)O.W.push(0);if(1!==O.o)if(qa.every(Nb)){for(var d=0,e=c=0;e<qa.length;++e)qa[e].detected>d&&(d=qa[e].detected,c=0);for(d=0;d<a;++d)O.W[d]=c}else{c=Math.round(ba.pf*a);c=Math.min(1,
c);d=O.Fd;for(var m=e=0;e<a;++e){if(!gb(qa[d])&&++m>c){do++d===O.o&&(d=0);while(!gb(qa[d]))}O.W[e]=d++;d%=O.o}O.Fd=d}for(a=0;a<pa.od();++a)O.pa=O.W[a],O.mc=(.5+O.pa)/O.o,O.Ad=O.W.lastIndexOf(O.pa)===a,A.set("s55"),c=qa[O.pa],A.G("u43",1+Na.uc*(Math.cos(c.ry)-1)),Q.ua&&A.G("u42",c.rz),1!==O.o&&A.G("u41",O.mc),Z.xa.da(),B.N.g(0),X.Da.g(1),U.l(!1,!1),Z.xa.g(0),Oa.V(Z.xa);pa.ae()}function Lb(){for(var a=0;a<O.o;++a)if(-1!==O.W.indexOf(a)){var c=a,d=Sa[c],e=[c],m=qa[c],n=hb[c],q=2*c;d.Wa=Fa(1,q,3,0,1);
m.detected=wa.$(m.detected,d.Wa,ba.ke);if(d.Wa<ea.multiDetectionThresholdFactors[0]*ea.threshold)d.Aa=Math.floor(d.Aa/2),Q.ua&&(m.rz=0,m.ry=0);else{var r=X.Pa;d.x=Fa(0,q,1,-1,1);d.y=Fa(0,q,2,-1,1);d.ca=Fa(0,q,3,0,1);d.sc=Fa(1,q,0,-r[0],r[0]);d.tc=Fa(1,q,1,-r[1],r[1]);d.Qa=Fa(1,q,2,-r[2],r[2]);for(r=0;r<X.aa;++r)d.hd[r]=X.Na[r](Fa(2,q,r,0,1));e.Rb=d.x-m.xRaw;e.Sb=d.y-m.yRaw;e.Qb=d.ca-m.sRaw;e.Nb=d.sc-m.rx;e.Ob=d.tc-m.ry;e.Pb=Q.ua?d.Qa:d.Qa-m.rz;q=pa.Qe();e=(1-Za.qb(sa.translationFactorRange[0],sa.translationFactorRange[1],
Math.sqrt(e.Rb*e.Rb+e.Sb*e.Sb+e.Qb*e.Qb)/q))*(1-Za.qb(sa.rotationFactorRange[0],sa.rotationFactorRange[1],Math.sqrt(e.Nb*e.Nb+e.Ob*e.Ob+e.Pb*e.Pb)/q))*Za.qb(sa.qualityFactorRange[0],sa.qualityFactorRange[1],d.Wa);c=n[++ib[c]%n.length]=e;for(q=0;q<n.length;++q)c=Math.min(c,n[q]);c=Math.max(.5,c);e=Math.min(c,e);n=wa.$(sa.alphaRange[1],sa.alphaRange[0],Math.pow(e,ba.me));m.xRaw=wa.$(m.xRaw,d.x,n);m.yRaw=wa.$(m.yRaw,d.y,n);m.sRaw=wa.$(m.sRaw,d.ca,n);m.rx=wa.$(m.rx,d.sc,n);m.ry=wa.$(m.ry,d.tc,n);m.rz=
Q.ua?m.rz+sa.followZRotAlphaFactor*n*d.Qa:wa.$(m.rz,d.Qa,n);c=m.sRaw*Na.Mb*Math.sin(m.ry);e=Math.sin(m.rz)*c/Pa;m.x=m.xRaw+Math.cos(m.rz)*c;m.y=m.yRaw+e;m.s=m.sRaw;n=Math.max(n,ba.le);for(c=0;c<X.aa;++c)m.expressions[c]=wa.$(m.expressions[c],d.hd[c],n);++d.Aa}}va.Pf();ea.isCleanGLStateAtEachIteration&&(va.reset(),Y.reset(),b.enable(b.DEPTH_TEST));Q.Va&&(1===O.o?Q.Va(qa[0]):Q.Va(qa));ea.isCleanGLStateAtEachIteration&&b.disable(b.BLEND)}function Mb(){na===ia.play&&Ma.rc(qb)}function sb(){Z.xa=Y.instance({isPot:!0,
isFloat:!1,width:Oa.Ve()});for(var a=ba.Yd,c=O.o,d=new Float32Array([0,.5,.5,0,0,0,0,0,0,0,0,0]),e=new Float32Array(d.length*O.o),m=0,n;m<O.o;++m)for(n=0;n<d.length;++n)e[m*d.length+n]=d[n];X.Da=Ob.instance({width:a,height:c,isFloat:!0,isPot:!1,array:e})}function Pb(){function a(c){for(var d=[],e=0;e<O.o;++e)d.push(JSON.parse(JSON.stringify(c)));return d}X.buffer=new Uint8Array(8*ba.Yd*O.o);Sa=a({Wa:0,x:0,y:0,ca:1,sc:0,tc:0,Qa:0,hd:new Float32Array(X.aa),Aa:0});qa=a({detected:0,x:0,y:0,s:1,xRaw:0,
yRaw:0,sRaw:1,rx:0,ry:0,rz:0,expressions:new Float32Array(X.aa)});a({Rb:0,Sb:0,Qb:0,Nb:0,Ob:0,Pb:0})}function jb(){A.T("s55",[{type:"1i",name:"u1",value:0},{type:"1i",name:"u39",value:1},{type:"2f",name:"u40",value:Z.H},{type:"1f",name:"u41",value:.5},{type:"1f",name:"u42",value:0}]);A.T("s56",[{type:"1i",name:"u44",value:0},{type:"1i",name:"u39",value:1},{type:"1f",name:"u47",value:ba.Nf},{type:"1f",name:"u48",value:ea.threshold},{type:"3f",name:"u46",value:[X.O[0]*Z.H[0],X.O[1]*Z.H[1],X.O[2]]},
{type:"1f",name:"u41",value:.5},{type:"1f",name:"u49",value:1},{type:"1f",name:"u42",value:0}]);var a=[{type:"1i",name:"u44",value:0}];A.T("s57",a);A.T("s58",a);A.T("s53",[{type:"1i",name:"u39",value:0},{type:"1f",name:"u52",value:Z.H[0]},{type:"2f",name:"u51",value:[0,.5/O.o]}])}function kb(){Z.H[0]=1;Z.H[1]=Z.D/Z.M;tb.A({ub:ea.overlapFactors,Kd:ea.nScaleLevels,D:Z.D,M:Z.M,Td:ea.scale0Factor,O:X.O,Ud:ea.scanCenterFirst})}function Qb(a){if(Q.Fa)ub("string"===typeof Q.Fa?JSON.parse(Q.Fa):Q.Fa,a);else{var c=
Q.Mc;"JSON"!==c.toUpperCase().split(".").pop()&&(c+=ba.neuralNetworkPath);vb.get(c,function(d){d=JSON.parse(d);ub(d,a)})}}function ub(a,c){if(a.exportData){var d=a.exportData;d.rotationEulerAnglesFactors&&(X.Pa=d.rotationEulerAnglesFactors);d.translationScalingFactors&&(X.O=d.translationScalingFactors);"undefined"!==typeof d.nExpressions&&(X.aa=d.nExpressions);Na.uc=.4;Na.Mb=.7;"undefined"!==typeof d.fgScaleXFactor&&(Na.uc=d.fgScaleXFactor);"undefined"!==typeof d.fgDisplaceXFactor&&(Na.Mb=d.fgDisplaceXFactor)}X.aa||
(X.aa=ba.Jd);if(!X.Na)for(X.Na=[],d=0;d<X.aa;++d)X.Na.push(ba.Ke);c(a)}function Rb(){if(Qa.A({Jb:Q.ia,width:Z.D,height:Z.M,debug:!1,Ld:function(){Ha("GLCONTEXT_LOST")},antialias:Q.antialias,premultipliedAlpha:!0}))return!0;Ha("GL_INCOMPATIBLE");return!1}function gb(a){return a.detected>ea.multiDetectionThresholdFactors[1]*ea.threshold}function Nb(a){return!gb(a)}function wb(a,c,d,e){return d>a?Math.max(0,a+c/2-(d-e/2)):Math.max(0,d+e/2-(a-c/2))}function Sb(){return Sa.some(function(a,c){if(c===O.pa)return!1;
c=Sa[O.pa];if(c.Aa>a.Aa||3>a.Aa||wb(c.x,c.ca,a.x,a.ca)<ba.Hd*c.ca)return!1;var d=Z.D/Z.M;return wb(c.y,c.ca*d,a.y,a.ca*d)>ba.Hd*c.ca*d})}function Tb(){var a=O.pa;X.Da.Bf(1);1!==O.o&&(b.viewport(0,0,3,O.o),A.set("s0"),A.Xd("u1",1),U.l(!1,!1),A.Xd("u1",0));b.viewport(0,a,1,1);A.set("s56");Q.ua&&A.G("u42",qa[a].rz);1!==O.o&&A.G("u41",O.mc);if(1<O.o){var c=Sb()?0:1;A.G("u49",c)}A.Gf("u45",tb.get());U.l(!1,!1);O.Ad&&(b.viewport(1,a,1,1),A.set("s57"),A.G("u49",1),U.l(!1,!1),b.viewport(2,a,1,1),A.set("s58"),
U.l(!1,!1))}function xb(){B.N&&B.N.remove();B.jb=B.element.isFakeVideo?!0:!1;if(B.jb){var a=yb();a={isFlipY:!1,array:B.element.arrayBuffer,width:a.w,height:a.wa,isKeepArray:!0}}else a={I:B.element};B.zc=Y.instance(Object.assign({isPot:!1,isLinear:!0,isFloat:!1},a));B.N=B.zc}function Ia(){var a=[{type:"mat2",name:"u38",value:B.v}];A.T("s54",[{type:"1i",name:"u1",value:0}].concat(a));A.T("s55",a)}function Ja(){B.L[0]=.5;B.L[1]=.5;var a=B.H[1]/B.H[0];Pa=Qa.U()/Qa.F();90===Math.abs(oa.rotate)&&(a=1/a);
a>Pa?B.L[1]*=Pa/a:B.L[0]*=a/Pa;A.T("s56",[{name:"u50",type:"1f",value:Pa}]);B.v[0]=0;B.v[1]=0;B.v[2]=0;B.v[3]=0;switch(oa.rotate){case 0:B.v[0]=B.L[0];B.v[3]=B.L[1];break;case 180:B.v[0]=-B.L[0];B.v[3]=-B.L[1];break;case 90:B.v[1]=B.L[0];B.v[2]=-B.L[1];break;case -90:B.v[1]=-B.L[0],B.v[2]=B.L[1]}oa.flipX&&(B.v[0]*=-1,B.v[2]*=-1);B.kb||(B.v[1]*=-1,B.v[3]*=-1)}function yb(){var a={w:B.element.videoWidth||B.element.width,wa:B.element.videoHeight||B.element.height};if(!a.w||!a.wa||4>a.w||4>a.wa)throw Error("INVALID VIDEO DIMENSIONS - width = "+
a.w+" height = "+a.wa);return a}function lb(){var a=yb(),c=B.H[0]!==a.w||B.H[1]!==a.wa;c&&(B.H[0]=a.w,B.H[1]=a.wa);return c}function $a(a,c){if(na===ia.error)return!1;B.element=a;lb();c&&c();return!0}function zb(a,c,d){a&&a();B.La={video:{facingMode:{exact:oa.facingMode},width:{min:oa.minWidth,max:oa.maxWidth,ideal:oa.idealWidth},height:{min:oa.minHeight,max:oa.maxHeight,ideal:oa.idealHeight}},audio:!1};W.Oc(B.La,oa.deviceId);W.get(B.element?B.element:W.Ze(),function(e){c&&c(e);d(e)},function(){Ha("WEBCAM_UNAVAILABLE")},
B.La)}function Ha(a){na!==ia.error&&(na=ia.error,Q.Ka&&Q.Ka(a))}var wa={Qg:function(a){return Math.ceil(Math.log2(a))},jh:function(a){return Math.log2(a)},fh:function(a){return 0===Math.log2(a)%1},dg:function(a){var c=[0,0,0,0];a.forEach(function(d){c[0]+=d[0];c[1]+=d[1];c[2]+=d[2];c[3]+=d[3]});return c},eg:function(a,c,d){return Math.min(Math.max(a,c),d)},hg:function(a){return a*Math.PI/180},oh:function(a,c){c=Math.pow(10,c);return Math.round(a*c)/c},ph:function(a){return Math.round(1E6*a)/1E6},
Rg:function(a,c){return(100*a/c).toFixed(3)},$:function(a,c,d){return a*(1-d)+c*d},Ge:function(a,c){return wa.ye(a-c)},ye:function(a){for(;a>Math.PI;)a-=2*Math.PI;for(;a<=-Math.PI;)a+=2*Math.PI;return a},kg:function(a,c){return Math.abs(wa.Ge(a,c))},Uf:function(a,c){return Math.atan2(Math.sin(a)+Math.sin(c),Math.cos(a)+Math.cos(c))}},vb={get:function(a,c,d){var e=new XMLHttpRequest;e.open("GET",a,!0);e.withCredentials=!1;e.onreadystatechange=function(){4===e.readyState&&(200===e.status||0===e.status?
c(e.responseText):"undefined"!==typeof d&&d(e.status))};e.send()},Ng:function(a,c){vb.get(a,function(d){c(JSON.parse(d))})},lh:function(a,c,d){var e=new XMLHttpRequest;e.open("POST",a,!0);e.setRequestHeader("Content-type","application/x-www-form-urlencoded");e.onreadystatechange=function(){4!==e.readyState||200!==e.status&&0!==e.status||d(e.responseText)};e.send(c)},Bg:function(a,c){var d=new XMLHttpRequest;d.open("POST",a,!0);d.responseType="arraybuffer";d.onload=function(){c(d.response)};d.send()}},
Ub={create:function(a,c){for(var d=Array(c),e=0;e<c;++e)d[e]=a;return d},ig:function(a,c){for(var d=0;d<a.length;++d)c[d]=a[d]},clone:function(a){for(var c=Array(a.length),d=0;d<a.length;++d)c[d]=a[d];return c},sh:function(a,c,d){a.forEach(function(e,m){c[m]=e*d})},Ch:function(a){for(var c=a.length-1;0<c;--c){var d=Math.floor(Math.random()*(c+1)),e=a[c];a[c]=a[d];a[d]=e}},Mf:function(a){return Array.isArray(a)||a.constructor===Float32Array||a.constructor===Uint8Array}},mb={Kb:function(a,c){if(0===
c||"object"!==typeof a)return a;a=Object.assign({},a);c=void 0===c||-1===c?-1:c-1;for(var d in a)a[d]=mb.Kb(a[d],c);return a}},Za={Dh:function(a,c,d){a=Math.min(Math.max((d-a)/(c-a),0),1);return a*a*(3-2*a)},qb:function(a,c,d){return Math.min(Math.max((d-a)/(c-a),0),1)},vg:function(a,c,d,e){return Math.pow(Math.min(Math.max((e-a)/(c-a),0),1),d)},Hh:function(){return 0},kh:function(){return 1},ih:function(a){return a},sg:function(a){return a*a},xg:function(a){return a*(2-a)},pg:function(a){return.5>
a?2*a*a:-1+(4-2*a)*a},ng:function(a){return a*a*a},wg:function(a){return--a*a*a+1},og:function(a){return.5>a?4*a*a*a:(a-1)*(2*a-2)*(2*a-2)+1},tg:function(a){return a*a*a*a},yg:function(a){return 1- --a*a*a*a},qg:function(a){return.5>a?8*a*a*a*a:1-8*--a*a*a*a},ug:function(a){return a*a*a*a*a},zg:function(a){return 1+--a*a*a*a*a},rg:function(a){return.5>a?16*a*a*a*a*a:1+16*--a*a*a*a*a}},Vb={Me:function(a,c,d){switch(a){case "relu":return d+"=max(vec4(0.,0.,0.,0.),"+c+");";case "elu":return d+"=mix(exp(-abs("+
c+"))-vec4(1.,1.,1.,1.),"+c+",step(0.,"+c+"));";case "elu01":return d+"=mix(0.1*exp(-abs("+c+"))-vec4(0.1,0.1,0.1,0.1),"+c+",step(0.,"+c+"));";case "arctan":return d+"=atan(3.14159265359*texture2D(u0,vUV))/3.14159265359;";case "copy":return"";default:return!1}}},A=function(){function a(u,f,y){f=u.createShader(f);u.shaderSource(f,y);u.compileShader(f);return u.getShaderParameter(f,u.COMPILE_STATUS)?f:!1}function c(u,f,y){f=a(u,u.VERTEX_SHADER,f);y=a(u,u.FRAGMENT_SHADER,y);u===b&&q.push(f,y);var G=
u.createProgram();u.attachShader(G,f);u.attachShader(G,y);u.linkProgram(G);return G}function d(u,f){f.C=f.C?!0:!1;if(!f.C){void 0===f.ta&&(f.ta="precision lowp float;attribute vec2 a0;varying vec2 vv0;void main(){gl_Position=vec4(a0,0.,1.),vv0=a0*.5+vec2(.5,.5);}");void 0===f.Ta&&(f.Ta=["a0"]);void 0===f.Ha&&(f.Ha=[2]);if(void 0===f.precision||"highp"===f.precision)f.precision=E;f.id=v++;void 0!==f.Vd&&(f.Vd.forEach(function(G,L){f.h=f.h.replace(G,f.yb[L])}),f.Vd.splice(0));f.Hc=0;f.Ha.forEach(function(G){f.Hc+=
4*G});f.ra=c(u,f.ta,"precision "+f.precision+" float;\n"+f.h);f.B={};f.i.forEach(function(G){f.B[G]=u.getUniformLocation(f.ra,G)});f.attributes={};f.Ia=[];f.Ta.forEach(function(G){var L=u.getAttribLocation(f.ra,G);f.attributes[G]=L;f.Ia.push(L)});if(f.j){u.useProgram(f.ra);l=f;r=f.id;for(var y in f.j)u.uniform1i(f.B[y],f.j[y])}f.qa=!0}}function e(u){xa.Ff(M);r!==u.id&&(M.R(),r=u.id,l=u,b.useProgram(u.ra),u.Ia.forEach(function(f){0!==f&&b.enableVertexAttribArray(f)}))}function m(u,f,y){d(u,f,y);u.useProgram(f.ra);
u.enableVertexAttribArray(0);r=-1;return l=f}function n(){return{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:["u1"],j:{u1:0}}}var q=[],r=-1,l=null,v=0,C=!1,E="highp",g=["u1"],t=["u0"],x={u1:0},k={u0:0},p={u1:0,u2:1},H={u3:0},I={s0:n(),s1:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:g,j:x,precision:"lowp"},s2:{h:"uniform sampler2D u1,u2;varying vec2 vv0;void main(){vec4 a=texture2D(u2,vv0),b=texture2D(u1,vv0);gl_FragColor=a*b;}",
i:["u1","u2"],j:p},s3:{h:"uniform sampler2D u1;uniform vec2 u4,u5;varying vec2 vv0;void main(){vec2 a=vv0*u4+u5;gl_FragColor=texture2D(u1,a);}",i:["u1","u4","u5"],j:x,C:!0},s4:{h:"uniform sampler2D u1;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=a.r*f;}",i:g,j:x},s5:{h:"uniform sampler2D u1,u2;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u2,vv0),b=texture2D(u1,vv0);gl_FragColor=a.a*b.r*f;}",i:["u1","u2"],j:p},s6:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vec2(1.-vv0.x,vv0.y));}",
i:g,j:x},s7:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vec2(vv0.x,1.-vv0.y));}",i:g,j:x},s8:{h:"uniform sampler2D u0;uniform float u4;varying vec2 vv0;void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=a*u4;}",i:["u0","u4"],j:k},s9:{h:"uniform sampler2D u0;uniform float u4;varying vec2 vv0;const vec4 f=vec4(.25,.25,.25,.25),g=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0);float b=dot(a*u4,f);gl_FragColor=b*g;}",i:["u0","u4"],j:k},s10:{h:"uniform sampler2D u1;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.);void main(){float a=.25*dot(e,texture2D(u1,vv0));gl_FragColor=a*e;}",
i:g,j:x},s11:{h:"uniform sampler2D u1,u6;uniform float u7;const vec4 f=vec4(1.,1.,1.,1.);varying vec2 vv0;void main(){vec4 a=texture2D(u1,vv0),b=texture2D(u6,vv0);gl_FragColor=mix(b,a,u7*f);}",i:["u1","u6","u7"],j:{u1:0,u6:1}},s12:{h:"uniform sampler2D u1;uniform vec2 u8;varying vec2 vv0;void main(){gl_FragColor=.25*(texture2D(u1,vv0+u8)+texture2D(u1,vv0+u8*vec2(1.,-1.))+texture2D(u1,vv0+u8*vec2(-1.,-1.))+texture2D(u1,vv0+u8*vec2(-1.,1.)));}",i:["u1","u8"],j:x},s13:{h:"uniform sampler2D u1;uniform vec4 u9;varying vec2 vv0;float g(float a,float b){a=floor(a)+.5;return floor(a/exp2(b));}float h(float a,float b){return floor(a*exp2(b)+.5);}float i(float a,float b){return mod(a,h(1.,b));}float e(float c,float a,float b){a=floor(a+.5),b=floor(b+.5);return i(g(c,a),b-a);}vec4 j(float a){if(a==0.)return vec4(0.,0.,0.,0.);float k=128.*step(a,0.);a=abs(a);float c=floor(log2(a)),l=c+127.,b=(a/exp2(c)-1.)*8388608.,d=l/2.,m=fract(d)*2.,n=floor(d),o=e(b,0.,8.),p=e(b,8.,16.),q=m*128.+e(b,16.,23.),r=k+n;return vec4(o,p,q,r)/255.;}void main(){float a=dot(texture2D(u1,vv0),u9);gl_FragColor=j(a);}",
i:["u1","u9"],j:x},s14:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=e/(e+exp(-a));gl_FragColor=b;}",i:t,j:k,C:!0},s15:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(0.,0.,0.,0.);void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=max(f,a);}",i:t,j:k},s16:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=mix(exp(-abs(a))-f,a,step(0.,a));}",i:t,j:k},
s17:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=exp(-abs(a))-f;gl_FragColor=mix(.1*b,a,step(0.,a));}",i:t,j:k},s18:{h:"uniform sampler2D u0,u7,u10;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),c=texture2D(u7,vv0),d=texture2D(u10,vv0),b=a/d;gl_FragColor=c*mix(exp(-abs(b))-f,b,step(0.,a));}",i:["u0","u7","u10"],j:{u0:0,u7:1,u10:2},C:!0},s19:{h:"uniform sampler2D u0;const float e=3.141593;varying vec2 vv0;void main(){gl_FragColor=atan(e*texture2D(u0,vv0))/e;}",
i:t,j:k},s20:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=log(f+a);gl_FragColor=b;}",i:t,j:k,C:!0},s21:{h:"uniform sampler2D u0,u11;uniform float u12;const vec2 e=vec2(.5,.5);const float f=1e-5;const vec4 g=vec4(1.,1.,1.,1.),i=vec4(0.,0.,0.,0.);varying vec2 vv0;void main(){vec4 a=texture2D(u11,e);float b=u12*u12;vec4 c=max(b*a,f*g);gl_FragColor=texture2D(u0,vv0)/c;}",i:["u0","u11","u12"],j:{u0:0,u11:1},C:!0},s22:{h:"uniform sampler2D u1;uniform vec2 u13;varying vec2 vv0;void main(){float a=u13.x*u13.y;vec2 b=floor(vv0*a)/a,c=fract(vv0*a),d=floor(b*u13.y),f=floor(u13.x*fract(b*u13.y)),g=(f*u13.y+d)/a;gl_FragColor=texture2D(u1,g+c/a);}",
i:["u1","u13"],j:x},s23:{h:"uniform sampler2D u14,u15,u16;varying vec2 vv0;void main(){vec4 a=texture2D(u16,vv0);vec2 b=a.rg,c=a.ba;vec4 d=texture2D(u14,b),f=texture2D(u15,c);gl_FragColor=d*f;}",i:["u14","u15","u16"],j:{u15:0,u14:1,u16:2},C:!0},s24:{h:"uniform float u17;uniform sampler2D u14,u15;varying vec2 vv0;void main(){vec2 a=fract(vv0*u17);vec4 b=texture2D(u14,vv0),c=texture2D(u15,a);gl_FragColor=b*c;}",i:["u15","u14","u17"],j:{u15:0,u14:1}},s25:{h:"uniform float u17;uniform sampler2D u14,u15,u18,u19,u20,u21;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.),g=vec4(1e-3,1e-3,1e-3,1e-3);void main(){vec2 h=vv0*u17,l=floor(h),c=h-l;vec4 m=texture2D(u14,vv0),d=texture2D(u15,c),a=texture2D(u21,vv0);a=a*255.;vec4 n=texture2D(u18,c),o=texture2D(u19,c),p=texture2D(u20,c),i=step(-g,-a),b=e-i,j=b*step(-e-g,-a);b*=e-j;vec4 k=b*step(-2.*e-g,-a);b*=e-k;vec4 q=b;d=i*d+j*n+k*o+q*p,gl_FragColor=m*d;}",
i:"u14 u15 u17 u21 u18 u19 u20".split(" "),j:{u15:0,u14:1,u21:3,u18:4,u19:5,u20:6},C:!0},s26:{h:"uniform sampler2D u14,u15,u22;uniform float u17,u23,u24,u25;varying vec2 vv0;const vec2 j=vec2(1.,1.);void main(){vec2 a=floor(u23*vv0),b=u23*vv0-a;float c=u17/u23;vec2 d=floor(b*c),f=b*c-d,g=(a+f)/u23;float k=u23*u25/u17;vec2 l=k*d,h=(l+f*u24)/u25,i=step(h,j);vec4 m=texture2D(u14,g),n=texture2D(u15,h),o=m*n*i.x*i.y,p=texture2D(u22,g);gl_FragColor=o*u24*u24+p;}",i:"u14 u15 u17 u23 u24 u25 u22".split(" "),
j:{u15:0,u14:1,u22:2}},s27:{h:"uniform sampler2D u14,u15;varying vec2 vv0;void main(){vec4 a=texture2D(u14,vv0),b=texture2D(u15,vv0);gl_FragColor=a*b;}",i:["u14","u15"],j:{u15:0,u14:1},C:!0},s28:{h:"uniform sampler2D u1,u22;uniform float u26;varying vec2 vv0;void main(){gl_FragColor=texture2D(u22,vv0)+u26*texture2D(u1,vv0);}",i:["u1","u22","u26"],j:{u1:0,u22:1}},s29:{h:"varying vec2 vv0;uniform sampler2D u1;const vec4 f=vec4(1.,1.,1.,1.),g=vec4(.299,.587,.114,0.);void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=dot(a,g)*f;}",
i:g,j:x,precision:"lowp"},s30:{h:"varying vec2 vv0;uniform sampler2D u1;uniform float u27;const vec3 f=vec3(.299,.587,.114);void main(){vec3 a=texture2D(u1,vv0).rgb,b=texture2D(u1,vv0+vec2(0.,u27)).rgb,c=texture2D(u1,vv0+vec2(u27,u27)).rgb,d=texture2D(u1,vv0+vec2(u27,0.)).rgb;gl_FragColor=vec4(dot(a,f),dot(b,f),dot(c,f),dot(d,f));}",i:["u1","u27"],j:x,precision:"lowp"},s31:{h:"varying vec2 vv0;uniform sampler2D u1;uniform float u27;const vec3 f=vec3(.299,.587,.114);void main(){vec3 a=texture2D(u1,vv0).rgb,b=texture2D(u1,vv0+vec2(0.,u27)).rgb,c=texture2D(u1,vv0+vec2(u27,u27)).rgb,d=texture2D(u1,vv0+vec2(u27,0.)).rgb;gl_FragColor=vec4(a.r,b.g,c.b,dot(d,f));}",
i:["u1","u27"],j:x,precision:"lowp"},s32:{h:"varying vec2 vv0;uniform sampler2D u1,u2;uniform float u28;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=vec4(0.);a-=texture2D(u1,vec2(vv0.x-u28,vv0.y-u28))*1.,a-=texture2D(u1,vec2(vv0.x-u28,vv0.y))*2.,a-=texture2D(u1,vec2(vv0.x-u28,vv0.y+u28))*1.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y-u28))*1.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y))*2.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y+u28))*1.;vec4 b=vec4(0.);b-=texture2D(u1,vec2(vv0.x-u28,vv0.y-u28))*1.,b-=texture2D(u1,vec2(vv0.x,vv0.y-u28))*2.,b-=texture2D(u1,vec2(vv0.x+u28,vv0.y-u28))*1.,b+=texture2D(u1,vec2(vv0.x-u28,vv0.y+u28))*1.,b+=texture2D(u1,vec2(vv0.x,vv0.y+u28))*2.,b+=texture2D(u1,vec2(vv0.x+u28,vv0.y+u28))*1.;vec3 c=sqrt(a.rgb*a.rgb+b.rgb*b.rgb);vec4 e=vec4(c,texture2D(u1,vv0).a),g=texture2D(u2,vv0);gl_FragColor=g.a*e.r*f;}",
i:["u1","u2","u28"],j:p,C:!0},s33:{h:"varying vec2 vv0;uniform sampler2D u1,u2;uniform float u28;const vec4 j=vec4(1.,1.,1.,1.);const vec2 k=vec2(1.,1.);void main(){float h=0.;vec2 l=k*u28,a,b;float c,d,i=0.;for(float e=-4.;e<=4.;e+=1.)for(float f=-4.;f<=4.;f+=1.)a=vec2(e,f),c=length(a)/2.,d=exp(-c*c),b=vv0+l*a,h+=d*texture2D(u1,b).r,i+=d;vec4 m=texture2D(u2,vv0);gl_FragColor=m.a*(texture2D(u1,b).r-h/i)*j;}",i:["u1","u2","u28"],j:p,C:!0},s34:{h:"uniform sampler2D u3;uniform vec2 u8;varying vec2 vv0;vec4 e(vec4 a,vec4 b){vec4 c=step(a,b);return mix(a,b,c);}const vec2 g=vec2(.5,.5),h=vec2(1.,0.),i=vec2(0.,1.);void main(){vec2 a=vv0-u8*g;vec4 b=texture2D(u3,a),c=texture2D(u3,a+u8*h),d=texture2D(u3,a+u8*i),j=texture2D(u3,a+u8),k=e(b,c),l=e(d,j);gl_FragColor=e(k,l);}",
i:["u3","u8"],j:H},s35:{h:"uniform sampler2D u3;uniform vec2 u8;varying vec2 vv0;const vec2 k=vec2(1.,0.),l=vec2(0.,1.),m=vec2(2.,0.),n=vec2(0.,2.);vec4 e(vec4 a,vec4 b){vec4 c=step(a,b);return mix(a,b,c);}vec4 f(vec2 a){vec4 b=texture2D(u3,a),c=texture2D(u3,a+u8*k),d=texture2D(u3,a+u8*l),g=texture2D(u3,a+u8),h=e(b,c),i=e(d,g);return e(h,i);}void main(){vec2 a=vv0+u8*vec2(-.55,-1.05);vec4 b=f(a),c=f(a+u8*m),d=f(a+u8*2.),g=f(a+u8*n),h=e(b,c),i=e(d,g);gl_FragColor=e(h,i);}",i:["u3","u8"],j:H,C:!0},
s36:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=a*a;}",i:["u1"],j:x,precision:"lowp",C:!0},s37:{h:"uniform sampler2D u1;uniform vec2 u8;varying vec2 vv0;const float e=15444.;void main(){vec4 a=1001./e*texture2D(u1,vv0-3.*u8)+2002./e*texture2D(u1,vv0-2.*u8)+3003./e*texture2D(u1,vv0-u8)+3432./e*texture2D(u1,vv0)+3003./e*texture2D(u1,vv0+u8)+2002./e*texture2D(u1,vv0+2.*u8)+1001./e*texture2D(u1,vv0+3.*u8);gl_FragColor=a;}",i:["u8","u1"],j:x,precision:"lowp",
C:!0},s38:{h:"uniform sampler2D u1,u11,u29;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);const float g=.1;void main(){vec4 a=texture2D(u11,vv0),b=texture2D(u29,vv0),c=texture2D(u1,vv0),d=max(f*g,b-a*a),h=sqrt(d);gl_FragColor=(c-a)/h;}",i:["u1","u11","u29"],j:{u1:0,u11:1,u29:2},C:!0}},N={s39:{h:"uniform float u17,u30;uniform sampler2D u14,u15,u22;varying vec2 vv0;const vec2 ZERO2=vec2(0.,0.),ONE2=vec2(1.,1.),HALF2=vec2(.5,.5),EPS2=vec2(1e-5,1e-5);void main(){vec4 sum=texture2D(u22,vv0);float toSparsity=1.1111;vec2 uvFrom,uvWeight,xyPatch=ZERO2,eps2=EPS2/u17,xyTo=floor(vv0*u17+eps2);float weightSize=toSparsity*u17;vec2 halfFromSparsity=ONE2*(toSparsity-1.)/2.;for(float patch_x=0.;patch_x<1.1111;patch_x+=1.){xyPatch.x=patch_x;for(float patch_y=0.;patch_y<1.1111;patch_y+=1.)xyPatch.y=patch_y,uvFrom=(xyTo+HALF2+u30*(xyPatch-halfFromSparsity))/u17,uvFrom+=step(uvFrom,-eps2),uvFrom-=step(ONE2-eps2,uvFrom),uvWeight=(xyTo*toSparsity+xyPatch+HALF2)/weightSize,sum+=texture2D(u14,uvWeight)*texture2D(u15,uvFrom);}gl_FragColor=sum,gl_FragColor*=2.2222;}",
i:["u17","u14","u15","u22","u30"],yb:["1.1111","gl_FragColor\\*=2.2222;"]},s40:{h:"uniform float u17,u30,u25;uniform sampler2D u14,u15,u22;varying vec2 vv0;const vec2 ZERO2=vec2(0.,0.),ONE2=vec2(1.,1.),HALF2=vec2(.5,.5),EPS2=vec2(1e-4,1e-4);void main(){vec4 sum=texture2D(u22,vv0);float fromSparsity=1.1111,shrinkFactor=3.3333;vec2 uvFrom,uvWeight,xyFrom,xyPatchTo,xyPatch=ZERO2,xyShrink=ZERO2,eps2=EPS2/u25,xyTo=floor(vv0*u17+eps2);float weightSize=fromSparsity*u25;vec2 halfFromSparsity=ONE2*(fromSparsity-1.)/2.;float toSparsity=weightSize/u17;vec2 xyFrom0=xyTo*shrinkFactor;for(float patch_x=0.;patch_x<1.1111;patch_x+=1.){xyPatch.x=patch_x;for(float patch_y=0.;patch_y<1.1111;patch_y+=1.){xyPatch.y=patch_y;for(float shrink_x=0.;shrink_x<3.3333;shrink_x+=1.){xyShrink.x=shrink_x;for(float shrink_y=0.;shrink_y<3.3333;shrink_y+=1.)xyShrink.y=shrink_y,xyFrom=xyFrom0+xyShrink+shrinkFactor*u30*(xyPatch-halfFromSparsity),uvFrom=(xyFrom+HALF2)/u25,uvFrom+=step(uvFrom,-eps2),uvFrom-=step(ONE2-eps2,uvFrom),xyPatchTo=xyPatch*shrinkFactor+xyShrink,uvWeight=(xyTo*toSparsity+xyPatchTo+HALF2)/weightSize,sum+=texture2D(u14,uvWeight)*texture2D(u15,uvFrom);}}}gl_FragColor=sum,gl_FragColor*=2.2222;}",
i:"u17 u25 u14 u15 u22 u30".split(" "),yb:["1.1111","gl_FragColor\\*=2.2222;","3.3333"]}},z=null,J=null,M={nb:function(){return C},A:function(){if(!C){z=mb.Kb(I,2);J=mb.Kb(N,2);E="highp";for(var u in z)d(b,z[u],u);A.set("s0");b.enableVertexAttribArray(0);C=!0}},Qc:function(u){u.forEach(function(f){M.Pc(f)})},Pc:function(u){z[u.id]=u;d(b,u,u.id)},sd:function(u,f,y){f||(f=u);z[f]=Object.create(J[u]);z[f].ef=!0;J[u].yb&&J[u].yb.forEach(function(G,L){z[f].h=z[f].h.replace(new RegExp(G,"g"),y[L])});d(b,
z[f],f)},set:function(u){var f=z[u];f.C&&(f.C=!1,d(b,f,u));e(f)},Ra:function(u){return m(u,n(),"s41")},wc:function(u){return m(u,{h:"void main(){gl_FragColor=vec4(.5,.5,.5,.5);}",i:[],precision:"highp"},"s42")},Je:function(u){return"undefined"===typeof z[u]?!1:z[u].qa},R:function(){-1!==r&&(r=-1,l.Ia.forEach(function(u){0!==u&&b.disableVertexAttribArray(u)}))},yc:function(){var u=0;l.Ia.forEach(function(f,y){y=l.Ha[y];b.vertexAttribPointer(f,y,b.FLOAT,!1,l.Hc,u);u+=4*y})},ad:function(){b.enableVertexAttribArray(0)},
Ba:function(){M.zb(b)},zb:function(u){u.vertexAttribPointer(l.Ia[0],2,u.FLOAT,!1,8,0)},Xd:function(u,f){b.uniform1i(l.B[u],f)},G:function(u,f){b.uniform1f(l.B[u],f)},sa:function(u,f,y){b.uniform2f(l.B[u],f,y)},wh:function(u,f){b.uniform2fv(l.B[u],f)},Gf:function(u,f){b.uniform3fv(l.B[u],f)},xh:function(u,f,y,G){b.uniform3f(l.B[u],f,y,G)},yh:function(u,f,y,G,L){b.uniform4f(l.B[u],f,y,G,L)},xc:function(u,f){b.uniform4fv(l.B[u],f)},zh:function(u,f){b.uniformMatrix2fv(l.B[u],!1,f)},Ah:function(u,f){b.uniformMatrix3fv(l.B[u],
!1,f)},Bh:function(u,f){b.uniformMatrix4fv(l.B[u],!1,f)},T:function(u,f){M.set(u);f.forEach(function(y){switch(y.type){case "4f":b.uniform4fv(l.B[y.name],y.value);break;case "3f":b.uniform3fv(l.B[y.name],y.value);break;case "2f":b.uniform2fv(l.B[y.name],y.value);break;case "1f":b.uniform1f(l.B[y.name],y.value);break;case "1i":b.uniform1i(l.B[y.name],y.value);break;case "mat2":b.uniformMatrix2fv(l.B[y.name],!1,y.value);break;case "mat3":b.uniformMatrix3fv(l.B[y.name],!1,y.value);break;case "mat4":b.uniformMatrix4fv(l.B[y.name],
!1,y.value)}})},Pg:function(){return"lowp"},m:function(){b.disableVertexAttribArray(0);M.R();for(var u in z){var f=z[u];f.qa&&(f.qa=!1,b.deleteProgram(f.ra));f.ef&&delete z[u]}q.forEach(function(y){b.deleteShader(y)});q.splice(0);v=0;C=!1;l=null;r=-1}};return M}(),b=null,Qa=function(){function a(g){console.log("ERROR in ContextFF: ",g);return!1}function c(g){function t(){Ca.m();aa.reset();k.getExtension("WEBGL_lose_context").loseContext()}if(navigator.userAgent&&-1!==navigator.userAgent.indexOf("forceWebGL1"))return!1;
var x=document.createElement("canvas");x.setAttribute("width",5);x.setAttribute("height",5);var k=null;try{k=x.getContext("webgl2",g)}catch(p){return!1}if(!k)return!1;d(k);aa.bd(k);g=aa.Lb(k);if(!g.ja&&!g.ka)return t(),!1;g=Ca.Tc(k,g);t();return g?!0:!1}function d(g){g.clearColor(0,0,0,0);g.disable(g.DEPTH_TEST);g.disable(g.BLEND);g.disable(g.DITHER);g.disable(g.STENCIL_TEST);g.disable(g.CULL_FACE);g.GENERATE_MIPMAP_HINT&&g.hint(g.GENERATE_MIPMAP_HINT,g.FASTEST);g.disable(g.SAMPLE_ALPHA_TO_COVERAGE);
g.disable(g.SAMPLE_COVERAGE);g.depthFunc(g.LEQUAL);g.clearDepth(1)}var e=null,m=null,n=null,q=null,r=!0,l=null,v=null,C=[],E={F:function(){return e.width},U:function(){return e.height},Gg:function(){return e},Eg:function(){return b},la:function(){return r},flush:function(){b.flush()},Pe:function(){l||(l=new Uint8Array(e.width*e.height*4));b.readPixels(0,0,e.width,e.height,b.RGBA,b.UNSIGNED_BYTE,l);return l},Ig:function(){return e.toDataURL("image/jpeg")},Jg:function(){va.P();m||(m=document.createElement("canvas"),
n=m.getContext("2d"));m.width=e.width;m.height=e.height;for(var g=E.Pe(),t=n.createImageData(m.width,m.height),x=m.width,k=m.height,p=t.data,H=0;H<k;++H)for(var I=k-H-1,N=0;N<x;++N){var z=4*(H*x+N),J=4*(I*x+N);p[z]=g[J];p[z+1]=g[J+1];p[z+2]=g[J+2];p[z+3]=g[J+3]}n.putImageData(t,0,0);return m.toDataURL("image/png")},Hg:function(g){!m&&g&&(m=document.createElement("canvas"),n=m.getContext("2d"));var t=g?m:document.createElement("canvas");t.width=e.width;t.height=e.height;(g?n:t.getContext("2d")).drawImage(e,
0,0);return t},A:function(g){g.Ce&&!g.Jb?e=document.getElementById(g.Ce):g.Jb&&(e=g.Jb);e||(e=document.createElement("canvas"));e.width=g&&void 0!==g.width?g.width:512;e.height=g&&void 0!==g.height?g.height:512;"undefined"===typeof g&&(g={});void 0===g.premultipliedAlpha&&(g.premultipliedAlpha=!1);void 0===g.wd&&(g.wd=!0);void 0===g.antialias&&(g.antialias=!1);if(b)r=b instanceof WebGL2RenderingContext;else{r=!0;var t={antialias:g.antialias,alpha:!0,preserveDrawingBuffer:!0,premultipliedAlpha:g.premultipliedAlpha,
stencil:!1,depth:g.wd};navigator&&navigator.userAgent&&-1!==navigator.userAgent.indexOf("noAntialiasing")&&(t.antialias=!1);var x=c(t);!x&&t.antialias&&(t.antialias=!1,x=c(t));x&&(b=e.getContext("webgl2",t));b?r=!0:((b=e.getContext("webgl",t))||(b=e.getContext("experimental-webgl",t)),r=!1)}if(!b)return a("WebGL1 and 2 are not enabled");(q=b.getExtension("WEBGL_lose_context"))&&g.Ld&&(v=g.Ld,e.addEventListener("webglcontextlost",v,!1));if(!aa.A())return a("Not enough GL capabilities");d(b);A.A();
U.A();if(!Ca.Tc(b,aa.Oe()))return a("Cannot filter float textures");C.forEach(function(k){k(b)});C.splice(0);return!0},$f:function(){return new Promise(function(g){b?g(b):C.push(g)})},m:function(){b&&(aa.m(),A.m(),Ca.m());q&&v&&(e.removeEventListener("webglcontextlost",v,!1),q=v=null);b=l=n=m=e=null;C.splice(0)}};return E}(),xa=function(){function a(){null===c&&("undefined"!==typeof A?c=A:"undefined"!==typeof JEShaders&&(c=JEShaders))}var c=null;a();return{reset:function(){c=null},Ff:function(d){c!==
d&&(c&&c.R(),c=d)},nb:function(){return c.nb()},Ba:function(){return c.Ba()},zb:function(d){return c.zb(d)},yc:function(){return c.yc()},R:function(){return c.R()},set:function(d){return c.set(d)},Ra:function(d){a();return c.Ra(d)},wc:function(d){a();return c.wc(d)}}}(),Ba=function(){function a(h){b.bindTexture(b.TEXTURE_2D,h)}function c(h){f[0]=h;h=y[0];var F=h>>16&32768,K=h>>12&2047,P=h>>23&255;return 103>P?F:142<P?F|31744|((255==P?0:1)&&h&8388607):113>P?(K|=2048,F|(K>>114-P)+(K>>113-P&1)):F=(F|
P-112<<10|K>>1)+(K&1)}function d(h){var F=new Uint16Array(h.length);h.forEach(function(K,P){F[P]=c(K)});return F}function e(){if(null!==G.$b)return G.$b;var h=n(d([.5,.5,.5,.5]));return null===h?!0:G.$b=h}function m(){if(null!==G.ac)return G.ac;var h=n(new Uint8Array([127,127,127,127]));return null===h?!0:G.ac=h}function n(h){if(!xa.nb()||!k)return null;var F=null,K=Math.sqrt(h.length/4);try{var P=b.getError();if("FUCKING_BIG_ERROR"===P)return!1;F=L.instance({isFloat:!1,S:!0,array:h,width:K});P=b.getError();
if(P!==b.NO_ERROR)return!1}catch(ra){return!1}la.P();b.viewport(0,0,K,K);b.clearColor(0,0,0,0);b.clear(b.COLOR_BUFFER_BIT);xa.set("s0");F.Rc(0);ma.l(!0,!0);h=4*K*K;P=new Uint8Array(h);b.readPixels(0,0,K,K,b.RGBA,b.UNSIGNED_BYTE,P);K=!0;for(var da=0;da<h;++da)K=K&&3>Math.abs(P[da]-127);F.remove();la.ha();return K}var q=0,r=null,l=0,v=null,C=null,E=null,g=null,t=null,x=null,k=!1,p=[],H={isFloat:!1,isPot:!0,isLinear:!1,isMipmap:!1,isAnisotropicFiltering:!1,isMirrorX:!1,isMirrorY:!1,isSrgb:!1,isKeepArray:!1,
isFlipY:null,width:0,height:0,url:null,array:null,data:null,I:null,Zb:null,df:!1,S:!1,oa:null,sb:4,ic:0},I=!1,N=null,z=null,J=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],M=!1,u=!1,f=new Float32Array(1),y=new Int32Array(f.buffer),G={$b:null,ac:null},L={A:function(){k||(t=[b.RGBA,null,b.RGBA,b.RGBA],x=[b.RGBA,null,b.RGBA,b.RGBA],r=[b.TEXTURE0,b.TEXTURE1,b.TEXTURE2,b.TEXTURE3,b.TEXTURE4,b.TEXTURE5,b.TEXTURE6,b.TEXTURE7],M="undefined"!==typeof JEContext,u="undefined"!==typeof aa,M&&JEContext.gh()&&r.push(b.TEXTURE8,
b.TEXTURE9),v=[-1,-1,-1,-1,-1,-1,-1,-1],g=[b.UNSIGNED_BYTE,b.FLOAT,b.FLOAT],k=!0)},af:function(){if(!C){for(var h=new Float32Array(16384),F=0;16384>F;++F)h[F]=2*Math.random()-1;C={random:L.instance({isFloat:!0,isPot:!0,array:h,width:64}),de:L.instance({isFloat:!1,isPot:!0,width:1,array:new Uint8Array([0,0,0,0])})}}L.Sf()},Xg:function(){return C.de},Sf:function(){g[1]=aa.Vb(b)},Df:function(){x=t=[b.RGBA,b.RGBA,b.RGBA,b.RGBA]},Sd:function(h){A.set("s1");la.P();var F=h.F(),K=h.U();b.viewport(0,0,F,K);
h.g(0);ma.l(!1,!1)},mh:function(h,F){L.Sd(h);b.readPixels(0,0,h.F(),h.U(),b.RGBA,b.UNSIGNED_BYTE,F)},nh:function(h,F){L.Sd(h);return aa.xb(0,0,h.F(),h.U(),F)},kd:function(h,F,K,P,da,ra,za){h.activeTexture(h.TEXTURE0);var w=h.createTexture();h.bindTexture(h.TEXTURE_2D,w);da=da instanceof Float32Array?da:new Float32Array(da);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,
h.NEAREST);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST);h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,ra);h.texImage2D(h.TEXTURE_2D,0,h.RGBA,K,P,0,h.RGBA,h.FLOAT,da);h.bindTexture(h.TEXTURE_2D,null);h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,!1);za&&(la.ha(),A.Ra(h));h.viewport(0,0,K,P);h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,F,0);h.bindTexture(h.TEXTURE_2D,w);za?ma.l(!0,!0):U.ab(h);h.deleteTexture(w);k&&(v[0]=-1,E=null,q=0)},Fb:function(h){h!==q&&(b.activeTexture(r[h]),
q=h)},instance:function(h){function F(){R=void 0!==w.I.videoWidth?w.I.videoWidth:w.I.width;T=void 0!==w.I.videoHeight?w.I.videoHeight:w.I.height}function K(D){var S=b.getError();if("FUCKING_BIG_ERROR"===S)return!1;b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D);S=b.getError();S!==b.NO_ERROR&&fa!==b.RGBA&&(fa=b.RGBA,b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D));return!0}function P(){if(!Ab){a(ta);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,Aa);w.isPot?(b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,w.isMirrorX?b.MIRRORED_REPEAT:
b.REPEAT),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,w.isMirrorY?b.MIRRORED_REPEAT:b.REPEAT)):(b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE));w.isAnisotropicFiltering&&"undefined"!==typeof JESETTINGS&&b.texParameterf(b.TEXTURE_2D,JEContext.Kg().TEXTURE_MAX_ANISOTROPY_EXT,JESETTINGS.Wf);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,w.isLinear?b.LINEAR:b.NEAREST);w.isLinear?b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,
w.isMipmap&&!Ka?b.NEAREST_MIPMAP_LINEAR:b.LINEAR):b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,w.isMipmap&&!Ka?b.NEAREST_MIPMAP_NEAREST:b.NEAREST);fa=t[w.sb-1];ja=x[w.sb-1];ha=g[nb];if(aa.la()){var D=aa.Re();fa===b.RGBA&&ha===b.FLOAT?w.isMipmap||w.isLinear?ja=Ca.Te(b):aa.Uc()?D&&(ja=D):ja=b.RGBA16F||b.RGBA:fa===b.RGB&&ha===b.FLOAT&&D&&(ja=D,fa=b.RGBA)}if(w.S&&!w.isFloat||w.isFloat&&w.isMipmap&&Ca.hf())ja=aa.Se(),ha=aa.Vb(b);w.ic&&(ab=w.ic);w.isSrgb&&4===w.sb&&(fa=JEContext.Vg());if(w.I)K(w.I);
else if(w.url)K(Ga);else if(ua){D=ua;try{"FUCKING_BIG_ERROR"!==b.getError()&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,D),b.getError()!==b.NO_ERROR&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null),b.getError()!==b.NO_ERROR&&b.texImage2D(b.TEXTURE_2D,0,b.RGBA,R,T,0,b.RGBA,b.UNSIGNED_BYTE,null)))}catch(hc){b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null)}w.isKeepArray||(ua=null)}else D=b.getError(),"FUCKING_BIG_ERROR"!==D&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null),D=b.getError(),D!==b.NO_ERROR&&
(fa=b.RGBA,w.S&&ha!==b.FLOAT&&(ha=b.FLOAT,b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null))));if(w.isMipmap)if(!Ka&&ca)ca.Ub(),bb=!0;else if(Ka){D=Math.log2(Math.min(R,T));Ra=Array(1+D);Ra[0]=ta;for(var S=1;S<=D;++S){var ka=Math.pow(2,S),V=R/ka;ka=T/ka;var La=b.createTexture();a(La);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texImage2D(b.TEXTURE_2D,0,ja,V,ka,0,fa,ha,null);a(null);Ra[S]=La}bb=!0}a(null);v[q]=-1;Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,
!1);Ta=!0;w.oa&&ca&&(w.oa(ca),w.oa=null)}}function da(){for(var D=R*T,S=2*D,ka=3*D,V=0;V<D;++V)ya[0][V]=Ua[V],ya[1][V]=Ua[V+D],ya[2][V]=Ua[V+S],ya[3][V]=Ua[V+ka]}function ra(){var D=R*T*4;Da=[new Uint8Array(D),new Uint8Array(D),new Uint8Array(D),new Uint8Array(D)];ya=[new Float32Array(Da[0].buffer),new Float32Array(Da[1].buffer),new Float32Array(Da[2].buffer),new Float32Array(Da[3].buffer)];cb=new Uint8Array(4*D);Ua=new Float32Array(cb.buffer);Va=!0}function za(){Ea.Gb=new Uint8Array(R*T*4);Ea.ld=
new Float32Array(Ea.buffer);Ea.Y=!0}var w=Object.assign({},H,h),Wa=l++;null===w.isFlipY&&(w.isFlipY=w.url||w.array?!0:!1);w.data&&(w.array="string"===typeof w.data?Ib(w.data):w.isFloat?new Float32Array(w.data):new Uint8Array(w.data),w.isFlipY=!1);var nb=0,Bb=w.I?!0:!1,Xa=null,ob=null,Cb=!1,pb=null;w.S=w.S||w.isFloat;w.S&&(nb=1);!w.df&&w.isFloat&&u&&!aa.Uc()&&(w.isFloat=!1);w.isFloat&&(nb=2);w.isAnisotropicFiltering&&M&&!JEContext.$g()&&(w.isAnisotropicFiltering=!1);var ta=w.Zb||b.createTexture(),
Ga=null,ua=!1,R=0,T=0,Ta=!1,Ab=!1,Va=!1,ya=null,Da=null,cb=null,Ua=null,ja=null,fa=null,ha=null,Aa=w.isFlipY,Wb=(h=w.S&&w.isMipmap)&&Ca.te(),Ka=h&&Wb?!0:!1,Ra=null,ab=-1,bb=!1,Ea={Y:!1,Gb:null,ld:null};w.width&&(R=w.width,T=w.height?w.height:R);var ca={get:function(){return ta},F:function(){return R},U:function(){return T},Yg:function(){return w.url},ah:function(){return w.isFloat},dh:function(){return w.S},eh:function(){return w.isLinear},Ub:function(){b.generateMipmap(b.TEXTURE_2D)},re:function(D,
S){Ka?(D||(D=ca.pd()),L.Fb(S),a(Ra[D]),v[S]=-1):ca.g(S)},pd:function(){-1===ab&&(ab=Math.log(R)/Math.log(2));return ab},Le:function(D){if(Ka){D||(D=ca.pd());A.set("s12");L.Fb(0);for(var S=R,ka=T,V=1;V<=D;++V)S/=2,ka/=2,A.sa("u8",.25/S,.25/ka),b.viewport(0,0,S,ka),a(Ra[V-1]),b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,Ra[V],0),ma.l(!1,1===V);v[0]=-1}else ca.Ub()},vh:function(D){(Bb=!Ub.Mf(D))?(ua=null,w.I=D,F()):ua=D},g:function(D){if(!Ta)return!1;L.Fb(D);if(v[D]===Wa)return!1;
a(ta);v[D]=Wa;return!0},Rc:function(D){b.activeTexture(r[D]);q=D;a(ta);v[D]=Wa},u:function(){E=ca;b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,ta,0)},da:function(){E=ca;b.viewport(0,0,R,T);b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,ta,0)},Fc:L.Fc,resize:function(D,S){R=D;T=S;P()},clone:function(D){D=L.instance({width:R,height:T,S:w.S,isFloat:w.isFloat,isLinear:w.isLinear,isMirrorY:w.isMirrorY,isFlipY:D?!Aa:Aa,isPot:w.isPot});xa.set("s0");la.ha();D.u();b.viewport(0,
0,R,T);ca.g(0);ma.l(!0,!0);return D},Hf:function(){b.viewport(0,0,R,T)},remove:function(){b.deleteTexture(ta);Ab=!0;p.splice(p.indexOf(ca),1);ca=null},refresh:function(){ca.Rc(0);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);Bb?b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,w.I):b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,ua);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},Rd:function(){Va||ra();b.readPixels(0,0,R,4*T,b.RGBA,b.UNSIGNED_BYTE,cb);da();return ya},xf:function(){Va||ra();return aa.xb(0,0,R,4*T,cb).then(function(){da();
return ya})},zf:function(){Ea.Y||za();b.readPixels(0,0,R,T,b.RGBA,b.UNSIGNED_BYTE,Ea.Gb);return Ea.ld},yf:function(){Ea.Y||za();return aa.xb(0,0,R,T,Ea.Gb)},Zc:function(D){la.P();A.set("s13");ca.g(0);if(D)b.viewport(0,0,R,T),A.xc("u9",.25,.25,.25,.25),ma.l(!1,!0);else for(D=0;4>D;++D)b.viewport(0,T*D,R,T),A.xc("u9",J[D]),ma.l(!1,0===D)},Rf:function(D){var S=ha===g[0]&&!m();a(ta);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);S?(Cb||(Xa=document.createElement("canvas"),Xa.width=R,Xa.height=T,ob=Xa.getContext("2d"),
pb=ob.createImageData(R,T),Cb=!0),pb.data.set(D),ob.putImageData(pb,0,0),b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,Xa)):b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,D);v[q]=Wa;Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},Gh:function(D,S){a(ta);S&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D);v[q]=Wa;S&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},th:function(D,S){var ka=R*T,V=4*ka;D=w.S?D?"RGBE":"JSON":"RGBA";S&&(D=S);S=aa.la()&&!1;var La=null;switch(D){case "RGBE":La="s43";
break;case "JSON":La=S?"s0":"s13";break;case "RGBA":case "RGBAARRAY":La="s7"}Va||("RGBA"===D||"RGBE"===D||"RGBAARRAY"===D?(Da=new Uint8Array(V),Va=!0):"JSON"!==D||S||ra());la.P();A.set(La);ca.g(0);V=null;if("RGBA"===D||"RGBE"===D||"RGBAARRAY"===D){b.viewport(0,0,R,T);ma.l(!0,!0);b.readPixels(0,0,R,T,b.RGBA,b.UNSIGNED_BYTE,Da);if("RGBAARRAY"===D)return{data:Da};I||(N=document.createElement("canvas"),z=N.getContext("2d"),I=!0);N.width=R;N.height=T;ka=z.createImageData(R,T);ka.data.set(Da);z.putImageData(ka,
0,0);V=N.toDataURL("image/png")}else if("JSON"===D)if(S)V=new Float32Array(ka),b.viewport(0,0,R,T),ma.l(!0,!0),b.readPixels(0,0,R,T,b.RGBA,b.FLOAT,V);else{for(V=0;4>V;++V)b.viewport(0,T*V,R,T),A.xc("u9",J[V]),ma.l(!V,!V);ca.Rd();V=Array(ka);for(S=0;S<ka;++S)V[4*S]=ya[0][S],V[4*S+1]=ya[1][S],V[4*S+2]=ya[2][S],V[4*S+3]=ya[3][S]}return{format:D,data:V,width:R,height:T,isMirrorY:w.isMirrorY,isFlipY:"RGBA"===D?w.isFlipY:!w.isFlipY}}};w.isMipmap&&!Ka&&Ta&&!bb&&(ca.Ub(),bb=!0);if(w.url)a(ta),b.texImage2D(b.TEXTURE_2D,
0,b.RGBA,1,1,0,b.RGBA,b.UNSIGNED_BYTE,null),Ga=new Image,Ga.jg="Anonymous",Ga.crossOrigin="Anonymous",Ga.src=w.url,Ga.onload=function(){R=Ga.width;T=Ga.height;P()};else if(w.I){var Db=function(){F();R?P():setTimeout(Db,1)};Db()}else w.array?(w.S&&!w.isFloat?w.array instanceof Uint16Array?(ua=w.array,P()):e()?(ua=d(w.array),P()):(P(),L.kd(b,ta,ca.F(),ca.U(),w.array,Aa,!0)):(ua=w.isFloat?w.array instanceof Float32Array?w.array:new Float32Array(w.array):w.array instanceof Uint8Array?w.array:new Uint8Array(w.array),
P()),w.isKeepArray||(ua&&ua!==w.array&&(ua=null),delete w.array)):w.Zb?Ta=!0:P();ca.Ug=ca.F;w.oa&&Ta&&(w.oa(ca),w.oa=null);p.push(ca);return ca},P:function(h){h!==q&&(b.activeTexture(r[h]),q=h);v[h]=-1;a(null)},Zf:function(h){C.random.g(h)},Fc:function(){E=null;b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,null,0)},reset:function(){0!==q&&b.activeTexture(r[0]);for(var h=0;h<r.length;++h)v[h]=-1;q=-1},qh:function(){q=-1},Of:function(){for(var h=0;h<r.length;++h)L.P(h)},md:function(){C&&
(C.random.remove(),C.de.remove())},Fh:function(h,F){if("RGBA"===h.format||"RGBE"===h.format){var K=new Image;K.src=h.data;K.onload=function(){L.instance({isMirrorY:h.isMirrorY,isFlipY:h.isFlipY,isFloat:!1,I:K,oa:function(P){if("RGBA"===h.format)F(P);else{var da=h.width,ra=h.height,za=L.instance({isMirrorY:h.isMirrorY,isFloat:!0,width:da,height:ra,isFlipY:h.isFlipY});la.ha();b.viewport(0,0,da,ra);A.set("s44");za.u();P.g(0);ma.l(!0,!0);L.P(0);F(za);b.flush();setTimeout(P.remove,50)}}})}}else"JSON"===
h.format?F(L.instance({isFloat:!0,isFlipY:h.isFlipY,width:h.width,height:h.height,array:new Float32Array(h.data)})):F(!1)},ze:d,m:function(){E&&(va.ha(),L.Fc(),va.P());L.Of();p.slice(0).forEach(function(h){h.remove()});p.splice(0);k=!1;l=0;"undefined"!==typeof Ca&&Ca.m();C=null}};return L}(),Ob=function(){return{instance:function(a){var c=[Ba.instance(a),Ba.instance(a)],d=[c[1],c[0]],e=d,m={Bf:function(n){e[1].u();e[0].g(n);m.Zd()},uh:function(n){e[1].da();e[0].g(n);m.Zd()},Zd:function(){e=e===c?
d:c},refresh:function(){e[0].refresh();e[1].refresh()},g:function(n){e[0].g(n)},Yf:function(n){e[1].g(n)},Og:function(){return e[0]},Sg:function(){return e[1]},remove:function(){e[0].remove();e[1].remove();e=null}};return m}}}(),ma=function(){function a(l){var v={ea:null,K:null};v.ea=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,v.ea);l.bufferData(l.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),l.STATIC_DRAW);v.K=l.createBuffer();l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,v.K);l.bufferData(l.ELEMENT_ARRAY_BUFFER,
new Uint16Array([0,1,2]),l.STATIC_DRAW);return v}var c=null,d=0,e=!1,m=[],n=-2,q=-2,r={reset:function(){q=n=-2},A:function(){e||(c=a(b),r.Ja(),e=!0)},instance:function(l){var v=d++,C=l.K?l.K.length:0,E="undefined"===typeof l.mode?b.STATIC_DRAW:l.mode,g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,l.ea instanceof Float32Array?l.ea:new Float32Array(l.ea),E);n=v;var t=null,x=null,k=null;if(l.K){t=b.createBuffer();b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,t);var p=null;65536>
l.K.length?(p=Uint16Array,x=b.UNSIGNED_SHORT,k=2):(p=Uint32Array,x=b.UNSIGNED_INT,k=4);p=l.K instanceof p?l.K:new p(l.K);b.bufferData(b.ELEMENT_ARRAY_BUFFER,p,E);q=v}var H={se:function(I){n!==v&&(b.bindBuffer(b.ARRAY_BUFFER,g),n=v);I&&xa.yc()},pe:function(){q!==v&&(b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,t),q=v)},bind:function(I){H.se(I);H.pe()},lg:function(){b.drawElements(b.TRIANGLES,C,x,0)},mg:function(I,N){b.drawElements(b.TRIANGLES,I,x,N*k)},remove:function(){b.deleteBuffer(g);l.K&&b.deleteBuffer(t);
H=null}};m.push(H);return H},Ja:function(){-1!==n&&(b.bindBuffer(b.ARRAY_BUFFER,c.ea),n=-1);-1!==q&&(b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,c.K),q=-1)},l:function(l,v){l&&ma.Ja();v&&xa.Ba();b.drawElements(b.TRIANGLES,3,b.UNSIGNED_SHORT,0)},ab:function(l){l=l||b;var v=a(l);l.bindBuffer(l.ARRAY_BUFFER,v.ea);l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,v.K);xa.zb(l);l.clear(l.COLOR_BUFFER_BIT);l.drawElements(l.TRIANGLES,3,l.UNSIGNED_SHORT,0);l.flush();l.bindBuffer(l.ARRAY_BUFFER,null);l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,
null);l.deleteBuffer(v.ea);l.deleteBuffer(v.K);r.reset();e&&(r.Ja(),xa.Ba())},md:function(){var l=b,v=c;l.deleteBuffer(v.ea);l.deleteBuffer(v.K)},m:function(){r.md();m.forEach(function(l){l.remove()});b.bindBuffer(b.ARRAY_BUFFER,null);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,null);r.reset();e=!1;m.splice(0);d=0}};return r}(),la=function(){var a=null,c=null,d=null,e=!1,m=[],n={J:-2,jd:1},q={nb:function(){return e},A:function(){if(!e){a=b.createFramebuffer();var r=aa.la();c=r&&b.DRAW_FRAMEBUFFER?b.DRAW_FRAMEBUFFER:
b.FRAMEBUFFER;d=r&&b.READ_FRAMEBUFFER?b.READ_FRAMEBUFFER:b.FRAMEBUFFER;e=!0}},Lg:function(){return c},Ue:function(){return d},eb:function(){return b.FRAMEBUFFER},Tg:function(){return n},Dg:function(){return a},instance:function(r){void 0===r.vd&&(r.vd=!1);var l=r.N?r.N:null,v=r.width,C=void 0!==r.height?r.height:r.width,E=a,g=null,t=!1,x=!1,k=0;l&&(v=v?v:l.F(),C=C?C:l.U());var p={Wd:function(){t||(E=b.createFramebuffer(),t=!0,k=n.jd++)},je:function(){p.Wd();p.u();g=b.createRenderbuffer();b.bindRenderbuffer(b.RENDERBUFFER,
g);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,v,C);b.framebufferRenderbuffer(c,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,g);b.clearDepth(1)},bind:function(H,I){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k);l&&l.u();I&&b.viewport(0,0,v,C);H&&b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)},Xf:function(){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k)},clear:function(){b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)},fg:function(){b.clear(b.COLOR_BUFFER_BIT)},gg:function(){b.clear(b.DEPTH_BUFFER_BIT)},Hf:function(){b.viewport(0,
0,v,C)},u:function(){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k)},rtt:function(H){l=H;n.J!==k&&(b.bindFramebuffer(b.FRAMEBUFFER,E),n.J=k);H.u()},P:function(){b.bindFramebuffer(c,null);n.J=-1},resize:function(H,I){v=H;C=I;g&&(b.bindRenderbuffer(b.RENDERBUFFER,g),b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,v,C))},remove:function(){E===a||x||(b.bindFramebuffer(c,E),b.framebufferTexture2D(c,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,null,0),g&&b.framebufferRenderbuffer(c,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,
null),b.bindFramebuffer(c,null),b.deleteFramebuffer(E),g&&b.deleteRenderbuffer(g));x=!0}};r.vd&&p.je();m.push(p);return p},P:function(){b.bindFramebuffer(c,null);n.J=-1},Pf:function(){b.bindFramebuffer(c,null);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);b.viewport(0,0,aa.F(),aa.U());n.J=-1},reset:function(){n.J=-2},ha:function(){0!==n.J&&(b.bindFramebuffer(c,a),n.J=0)},clear:function(){b.viewport(0,0,aa.F(),aa.U());b.clear(b.COLOR_BUFFER_BIT)},m:function(){q.P();m.forEach(function(r){r.remove()});
null!==a&&(b.deleteFramebuffer(a),a=null);q.reset();e=!1;m.splice(0);n.jd=1}};return q}(),aa=function(){function a(){e="undefined"===typeof Qa?JEContext:Qa;m=!0}function c(k,p){for(var H=0;H<k.length;++H){var I=p.getExtension(k[H]);if(I)return I}return null}function d(){null!==g.Cb&&(clearInterval(g.Cb),g.Cb=null);g.Oa=!1}var e=null,m=!1,n={xd:!1,Ac:null,Bc:null,Bd:!1,gf:!1,Cc:null,Cd:!1,Dc:null,yd:!1,Hb:null,bf:!1,Ib:null,cf:!1},q=null,r={ja:!0,ka:!0,Tb:!0,Qd:!1},l=null,v=!0,C=null,E=null,g={Oa:!1,
va:null,ib:null,Yb:-1,X:null,Cb:null},t="undefined"===typeof window?{}:window,x={A:function(){if(m)return!0;x.reset();m||a();var k=b;if(!q.xd){q.Ac=x.ed(k);t.GL_EXT_FLOAT=q.Ac;q.Bd=q.Ac?!0:!1;if(q.Bd||x.la())q.Bc=x.fd(k),q.gf=q.Bc?!0:!1,t.GL_EXT_FLOATLINEAR=q.Bc;q.xd=!0}if(!q.yd){q.Cc=x.Za(k);q.Cc&&(q.Cd=!0,t.GL_EXT_HALFFLOAT=q.Cc);if(q.Cd||x.la())q.Dc=x.gd(k),t.GL_EXT_HALFFLOATLINEAR=q.Dc;q.Zg=q.Dc?!0:!1;q.yd=!0}q.Hb=x.cd(k);q.bf=q.Hb?!0:!1;t.GL_EXT_COLORBUFFERFLOAT=q.Hb;q.Ib=x.dd(k);q.cf=q.Ib?!0:
!1;t.GL_EXT_COLORBUFFERHALFFLOAT=q.Ib;la.A();Ba.A();if(!x.De())return!1;ma.A();Ba.af();return!0},reset:function(){q=Object.assign({},n);l=Object.assign({},r)},F:function(){m||a();return e.F()},U:function(){m||a();return e.U()},la:function(){m||a();return e.la()},bd:function(k){x.cd(k);x.dd(k);x.ed(k);x.fd(k);x.Za(k);x.gd(k)},cd:c.bind(null,["EXT_color_buffer_float","WEBGL_color_buffer_float","OES_color_buffer_float"]),dd:c.bind(null,["EXT_color_buffer_half_float","WEBGL_color_buffer_half_float","OES_color_buffer_half_float"]),
ed:c.bind(null,["OES_texture_float","MOZ_OES_texture_float","WEBKIT_OES_texture_float"]),fd:c.bind(null,["OES_texture_float_linear","MOZ_OES_texture_float_linear","WEBKIT_OES_texture_float_linear"]),Za:c.bind(null,["OES_texture_half_float","MOZ_OES_texture_half_float","WEBKIT_OES_texture_half_float"]),gd:c.bind(null,["OES_texture_half_float_linear","MOZ_OES_texture_half_float_linear","WEBKIT_OES_texture_half_float_linear"]),Vb:function(k){var p=x.Za(k);return p&&p.HALF_FLOAT_OES?p.HALF_FLOAT_OES:
k.HALF_FLOAT||k.FLOAT},Re:function(){return E||b.RGBA32F||b.RGBA},Se:function(){return C||b.RGBA16F||b.RGBA},Oe:function(){return l},Uc:function(){return l.ja},bg:function(){return l.ka},ag:function(){return l.Tb},ue:function(){return l.Qd&&v},be:function(k){v=k;!k&&g.Oa&&(b.deleteSync(g.ib),b.bindBuffer(g.X,null),g.Oa=!1)},Ab:function(k,p,H){function I(){k.bindTexture(k.TEXTURE_2D,null);k.bindFramebuffer(N,null);k.deleteTexture(M);k.deleteFramebuffer(J)}var N=k.FRAMEBUFFER,z=k.NEAREST,J=k.createFramebuffer();
k.bindFramebuffer(N,J);var M=k.createTexture();k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,M);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,!1);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_MAG_FILTER,z);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_MIN_FILTER,z);k.texImage2D(k.TEXTURE_2D,0,p,3,3,0,k.RGBA,H,null);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,k.TEXTURE_2D,M,0);
if(k.checkFramebufferStatus(k.READ_FRAMEBUFFER||k.FRAMEBUFFER)!==k.FRAMEBUFFER_COMPLETE)return I(),!1;xa.wc(k);k.clearColor(0,0,0,0);k.viewport(0,0,3,3);k.disable(k.DEPTH_TEST);k.clear(k.COLOR_BUFFER_BIT);ma.ab(k);k.bindFramebuffer(N,null);xa.Ra(k);k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,M);ma.ab(k);p=new Uint8Array(36);k.readPixels(0,0,3,3,k.RGBA,k.UNSIGNED_BYTE,p);I();for(H=0;36>H;++H)if(3!==H%4&&3<Math.abs(p[H]-127))return!1;return!0},Lb:function(k){var p={ja:!1,ka:!1};k.disable(k.BLEND);
k.clearColor(0,0,0,0);k.clear(k.COLOR_BUFFER_BIT);k.RGBA32F&&x.Ab(k,k.RGBA32F,k.FLOAT)&&(p.ja=!0,E=k.RGBA32F);!p.ja&&x.Ab(k,k.RGBA,k.FLOAT)&&(p.ja=!0,E=k.RGBA);var H=x.Vb(k);C=null;k.RGBA16F&&x.Ab(k,k.RGBA16F,H)&&(p.ka=!0,C=k.RGBA16F);!p.ka&&x.Ab(k,k.RGBA,H)&&(p.ka=!0,C=k.RGBA);return p},Ee:function(){var k=la.instance({width:2});k.Wd();var p=Ba.instance({width:2,isFloat:!0,sb:3});k.u();p.u();b.flush();b.checkFramebufferStatus(la.Ue())!==b.FRAMEBUFFER_COMPLETE?(Ba.Df(),l.Tb=!1):l.Tb=!0;k.remove();
p.remove()},Fe:function(){var k=!1;x.la()&&(k="PIXEL_PACK_BUFFER STREAM_READ SYNC_GPU_COMMANDS_COMPLETE WAIT_FAILED fenceSync deleteSync createBuffer".split(" ").every(function(p){return"undefined"!==typeof b[p]}));l.Qd=k},De:function(){var k=x.Lb(b);Object.assign(l,k);if(!l.ja&&!l.ka)return!1;x.Ee();x.Fe();return!0},xb:function(k,p,H,I,N){if(!x.ue())return b.readPixels(k,p,H,I,b.RGBA,b.UNSIGNED_BYTE,N),Promise.resolve(N);null===g.va&&(g.X=b.PIXEL_PACK_BUFFER,g.va=b.createBuffer(),g.Yb=-1);b.bindBuffer(g.X,
g.va);N.byteLength!==g.Yb&&(b.bufferData(g.X,N.byteLength,b.STREAM_READ),g.Yb=N.byteLength);b.readPixels(k,p,H,I,b.RGBA,b.UNSIGNED_BYTE,0);g.ib=b.fenceSync(b.SYNC_GPU_COMMANDS_COMPLETE,0);b.flush();return new Promise(function(z,J){function M(){if(!g.Oa)return d(),J(),!1;switch(b.clientWaitSync(g.ib,0,0)){case b.TIMEOUT_EXPIRED:case b.WAIT_FAILED:return!1;default:return d(),b.deleteSync(g.ib),b.getBufferSubData(g.X,0,N),b.bindBuffer(g.X,null),z(N),!0}}d();g.Oa=!0;M()||(g.Cb=setInterval(M,0))})},m:function(){d();
Ba.m();la.m();ma.m();null!==g.va&&(b.deleteBuffer(g.va),g.va=null);xa.reset();m=!1}};return x}(),U=ma,va=la,Y=Ba,Ca=function(){function a(J,M,u,f){p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,f?p.NEAREST_MIPMAP_NEAREST:p.LINEAR);var y=null;if(null!==u)try{y=p.getError();if("FUCKING_BIG_ERROR"===y)return!1;p.texImage2D(p.TEXTURE_2D,0,J,4,4,0,p.RGBA,M,u);y=p.getError();if(y!==p.NO_ERROR)return!1}catch(G){return!1}f&&p.generateMipmap(p.TEXTURE_2D);p.clear(p.COLOR_BUFFER_BIT);U.ab(p);y=p.getError();
if("FUCKING_BIG_ERROR"===y)return!1;p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,C);y=p.getError();y===p.INVALID_OPERATION&&"undefined"!==typeof p.PIXEL_PACK_BUFFER&&(p.bindBuffer(p.PIXEL_PACK_BUFFER,null),p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,C),y=p.getError());if(y!==p.NO_ERROR)return!1;u=!0;for(f=0;16>f;++f)u=u&&4>Math.abs(C[f]-127);u&&(l.Nd=M,l.ud=J);return u}function c(J,M){return H.ja&&a(J,p.FLOAT,new Float32Array(E),M)?(r=q.Nc,!0):!1}function d(J,M,u){if(!H.ka)return!1;var f=Ba.ze(E),
y=aa.Za(p);if(y&&y.HALF_FLOAT_OES&&a(J,y.HALF_FLOAT_OES,f,M)||p.HALF_FLOAT&&a(J,p.HALF_FLOAT,f,M))return r=q.Ga,!0;f=new Float32Array(E);if(a(J,p.FLOAT,f,M))return r=q.Ga,!0;p.bindTexture(p.TEXTURE_2D,u);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,2,2,0,p.RGBA,p.UNSIGNED_BYTE,null);p.bindFramebuffer(l.Xa,z);Ba.kd(p,u,2,2,f,!1,!1);p.bindFramebuffer(l.Xa,null);p.bindTexture(p.TEXTURE_2D,u);return a(J,null,null,M)?(r=q.Ga,!0):!1}function e(J,M,u){v=!0;if(d(J,!0,u)||c(M,!0))return!0;v=!1;return d(J,!1,u)||c(M,
!1)?!0:!1}function m(J){if(r===q.R){p=J||b;r=q.RGBA8;v=!0;aa.bd(p);H||(H=aa.Lb(p));va.reset();z=p.createFramebuffer();l.Xa=p.DRAW_FRAMEBUFFER||p.FRAMEBUFFER;p.bindFramebuffer(l.Xa,null);p.clearColor(0,0,0,0);p.viewport(0,0,2,2);A.R();I=A.Ra(p);J=p.createTexture();p.activeTexture(p.TEXTURE0);p.bindTexture(p.TEXTURE_2D,J);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.REPEAT);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.REPEAT);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);N=J;var M=
J=p.RGBA,u=p.RGBA16F,f=p.RGBA32F;f&&(J=f);u&&(M=u);if((u||f)&&e(M,J,N))return n(),!0;J=M=p.RGBA;if(e(M,J,N))return n(),!0;r=q.RGBA8;n();return!1}}function n(){p.deleteProgram(I.ra);p.deleteTexture(N);N=I=null}for(var q={R:-1,Nc:3,Ga:2,RGBA8:0},r=q.R,l={Nd:null,ud:null,Xa:null},v=!0,C=new Uint8Array(16),E=Array(64),g=0;4>g;++g)for(var t=0;4>t;++t){var x=0===(t+g)%2?1:0,k=4*g+t;E[4*k]=x;E[4*k+1]=x;E[4*k+2]=x;E[4*k+3]=x}var p=null,H=null,I=null,N=null,z=null;return{te:function(J){m(J);return v},Tc:function(J,
M){r===q.R&&(typeof("undefined"!==M)&&(H=M),m(J));return r!==q.RGBA8},bh:function(J){m(J);return r===q.Nc},hf:function(J){m(J);return r===q.Ga},Mg:function(J){m(J);return l.Nd},Te:function(J){m(J);return l.ud},m:function(){p=null;v=!0;r=q.R;H=null}}}(),Xb=function(){return{instance:function(a){var c=Y.instance(a.alpha),d=Y.instance(a.beta);return{He:function(){c.g(1);d.g(2)}}}}}(),Gb=function(){return{instance:function(a){var c=null,d=!1,e=!1,m=null,n=!1,q=!1,r=null,l="undefined"===typeof a.preprocessing?
!1:a.preprocessing,v="undefined"===typeof a.preprocessingSize?a.size:a.preprocessingSize;a.mask&&(d=!0,ba&&void 0!==ba.oe&&(a.mask=ba.oe+a.mask),c=Y.instance({isFloat:!1,url:a.mask}));var C=!1;a.customInputShader&&(C="s45",A.Pc({name:"_",id:C,h:a.customInputShader,Eh:["uSource"],precision:"lowp"}),A.T(C,[{type:"1i",name:"_",value:0}]));switch(l){case "sobel":r="s32";n=!0;break;case "meanNormalization":r="s33";n=!0;break;case "grayScale":r="s29";n=!1;break;case "grayScaleTilt":r="s30";q=!0;n=!1;break;
case "rgbGrayTilt":r="s31";q=!0;n=!1;break;case "copy":r=C?C:"s0";break;case "inputLightRegulation":r=C?C:"s29";m=Yb.instance({td:v,Md:a.size,Id:a.nBlurPass,mb:!1});e=!0;break;case "inputMix0":r="none";m=Zb.instance({D:v,ee:a.varianceMin,Sc:a.blurKernelSizePx,mb:!1});e=!0;break;case "direct":case "none":r="abort";break;default:r="s4"}q&&A.T(r,[{name:"u27",type:"1f",value:a.tilt}]);d&&(r+="Mask");var E=Y.instance({isFloat:!1,isPot:!1,width:a.size}),g={F:function(){return v},Wb:function(){return g.F()},
Xe:function(){return e?m.Xb():E},V:function(t){va.ha();"abort"!==r&&("none"!==r&&(A.set(r),n&&A.G("u28",1/a.size),E.da(),d&&c.g(1),U.l(!1,!1),E.g(0),t=E),e&&m.process(t))},m:function(){E.remove();d&&c.remove()}};return g}}}(),Hb=function(){return{instance:function(a){function c(h){m.forEach(function(F,K){n[K][0]=h[0][F];n[K][1]=h[1][F];n[K][2]=h[2][F];n[K][3]=h[3][F]});return n}"undefined"===typeof a.normalize&&(a.normalize=!1);var d={input:null,Ua:null,bc:null,ba:null,tb:null,oc:null,pc:null},e=
null,m=[],n=[],q=!1,r=null,l=!0,v=-1,C=a.isReorganize?a.isReorganize:!1,E=a.kernelsCount?!0:!1,g=a.dynPelu?Xb.instance(a.dynPelu):!1,t=g?!0:!1,x={isEnabled:!1};a.ff?(a.sparsity="undefined"!==typeof a.sparsity?a.sparsity:a.vb.Wb(),l=!1):"full"===a.connectivityUp&&(a.sparsity=a.vb.Wb());var k={elu:"s16",elu01:"s17",relu:"s15",arctan:"s19",sigmoid:"s14",copy:"s0",softplus:"s20",dynPelu:"s18"}[a.activation],p=a.sparsity*a.sparsity,H=!1,I=a.size,N="";if(a.maxPooling){switch(a.maxPooling.size){case 2:N=
"s34";break;case 4:N="s35"}H=!0;I/=a.maxPooling.size;d.oc=Y.instance({isFloat:!0,isPot:!1,width:I})}var z=void 0!==a.rf&&a.rf?!0:!1,J=null,M=null,u=null;if(z){J="s46"+a.index.toString();A.sd("s46",J,[((a.normalization.n-1)/2).toFixed(1)]);A.T(J,[{type:"1i",name:"u1",value:0},{type:"2f",name:"u8",value:[1/a.size,1/a.size]},{type:"1f",name:"u7",value:a.normalization.alpha},{type:"1f",name:"u10",value:a.normalization.beta},{type:"1f",name:"u31",value:a.normalization.k}]);var f={isFloat:!0,isPot:!0,width:a.size};
M=Y.instance(f);u=Y.instance(f)}var y=-1,G=null;l&&(d.ba=Y.instance({isFloat:!0,isPot:!1,width:a.size}));d.Ua=Y.instance(a.bias);var L={F:function(){return a.size},Wb:function(){return I},nd:function(){return a.classesCount},qe:function(h){e.g(h)},uf:function(){a.remap&&a.remap.isEnabled&&(x={isEnabled:!0,kf:Y.instance({isFloat:!1,isFlipY:!1,array:new Uint8Array(a.remap.maskTexture.data),width:a.remap.maskTexture.width,isPot:!1}),pb:a.remap.layers.map(function(h){return a.parent.We(h)}),depth:a.remap.depth})},
Ef:function(){switch(a.connectivityUp){case "direct":G=$b.instance(a.connectivity);break;case "square":G=ac.instance(a.connectivity);break;case "squareFast":G=bc.instance(a.connectivity,a.activation);break;case "full":G=cc.instance(a.connectivity);break;case "conv":v=a.kernelsCount,G=dc.instance(a.connectivity),C&&(d.tb=Y.instance({width:I,isFloat:!0,isFlipY:!1,isPot:!1}))}if(G.Ca){var h=a.size*a.sparsity;y=Math.log(h/a.size)/Math.log(2);d.input=Y.instance({isMipmap:!0,isFloat:!0,isPot:!0,width:h,
ic:y});d.bc=Y.instance({isFloat:!0,isPot:!0,width:a.size})}},V:function(h,F){e=h;G.Ca?(d.input.da(),E&&d.Ua.g(2),G.V(x),d.input.g(0),d.input.Le(y),d.bc.da(),E?A.set("s0"):(A.set("s28"),A.G("u26",p),d.Ua.g(1)),d.input.re(y,0),U.l(!1,!1),A.set(k),z?M.u():d.ba.u(),d.bc.g(0),t&&g.He(),U.l(!1,!1)):(d.ba.da(),d.Ua.g(1),G.V());z&&(A.set(J),u.u(),M.g(0),U.l(!1,!1),A.set("s47"),A.G("u7",1),d.ba.u(),u.g(1),U.l(!1,!1));if(l)return H?(d.oc.da(),d.ba.g(0),A.set(N),A.sa("u8",1/a.size,1/a.size),U.l(!1,!1),F=d.oc):
F=d.ba,F.g(0),C&&(d.tb.u(),A.set("s22"),A.sa("u13",v,I/v),U.l(!1,!1),F=d.tb,d.tb.g(0)),F;var K=d.ba;a.normalize&&(A.set("gpuRawAvg"===q?"s9":"s8"),A.G("u4",1/a.size),d.pc.da(),d.ba.g(0),U.l(!1,!1),K=d.pc);h=null;switch(q){case "cpuRGBA2Float":K.Zc(!1);F?h=L.vf(K).then(r):(K=L.wf(K),r(K));break;case "cpuMeanFloat":K.Zc(!0);F?h=K.yf().then(r):(K=K.zf(),r(K));break;case "gpuRawAvg":case "gpuRaw":K.g(0);case "none":null!==r&&r(K)}F&&null===h&&(h=Promise.resolve());return h},Be:function(h){h&&(q=h.qc||
"none",r=h.nc||null);d.ba=Y.instance({isFloat:!0,isPot:!0,isMipmap:!1,width:a.size});h="undefined"!==typeof a.classesCount&&a.classesCount?a.classesCount:a.size*a.size;for(var F=0,K=0,P=0;F<h;++F)m.push(K+(a.size-1-P)*a.size),n.push([-1,-1,-1,-1]),++K,K===a.size&&(K=0,++P);a.normalize&&(d.pc=Y.instance({isFloat:!0,isPot:!0,width:a.size}))},vf:function(h){return h.xf().then(c)},wf:function(h){h=h.Rd();c(h);return n},m:function(){for(var h in d){var F=d[h];F&&F.remove()}G&&(G.m(),G=null)}};a.vb&&L.Ef(a.vb);
return L}}}(),$b=function(){return{instance:function(a){var c=Y.instance(a.weights);return{Ca:!0,cb:function(){return 1},m:function(){c.remove()},$e:function(){return c},V:function(){A.set("s27");c.g(1);U.l(!1,!1)}}}}}(),cc=function(){return{instance:function(a){var c=a.fromLayerSize,d=Y.instance(a.weights);return{Ca:!0,cb:function(){return c},m:function(){d.remove()},V:function(e){if(e.isEnabled){A.set("s25");e.kf.g(3);var m,n=Math.min(e.pb.length,e.depth);for(m=0;m<n;++m)e.pb[m].qe(4+m)}else A.set("s24");
A.G("u17",a.toLayerSize);d.g(1);U.l(!1,!1)}}}}}(),ac=function(){return{instance:function(a){for(var c=a.fromLayerSize,d=a.toLayerSize,e=a.toSparsity,m=e*d,n=m/c,q=c/d,r=0,l=0,v=0,C=Array(e*d*e*d*4),E=Array(e*d*e*d*4),g=Array(c*c),t=0;t<g.length;++t)g[t]=0;t=Math.floor(e/2);for(var x=.5/d,k=.5/c,p=.5/m,H=0;H<d;++H)for(var I=Math.round(H*q),N=0;N<d;++N){var z=Math.round(N*q),J=H/d,M=N/d;J+=x;M+=x;for(var u=0;u<e;++u){var f=I+u-t;0>f&&(f+=c);f>=c&&(f-=c);for(var y=0;y<e;++y){var G=r/m,L=l/m,h=z+y-t;
0>h&&(h+=c);h>=c&&(h-=c);var F=f/c,K=h/c;L=1-L-1/m;F+=k;K+=k;G+=p;L+=p;var P=H*e+u,da=N*e+y;da=d*e-da-1;P=da*d*e+P;C[4*P]=G;C[4*P+1]=L;C[4*P+2]=F;C[4*P+3]=K;K=g[h*c+f]++;P=K%n;F=f*n+P;h=h*n+(K-P)/n;h=c*n-1-h;h=h*c*n+F;E[4*h]=G;E[4*h+1]=L;E[4*h+2]=J;E[4*h+3]=M;++r>=m&&(r=0,++l);++v}}}g=null;var ra=Y.instance(a.weights);delete a.weights.data;var za=Y.instance({width:m,isFloat:!0,array:new Float32Array(E),isPot:!0});E=null;var w=Y.instance({width:m,isFloat:!0,array:new Float32Array(C),isPot:!0});C=null;
return{Ca:!0,cb:function(){return n},m:function(){za.remove();w.remove();ra.remove()},V:function(){A.set("s23");ra.g(1);w.g(2);U.l(!1,!1)}}}}}(),dc=function(){return{instance:function(a){var c=a.kernelsCount,d=a.toSparsity,e=d*a.toLayerSize/a.fromLayerSize,m=Y.instance(a.weights);return{Ca:!0,cb:function(){return e},Wg:function(){return d},$e:function(){return m},m:function(){m.remove()},V:function(){A.set("s26");A.G("u23",c);A.G("u24",d);A.G("u17",a.toLayerSize);A.G("u25",a.fromLayerSize);m.g(1);
U.l(!1,!1)}}}}}(),bc=function(){return{instance:function(a,c){var d=a.fromLayerSize,e=a.toLayerSize,m=a.toSparsity,n=a.stride?a.stride:1,q=m*e/d,r=e<d,l=d/e,v=Y.instance(a.weights),C="s48"+[d.toString(),e.toString(),m.toString(),n.toString(),c].join("_");A.Je(C)||(a=Vb.Me(c,"gl_FragColor","gl_FragColor"),e=[{type:"1f",name:"u17",value:e},{type:"1f",name:"u30",value:n}],r&&e.push({type:"1f",name:"u25",value:d}),d=[(r?q:m).toFixed(1),a],r&&d.push(l.toFixed(1)),A.sd(r?"s40":"s39",C,d),A.T(C,e.concat([{type:"1i",
name:"u15",value:0},{type:"1i",name:"u22",value:1},{type:"1i",name:"u14",value:3}])));return{Ca:!1,cb:function(){return q},m:function(){v.remove()},V:function(){A.set(C);v.g(3);U.l(!1,!1)}}}}}(),Yb=function(){return{instance:function(a){var c=a.Id?a.Id:3,d=a.td?a.td:64,e=a.Md?a.Md:64,m=a.mb?!0:!1;a={isFloat:!1,width:d,isPot:!1,isFlipY:!1};var n=Y.instance(a),q=Y.instance(a),r=Y.instance(a),l=Y.instance(a),v=Y.instance({isFloat:!0,width:e,isPot:!1,isFlipY:!1}),C=1/d;return{process:function(E){A.set("s36");
l.u();U.l(m,!1);A.set("s37");for(var g=0;g<c;++g)n.u(),A.sa("u8",C,0),U.l(m,!1),r.u(),l.g(0),U.l(m,!1),q.u(),n.g(0),A.sa("u8",0,C),U.l(m,!1),l.u(),r.g(0),U.l(m,!1),g!==c-1&&q.g(0);A.set("s38");v.u();E.g(0);q.g(1);l.g(2);U.l(m,!1);v.g(0)},Xb:function(){return v}}}}}(),Zb=function(){return{instance:function(a){function c(v){return Y.instance({isFloat:v,width:d.D,isPot:!1,isFlipY:!1})}var d=Object.assign({ee:.1,Sc:9,D:128,mb:!1},a),e=c(!1),m=[c(!1),c(!1),c(!1)],n=[c(!1),c(!1),c(!1)],q=c(!0),r=[e,n[0],
n[1]];a="uniform sampler2D u1;const float e=1.1111,g=2.2222;uniform vec2 u32;varying vec2 vv0;void main(){float b=0.,c=0.;for(float a=-e;a<=e;a+=1.){vec2 i=u32*a,j=vv0+i*g;float d=1.2*a/e,f=exp(-d*d);b+=f*texture2D(u1,j).r,c+=f;}b/=c,gl_FragColor=vec4(b,0.,0.,1.);}".replace("1.1111",Math.round((d.Sc-1)/2).toFixed(2)).replace("2.2222",(1/d.D).toFixed(6));var l={u1:0};A.Qc([{id:"s50",name:"_",h:"uniform sampler2D u1;varying vec2 vv0;const vec3 f=vec3(.2126,.7152,.0722),g=vec3(1.,1.,1.);void main(){vec3 b=texture2D(u1,vv0).rgb;float a=dot(b,f);gl_FragColor=vec4(a,a,a,a);}",
j:l,i:["u1"],precision:"lowp"},{id:"s51",name:"_",h:a,j:l,i:["u1","u32"],precision:"lowp"},{id:"s52",name:"_",h:"uniform sampler2D u33,u34,u35,u36;const float f=1.1111;const vec3 g=vec3(1.,1.,1.);varying vec2 vv0;void main(){vec3 a=texture2D(u33,vv0).rgb;float c=texture2D(u34,vv0).r,d=texture2D(u35,vv0).r,h=texture2D(u36,vv0).r,i=a.r*a.r;vec3 b=vec3(c,d,h),j=max(g*f,abs(i-b*b)),k=sqrt(j);gl_FragColor=vec4(a.r,(a-b)/k);}".replace("1.1111",d.ee.toFixed(4)),j:{u33:0,u34:1,u35:2,u36:3},i:["u33","u34",
"u35","u36"],precision:"highp"}]);return{process:function(){A.set("s50");e.da();U.l(d.mb,!1);A.set("s51");for(var v=0;3>v;++v)A.sa("u32",1,0),m[v].u(),r[v].g(0),U.l(!1,!1),A.sa("u32",0,1),n[v].u(),m[v].g(0),U.l(!1,!1);A.set("s52");q.u();e.g(0);n[0].g(1);n[1].g(2);n[2].g(3);U.l(!1,!1);q.g(0)},Xb:function(){return q}}}}}(),W={Ze:function(){return W.Yc()?document.createElement("video"):!1},Ma:function(a,c){a[c]=!0;a.setAttribute(c,"true")},xe:function(){var a=!1,c=navigator.userAgent||navigator.vendor||
window.opera;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(c)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(c.substr(0,
4)))a=!0;return a},Vc:function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream},Ne:function(){var a=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return a&&a.length&&2<a.length?[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3]||0,10)]:[0,0,0]},Dd:function(){try{return window.matchMedia("(orientation: portrait)").matches?!0:!1}catch(a){return window.innerHeight>window.innerWidth}},we:function(){return W.Wc()||W.Vc()},Wc:function(){var a=navigator.userAgent.toLowerCase();
return-1!==a.indexOf("safari")&&-1===a.indexOf("chrome")?!0:!1},Ag:function(){return W.xe()?W.Dd()?window.innerHeight/window.innerWidth*45:45:45},Yc:function(){return navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?!0:!1},pause:function(a){a.pause()},rh:function(a){a.play()},release:function(a){a.pause();a.videoStream&&a.videoStream.stop();a.videoStream=null},Xc:function(a){if(!a)return a;var c=null;if(a.video){var d=function(e){return e&&"object"===typeof e?Object.assign({},e):e};c={};
"undefined"!==typeof a.video.width&&(c.width=d(a.video.width));"undefined"!==typeof a.video.height&&(c.height=d(a.video.height));"undefined"!==typeof a.video.facingMode&&(c.facingMode=d(a.video.facingMode))}c={audio:a.audio,video:c};"undefined"!==typeof a.deviceId&&W.Oc(c,a.deviceId);return c},Oc:function(a,c){c&&(a.video=a.video||{},a.video.deviceId={exact:c},a.video.facingMode&&delete a.video.facingMode)},$d:function(a){var c=a.video.width;a.video.width=a.video.height;a.video.height=c;return a},
Ae:function(a){function c(g){return[480,576,640,648,720,768,800,960,1080,1152,1280,1366,1920].sort(function(t,x){return Math.abs(t-g)-Math.abs(x-g)})}function d(g){var t=W.Xc(a);g=g(t);m.push(g);e(g)}function e(g){if(g.video&&g.video.facingMode&&g.video.facingMode.exact){var t=g.video.facingMode.exact;g=W.Xc(g);delete g.video.facingMode.exact;g.video.facingMode.ideal=t;m.push(g)}}var m=[];if(!a||!a.video)return m;e(a);if(a.video.width&&a.video.height){if(a.video.width.ideal&&a.video.height.ideal){var n=
c(a.video.width.ideal).slice(0,3),q=c(a.video.height.ideal).slice(0,3),r={},l=0;for(r.na=void 0;l<n.length;r={na:r.na},++l){r.na=n[l];var v={},C=0;for(v.ma=void 0;C<q.length;v={ma:v.ma},++C)if(v.ma=q[C],r.na!==a.video.width.ideal||v.ma!==a.video.height.ideal){var E=Math.max(r.na,v.ma)/Math.min(r.na,v.ma);E<4/3-.1||E>16/9+.1||d(function(g,t){return function(x){x.video.width.ideal=g.na;x.video.height.ideal=t.ma;return x}}(r,v))}}}d(function(g){return W.$d(g)})}a.video.width&&a.video.height&&(a.video.width.ideal&&
a.video.height.ideal&&d(function(g){delete g.video.width.ideal;delete g.video.height.ideal;return g}),d(function(g){delete g.video.width;delete g.video.height;return g}));a.video.facingMode&&(d(function(g){delete g.video.facingMode;return g}),a.video.width&&a.video.height&&d(function(g){W.$d(g);delete g.video.facingMode;return g}));m.push({audio:a.audio,video:!0});return m},Lf:function(a){if(W.Dd()){if(!a||!a.video)return!1;var c=a.video.width,d=a.video.height;if(!c||!d)return!1;if(c.ideal&&d.ideal&&
c.ideal>d.ideal)return a.video.height=c,a.video.width=d,!0}return!1},rb:function(a){a.volume=0;W.Ma(a,"muted");if(W.Wc()){if(1===a.volume){var c=function(){a.volume=0;window.removeEventListener("mousemove",c,!1);window.removeEventListener("touchstart",c,!1)};window.addEventListener("mousemove",c,!1);window.addEventListener("touchstart",c,!1)}setTimeout(function(){a.volume=0;W.Ma(a,"muted")},5)}},ce:function(a,c,d){return null===a?Promise.resolve():new Promise(function(e,m){if(a.srcObject&&a.srcObject.getVideoTracks){var n=
a.srcObject.getVideoTracks();1!==n.length?m("INVALID_TRACKNUMBER"):(n=n[0],c?W.get(a,e,m,d):(n.stop(),e()))}else m("BAD_IMPLEMENTATION")})},qd:function(a,c,d,e){function m(q){n||(n=!0,d(q))}var n=!1;return navigator.mediaDevices.getUserMedia(e).then(function(q){function r(){setTimeout(function(){if(a.currentTime){var v=a.videoWidth,C=a.videoHeight;if(0===v||0===C)m("VIDEO_NULLSIZE");else{v&&(a.style.width=v.toString()+"px");C&&(a.style.height=C.toString()+"px");v={ve:null,If:null,lf:null};try{var E=
q.getVideoTracks()[0];E&&(v.lf=E,v.ve=E.getCapabilities(),v.If=E.getSettings())}catch(g){}W.we()?a.parentNode&&null!==a.parentNode?(n||c(a,q,v),setTimeout(function(){a.play()},100)):(document.body.appendChild(a),W.rb(a),n||c(a,q,v),setTimeout(function(){a.style.transform="scale(0.0001,0.0001)";a.style.position="fixed";a.style.bottom="0px";a.style.right="0px";W.rb(a);setTimeout(function(){a.play()},100)},80)):n||c(a,q,v)}}else m("VIDEO_NOTSTARTED")},700)}function l(){a.removeEventListener("loadeddata",
l,!1);var v=a.play();W.rb(a);"undefined"===typeof v?r():v.then(function(){r()}).catch(function(){m("VIDEO_PLAYPROMISEREJECTED")})}"undefined"!==typeof a.srcObject?a.srcObject=q:(a.src=window.URL.createObjectURL(q),a.videoStream=q);W.rb(a);a.addEventListener("loadeddata",l,!1)}).catch(function(q){m(q)})},get:function(a,c,d,e){if(!a)return d&&d("VIDEO_NOTPROVIDED"),!1;if(!W.Yc())return d&&d("MEDIASTREAMAPI_NOTFOUND"),!1;if(e&&e.video){if(W.Vc()){var m=W.Ne();0!==m[0]&&(12>m[0]||12===m[0]&&2>m[1])&&
W.Lf(e)}e.video.width&&e.video.width.ideal&&(a.style.width=e.video.width.ideal+"px");e.video.height&&e.video.height.ideal&&(a.style.height=e.video.height.ideal+"px")}W.Ma(a,"autoplay");W.Ma(a,"playsinline");e&&e.audio?a.volume=0:W.Ma(a,"muted");W.qd(a,c,function(){function n(r){if(0===r.length)d("INVALID_FALLBACKCONSTRAINTS");else{var l=r.shift();W.qd(a,c,function(){n(r)},l)}}var q=W.Ae(e);n(q)},e)},Ye:function(a){if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices)return a(!1,"NOTSUPPORTED"),
!1;navigator.mediaDevices.enumerateDevices().then(function(c){(c=c.filter(function(d){return d.kind&&-1!==d.kind.toLowerCase().indexOf("video")&&d.label&&d.deviceId}))&&c.length&&0<c.length?a(c,!1):a(!1,"NODEVICESFOUND")}).catch(function(){a(!1,"PROMISEREJECTED")})},cg:function(a,c,d){var e={};e[c]=d;c=[];c.push(e);a.applyConstraints({advanced:c}).catch(function(){})}},pa=function(){function a(t,x,k,p,H,I){if(I===H.length)p();else{switch(H[I]){case "D":t();break;case "S":x().then(function(){g.ae();
a(t,x,k,p,H,++I)}).catch(p);return;case "R":k()}a(t,x,k,p,H,++I)}}var c={n:5,kc:1,Gd:0,bb:[35,49],Ya:[2,200],k:.7,Qf:200,tf:.05},d=-1,e=null,m=-1,n=-1,q=0,r=-1,l=-1,v=0,C=0,E=c.Ya[1],g={od:function(){switch(d){case -1:return-1;case 0:return l+e.Gd;case 1:return v}},Fg:function(t){return Math.pow(Math.min(Math.max(r,0),e.n-1)/(e.n-1),t||1)},A:function(t){e=Object.assign({},c,t);r=l=e.kc;d=0;g.reset()},ae:function(t){t=("undefined"===typeof t?Date.now():t)||0;var x=Math.min(Math.max(t-C,e.Ya[0]),e.Ya[1]);
E=x;C=t;var k=-1===m?0:e.k;m=Math.min(Math.max(1E3/x,5),120)*(1-k)+m*k;t-n>e.Qf&&5<++q&&(x=e.k,r=r*(1-x)+(m<e.bb[0]?l-1:m>e.bb[1]?l+1:l)*x,Math.abs(r-l)>1-e.tf&&(x=Math.min(Math.max(Math.round(r),0),e.n-1),x!==l&&(r=l=x,m=(e.bb[1]-e.bb[0])/2)),n=t)},rc:function(t,x,k,p,H){a(t,x,k,p,H,0)},vc:function(t){v=t;d=1},Gc:function(){d=0;g.reset()},reset:function(){E=c.Ya[1];n=m=-1;q=0},Qe:function(){return E}};return g}(),Ma=function(){function a(){d(k+t.jc);p.port.postMessage("DONE")}function c(){var f=
t.ga;z.isEnabled&&(f=Math.max(f,z.ga));N.Sa=0===f?window.requestAnimationFrame(d):window.requestAnimationFrame(e)}function d(f){I.ya&&null!==x&&(f-=k,f=Math.min(Math.max(f,t.$c[0]),t.$c[1]),k+=f,n(),z.isEnabled&&z.Y&&I.Z&&k-z.fc>t.Lc&&(v(),z.fc=k),x(k))}function e(f){I.ya&&(N.timeout=window.setTimeout(d.bind(null,f),t.ga))}function m(){x=null;I.ya=!1;n()}function n(){N.Sa&&(window.cancelAnimationFrame(N.Sa),N.Sa=null);N.timeout&&(window.clearTimeout(N.timeout),N.timeout=null)}function q(f){f&&!I.Z?
(I.Z=!0,H&&pa.Gc(),p.port.postMessage("STOP"),aa.be(!0),c()):!f&&I.Z&&(I.Z=!1,H&&pa.vc(1),aa.be(!1),p.port.postMessage("START"))}function r(f){f.target.hidden?M():J()}function l(f,y,G){y=f.createShader(y);f.shaderSource(y,G);f.compileShader(y);return y}function v(){z.Y=!1;var f=z.fb,y=z.gb,G=z.hb,L=z.X;f.uniform1f(z.rd,Math.random());z.za?y.beginQueryEXT(L,G):f.beginQuery(L,G);f.drawElements(f.POINTS,1,f.UNSIGNED_SHORT,0);z.za?y.endQueryEXT(L):f.endQuery(L);f.flush();E().then(function(h){h=t.ge*t.Jc*
1E3/h;z.Db=(z.Db+1)%t.Ea;z.hc[z.Db]=h;if(++z.Ed>t.Ea){z.ob.set(z.hc);z.ob.sort();h=z.ob[Math.floor(t.Ea/2)];z.$a=Math.max(z.$a,h);var F;for(F=0;F<z.Ec&&!(h>z.$a*(1-(t.Kc[F]+t.he*(F>=z.Bb?1:-1))));++F)F===z.Ec-1&&++F;F!==z.Bb&&(console.log("THERMAL THROTTLING LEVEL = "+F.toString()),z.Bb=F,z.ga=0===F?0:t.fe[F-1],t.Ic&&t.Ic(F))}z.Y=!0}).catch(function(){z.Y=!0})}function C(f){var y=z.fb,G=z.gb,L=z.hb;L=z.za?G.Cg(L,G.QUERY_RESULT_AVAILABLE_EXT):y.getQueryParameter(L,y.QUERY_RESULT_AVAILABLE);y=y.getParameter(G.GPU_DISJOINT_EXT);
L?f(!y):setTimeout(C.bind(null,f),.1)}function E(){return new Promise(function(f,y){C(function(G){if(G){G=z.fb;var L=z.gb,h=z.hb;G=z.za?L.getQueryObjectEXT(h,L.QUERY_RESULT_EXT):G.getQueryParameter(h,G.QUERY_RESULT);f(G)}else y()})})}var g={zd:!0,$c:[1,200],jc:20,ga:0,ie:!1,Jc:50,ge:240,Lc:3E3,Ea:3,Kc:[.2,.35,.5],he:.05,fe:[8,20,40],Ic:null},t=null,x=null,k=0,p=null,H=!1,I={qa:!1,Z:!0,ec:!1,dc:!1,cc:!1,ya:!1},N={Sa:null,timeout:null},z={isEnabled:!1,Y:!1,fb:null,gb:null,hb:null,X:null,rd:null,za:!0,
Bb:0,Ec:0,ga:0,fc:0,Ed:0,hc:null,ob:null,Db:0,$a:0},J=q.bind(null,!0),M=q.bind(null,!1),u={A:function(f){t=Object.assign(g,f);Object.assign(I,{Z:!0,qa:!0,ya:!1});if(t.ie){f=document.createElement("canvas");f.setAttribute("width","1");f.setAttribute("height","1");var y={antialias:!1};f=f.getContext("webgl2",y)||f.getContext("webgl",y);if(y=f.getExtension("EXT_disjoint_timer_query")||f.getExtension("EXT_disjoint_timer_query_webgl2")){z.fb=f;z.gb=y;z.isEnabled=!0;z.za=y.beginQueryEXT?!0:!1;var G=l(f,
f.VERTEX_SHADER,"attribute vec4 a0;void main(){gl_Position=a0;}"),L=l(f,f.FRAGMENT_SHADER,"precision lowp float;uniform float u37;void main(){vec4 a=u37*vec4(1.,2.,3.,4.);for(int b=0;b<666;b+=1)a=cos(a);gl_FragColor=a;}".replace("666",t.Jc.toString())),h=f.createProgram();f.attachShader(h,G);f.attachShader(h,L);f.linkProgram(h);G=f.getAttribLocation(h,"a0");z.rd=f.getUniformLocation(h,"u37");f.useProgram(h);f.enableVertexAttribArray(G);h=f.createBuffer();f.bindBuffer(f.ARRAY_BUFFER,h);f.bufferData(f.ARRAY_BUFFER,
new Float32Array([.5,.5,0,1]),f.STATIC_DRAW);f.vertexAttribPointer(G,4,f.FLOAT,!1,16,0);h=f.createBuffer();f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,h);f.bufferData(f.ELEMENT_ARRAY_BUFFER,new Uint16Array([0]),f.STATIC_DRAW);f.disable(f.DEPTH_TEST);f.disable(f.DITHER);f.disable(f.STENCIL_TEST);f.viewport(0,0,1,1);h=z.za?y.createQueryEXT():f.createQuery();z.hb=h;z.X=y.TIME_ELAPSED_EXT||f.TIME_ELAPSED;z.Bb=0;z.Ec=t.Kc.length;z.ga=0;z.fc=-t.Lc;z.hc=new Float32Array(t.Ea);z.ob=new Float32Array(t.Ea);z.$a=0;
z.Db=0;z.Ed=0;z.Y=!0}}if(t.zd){f=!1;try{if("undefined"===typeof SharedWorker){var F=URL.createObjectURL(new Blob(["let handler = null;\n self.addEventListener('message', function(e){\n if (handler !== null){\n clearTimeout(handler);\n handler = null;\n }\n switch (e.data) {\n case 'START':\n case 'DONE':\n handler = setTimeout(function(){\n self.postMessage('TICK');\n }, "+t.jc.toString()+");\n break;\n case 'STOP':\n break;\n };\n }, false);"],
{type:"text/javascript"})),K=new Worker(F);K.addEventListener("message",a);p={Pd:K,port:K};I.ec=!0}else{var P=URL.createObjectURL(new Blob(["let handler = null;\n onconnect = function(e) {\n const port = e.ports[0];\n port.addEventListener('message', function(e) {\n \n if (handler !== null){\n clearTimeout(handler);\n handler = null;\n }\n switch (e.data) {\n case 'START':\n case 'DONE':\n handler = setTimeout(function(){\n port.postMessage('TICK');\n }, "+
t.jc.toString()+");\n break;\n case 'STOP':\n break;\n };\n \n });\n \n port.start();\n } // end onconnect()"],{type:"text/javascript"})),da=new SharedWorker(P);da.port.start();da.port.addEventListener("message",a);p={Pd:da,port:da.port};I.dc=!0}f=!0}catch(ra){}f&&("onvisibilitychange"in document?document.addEventListener("visibilitychange",r):(window.addEventListener("blur",M),window.addEventListener("focus",J)),I.cc=
!0)}H="undefined"!==typeof pa},m:function(){m();I.cc&&("onvisibilitychange"in document?document.removeEventListener("visibilitychange",r):(window.removeEventListener("blur",M),window.removeEventListener("focus",J)),I.cc=!1);I.dc?(p.port.close(),I.dc=!1):I.ec&&(p.Pd.terminate(),I.ec=!1);Object.assign(I,{Z:!0,qa:!1,ya:!1});x=null},hh:function(){return I.Z},update:function(f){Object.assign(t,f)},rc:function(f){I.qa||u.A({});n();I.ya=!0;x=f;I.Z&&c()},stop:m};return u}(),tb=function(){var a={Kd:4,ub:[1.5,
1.5,2],O:[.1,.1,.1],Td:1,D:-1,M:-1,Kf:2,sf:1,Ud:!0,Ie:.8},c=null,d=[],e=0,m=[.5,.5,1];return{A:function(n){c=Object.assign({},a,n);d.splice(0);n=c.ub[0]*c.O[0];var q=c.ub[1]*c.O[1],r=1/(1+c.ub[2]*c.O[2]),l=c.Td*Math.min(c.D,c.M),v=l/c.D;l/=c.M;var C=.5*c.Ie;C*=C;for(var E=0;E<c.Kd;++E){var g=Math.pow(r,E),t=v*g,x=l*g;g=t*n;var k=x*q,p=t/2;x/=2;for(var H=1+(1-p-p)/g,I=1+(1-x-x)/k,N=0;N<I;++N)for(var z=x+N*k,J=z-.5,M=0;M<H;++M){var u=p+M*g,f=u-.5;f*f+J*J>C||d.push([u,z,t*c.sf])}}c.Ud&&d.sort(function(y,
G){var L=y[0]-.5;y=y[1]-.5;var h=G[0]-.5;G=G[1]-.5;return L*L+y*y-(h*h+G*G)})},get:function(){var n=d.length;if(0===n)return m;e>=n&&(e=0);var q=d[Math.floor(e)];e=(e+1/c.Kf)%n;return q}}}(),ba={neuralNetworkPath:"NN_DEFAULT.json",fa:0,Eb:[2,8],Af:{threshold:1,nScaleLevels:2,scale0Factor:.8,overlapFactors:[2,2,3],scanCenterFirst:!0,nDetectsPerLoop:-1,multiDetectionThresholdFactors:[.5,.6],isCleanGLStateAtEachIteration:!0,animateProcessOrder:"DSR"},Nf:50,
Hd:.3,mf:8,pf:.3,Jf:{translationFactorRange:[.0015,.005],rotationFactorRange:[.003,.02],qualityFactorRange:[.9,.98],alphaRange:[.05,1],followZRotAlphaFactor:.8},Pa:[.65,1,.262],O:[.092,.092,.3],ke:.2,me:2,le:.1,qf:8,Jd:1,Ke:Za.qb.bind(null,.3,.7),Tf:20,Yd:3},oa={facingMode:"user",idealWidth:800,idealHeight:600,minWidth:480,maxWidth:1920,minHeight:480,maxHeight:1920,rotate:0,flipX:!1},ia={lc:-3,jf:-1,error:-2,ready:1,play:2,pause:3},na=ia.lc,B=null,ec={kb:!1,zc:null,element:null,N:null,H:[0,0],L:[.5,
.5],v:[.5,0,0,.5],wb:0,La:null,jb:!1},Q=null,fc={Ka:null,Va:null,antialias:!0,Mc:"./",Fa:null,ia:null,fa:ba.fa,Od:ba.fa,lb:!1,ua:!0},Oa=null,ea=null,sa=null,Pa=1,Na={uc:-1,Mb:-1},Z=null,gc={D:0,M:0,H:[0,0],xa:null},X={Da:null,buffer:null,O:null,Pa:null,aa:ba.Jd,Na:null},Sa=null,qa=null,O={o:1,pa:0,W:null,Ad:!1,Fd:0,mc:0},hb=[],ib=[],Eb={VERSION:"2.1.7",init:function(a){function c(){na!==ia.error&&2===++e&&(Ja(),xb(),Ia(),Q.Ka&&(na=ia.ready,Q.Ka(!1,{GL:b,canvasElement:Q.ia,videoTexture:B.N.get(),videoTransformMat2:B.v,
maxFacesDetected:O.o,videoElement:B.element}),fb()),eb())}if(na!==ia.lc)return a.callbackReady&&a.callbackReady("ALREADY_INITIALIZED"),!1;na=ia.jf;B=Object.assign({},ec);Q=Object.assign({},fc);Z=Object.assign({},gc);O.W=[0];X.O=ba.O.slice(0);X.Pa=ba.Pa.slice(0);"undefined"!==typeof a.antialias&&(Q.antialias=a.antialias);a.callbackReady&&(Q.Ka=a.callbackReady);a.callbackTrack&&(Q.Va=a.callbackTrack);a.nExpressions&&(X.aa=a.nExpressions);a.expressionsEasings&&(X.Na=a.expressionsEasings);"undefined"!==
typeof a.animateDelay&&(Q.fa=a.animateDelay);"undefined"!==typeof a.NNCPath&&(Q.Mc=a.NNCPath);"undefined"!==typeof a.NNC&&(Q.Fa=a.NNC);"undefined"!==typeof a.maxFacesDetected&&(O.o=Math.max(1,a.maxFacesDetected));"undefined"!==typeof a.followZRot&&(Q.ua=a.followZRot?!0:!1);if(O.o>ba.mf)return Ha("MAXFACES_TOOHIGH"),!1;if(!a.canvasId&&!a.canvas)return Ha("NO_CANVASID"),!1;Q.ia=a.canvas?a.canvas:document.getElementById(a.canvasId);if(!Q.ia)return Ha("INVALID_CANVASID"),!1;Z.D=Q.ia.width;Z.M=Q.ia.height;
if(!Z.D||!Z.M)return Ha("INVALID_CANVASDIMENSIONS"),!1;for(var d=0;d<O.o;++d)hb.push(new Float32Array(ba.qf)),ib.push(0);Ma.A({zd:a.isKeepRunningOnWinFocusLost||!1,ga:Q.fa});pa.A({kc:0,n:ba.Eb[1]-ba.Eb[0]+1,Gd:ba.Eb[0]});ea=Object.create(ba.Af);a.scanSettings&&(Object.assign(ea,a.scanSettings),-1!==ea.nDetectsPerLoop?pa.vc(ea.nDetectsPerLoop):pa.Gc());sa=Object.create(ba.Jf);a.stabilizationSettings&&Object.assign(sa,a.stabilizationSettings);var e=0;a.videoSettings&&a.videoSettings.videoElement?$a(a.videoSettings.videoElement,
c):(a.videoSettings&&Object.assign(oa,a.videoSettings),zb(a.onWebcamAsk,a.onWebcamGet,function(m){$a(m,c)}));Qb(function(m){if(!Rb())return!1;Oa=new Fb({pb:m.layers,qc:"gpuRawAvg",nc:Tb});A.Qc([{id:"s54",name:"_",ta:"attribute vec2 a0;uniform mat2 u38;varying vec2 vv0;void main(){gl_Position=vec4(a0,0.,1.),vv0=vec2(.5,.5)+u38*a0;}",Ta:["a0"],Ha:[2],h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:["u1","u38"],precision:"lowp"},{id:"s55",name:"_",h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",
ta:"attribute vec2 a0;uniform sampler2D u39;uniform mat2 u38;uniform vec2 u40;uniform float u41,u42,u43;varying vec2 vv0;void main(){vec4 a=texture2D(u39,vec2(.17,u41));vec2 f=a.gb,g=a.a*u40,b=a0;b.x*=u43;float c=cos(u42),d=sin(u42);vec2 h=mat2(c,d,-d,c)*b,i=f+h*.5*g,j=i-.5;vv0=.5+2.*u38*j,gl_Position=vec4(a0,0.,1.);}",Ta:["a0"],Ha:[2],i:"u1 u39 u40 u41 u42 u43 u38".split(" "),precision:"lowp"},{id:"s56",name:"_",h:"uniform sampler2D u44,u39;uniform vec3 u45,u46;uniform float u47,u48,u41,u49,u42,u50;const vec4 e=vec4(.25,.25,.25,.25);void main(){vec4 d=texture2D(u44,vec2(.625,.625)),f=texture2D(u44,vec2(.875,.625)),a=texture2D(u39,vec2(.17,u41));float g=dot(d-f,e);bool h=g>u48;h?a.r=2.:a.r>u47?a.r=0.:a.r>1.9?a.r+=1.:0.,a.r*=u49;if(a.r<.9)a=vec4(1.,u45);else{a.r*=step(1.9,a.r);float i=dot(e,texture2D(u44,vec2(.875,.875))),j=dot(e,texture2D(u44,vec2(.125,.625))),k=dot(e,texture2D(u44,vec2(.375,.625))),b=cos(u42),c=sin(u42);vec2 l=mat2(b,c*u50,-c/u50,b)*vec2(i,j);a.gba+=vec3(l,k)*u46*a.a;}gl_FragColor=a;}",
ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",i:"u44 u39 u45 u47 u46 u49 u42 u50 u48 u41".split(" ")},{id:"s57",name:"_",ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",h:"uniform sampler2D u44;uniform float u49;const vec4 e=vec4(.25,.25,.25,.25);const vec3 f=vec3(.5,.5,.5);void main(){float a=dot(e,texture2D(u44,vec2(.125,.875))),b=dot(e,texture2D(u44,vec2(.375,.875))),c=dot(e,texture2D(u44,vec2(.625,.875))),d=dot(e,texture2D(u44,vec2(.625,.625)));vec3 g=vec3(a,b,c)*.5+f;gl_FragColor=vec4(g,d*u49);}",
i:["u44","u49"]},{id:"s58",name:"_",ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",h:"uniform sampler2D u44;const vec4 e=vec4(.25,.25,.25,.25);void main(){float a=dot(e,texture2D(u44,vec2(.375,.375))),b=dot(e,texture2D(u44,vec2(.625,.375))),c=dot(e,texture2D(u44,vec2(.875,.375))),d=dot(e,texture2D(u44,vec2(.125,.125)));gl_FragColor=vec4(a,b,c,d);}",i:["u44"]},{id:"s53",name:"_",h:"uniform sampler2D u39;uniform vec2 u51;uniform float u52;varying vec2 vv0;void main(){float f=step(.5,mod(gl_FragCoord.y+1.5,2.)),c=step(.33,vv0.x);vec4 a=texture2D(u39,vv0+u51);a.a=mix(a.a*u52,a.a,c);vec4 d=floor(255.*a),g=255.*(255.*a-d),b=mix(d,g,f)/255.;b.x=mix(step(a.x,1.5),b.x,c),gl_FragColor=b;}",
i:["u39","u52","u51"]}]);sb();Pb();kb();jb();c()});return!0},destroy:function(){Ma.m();return new Promise(function(a){Eb.toggle_pause(!0,!0).finally(function(){Oa&&Oa.m();Qa.m();Oa=qa=Sa=null;hb.splice(0);ib.splice(0);Z.xa=null;X.Da=null;B.N=null;na=ia.lc;a()}).catch(function(){})})},toggle_pause:function(a,c){if(!Ya())return Promise.reject("NOT_READY");var d=null;d=B.jb?Promise.resolve():c?W.ce(B.element,!a,B.La):Promise.resolve();a?rb():d.then(function(){eb()});return d},update_videoSettings:function(a){rb();
return new Promise(function(c,d){W.ce(B.element,!1,B.La).then(function(){Object.assign(oa,a);zb(null,null,function(e){$a(e,function(){Ja();Ia();eb();c()})})}).catch(d)})},toggle_slow:function(a){Ya()&&na===ia.play&&(a&&!Q.lb?(Q.Od=Q.fa,ea.nDetectsPerLoop=1,this.set_animateDelay(ba.Vf),Q.lb=!0):!a&&Q.lb&&(ea.nDetectsPerLoop=-1,this.set_animateDelay(Q.Od),Q.lb=!1))},set_animateDelay:function(a){Q.fa=a;Ma.update({ga:Q.fa})},resize:function(){if(!Ya())return!1;var a=Q.ia.width,c=Q.ia.height;if(!lb()&&
a===Z.D&&c===Z.M)return!1;Z.D=a;Z.M=c;A.R();kb();jb();Ja();Ia();return!0},set_inputTexture:function(a,c,d){B.H[0]=c;B.H[1]=d;B.N=Y.instance({width:c,height:d,Zb:a});B.kb=!0;Ja();fb();Ia()},reset_GLState:function(){fb();Z.xa.remove();X.Da.remove();sb()},render_video:function(){va.P();A.set("s54");b.viewport(0,0,Z.D,Z.M);B.N.g(0);U.l(!0,!0)},reset_inputTexture:function(){B.kb=!1;B.N=B.zc;lb();Ja();Ia()},get_videoDevices:function(a){return W.Ye(a)},set_scanSettings:function(a){Object.assign(ea,a);-1!==
ea.nDetectsPerLoop?pa.vc(ea.nDetectsPerLoop):pa.Gc();kb();jb()},set_stabilizationSettings:function(a){Object.assign(sa,a)},set_videoOrientation:function(a,c){Ya()&&(oa.flipX=c,oa.rotate=a,Ja(),Ia())},update_videoElement:function(a,c){$a(a?a:B.element,function(){xb();Ja();Ia();c&&c()})},create_new:function(){return JEELIZFACEFILTERGEN()}};return Eb};const JEELIZFACEFILTER=JEELIZFACEFILTERGEN();
if(typeof(module)!=='undefined'){module.exports=JEELIZFACEFILTER;}
/* eslint-enable */

View File

@@ -0,0 +1,258 @@
/**
* Jeeliz Face Filter - https://github.com/jeeliz/jeelizFaceFilter
*
* Copyright 2020 WebAR.rocks ( https://webar.rocks )
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// BEGIN EMULATE DOM
// import some usefull stuffs
try {
var Buffer = require('buffer').Buffer;
} catch(err) {
console.log('Cannot import Buffer package');
}
// emulate global variables:
const navigator = {
platform: "Linux x86_64",
userAgent: "forceWebGL1_noAntialiasing_noDOM"
};
const window = {
canvas: null,
innnerWidth: -1,
innerHeight: -1,
URL: {
createObjectURL: function() {
return null
}
},
addEventListener: function() {},
removeEventListener: function() {},
requestAnimationFrame: function(step) {
if (window.canvas === null){
setTimeout(step, 1);
return;
}
window.canvas.requestAnimationFrame(step)
},
cancelAnimationFrame: function(step) {
if (window.canvas === null){
return;
}
window.canvas.cancelAnimationFrame(step)
},
setCanvas: function(c) {
window.canvas = c;
}
};
const document = {
createElement: function(elementType){
switch(elementType){
case 'canvas':
return null; // return a real canvas
}
},
getElementById: function(elementId){
return null;
},
body: { appendChild: function(element){ return null; }}
};
if(typeof(wx) !== 'undefined'){ //WECHAT
const systemInfo = wx.getSystemInfoSync()
window.innnerWidth = systemInfo.windowWidth;
window.innnerHeight = systemInfo.windowHeight;
}
const FAKEDOM = {
window: window,
document: document,
navigator: navigator
};
// END EMULATE DOM
window.JEELIZFACEFILTERGEN=function(){function Fb(a){var c=null,d=null,e=null,m=0;this.A=function(n){this.Cf(n.pb);e.Be({qc:n.qc,nc:n.nc})};this.We=function(n){return c[n]};this.Cf=function(n){var q=null;m=n.length;c=n.map(function(r,l){r=Object.assign({},r,{index:l,parent:this,vb:q,ff:l===m-1});return q=l=0===l?Gb.instance(r):Hb.instance(r)});d=c[0];e=c[m-1];c.forEach(function(r,l){0!==l&&r.uf()})};this.V=function(n){var q=n;c.forEach(function(r){q=r.V(q,!1)});return q};this.Ve=function(){return d.F()};
this.Xb=function(){return e.Xe()};this.nd=function(){return e.nd()};this.m=function(){c&&(c.forEach(function(n){n.m()}),e=d=c=null,m=0)};"undefined"!==typeof a&&this.A(a)}function db(a,c){var d=c%8;return a[(c-d)/8]>>7-d&1}function Ib(a){var c=JSON.parse(a);a=c.ne;var d=c.nf,e=c.n;var m="undefined"===typeof btoa?Buffer.from(c.data,"base64").toString("latin1"):atob(c.data);var n=m.length;c=new Uint8Array(n);for(var q=0;q<n;++q)c[q]=m.charCodeAt(q);m=new Float32Array(e);n=new Float32Array(d);q=a+d+
1;for(var r=0;r<e;++r){for(var l=q*r,v=0===db(c,l)?1:-1,C=l+1,E=1,g=0,t=C+a-1;t>=C;--t)g+=E*db(c,t),E*=2;C=g;l=l+1+a;E=n.length;g=0;for(t=l;t<l+E;++t)n[g]=db(c,t,!0),++g;for(E=l=0;E<d;++E)l+=n[E]*Math.pow(2,-E-1);m[r]=0===l&&0===C?0:v*(1+l)*Math.pow(2,1+C-Math.pow(2,a-1))}return m}function Ya(){return-1!==[ia.ready,ia.play,ia.pause].indexOf(na)}function eb(){if(na===ia.play)return!1;na=ia.play;Ma.stop();qb(0)}function rb(){if(na!==ia.play)return!1;Ma.stop();na=ia.pause;return!0}function Fa(a,c,d,
e,m){a=4*(3*c+a)+d;return e+(X.buffer[a]/255+X.buffer[a+12]/65025)*(m-e)}function fb(){b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1);va.ha();U.reset();Y.reset();A.R();A.ad();b.disable(b.DEPTH_TEST);b.disable(b.BLEND);U.Ja();A.Ba()}function Jb(){va.P();b.viewport(0,0,3,2*O.o);A.set("s53");X.Da.g(0);U.l(!1,!1);return aa.xb(0,0,3,2*O.o,X.buffer)}function qb(){na!==ia.pause&&(ea.isCleanGLStateAtEachIteration&&(A.ad(),U.reset(),U.Ja(),b.disable(b.DEPTH_TEST),b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1),A.Ba()),pa.rc(Kb,
Jb,Lb,Mb,ea.animateProcessOrder))}function Kb(){va.ha();if(!B.kb)if(B.jb)B.element.needsUpdate&&(B.N.Rf(B.element.arrayBuffer),B.element.needsUpdate=!1);else{var a=B.element.currentTime,c=a-B.wb;0>c&&(B.wb=a);1E3*c<ba.Tf||(B.wb+=c,B.N.refresh())}a=pa.od();if(O.W.length>a)O.W.splice(0,O.W.length-a);else for(;O.W.length<a;)O.W.push(0);if(1!==O.o)if(qa.every(Nb)){for(var d=0,e=c=0;e<qa.length;++e)qa[e].detected>d&&(d=qa[e].detected,c=0);for(d=0;d<a;++d)O.W[d]=c}else{c=Math.round(ba.pf*a);c=Math.min(1,
c);d=O.Fd;for(var m=e=0;e<a;++e){if(!gb(qa[d])&&++m>c){do++d===O.o&&(d=0);while(!gb(qa[d]))}O.W[e]=d++;d%=O.o}O.Fd=d}for(a=0;a<pa.od();++a)O.pa=O.W[a],O.mc=(.5+O.pa)/O.o,O.Ad=O.W.lastIndexOf(O.pa)===a,A.set("s55"),c=qa[O.pa],A.G("u43",1+Na.uc*(Math.cos(c.ry)-1)),Q.ua&&A.G("u42",c.rz),1!==O.o&&A.G("u41",O.mc),Z.xa.da(),B.N.g(0),X.Da.g(1),U.l(!1,!1),Z.xa.g(0),Oa.V(Z.xa);pa.ae()}function Lb(){for(var a=0;a<O.o;++a)if(-1!==O.W.indexOf(a)){var c=a,d=Sa[c],e=[c],m=qa[c],n=hb[c],q=2*c;d.Wa=Fa(1,q,3,0,1);
m.detected=wa.$(m.detected,d.Wa,ba.ke);if(d.Wa<ea.multiDetectionThresholdFactors[0]*ea.threshold)d.Aa=Math.floor(d.Aa/2),Q.ua&&(m.rz=0,m.ry=0);else{var r=X.Pa;d.x=Fa(0,q,1,-1,1);d.y=Fa(0,q,2,-1,1);d.ca=Fa(0,q,3,0,1);d.sc=Fa(1,q,0,-r[0],r[0]);d.tc=Fa(1,q,1,-r[1],r[1]);d.Qa=Fa(1,q,2,-r[2],r[2]);for(r=0;r<X.aa;++r)d.hd[r]=X.Na[r](Fa(2,q,r,0,1));e.Rb=d.x-m.xRaw;e.Sb=d.y-m.yRaw;e.Qb=d.ca-m.sRaw;e.Nb=d.sc-m.rx;e.Ob=d.tc-m.ry;e.Pb=Q.ua?d.Qa:d.Qa-m.rz;q=pa.Qe();e=(1-Za.qb(sa.translationFactorRange[0],sa.translationFactorRange[1],
Math.sqrt(e.Rb*e.Rb+e.Sb*e.Sb+e.Qb*e.Qb)/q))*(1-Za.qb(sa.rotationFactorRange[0],sa.rotationFactorRange[1],Math.sqrt(e.Nb*e.Nb+e.Ob*e.Ob+e.Pb*e.Pb)/q))*Za.qb(sa.qualityFactorRange[0],sa.qualityFactorRange[1],d.Wa);c=n[++ib[c]%n.length]=e;for(q=0;q<n.length;++q)c=Math.min(c,n[q]);c=Math.max(.5,c);e=Math.min(c,e);n=wa.$(sa.alphaRange[1],sa.alphaRange[0],Math.pow(e,ba.me));m.xRaw=wa.$(m.xRaw,d.x,n);m.yRaw=wa.$(m.yRaw,d.y,n);m.sRaw=wa.$(m.sRaw,d.ca,n);m.rx=wa.$(m.rx,d.sc,n);m.ry=wa.$(m.ry,d.tc,n);m.rz=
Q.ua?m.rz+sa.followZRotAlphaFactor*n*d.Qa:wa.$(m.rz,d.Qa,n);c=m.sRaw*Na.Mb*Math.sin(m.ry);e=Math.sin(m.rz)*c/Pa;m.x=m.xRaw+Math.cos(m.rz)*c;m.y=m.yRaw+e;m.s=m.sRaw;n=Math.max(n,ba.le);for(c=0;c<X.aa;++c)m.expressions[c]=wa.$(m.expressions[c],d.hd[c],n);++d.Aa}}va.Pf();ea.isCleanGLStateAtEachIteration&&(va.reset(),Y.reset(),b.enable(b.DEPTH_TEST));Q.Va&&(1===O.o?Q.Va(qa[0]):Q.Va(qa));ea.isCleanGLStateAtEachIteration&&b.disable(b.BLEND)}function Mb(){na===ia.play&&Ma.rc(qb)}function sb(){Z.xa=Y.instance({isPot:!0,
isFloat:!1,width:Oa.Ve()});for(var a=ba.Yd,c=O.o,d=new Float32Array([0,.5,.5,0,0,0,0,0,0,0,0,0]),e=new Float32Array(d.length*O.o),m=0,n;m<O.o;++m)for(n=0;n<d.length;++n)e[m*d.length+n]=d[n];X.Da=Ob.instance({width:a,height:c,isFloat:!0,isPot:!1,array:e})}function Pb(){function a(c){for(var d=[],e=0;e<O.o;++e)d.push(JSON.parse(JSON.stringify(c)));return d}X.buffer=new Uint8Array(8*ba.Yd*O.o);Sa=a({Wa:0,x:0,y:0,ca:1,sc:0,tc:0,Qa:0,hd:new Float32Array(X.aa),Aa:0});qa=a({detected:0,x:0,y:0,s:1,xRaw:0,
yRaw:0,sRaw:1,rx:0,ry:0,rz:0,expressions:new Float32Array(X.aa)});a({Rb:0,Sb:0,Qb:0,Nb:0,Ob:0,Pb:0})}function jb(){A.T("s55",[{type:"1i",name:"u1",value:0},{type:"1i",name:"u39",value:1},{type:"2f",name:"u40",value:Z.H},{type:"1f",name:"u41",value:.5},{type:"1f",name:"u42",value:0}]);A.T("s56",[{type:"1i",name:"u44",value:0},{type:"1i",name:"u39",value:1},{type:"1f",name:"u47",value:ba.Nf},{type:"1f",name:"u48",value:ea.threshold},{type:"3f",name:"u46",value:[X.O[0]*Z.H[0],X.O[1]*Z.H[1],X.O[2]]},
{type:"1f",name:"u41",value:.5},{type:"1f",name:"u49",value:1},{type:"1f",name:"u42",value:0}]);var a=[{type:"1i",name:"u44",value:0}];A.T("s57",a);A.T("s58",a);A.T("s53",[{type:"1i",name:"u39",value:0},{type:"1f",name:"u52",value:Z.H[0]},{type:"2f",name:"u51",value:[0,.5/O.o]}])}function kb(){Z.H[0]=1;Z.H[1]=Z.D/Z.M;tb.A({ub:ea.overlapFactors,Kd:ea.nScaleLevels,D:Z.D,M:Z.M,Td:ea.scale0Factor,O:X.O,Ud:ea.scanCenterFirst})}function Qb(a){if(Q.Fa)ub("string"===typeof Q.Fa?JSON.parse(Q.Fa):Q.Fa,a);else{var c=
Q.Mc;"JSON"!==c.toUpperCase().split(".").pop()&&(c+=ba.neuralNetworkPath);vb.get(c,function(d){d=JSON.parse(d);ub(d,a)})}}function ub(a,c){if(a.exportData){var d=a.exportData;d.rotationEulerAnglesFactors&&(X.Pa=d.rotationEulerAnglesFactors);d.translationScalingFactors&&(X.O=d.translationScalingFactors);"undefined"!==typeof d.nExpressions&&(X.aa=d.nExpressions);Na.uc=.4;Na.Mb=.7;"undefined"!==typeof d.fgScaleXFactor&&(Na.uc=d.fgScaleXFactor);"undefined"!==typeof d.fgDisplaceXFactor&&(Na.Mb=d.fgDisplaceXFactor)}X.aa||
(X.aa=ba.Jd);if(!X.Na)for(X.Na=[],d=0;d<X.aa;++d)X.Na.push(ba.Ke);c(a)}function Rb(){if(Qa.A({Jb:Q.ia,width:Z.D,height:Z.M,debug:!1,Ld:function(){Ha("GLCONTEXT_LOST")},antialias:Q.antialias,premultipliedAlpha:!0}))return!0;Ha("GL_INCOMPATIBLE");return!1}function gb(a){return a.detected>ea.multiDetectionThresholdFactors[1]*ea.threshold}function Nb(a){return!gb(a)}function wb(a,c,d,e){return d>a?Math.max(0,a+c/2-(d-e/2)):Math.max(0,d+e/2-(a-c/2))}function Sb(){return Sa.some(function(a,c){if(c===O.pa)return!1;
c=Sa[O.pa];if(c.Aa>a.Aa||3>a.Aa||wb(c.x,c.ca,a.x,a.ca)<ba.Hd*c.ca)return!1;var d=Z.D/Z.M;return wb(c.y,c.ca*d,a.y,a.ca*d)>ba.Hd*c.ca*d})}function Tb(){var a=O.pa;X.Da.Bf(1);1!==O.o&&(b.viewport(0,0,3,O.o),A.set("s0"),A.Xd("u1",1),U.l(!1,!1),A.Xd("u1",0));b.viewport(0,a,1,1);A.set("s56");Q.ua&&A.G("u42",qa[a].rz);1!==O.o&&A.G("u41",O.mc);if(1<O.o){var c=Sb()?0:1;A.G("u49",c)}A.Gf("u45",tb.get());U.l(!1,!1);O.Ad&&(b.viewport(1,a,1,1),A.set("s57"),A.G("u49",1),U.l(!1,!1),b.viewport(2,a,1,1),A.set("s58"),
U.l(!1,!1))}function xb(){B.N&&B.N.remove();B.jb=B.element.isFakeVideo?!0:!1;if(B.jb){var a=yb();a={isFlipY:!1,array:B.element.arrayBuffer,width:a.w,height:a.wa,isKeepArray:!0}}else a={I:B.element};B.zc=Y.instance(Object.assign({isPot:!1,isLinear:!0,isFloat:!1},a));B.N=B.zc}function Ia(){var a=[{type:"mat2",name:"u38",value:B.v}];A.T("s54",[{type:"1i",name:"u1",value:0}].concat(a));A.T("s55",a)}function Ja(){B.L[0]=.5;B.L[1]=.5;var a=B.H[1]/B.H[0];Pa=Qa.U()/Qa.F();90===Math.abs(oa.rotate)&&(a=1/a);
a>Pa?B.L[1]*=Pa/a:B.L[0]*=a/Pa;A.T("s56",[{name:"u50",type:"1f",value:Pa}]);B.v[0]=0;B.v[1]=0;B.v[2]=0;B.v[3]=0;switch(oa.rotate){case 0:B.v[0]=B.L[0];B.v[3]=B.L[1];break;case 180:B.v[0]=-B.L[0];B.v[3]=-B.L[1];break;case 90:B.v[1]=B.L[0];B.v[2]=-B.L[1];break;case -90:B.v[1]=-B.L[0],B.v[2]=B.L[1]}oa.flipX&&(B.v[0]*=-1,B.v[2]*=-1);B.kb||(B.v[1]*=-1,B.v[3]*=-1)}function yb(){var a={w:B.element.videoWidth||B.element.width,wa:B.element.videoHeight||B.element.height};if(!a.w||!a.wa||4>a.w||4>a.wa)throw Error("INVALID VIDEO DIMENSIONS - width = "+
a.w+" height = "+a.wa);return a}function lb(){var a=yb(),c=B.H[0]!==a.w||B.H[1]!==a.wa;c&&(B.H[0]=a.w,B.H[1]=a.wa);return c}function $a(a,c){if(na===ia.error)return!1;B.element=a;lb();c&&c();return!0}function zb(a,c,d){a&&a();B.La={video:{facingMode:{exact:oa.facingMode},width:{min:oa.minWidth,max:oa.maxWidth,ideal:oa.idealWidth},height:{min:oa.minHeight,max:oa.maxHeight,ideal:oa.idealHeight}},audio:!1};W.Oc(B.La,oa.deviceId);W.get(B.element?B.element:W.Ze(),function(e){c&&c(e);d(e)},function(){Ha("WEBCAM_UNAVAILABLE")},
B.La)}function Ha(a){na!==ia.error&&(na=ia.error,Q.Ka&&Q.Ka(a))}var wa={Qg:function(a){return Math.ceil(Math.log2(a))},jh:function(a){return Math.log2(a)},fh:function(a){return 0===Math.log2(a)%1},dg:function(a){var c=[0,0,0,0];a.forEach(function(d){c[0]+=d[0];c[1]+=d[1];c[2]+=d[2];c[3]+=d[3]});return c},eg:function(a,c,d){return Math.min(Math.max(a,c),d)},hg:function(a){return a*Math.PI/180},oh:function(a,c){c=Math.pow(10,c);return Math.round(a*c)/c},ph:function(a){return Math.round(1E6*a)/1E6},
Rg:function(a,c){return(100*a/c).toFixed(3)},$:function(a,c,d){return a*(1-d)+c*d},Ge:function(a,c){return wa.ye(a-c)},ye:function(a){for(;a>Math.PI;)a-=2*Math.PI;for(;a<=-Math.PI;)a+=2*Math.PI;return a},kg:function(a,c){return Math.abs(wa.Ge(a,c))},Uf:function(a,c){return Math.atan2(Math.sin(a)+Math.sin(c),Math.cos(a)+Math.cos(c))}},vb={get:function(a,c,d){var e=new XMLHttpRequest;e.open("GET",a,!0);e.withCredentials=!1;e.onreadystatechange=function(){4===e.readyState&&(200===e.status||0===e.status?
c(e.responseText):"undefined"!==typeof d&&d(e.status))};e.send()},Ng:function(a,c){vb.get(a,function(d){c(JSON.parse(d))})},lh:function(a,c,d){var e=new XMLHttpRequest;e.open("POST",a,!0);e.setRequestHeader("Content-type","application/x-www-form-urlencoded");e.onreadystatechange=function(){4!==e.readyState||200!==e.status&&0!==e.status||d(e.responseText)};e.send(c)},Bg:function(a,c){var d=new XMLHttpRequest;d.open("POST",a,!0);d.responseType="arraybuffer";d.onload=function(){c(d.response)};d.send()}},
Ub={create:function(a,c){for(var d=Array(c),e=0;e<c;++e)d[e]=a;return d},ig:function(a,c){for(var d=0;d<a.length;++d)c[d]=a[d]},clone:function(a){for(var c=Array(a.length),d=0;d<a.length;++d)c[d]=a[d];return c},sh:function(a,c,d){a.forEach(function(e,m){c[m]=e*d})},Ch:function(a){for(var c=a.length-1;0<c;--c){var d=Math.floor(Math.random()*(c+1)),e=a[c];a[c]=a[d];a[d]=e}},Mf:function(a){return Array.isArray(a)||a.constructor===Float32Array||a.constructor===Uint8Array}},mb={Kb:function(a,c){if(0===
c||"object"!==typeof a)return a;a=Object.assign({},a);c=void 0===c||-1===c?-1:c-1;for(var d in a)a[d]=mb.Kb(a[d],c);return a}},Za={Dh:function(a,c,d){a=Math.min(Math.max((d-a)/(c-a),0),1);return a*a*(3-2*a)},qb:function(a,c,d){return Math.min(Math.max((d-a)/(c-a),0),1)},vg:function(a,c,d,e){return Math.pow(Math.min(Math.max((e-a)/(c-a),0),1),d)},Hh:function(){return 0},kh:function(){return 1},ih:function(a){return a},sg:function(a){return a*a},xg:function(a){return a*(2-a)},pg:function(a){return.5>
a?2*a*a:-1+(4-2*a)*a},ng:function(a){return a*a*a},wg:function(a){return--a*a*a+1},og:function(a){return.5>a?4*a*a*a:(a-1)*(2*a-2)*(2*a-2)+1},tg:function(a){return a*a*a*a},yg:function(a){return 1- --a*a*a*a},qg:function(a){return.5>a?8*a*a*a*a:1-8*--a*a*a*a},ug:function(a){return a*a*a*a*a},zg:function(a){return 1+--a*a*a*a*a},rg:function(a){return.5>a?16*a*a*a*a*a:1+16*--a*a*a*a*a}},Vb={Me:function(a,c,d){switch(a){case "relu":return d+"=max(vec4(0.,0.,0.,0.),"+c+");";case "elu":return d+"=mix(exp(-abs("+
c+"))-vec4(1.,1.,1.,1.),"+c+",step(0.,"+c+"));";case "elu01":return d+"=mix(0.1*exp(-abs("+c+"))-vec4(0.1,0.1,0.1,0.1),"+c+",step(0.,"+c+"));";case "arctan":return d+"=atan(3.14159265359*texture2D(u0,vUV))/3.14159265359;";case "copy":return"";default:return!1}}},A=function(){function a(u,f,y){f=u.createShader(f);u.shaderSource(f,y);u.compileShader(f);return u.getShaderParameter(f,u.COMPILE_STATUS)?f:!1}function c(u,f,y){f=a(u,u.VERTEX_SHADER,f);y=a(u,u.FRAGMENT_SHADER,y);u===b&&q.push(f,y);var G=
u.createProgram();u.attachShader(G,f);u.attachShader(G,y);u.linkProgram(G);return G}function d(u,f){f.C=f.C?!0:!1;if(!f.C){void 0===f.ta&&(f.ta="precision lowp float;attribute vec2 a0;varying vec2 vv0;void main(){gl_Position=vec4(a0,0.,1.),vv0=a0*.5+vec2(.5,.5);}");void 0===f.Ta&&(f.Ta=["a0"]);void 0===f.Ha&&(f.Ha=[2]);if(void 0===f.precision||"highp"===f.precision)f.precision=E;f.id=v++;void 0!==f.Vd&&(f.Vd.forEach(function(G,L){f.h=f.h.replace(G,f.yb[L])}),f.Vd.splice(0));f.Hc=0;f.Ha.forEach(function(G){f.Hc+=
4*G});f.ra=c(u,f.ta,"precision "+f.precision+" float;\n"+f.h);f.B={};f.i.forEach(function(G){f.B[G]=u.getUniformLocation(f.ra,G)});f.attributes={};f.Ia=[];f.Ta.forEach(function(G){var L=u.getAttribLocation(f.ra,G);f.attributes[G]=L;f.Ia.push(L)});if(f.j){u.useProgram(f.ra);l=f;r=f.id;for(var y in f.j)u.uniform1i(f.B[y],f.j[y])}f.qa=!0}}function e(u){xa.Ff(M);r!==u.id&&(M.R(),r=u.id,l=u,b.useProgram(u.ra),u.Ia.forEach(function(f){0!==f&&b.enableVertexAttribArray(f)}))}function m(u,f,y){d(u,f,y);u.useProgram(f.ra);
u.enableVertexAttribArray(0);r=-1;return l=f}function n(){return{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:["u1"],j:{u1:0}}}var q=[],r=-1,l=null,v=0,C=!1,E="highp",g=["u1"],t=["u0"],x={u1:0},k={u0:0},p={u1:0,u2:1},H={u3:0},I={s0:n(),s1:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:g,j:x,precision:"lowp"},s2:{h:"uniform sampler2D u1,u2;varying vec2 vv0;void main(){vec4 a=texture2D(u2,vv0),b=texture2D(u1,vv0);gl_FragColor=a*b;}",
i:["u1","u2"],j:p},s3:{h:"uniform sampler2D u1;uniform vec2 u4,u5;varying vec2 vv0;void main(){vec2 a=vv0*u4+u5;gl_FragColor=texture2D(u1,a);}",i:["u1","u4","u5"],j:x,C:!0},s4:{h:"uniform sampler2D u1;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=a.r*f;}",i:g,j:x},s5:{h:"uniform sampler2D u1,u2;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u2,vv0),b=texture2D(u1,vv0);gl_FragColor=a.a*b.r*f;}",i:["u1","u2"],j:p},s6:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vec2(1.-vv0.x,vv0.y));}",
i:g,j:x},s7:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vec2(vv0.x,1.-vv0.y));}",i:g,j:x},s8:{h:"uniform sampler2D u0;uniform float u4;varying vec2 vv0;void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=a*u4;}",i:["u0","u4"],j:k},s9:{h:"uniform sampler2D u0;uniform float u4;varying vec2 vv0;const vec4 f=vec4(.25,.25,.25,.25),g=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0);float b=dot(a*u4,f);gl_FragColor=b*g;}",i:["u0","u4"],j:k},s10:{h:"uniform sampler2D u1;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.);void main(){float a=.25*dot(e,texture2D(u1,vv0));gl_FragColor=a*e;}",
i:g,j:x},s11:{h:"uniform sampler2D u1,u6;uniform float u7;const vec4 f=vec4(1.,1.,1.,1.);varying vec2 vv0;void main(){vec4 a=texture2D(u1,vv0),b=texture2D(u6,vv0);gl_FragColor=mix(b,a,u7*f);}",i:["u1","u6","u7"],j:{u1:0,u6:1}},s12:{h:"uniform sampler2D u1;uniform vec2 u8;varying vec2 vv0;void main(){gl_FragColor=.25*(texture2D(u1,vv0+u8)+texture2D(u1,vv0+u8*vec2(1.,-1.))+texture2D(u1,vv0+u8*vec2(-1.,-1.))+texture2D(u1,vv0+u8*vec2(-1.,1.)));}",i:["u1","u8"],j:x},s13:{h:"uniform sampler2D u1;uniform vec4 u9;varying vec2 vv0;float g(float a,float b){a=floor(a)+.5;return floor(a/exp2(b));}float h(float a,float b){return floor(a*exp2(b)+.5);}float i(float a,float b){return mod(a,h(1.,b));}float e(float c,float a,float b){a=floor(a+.5),b=floor(b+.5);return i(g(c,a),b-a);}vec4 j(float a){if(a==0.)return vec4(0.,0.,0.,0.);float k=128.*step(a,0.);a=abs(a);float c=floor(log2(a)),l=c+127.,b=(a/exp2(c)-1.)*8388608.,d=l/2.,m=fract(d)*2.,n=floor(d),o=e(b,0.,8.),p=e(b,8.,16.),q=m*128.+e(b,16.,23.),r=k+n;return vec4(o,p,q,r)/255.;}void main(){float a=dot(texture2D(u1,vv0),u9);gl_FragColor=j(a);}",
i:["u1","u9"],j:x},s14:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=e/(e+exp(-a));gl_FragColor=b;}",i:t,j:k,C:!0},s15:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(0.,0.,0.,0.);void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=max(f,a);}",i:t,j:k},s16:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0);gl_FragColor=mix(exp(-abs(a))-f,a,step(0.,a));}",i:t,j:k},
s17:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=exp(-abs(a))-f;gl_FragColor=mix(.1*b,a,step(0.,a));}",i:t,j:k},s18:{h:"uniform sampler2D u0,u7,u10;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),c=texture2D(u7,vv0),d=texture2D(u10,vv0),b=a/d;gl_FragColor=c*mix(exp(-abs(b))-f,b,step(0.,a));}",i:["u0","u7","u10"],j:{u0:0,u7:1,u10:2},C:!0},s19:{h:"uniform sampler2D u0;const float e=3.141593;varying vec2 vv0;void main(){gl_FragColor=atan(e*texture2D(u0,vv0))/e;}",
i:t,j:k},s20:{h:"uniform sampler2D u0;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=texture2D(u0,vv0),b=log(f+a);gl_FragColor=b;}",i:t,j:k,C:!0},s21:{h:"uniform sampler2D u0,u11;uniform float u12;const vec2 e=vec2(.5,.5);const float f=1e-5;const vec4 g=vec4(1.,1.,1.,1.),i=vec4(0.,0.,0.,0.);varying vec2 vv0;void main(){vec4 a=texture2D(u11,e);float b=u12*u12;vec4 c=max(b*a,f*g);gl_FragColor=texture2D(u0,vv0)/c;}",i:["u0","u11","u12"],j:{u0:0,u11:1},C:!0},s22:{h:"uniform sampler2D u1;uniform vec2 u13;varying vec2 vv0;void main(){float a=u13.x*u13.y;vec2 b=floor(vv0*a)/a,c=fract(vv0*a),d=floor(b*u13.y),f=floor(u13.x*fract(b*u13.y)),g=(f*u13.y+d)/a;gl_FragColor=texture2D(u1,g+c/a);}",
i:["u1","u13"],j:x},s23:{h:"uniform sampler2D u14,u15,u16;varying vec2 vv0;void main(){vec4 a=texture2D(u16,vv0);vec2 b=a.rg,c=a.ba;vec4 d=texture2D(u14,b),f=texture2D(u15,c);gl_FragColor=d*f;}",i:["u14","u15","u16"],j:{u15:0,u14:1,u16:2},C:!0},s24:{h:"uniform float u17;uniform sampler2D u14,u15;varying vec2 vv0;void main(){vec2 a=fract(vv0*u17);vec4 b=texture2D(u14,vv0),c=texture2D(u15,a);gl_FragColor=b*c;}",i:["u15","u14","u17"],j:{u15:0,u14:1}},s25:{h:"uniform float u17;uniform sampler2D u14,u15,u18,u19,u20,u21;varying vec2 vv0;const vec4 e=vec4(1.,1.,1.,1.),g=vec4(1e-3,1e-3,1e-3,1e-3);void main(){vec2 h=vv0*u17,l=floor(h),c=h-l;vec4 m=texture2D(u14,vv0),d=texture2D(u15,c),a=texture2D(u21,vv0);a=a*255.;vec4 n=texture2D(u18,c),o=texture2D(u19,c),p=texture2D(u20,c),i=step(-g,-a),b=e-i,j=b*step(-e-g,-a);b*=e-j;vec4 k=b*step(-2.*e-g,-a);b*=e-k;vec4 q=b;d=i*d+j*n+k*o+q*p,gl_FragColor=m*d;}",
i:"u14 u15 u17 u21 u18 u19 u20".split(" "),j:{u15:0,u14:1,u21:3,u18:4,u19:5,u20:6},C:!0},s26:{h:"uniform sampler2D u14,u15,u22;uniform float u17,u23,u24,u25;varying vec2 vv0;const vec2 j=vec2(1.,1.);void main(){vec2 a=floor(u23*vv0),b=u23*vv0-a;float c=u17/u23;vec2 d=floor(b*c),f=b*c-d,g=(a+f)/u23;float k=u23*u25/u17;vec2 l=k*d,h=(l+f*u24)/u25,i=step(h,j);vec4 m=texture2D(u14,g),n=texture2D(u15,h),o=m*n*i.x*i.y,p=texture2D(u22,g);gl_FragColor=o*u24*u24+p;}",i:"u14 u15 u17 u23 u24 u25 u22".split(" "),
j:{u15:0,u14:1,u22:2}},s27:{h:"uniform sampler2D u14,u15;varying vec2 vv0;void main(){vec4 a=texture2D(u14,vv0),b=texture2D(u15,vv0);gl_FragColor=a*b;}",i:["u14","u15"],j:{u15:0,u14:1},C:!0},s28:{h:"uniform sampler2D u1,u22;uniform float u26;varying vec2 vv0;void main(){gl_FragColor=texture2D(u22,vv0)+u26*texture2D(u1,vv0);}",i:["u1","u22","u26"],j:{u1:0,u22:1}},s29:{h:"varying vec2 vv0;uniform sampler2D u1;const vec4 f=vec4(1.,1.,1.,1.),g=vec4(.299,.587,.114,0.);void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=dot(a,g)*f;}",
i:g,j:x,precision:"lowp"},s30:{h:"varying vec2 vv0;uniform sampler2D u1;uniform float u27;const vec3 f=vec3(.299,.587,.114);void main(){vec3 a=texture2D(u1,vv0).rgb,b=texture2D(u1,vv0+vec2(0.,u27)).rgb,c=texture2D(u1,vv0+vec2(u27,u27)).rgb,d=texture2D(u1,vv0+vec2(u27,0.)).rgb;gl_FragColor=vec4(dot(a,f),dot(b,f),dot(c,f),dot(d,f));}",i:["u1","u27"],j:x,precision:"lowp"},s31:{h:"varying vec2 vv0;uniform sampler2D u1;uniform float u27;const vec3 f=vec3(.299,.587,.114);void main(){vec3 a=texture2D(u1,vv0).rgb,b=texture2D(u1,vv0+vec2(0.,u27)).rgb,c=texture2D(u1,vv0+vec2(u27,u27)).rgb,d=texture2D(u1,vv0+vec2(u27,0.)).rgb;gl_FragColor=vec4(a.r,b.g,c.b,dot(d,f));}",
i:["u1","u27"],j:x,precision:"lowp"},s32:{h:"varying vec2 vv0;uniform sampler2D u1,u2;uniform float u28;const vec4 f=vec4(1.,1.,1.,1.);void main(){vec4 a=vec4(0.);a-=texture2D(u1,vec2(vv0.x-u28,vv0.y-u28))*1.,a-=texture2D(u1,vec2(vv0.x-u28,vv0.y))*2.,a-=texture2D(u1,vec2(vv0.x-u28,vv0.y+u28))*1.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y-u28))*1.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y))*2.,a+=texture2D(u1,vec2(vv0.x+u28,vv0.y+u28))*1.;vec4 b=vec4(0.);b-=texture2D(u1,vec2(vv0.x-u28,vv0.y-u28))*1.,b-=texture2D(u1,vec2(vv0.x,vv0.y-u28))*2.,b-=texture2D(u1,vec2(vv0.x+u28,vv0.y-u28))*1.,b+=texture2D(u1,vec2(vv0.x-u28,vv0.y+u28))*1.,b+=texture2D(u1,vec2(vv0.x,vv0.y+u28))*2.,b+=texture2D(u1,vec2(vv0.x+u28,vv0.y+u28))*1.;vec3 c=sqrt(a.rgb*a.rgb+b.rgb*b.rgb);vec4 e=vec4(c,texture2D(u1,vv0).a),g=texture2D(u2,vv0);gl_FragColor=g.a*e.r*f;}",
i:["u1","u2","u28"],j:p,C:!0},s33:{h:"varying vec2 vv0;uniform sampler2D u1,u2;uniform float u28;const vec4 j=vec4(1.,1.,1.,1.);const vec2 k=vec2(1.,1.);void main(){float h=0.;vec2 l=k*u28,a,b;float c,d,i=0.;for(float e=-4.;e<=4.;e+=1.)for(float f=-4.;f<=4.;f+=1.)a=vec2(e,f),c=length(a)/2.,d=exp(-c*c),b=vv0+l*a,h+=d*texture2D(u1,b).r,i+=d;vec4 m=texture2D(u2,vv0);gl_FragColor=m.a*(texture2D(u1,b).r-h/i)*j;}",i:["u1","u2","u28"],j:p,C:!0},s34:{h:"uniform sampler2D u3;uniform vec2 u8;varying vec2 vv0;vec4 e(vec4 a,vec4 b){vec4 c=step(a,b);return mix(a,b,c);}const vec2 g=vec2(.5,.5),h=vec2(1.,0.),i=vec2(0.,1.);void main(){vec2 a=vv0-u8*g;vec4 b=texture2D(u3,a),c=texture2D(u3,a+u8*h),d=texture2D(u3,a+u8*i),j=texture2D(u3,a+u8),k=e(b,c),l=e(d,j);gl_FragColor=e(k,l);}",
i:["u3","u8"],j:H},s35:{h:"uniform sampler2D u3;uniform vec2 u8;varying vec2 vv0;const vec2 k=vec2(1.,0.),l=vec2(0.,1.),m=vec2(2.,0.),n=vec2(0.,2.);vec4 e(vec4 a,vec4 b){vec4 c=step(a,b);return mix(a,b,c);}vec4 f(vec2 a){vec4 b=texture2D(u3,a),c=texture2D(u3,a+u8*k),d=texture2D(u3,a+u8*l),g=texture2D(u3,a+u8),h=e(b,c),i=e(d,g);return e(h,i);}void main(){vec2 a=vv0+u8*vec2(-.55,-1.05);vec4 b=f(a),c=f(a+u8*m),d=f(a+u8*2.),g=f(a+u8*n),h=e(b,c),i=e(d,g);gl_FragColor=e(h,i);}",i:["u3","u8"],j:H,C:!0},
s36:{h:"uniform sampler2D u1;varying vec2 vv0;void main(){vec4 a=texture2D(u1,vv0);gl_FragColor=a*a;}",i:["u1"],j:x,precision:"lowp",C:!0},s37:{h:"uniform sampler2D u1;uniform vec2 u8;varying vec2 vv0;const float e=15444.;void main(){vec4 a=1001./e*texture2D(u1,vv0-3.*u8)+2002./e*texture2D(u1,vv0-2.*u8)+3003./e*texture2D(u1,vv0-u8)+3432./e*texture2D(u1,vv0)+3003./e*texture2D(u1,vv0+u8)+2002./e*texture2D(u1,vv0+2.*u8)+1001./e*texture2D(u1,vv0+3.*u8);gl_FragColor=a;}",i:["u8","u1"],j:x,precision:"lowp",
C:!0},s38:{h:"uniform sampler2D u1,u11,u29;varying vec2 vv0;const vec4 f=vec4(1.,1.,1.,1.);const float g=.1;void main(){vec4 a=texture2D(u11,vv0),b=texture2D(u29,vv0),c=texture2D(u1,vv0),d=max(f*g,b-a*a),h=sqrt(d);gl_FragColor=(c-a)/h;}",i:["u1","u11","u29"],j:{u1:0,u11:1,u29:2},C:!0}},N={s39:{h:"uniform float u17,u30;uniform sampler2D u14,u15,u22;varying vec2 vv0;const vec2 ZERO2=vec2(0.,0.),ONE2=vec2(1.,1.),HALF2=vec2(.5,.5),EPS2=vec2(1e-5,1e-5);void main(){vec4 sum=texture2D(u22,vv0);float toSparsity=1.1111;vec2 uvFrom,uvWeight,xyPatch=ZERO2,eps2=EPS2/u17,xyTo=floor(vv0*u17+eps2);float weightSize=toSparsity*u17;vec2 halfFromSparsity=ONE2*(toSparsity-1.)/2.;for(float patch_x=0.;patch_x<1.1111;patch_x+=1.){xyPatch.x=patch_x;for(float patch_y=0.;patch_y<1.1111;patch_y+=1.)xyPatch.y=patch_y,uvFrom=(xyTo+HALF2+u30*(xyPatch-halfFromSparsity))/u17,uvFrom+=step(uvFrom,-eps2),uvFrom-=step(ONE2-eps2,uvFrom),uvWeight=(xyTo*toSparsity+xyPatch+HALF2)/weightSize,sum+=texture2D(u14,uvWeight)*texture2D(u15,uvFrom);}gl_FragColor=sum,gl_FragColor*=2.2222;}",
i:["u17","u14","u15","u22","u30"],yb:["1.1111","gl_FragColor\\*=2.2222;"]},s40:{h:"uniform float u17,u30,u25;uniform sampler2D u14,u15,u22;varying vec2 vv0;const vec2 ZERO2=vec2(0.,0.),ONE2=vec2(1.,1.),HALF2=vec2(.5,.5),EPS2=vec2(1e-4,1e-4);void main(){vec4 sum=texture2D(u22,vv0);float fromSparsity=1.1111,shrinkFactor=3.3333;vec2 uvFrom,uvWeight,xyFrom,xyPatchTo,xyPatch=ZERO2,xyShrink=ZERO2,eps2=EPS2/u25,xyTo=floor(vv0*u17+eps2);float weightSize=fromSparsity*u25;vec2 halfFromSparsity=ONE2*(fromSparsity-1.)/2.;float toSparsity=weightSize/u17;vec2 xyFrom0=xyTo*shrinkFactor;for(float patch_x=0.;patch_x<1.1111;patch_x+=1.){xyPatch.x=patch_x;for(float patch_y=0.;patch_y<1.1111;patch_y+=1.){xyPatch.y=patch_y;for(float shrink_x=0.;shrink_x<3.3333;shrink_x+=1.){xyShrink.x=shrink_x;for(float shrink_y=0.;shrink_y<3.3333;shrink_y+=1.)xyShrink.y=shrink_y,xyFrom=xyFrom0+xyShrink+shrinkFactor*u30*(xyPatch-halfFromSparsity),uvFrom=(xyFrom+HALF2)/u25,uvFrom+=step(uvFrom,-eps2),uvFrom-=step(ONE2-eps2,uvFrom),xyPatchTo=xyPatch*shrinkFactor+xyShrink,uvWeight=(xyTo*toSparsity+xyPatchTo+HALF2)/weightSize,sum+=texture2D(u14,uvWeight)*texture2D(u15,uvFrom);}}}gl_FragColor=sum,gl_FragColor*=2.2222;}",
i:"u17 u25 u14 u15 u22 u30".split(" "),yb:["1.1111","gl_FragColor\\*=2.2222;","3.3333"]}},z=null,J=null,M={nb:function(){return C},A:function(){if(!C){z=mb.Kb(I,2);J=mb.Kb(N,2);E="highp";for(var u in z)d(b,z[u],u);A.set("s0");b.enableVertexAttribArray(0);C=!0}},Qc:function(u){u.forEach(function(f){M.Pc(f)})},Pc:function(u){z[u.id]=u;d(b,u,u.id)},sd:function(u,f,y){f||(f=u);z[f]=Object.create(J[u]);z[f].ef=!0;J[u].yb&&J[u].yb.forEach(function(G,L){z[f].h=z[f].h.replace(new RegExp(G,"g"),y[L])});d(b,
z[f],f)},set:function(u){var f=z[u];f.C&&(f.C=!1,d(b,f,u));e(f)},Ra:function(u){return m(u,n(),"s41")},wc:function(u){return m(u,{h:"void main(){gl_FragColor=vec4(.5,.5,.5,.5);}",i:[],precision:"highp"},"s42")},Je:function(u){return"undefined"===typeof z[u]?!1:z[u].qa},R:function(){-1!==r&&(r=-1,l.Ia.forEach(function(u){0!==u&&b.disableVertexAttribArray(u)}))},yc:function(){var u=0;l.Ia.forEach(function(f,y){y=l.Ha[y];b.vertexAttribPointer(f,y,b.FLOAT,!1,l.Hc,u);u+=4*y})},ad:function(){b.enableVertexAttribArray(0)},
Ba:function(){M.zb(b)},zb:function(u){u.vertexAttribPointer(l.Ia[0],2,u.FLOAT,!1,8,0)},Xd:function(u,f){b.uniform1i(l.B[u],f)},G:function(u,f){b.uniform1f(l.B[u],f)},sa:function(u,f,y){b.uniform2f(l.B[u],f,y)},wh:function(u,f){b.uniform2fv(l.B[u],f)},Gf:function(u,f){b.uniform3fv(l.B[u],f)},xh:function(u,f,y,G){b.uniform3f(l.B[u],f,y,G)},yh:function(u,f,y,G,L){b.uniform4f(l.B[u],f,y,G,L)},xc:function(u,f){b.uniform4fv(l.B[u],f)},zh:function(u,f){b.uniformMatrix2fv(l.B[u],!1,f)},Ah:function(u,f){b.uniformMatrix3fv(l.B[u],
!1,f)},Bh:function(u,f){b.uniformMatrix4fv(l.B[u],!1,f)},T:function(u,f){M.set(u);f.forEach(function(y){switch(y.type){case "4f":b.uniform4fv(l.B[y.name],y.value);break;case "3f":b.uniform3fv(l.B[y.name],y.value);break;case "2f":b.uniform2fv(l.B[y.name],y.value);break;case "1f":b.uniform1f(l.B[y.name],y.value);break;case "1i":b.uniform1i(l.B[y.name],y.value);break;case "mat2":b.uniformMatrix2fv(l.B[y.name],!1,y.value);break;case "mat3":b.uniformMatrix3fv(l.B[y.name],!1,y.value);break;case "mat4":b.uniformMatrix4fv(l.B[y.name],
!1,y.value)}})},Pg:function(){return"lowp"},m:function(){b.disableVertexAttribArray(0);M.R();for(var u in z){var f=z[u];f.qa&&(f.qa=!1,b.deleteProgram(f.ra));f.ef&&delete z[u]}q.forEach(function(y){b.deleteShader(y)});q.splice(0);v=0;C=!1;l=null;r=-1}};return M}(),b=null,Qa=function(){function a(g){console.log("ERROR in ContextFF: ",g);return!1}function c(g){function t(){Ca.m();aa.reset();k.getExtension("WEBGL_lose_context").loseContext()}if(navigator.userAgent&&-1!==navigator.userAgent.indexOf("forceWebGL1"))return!1;
var x=document.createElement("canvas");x.setAttribute("width",5);x.setAttribute("height",5);var k=null;try{k=x.getContext("webgl2",g)}catch(p){return!1}if(!k)return!1;d(k);aa.bd(k);g=aa.Lb(k);if(!g.ja&&!g.ka)return t(),!1;g=Ca.Tc(k,g);t();return g?!0:!1}function d(g){g.clearColor(0,0,0,0);g.disable(g.DEPTH_TEST);g.disable(g.BLEND);g.disable(g.DITHER);g.disable(g.STENCIL_TEST);g.disable(g.CULL_FACE);g.GENERATE_MIPMAP_HINT&&g.hint(g.GENERATE_MIPMAP_HINT,g.FASTEST);g.disable(g.SAMPLE_ALPHA_TO_COVERAGE);
g.disable(g.SAMPLE_COVERAGE);g.depthFunc(g.LEQUAL);g.clearDepth(1)}var e=null,m=null,n=null,q=null,r=!0,l=null,v=null,C=[],E={F:function(){return e.width},U:function(){return e.height},Gg:function(){return e},Eg:function(){return b},la:function(){return r},flush:function(){b.flush()},Pe:function(){l||(l=new Uint8Array(e.width*e.height*4));b.readPixels(0,0,e.width,e.height,b.RGBA,b.UNSIGNED_BYTE,l);return l},Ig:function(){return e.toDataURL("image/jpeg")},Jg:function(){va.P();m||(m=document.createElement("canvas"),
n=m.getContext("2d"));m.width=e.width;m.height=e.height;for(var g=E.Pe(),t=n.createImageData(m.width,m.height),x=m.width,k=m.height,p=t.data,H=0;H<k;++H)for(var I=k-H-1,N=0;N<x;++N){var z=4*(H*x+N),J=4*(I*x+N);p[z]=g[J];p[z+1]=g[J+1];p[z+2]=g[J+2];p[z+3]=g[J+3]}n.putImageData(t,0,0);return m.toDataURL("image/png")},Hg:function(g){!m&&g&&(m=document.createElement("canvas"),n=m.getContext("2d"));var t=g?m:document.createElement("canvas");t.width=e.width;t.height=e.height;(g?n:t.getContext("2d")).drawImage(e,
0,0);return t},A:function(g){g.Ce&&!g.Jb?e=document.getElementById(g.Ce):g.Jb&&(e=g.Jb);e||(e=document.createElement("canvas"));e.width=g&&void 0!==g.width?g.width:512;e.height=g&&void 0!==g.height?g.height:512;"undefined"===typeof g&&(g={});void 0===g.premultipliedAlpha&&(g.premultipliedAlpha=!1);void 0===g.wd&&(g.wd=!0);void 0===g.antialias&&(g.antialias=!1);if(b)r=b instanceof WebGL2RenderingContext;else{r=!0;var t={antialias:g.antialias,alpha:!0,preserveDrawingBuffer:!0,premultipliedAlpha:g.premultipliedAlpha,
stencil:!1,depth:g.wd};navigator&&navigator.userAgent&&-1!==navigator.userAgent.indexOf("noAntialiasing")&&(t.antialias=!1);var x=c(t);!x&&t.antialias&&(t.antialias=!1,x=c(t));x&&(b=e.getContext("webgl2",t));b?r=!0:((b=e.getContext("webgl",t))||(b=e.getContext("experimental-webgl",t)),r=!1)}if(!b)return a("WebGL1 and 2 are not enabled");(q=b.getExtension("WEBGL_lose_context"))&&g.Ld&&(v=g.Ld,e.addEventListener("webglcontextlost",v,!1));if(!aa.A())return a("Not enough GL capabilities");d(b);A.A();
U.A();if(!Ca.Tc(b,aa.Oe()))return a("Cannot filter float textures");C.forEach(function(k){k(b)});C.splice(0);return!0},$f:function(){return new Promise(function(g){b?g(b):C.push(g)})},m:function(){b&&(aa.m(),A.m(),Ca.m());q&&v&&(e.removeEventListener("webglcontextlost",v,!1),q=v=null);b=l=n=m=e=null;C.splice(0)}};return E}(),xa=function(){function a(){null===c&&("undefined"!==typeof A?c=A:"undefined"!==typeof JEShaders&&(c=JEShaders))}var c=null;a();return{reset:function(){c=null},Ff:function(d){c!==
d&&(c&&c.R(),c=d)},nb:function(){return c.nb()},Ba:function(){return c.Ba()},zb:function(d){return c.zb(d)},yc:function(){return c.yc()},R:function(){return c.R()},set:function(d){return c.set(d)},Ra:function(d){a();return c.Ra(d)},wc:function(d){a();return c.wc(d)}}}(),Ba=function(){function a(h){b.bindTexture(b.TEXTURE_2D,h)}function c(h){f[0]=h;h=y[0];var F=h>>16&32768,K=h>>12&2047,P=h>>23&255;return 103>P?F:142<P?F|31744|((255==P?0:1)&&h&8388607):113>P?(K|=2048,F|(K>>114-P)+(K>>113-P&1)):F=(F|
P-112<<10|K>>1)+(K&1)}function d(h){var F=new Uint16Array(h.length);h.forEach(function(K,P){F[P]=c(K)});return F}function e(){if(null!==G.$b)return G.$b;var h=n(d([.5,.5,.5,.5]));return null===h?!0:G.$b=h}function m(){if(null!==G.ac)return G.ac;var h=n(new Uint8Array([127,127,127,127]));return null===h?!0:G.ac=h}function n(h){if(!xa.nb()||!k)return null;var F=null,K=Math.sqrt(h.length/4);try{var P=b.getError();if("FUCKING_BIG_ERROR"===P)return!1;F=L.instance({isFloat:!1,S:!0,array:h,width:K});P=b.getError();
if(P!==b.NO_ERROR)return!1}catch(ra){return!1}la.P();b.viewport(0,0,K,K);b.clearColor(0,0,0,0);b.clear(b.COLOR_BUFFER_BIT);xa.set("s0");F.Rc(0);ma.l(!0,!0);h=4*K*K;P=new Uint8Array(h);b.readPixels(0,0,K,K,b.RGBA,b.UNSIGNED_BYTE,P);K=!0;for(var da=0;da<h;++da)K=K&&3>Math.abs(P[da]-127);F.remove();la.ha();return K}var q=0,r=null,l=0,v=null,C=null,E=null,g=null,t=null,x=null,k=!1,p=[],H={isFloat:!1,isPot:!0,isLinear:!1,isMipmap:!1,isAnisotropicFiltering:!1,isMirrorX:!1,isMirrorY:!1,isSrgb:!1,isKeepArray:!1,
isFlipY:null,width:0,height:0,url:null,array:null,data:null,I:null,Zb:null,df:!1,S:!1,oa:null,sb:4,ic:0},I=!1,N=null,z=null,J=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],M=!1,u=!1,f=new Float32Array(1),y=new Int32Array(f.buffer),G={$b:null,ac:null},L={A:function(){k||(t=[b.RGBA,null,b.RGBA,b.RGBA],x=[b.RGBA,null,b.RGBA,b.RGBA],r=[b.TEXTURE0,b.TEXTURE1,b.TEXTURE2,b.TEXTURE3,b.TEXTURE4,b.TEXTURE5,b.TEXTURE6,b.TEXTURE7],M="undefined"!==typeof JEContext,u="undefined"!==typeof aa,M&&JEContext.gh()&&r.push(b.TEXTURE8,
b.TEXTURE9),v=[-1,-1,-1,-1,-1,-1,-1,-1],g=[b.UNSIGNED_BYTE,b.FLOAT,b.FLOAT],k=!0)},af:function(){if(!C){for(var h=new Float32Array(16384),F=0;16384>F;++F)h[F]=2*Math.random()-1;C={random:L.instance({isFloat:!0,isPot:!0,array:h,width:64}),de:L.instance({isFloat:!1,isPot:!0,width:1,array:new Uint8Array([0,0,0,0])})}}L.Sf()},Xg:function(){return C.de},Sf:function(){g[1]=aa.Vb(b)},Df:function(){x=t=[b.RGBA,b.RGBA,b.RGBA,b.RGBA]},Sd:function(h){A.set("s1");la.P();var F=h.F(),K=h.U();b.viewport(0,0,F,K);
h.g(0);ma.l(!1,!1)},mh:function(h,F){L.Sd(h);b.readPixels(0,0,h.F(),h.U(),b.RGBA,b.UNSIGNED_BYTE,F)},nh:function(h,F){L.Sd(h);return aa.xb(0,0,h.F(),h.U(),F)},kd:function(h,F,K,P,da,ra,za){h.activeTexture(h.TEXTURE0);var w=h.createTexture();h.bindTexture(h.TEXTURE_2D,w);da=da instanceof Float32Array?da:new Float32Array(da);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MAG_FILTER,
h.NEAREST);h.texParameteri(h.TEXTURE_2D,h.TEXTURE_MIN_FILTER,h.NEAREST);h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,ra);h.texImage2D(h.TEXTURE_2D,0,h.RGBA,K,P,0,h.RGBA,h.FLOAT,da);h.bindTexture(h.TEXTURE_2D,null);h.pixelStorei(h.UNPACK_FLIP_Y_WEBGL,!1);za&&(la.ha(),A.Ra(h));h.viewport(0,0,K,P);h.framebufferTexture2D(h.FRAMEBUFFER,h.COLOR_ATTACHMENT0,h.TEXTURE_2D,F,0);h.bindTexture(h.TEXTURE_2D,w);za?ma.l(!0,!0):U.ab(h);h.deleteTexture(w);k&&(v[0]=-1,E=null,q=0)},Fb:function(h){h!==q&&(b.activeTexture(r[h]),
q=h)},instance:function(h){function F(){R=void 0!==w.I.videoWidth?w.I.videoWidth:w.I.width;T=void 0!==w.I.videoHeight?w.I.videoHeight:w.I.height}function K(D){var S=b.getError();if("FUCKING_BIG_ERROR"===S)return!1;b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D);S=b.getError();S!==b.NO_ERROR&&fa!==b.RGBA&&(fa=b.RGBA,b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D));return!0}function P(){if(!Ab){a(ta);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,Aa);w.isPot?(b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,w.isMirrorX?b.MIRRORED_REPEAT:
b.REPEAT),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,w.isMirrorY?b.MIRRORED_REPEAT:b.REPEAT)):(b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE),b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE));w.isAnisotropicFiltering&&"undefined"!==typeof JESETTINGS&&b.texParameterf(b.TEXTURE_2D,JEContext.Kg().TEXTURE_MAX_ANISOTROPY_EXT,JESETTINGS.Wf);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,w.isLinear?b.LINEAR:b.NEAREST);w.isLinear?b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,
w.isMipmap&&!Ka?b.NEAREST_MIPMAP_LINEAR:b.LINEAR):b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,w.isMipmap&&!Ka?b.NEAREST_MIPMAP_NEAREST:b.NEAREST);fa=t[w.sb-1];ja=x[w.sb-1];ha=g[nb];if(aa.la()){var D=aa.Re();fa===b.RGBA&&ha===b.FLOAT?w.isMipmap||w.isLinear?ja=Ca.Te(b):aa.Uc()?D&&(ja=D):ja=b.RGBA16F||b.RGBA:fa===b.RGB&&ha===b.FLOAT&&D&&(ja=D,fa=b.RGBA)}if(w.S&&!w.isFloat||w.isFloat&&w.isMipmap&&Ca.hf())ja=aa.Se(),ha=aa.Vb(b);w.ic&&(ab=w.ic);w.isSrgb&&4===w.sb&&(fa=JEContext.Vg());if(w.I)K(w.I);
else if(w.url)K(Ga);else if(ua){D=ua;try{"FUCKING_BIG_ERROR"!==b.getError()&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,D),b.getError()!==b.NO_ERROR&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null),b.getError()!==b.NO_ERROR&&b.texImage2D(b.TEXTURE_2D,0,b.RGBA,R,T,0,b.RGBA,b.UNSIGNED_BYTE,null)))}catch(hc){b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null)}w.isKeepArray||(ua=null)}else D=b.getError(),"FUCKING_BIG_ERROR"!==D&&(b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null),D=b.getError(),D!==b.NO_ERROR&&
(fa=b.RGBA,w.S&&ha!==b.FLOAT&&(ha=b.FLOAT,b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,null))));if(w.isMipmap)if(!Ka&&ca)ca.Ub(),bb=!0;else if(Ka){D=Math.log2(Math.min(R,T));Ra=Array(1+D);Ra[0]=ta;for(var S=1;S<=D;++S){var ka=Math.pow(2,S),V=R/ka;ka=T/ka;var La=b.createTexture();a(La);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texImage2D(b.TEXTURE_2D,0,ja,V,ka,0,fa,ha,null);a(null);Ra[S]=La}bb=!0}a(null);v[q]=-1;Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,
!1);Ta=!0;w.oa&&ca&&(w.oa(ca),w.oa=null)}}function da(){for(var D=R*T,S=2*D,ka=3*D,V=0;V<D;++V)ya[0][V]=Ua[V],ya[1][V]=Ua[V+D],ya[2][V]=Ua[V+S],ya[3][V]=Ua[V+ka]}function ra(){var D=R*T*4;Da=[new Uint8Array(D),new Uint8Array(D),new Uint8Array(D),new Uint8Array(D)];ya=[new Float32Array(Da[0].buffer),new Float32Array(Da[1].buffer),new Float32Array(Da[2].buffer),new Float32Array(Da[3].buffer)];cb=new Uint8Array(4*D);Ua=new Float32Array(cb.buffer);Va=!0}function za(){Ea.Gb=new Uint8Array(R*T*4);Ea.ld=
new Float32Array(Ea.buffer);Ea.Y=!0}var w=Object.assign({},H,h),Wa=l++;null===w.isFlipY&&(w.isFlipY=w.url||w.array?!0:!1);w.data&&(w.array="string"===typeof w.data?Ib(w.data):w.isFloat?new Float32Array(w.data):new Uint8Array(w.data),w.isFlipY=!1);var nb=0,Bb=w.I?!0:!1,Xa=null,ob=null,Cb=!1,pb=null;w.S=w.S||w.isFloat;w.S&&(nb=1);!w.df&&w.isFloat&&u&&!aa.Uc()&&(w.isFloat=!1);w.isFloat&&(nb=2);w.isAnisotropicFiltering&&M&&!JEContext.$g()&&(w.isAnisotropicFiltering=!1);var ta=w.Zb||b.createTexture(),
Ga=null,ua=!1,R=0,T=0,Ta=!1,Ab=!1,Va=!1,ya=null,Da=null,cb=null,Ua=null,ja=null,fa=null,ha=null,Aa=w.isFlipY,Wb=(h=w.S&&w.isMipmap)&&Ca.te(),Ka=h&&Wb?!0:!1,Ra=null,ab=-1,bb=!1,Ea={Y:!1,Gb:null,ld:null};w.width&&(R=w.width,T=w.height?w.height:R);var ca={get:function(){return ta},F:function(){return R},U:function(){return T},Yg:function(){return w.url},ah:function(){return w.isFloat},dh:function(){return w.S},eh:function(){return w.isLinear},Ub:function(){b.generateMipmap(b.TEXTURE_2D)},re:function(D,
S){Ka?(D||(D=ca.pd()),L.Fb(S),a(Ra[D]),v[S]=-1):ca.g(S)},pd:function(){-1===ab&&(ab=Math.log(R)/Math.log(2));return ab},Le:function(D){if(Ka){D||(D=ca.pd());A.set("s12");L.Fb(0);for(var S=R,ka=T,V=1;V<=D;++V)S/=2,ka/=2,A.sa("u8",.25/S,.25/ka),b.viewport(0,0,S,ka),a(Ra[V-1]),b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,Ra[V],0),ma.l(!1,1===V);v[0]=-1}else ca.Ub()},vh:function(D){(Bb=!Ub.Mf(D))?(ua=null,w.I=D,F()):ua=D},g:function(D){if(!Ta)return!1;L.Fb(D);if(v[D]===Wa)return!1;
a(ta);v[D]=Wa;return!0},Rc:function(D){b.activeTexture(r[D]);q=D;a(ta);v[D]=Wa},u:function(){E=ca;b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,ta,0)},da:function(){E=ca;b.viewport(0,0,R,T);b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,ta,0)},Fc:L.Fc,resize:function(D,S){R=D;T=S;P()},clone:function(D){D=L.instance({width:R,height:T,S:w.S,isFloat:w.isFloat,isLinear:w.isLinear,isMirrorY:w.isMirrorY,isFlipY:D?!Aa:Aa,isPot:w.isPot});xa.set("s0");la.ha();D.u();b.viewport(0,
0,R,T);ca.g(0);ma.l(!0,!0);return D},Hf:function(){b.viewport(0,0,R,T)},remove:function(){b.deleteTexture(ta);Ab=!0;p.splice(p.indexOf(ca),1);ca=null},refresh:function(){ca.Rc(0);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);Bb?b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,w.I):b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,ua);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},Rd:function(){Va||ra();b.readPixels(0,0,R,4*T,b.RGBA,b.UNSIGNED_BYTE,cb);da();return ya},xf:function(){Va||ra();return aa.xb(0,0,R,4*T,cb).then(function(){da();
return ya})},zf:function(){Ea.Y||za();b.readPixels(0,0,R,T,b.RGBA,b.UNSIGNED_BYTE,Ea.Gb);return Ea.ld},yf:function(){Ea.Y||za();return aa.xb(0,0,R,T,Ea.Gb)},Zc:function(D){la.P();A.set("s13");ca.g(0);if(D)b.viewport(0,0,R,T),A.xc("u9",.25,.25,.25,.25),ma.l(!1,!0);else for(D=0;4>D;++D)b.viewport(0,T*D,R,T),A.xc("u9",J[D]),ma.l(!1,0===D)},Rf:function(D){var S=ha===g[0]&&!m();a(ta);Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);S?(Cb||(Xa=document.createElement("canvas"),Xa.width=R,Xa.height=T,ob=Xa.getContext("2d"),
pb=ob.createImageData(R,T),Cb=!0),pb.data.set(D),ob.putImageData(pb,0,0),b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,Xa)):b.texImage2D(b.TEXTURE_2D,0,ja,R,T,0,fa,ha,D);v[q]=Wa;Aa&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},Gh:function(D,S){a(ta);S&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!0);b.texImage2D(b.TEXTURE_2D,0,ja,fa,ha,D);v[q]=Wa;S&&b.pixelStorei(b.UNPACK_FLIP_Y_WEBGL,!1)},th:function(D,S){var ka=R*T,V=4*ka;D=w.S?D?"RGBE":"JSON":"RGBA";S&&(D=S);S=aa.la()&&!1;var La=null;switch(D){case "RGBE":La="s43";
break;case "JSON":La=S?"s0":"s13";break;case "RGBA":case "RGBAARRAY":La="s7"}Va||("RGBA"===D||"RGBE"===D||"RGBAARRAY"===D?(Da=new Uint8Array(V),Va=!0):"JSON"!==D||S||ra());la.P();A.set(La);ca.g(0);V=null;if("RGBA"===D||"RGBE"===D||"RGBAARRAY"===D){b.viewport(0,0,R,T);ma.l(!0,!0);b.readPixels(0,0,R,T,b.RGBA,b.UNSIGNED_BYTE,Da);if("RGBAARRAY"===D)return{data:Da};I||(N=document.createElement("canvas"),z=N.getContext("2d"),I=!0);N.width=R;N.height=T;ka=z.createImageData(R,T);ka.data.set(Da);z.putImageData(ka,
0,0);V=N.toDataURL("image/png")}else if("JSON"===D)if(S)V=new Float32Array(ka),b.viewport(0,0,R,T),ma.l(!0,!0),b.readPixels(0,0,R,T,b.RGBA,b.FLOAT,V);else{for(V=0;4>V;++V)b.viewport(0,T*V,R,T),A.xc("u9",J[V]),ma.l(!V,!V);ca.Rd();V=Array(ka);for(S=0;S<ka;++S)V[4*S]=ya[0][S],V[4*S+1]=ya[1][S],V[4*S+2]=ya[2][S],V[4*S+3]=ya[3][S]}return{format:D,data:V,width:R,height:T,isMirrorY:w.isMirrorY,isFlipY:"RGBA"===D?w.isFlipY:!w.isFlipY}}};w.isMipmap&&!Ka&&Ta&&!bb&&(ca.Ub(),bb=!0);if(w.url)a(ta),b.texImage2D(b.TEXTURE_2D,
0,b.RGBA,1,1,0,b.RGBA,b.UNSIGNED_BYTE,null),Ga=new Image,Ga.jg="Anonymous",Ga.crossOrigin="Anonymous",Ga.src=w.url,Ga.onload=function(){R=Ga.width;T=Ga.height;P()};else if(w.I){var Db=function(){F();R?P():setTimeout(Db,1)};Db()}else w.array?(w.S&&!w.isFloat?w.array instanceof Uint16Array?(ua=w.array,P()):e()?(ua=d(w.array),P()):(P(),L.kd(b,ta,ca.F(),ca.U(),w.array,Aa,!0)):(ua=w.isFloat?w.array instanceof Float32Array?w.array:new Float32Array(w.array):w.array instanceof Uint8Array?w.array:new Uint8Array(w.array),
P()),w.isKeepArray||(ua&&ua!==w.array&&(ua=null),delete w.array)):w.Zb?Ta=!0:P();ca.Ug=ca.F;w.oa&&Ta&&(w.oa(ca),w.oa=null);p.push(ca);return ca},P:function(h){h!==q&&(b.activeTexture(r[h]),q=h);v[h]=-1;a(null)},Zf:function(h){C.random.g(h)},Fc:function(){E=null;b.framebufferTexture2D(la.eb(),b.COLOR_ATTACHMENT0,b.TEXTURE_2D,null,0)},reset:function(){0!==q&&b.activeTexture(r[0]);for(var h=0;h<r.length;++h)v[h]=-1;q=-1},qh:function(){q=-1},Of:function(){for(var h=0;h<r.length;++h)L.P(h)},md:function(){C&&
(C.random.remove(),C.de.remove())},Fh:function(h,F){if("RGBA"===h.format||"RGBE"===h.format){var K=new Image;K.src=h.data;K.onload=function(){L.instance({isMirrorY:h.isMirrorY,isFlipY:h.isFlipY,isFloat:!1,I:K,oa:function(P){if("RGBA"===h.format)F(P);else{var da=h.width,ra=h.height,za=L.instance({isMirrorY:h.isMirrorY,isFloat:!0,width:da,height:ra,isFlipY:h.isFlipY});la.ha();b.viewport(0,0,da,ra);A.set("s44");za.u();P.g(0);ma.l(!0,!0);L.P(0);F(za);b.flush();setTimeout(P.remove,50)}}})}}else"JSON"===
h.format?F(L.instance({isFloat:!0,isFlipY:h.isFlipY,width:h.width,height:h.height,array:new Float32Array(h.data)})):F(!1)},ze:d,m:function(){E&&(va.ha(),L.Fc(),va.P());L.Of();p.slice(0).forEach(function(h){h.remove()});p.splice(0);k=!1;l=0;"undefined"!==typeof Ca&&Ca.m();C=null}};return L}(),Ob=function(){return{instance:function(a){var c=[Ba.instance(a),Ba.instance(a)],d=[c[1],c[0]],e=d,m={Bf:function(n){e[1].u();e[0].g(n);m.Zd()},uh:function(n){e[1].da();e[0].g(n);m.Zd()},Zd:function(){e=e===c?
d:c},refresh:function(){e[0].refresh();e[1].refresh()},g:function(n){e[0].g(n)},Yf:function(n){e[1].g(n)},Og:function(){return e[0]},Sg:function(){return e[1]},remove:function(){e[0].remove();e[1].remove();e=null}};return m}}}(),ma=function(){function a(l){var v={ea:null,K:null};v.ea=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,v.ea);l.bufferData(l.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),l.STATIC_DRAW);v.K=l.createBuffer();l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,v.K);l.bufferData(l.ELEMENT_ARRAY_BUFFER,
new Uint16Array([0,1,2]),l.STATIC_DRAW);return v}var c=null,d=0,e=!1,m=[],n=-2,q=-2,r={reset:function(){q=n=-2},A:function(){e||(c=a(b),r.Ja(),e=!0)},instance:function(l){var v=d++,C=l.K?l.K.length:0,E="undefined"===typeof l.mode?b.STATIC_DRAW:l.mode,g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,l.ea instanceof Float32Array?l.ea:new Float32Array(l.ea),E);n=v;var t=null,x=null,k=null;if(l.K){t=b.createBuffer();b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,t);var p=null;65536>
l.K.length?(p=Uint16Array,x=b.UNSIGNED_SHORT,k=2):(p=Uint32Array,x=b.UNSIGNED_INT,k=4);p=l.K instanceof p?l.K:new p(l.K);b.bufferData(b.ELEMENT_ARRAY_BUFFER,p,E);q=v}var H={se:function(I){n!==v&&(b.bindBuffer(b.ARRAY_BUFFER,g),n=v);I&&xa.yc()},pe:function(){q!==v&&(b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,t),q=v)},bind:function(I){H.se(I);H.pe()},lg:function(){b.drawElements(b.TRIANGLES,C,x,0)},mg:function(I,N){b.drawElements(b.TRIANGLES,I,x,N*k)},remove:function(){b.deleteBuffer(g);l.K&&b.deleteBuffer(t);
H=null}};m.push(H);return H},Ja:function(){-1!==n&&(b.bindBuffer(b.ARRAY_BUFFER,c.ea),n=-1);-1!==q&&(b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,c.K),q=-1)},l:function(l,v){l&&ma.Ja();v&&xa.Ba();b.drawElements(b.TRIANGLES,3,b.UNSIGNED_SHORT,0)},ab:function(l){l=l||b;var v=a(l);l.bindBuffer(l.ARRAY_BUFFER,v.ea);l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,v.K);xa.zb(l);l.clear(l.COLOR_BUFFER_BIT);l.drawElements(l.TRIANGLES,3,l.UNSIGNED_SHORT,0);l.flush();l.bindBuffer(l.ARRAY_BUFFER,null);l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,
null);l.deleteBuffer(v.ea);l.deleteBuffer(v.K);r.reset();e&&(r.Ja(),xa.Ba())},md:function(){var l=b,v=c;l.deleteBuffer(v.ea);l.deleteBuffer(v.K)},m:function(){r.md();m.forEach(function(l){l.remove()});b.bindBuffer(b.ARRAY_BUFFER,null);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,null);r.reset();e=!1;m.splice(0);d=0}};return r}(),la=function(){var a=null,c=null,d=null,e=!1,m=[],n={J:-2,jd:1},q={nb:function(){return e},A:function(){if(!e){a=b.createFramebuffer();var r=aa.la();c=r&&b.DRAW_FRAMEBUFFER?b.DRAW_FRAMEBUFFER:
b.FRAMEBUFFER;d=r&&b.READ_FRAMEBUFFER?b.READ_FRAMEBUFFER:b.FRAMEBUFFER;e=!0}},Lg:function(){return c},Ue:function(){return d},eb:function(){return b.FRAMEBUFFER},Tg:function(){return n},Dg:function(){return a},instance:function(r){void 0===r.vd&&(r.vd=!1);var l=r.N?r.N:null,v=r.width,C=void 0!==r.height?r.height:r.width,E=a,g=null,t=!1,x=!1,k=0;l&&(v=v?v:l.F(),C=C?C:l.U());var p={Wd:function(){t||(E=b.createFramebuffer(),t=!0,k=n.jd++)},je:function(){p.Wd();p.u();g=b.createRenderbuffer();b.bindRenderbuffer(b.RENDERBUFFER,
g);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,v,C);b.framebufferRenderbuffer(c,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,g);b.clearDepth(1)},bind:function(H,I){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k);l&&l.u();I&&b.viewport(0,0,v,C);H&&b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)},Xf:function(){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k)},clear:function(){b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT)},fg:function(){b.clear(b.COLOR_BUFFER_BIT)},gg:function(){b.clear(b.DEPTH_BUFFER_BIT)},Hf:function(){b.viewport(0,
0,v,C)},u:function(){k!==n.J&&(b.bindFramebuffer(c,E),n.J=k)},rtt:function(H){l=H;n.J!==k&&(b.bindFramebuffer(b.FRAMEBUFFER,E),n.J=k);H.u()},P:function(){b.bindFramebuffer(c,null);n.J=-1},resize:function(H,I){v=H;C=I;g&&(b.bindRenderbuffer(b.RENDERBUFFER,g),b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,v,C))},remove:function(){E===a||x||(b.bindFramebuffer(c,E),b.framebufferTexture2D(c,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,null,0),g&&b.framebufferRenderbuffer(c,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,
null),b.bindFramebuffer(c,null),b.deleteFramebuffer(E),g&&b.deleteRenderbuffer(g));x=!0}};r.vd&&p.je();m.push(p);return p},P:function(){b.bindFramebuffer(c,null);n.J=-1},Pf:function(){b.bindFramebuffer(c,null);b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);b.viewport(0,0,aa.F(),aa.U());n.J=-1},reset:function(){n.J=-2},ha:function(){0!==n.J&&(b.bindFramebuffer(c,a),n.J=0)},clear:function(){b.viewport(0,0,aa.F(),aa.U());b.clear(b.COLOR_BUFFER_BIT)},m:function(){q.P();m.forEach(function(r){r.remove()});
null!==a&&(b.deleteFramebuffer(a),a=null);q.reset();e=!1;m.splice(0);n.jd=1}};return q}(),aa=function(){function a(){e="undefined"===typeof Qa?JEContext:Qa;m=!0}function c(k,p){for(var H=0;H<k.length;++H){var I=p.getExtension(k[H]);if(I)return I}return null}function d(){null!==g.Cb&&(clearInterval(g.Cb),g.Cb=null);g.Oa=!1}var e=null,m=!1,n={xd:!1,Ac:null,Bc:null,Bd:!1,gf:!1,Cc:null,Cd:!1,Dc:null,yd:!1,Hb:null,bf:!1,Ib:null,cf:!1},q=null,r={ja:!0,ka:!0,Tb:!0,Qd:!1},l=null,v=!0,C=null,E=null,g={Oa:!1,
va:null,ib:null,Yb:-1,X:null,Cb:null},t="undefined"===typeof window?{}:window,x={A:function(){if(m)return!0;x.reset();m||a();var k=b;if(!q.xd){q.Ac=x.ed(k);t.GL_EXT_FLOAT=q.Ac;q.Bd=q.Ac?!0:!1;if(q.Bd||x.la())q.Bc=x.fd(k),q.gf=q.Bc?!0:!1,t.GL_EXT_FLOATLINEAR=q.Bc;q.xd=!0}if(!q.yd){q.Cc=x.Za(k);q.Cc&&(q.Cd=!0,t.GL_EXT_HALFFLOAT=q.Cc);if(q.Cd||x.la())q.Dc=x.gd(k),t.GL_EXT_HALFFLOATLINEAR=q.Dc;q.Zg=q.Dc?!0:!1;q.yd=!0}q.Hb=x.cd(k);q.bf=q.Hb?!0:!1;t.GL_EXT_COLORBUFFERFLOAT=q.Hb;q.Ib=x.dd(k);q.cf=q.Ib?!0:
!1;t.GL_EXT_COLORBUFFERHALFFLOAT=q.Ib;la.A();Ba.A();if(!x.De())return!1;ma.A();Ba.af();return!0},reset:function(){q=Object.assign({},n);l=Object.assign({},r)},F:function(){m||a();return e.F()},U:function(){m||a();return e.U()},la:function(){m||a();return e.la()},bd:function(k){x.cd(k);x.dd(k);x.ed(k);x.fd(k);x.Za(k);x.gd(k)},cd:c.bind(null,["EXT_color_buffer_float","WEBGL_color_buffer_float","OES_color_buffer_float"]),dd:c.bind(null,["EXT_color_buffer_half_float","WEBGL_color_buffer_half_float","OES_color_buffer_half_float"]),
ed:c.bind(null,["OES_texture_float","MOZ_OES_texture_float","WEBKIT_OES_texture_float"]),fd:c.bind(null,["OES_texture_float_linear","MOZ_OES_texture_float_linear","WEBKIT_OES_texture_float_linear"]),Za:c.bind(null,["OES_texture_half_float","MOZ_OES_texture_half_float","WEBKIT_OES_texture_half_float"]),gd:c.bind(null,["OES_texture_half_float_linear","MOZ_OES_texture_half_float_linear","WEBKIT_OES_texture_half_float_linear"]),Vb:function(k){var p=x.Za(k);return p&&p.HALF_FLOAT_OES?p.HALF_FLOAT_OES:
k.HALF_FLOAT||k.FLOAT},Re:function(){return E||b.RGBA32F||b.RGBA},Se:function(){return C||b.RGBA16F||b.RGBA},Oe:function(){return l},Uc:function(){return l.ja},bg:function(){return l.ka},ag:function(){return l.Tb},ue:function(){return l.Qd&&v},be:function(k){v=k;!k&&g.Oa&&(b.deleteSync(g.ib),b.bindBuffer(g.X,null),g.Oa=!1)},Ab:function(k,p,H){function I(){k.bindTexture(k.TEXTURE_2D,null);k.bindFramebuffer(N,null);k.deleteTexture(M);k.deleteFramebuffer(J)}var N=k.FRAMEBUFFER,z=k.NEAREST,J=k.createFramebuffer();
k.bindFramebuffer(N,J);var M=k.createTexture();k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,M);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,!1);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_MAG_FILTER,z);k.texParameteri(k.TEXTURE_2D,k.TEXTURE_MIN_FILTER,z);k.texImage2D(k.TEXTURE_2D,0,p,3,3,0,k.RGBA,H,null);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,k.TEXTURE_2D,M,0);
if(k.checkFramebufferStatus(k.READ_FRAMEBUFFER||k.FRAMEBUFFER)!==k.FRAMEBUFFER_COMPLETE)return I(),!1;xa.wc(k);k.clearColor(0,0,0,0);k.viewport(0,0,3,3);k.disable(k.DEPTH_TEST);k.clear(k.COLOR_BUFFER_BIT);ma.ab(k);k.bindFramebuffer(N,null);xa.Ra(k);k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,M);ma.ab(k);p=new Uint8Array(36);k.readPixels(0,0,3,3,k.RGBA,k.UNSIGNED_BYTE,p);I();for(H=0;36>H;++H)if(3!==H%4&&3<Math.abs(p[H]-127))return!1;return!0},Lb:function(k){var p={ja:!1,ka:!1};k.disable(k.BLEND);
k.clearColor(0,0,0,0);k.clear(k.COLOR_BUFFER_BIT);k.RGBA32F&&x.Ab(k,k.RGBA32F,k.FLOAT)&&(p.ja=!0,E=k.RGBA32F);!p.ja&&x.Ab(k,k.RGBA,k.FLOAT)&&(p.ja=!0,E=k.RGBA);var H=x.Vb(k);C=null;k.RGBA16F&&x.Ab(k,k.RGBA16F,H)&&(p.ka=!0,C=k.RGBA16F);!p.ka&&x.Ab(k,k.RGBA,H)&&(p.ka=!0,C=k.RGBA);return p},Ee:function(){var k=la.instance({width:2});k.Wd();var p=Ba.instance({width:2,isFloat:!0,sb:3});k.u();p.u();b.flush();b.checkFramebufferStatus(la.Ue())!==b.FRAMEBUFFER_COMPLETE?(Ba.Df(),l.Tb=!1):l.Tb=!0;k.remove();
p.remove()},Fe:function(){var k=!1;x.la()&&(k="PIXEL_PACK_BUFFER STREAM_READ SYNC_GPU_COMMANDS_COMPLETE WAIT_FAILED fenceSync deleteSync createBuffer".split(" ").every(function(p){return"undefined"!==typeof b[p]}));l.Qd=k},De:function(){var k=x.Lb(b);Object.assign(l,k);if(!l.ja&&!l.ka)return!1;x.Ee();x.Fe();return!0},xb:function(k,p,H,I,N){if(!x.ue())return b.readPixels(k,p,H,I,b.RGBA,b.UNSIGNED_BYTE,N),Promise.resolve(N);null===g.va&&(g.X=b.PIXEL_PACK_BUFFER,g.va=b.createBuffer(),g.Yb=-1);b.bindBuffer(g.X,
g.va);N.byteLength!==g.Yb&&(b.bufferData(g.X,N.byteLength,b.STREAM_READ),g.Yb=N.byteLength);b.readPixels(k,p,H,I,b.RGBA,b.UNSIGNED_BYTE,0);g.ib=b.fenceSync(b.SYNC_GPU_COMMANDS_COMPLETE,0);b.flush();return new Promise(function(z,J){function M(){if(!g.Oa)return d(),J(),!1;switch(b.clientWaitSync(g.ib,0,0)){case b.TIMEOUT_EXPIRED:case b.WAIT_FAILED:return!1;default:return d(),b.deleteSync(g.ib),b.getBufferSubData(g.X,0,N),b.bindBuffer(g.X,null),z(N),!0}}d();g.Oa=!0;M()||(g.Cb=setInterval(M,0))})},m:function(){d();
Ba.m();la.m();ma.m();null!==g.va&&(b.deleteBuffer(g.va),g.va=null);xa.reset();m=!1}};return x}(),U=ma,va=la,Y=Ba,Ca=function(){function a(J,M,u,f){p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,f?p.NEAREST_MIPMAP_NEAREST:p.LINEAR);var y=null;if(null!==u)try{y=p.getError();if("FUCKING_BIG_ERROR"===y)return!1;p.texImage2D(p.TEXTURE_2D,0,J,4,4,0,p.RGBA,M,u);y=p.getError();if(y!==p.NO_ERROR)return!1}catch(G){return!1}f&&p.generateMipmap(p.TEXTURE_2D);p.clear(p.COLOR_BUFFER_BIT);U.ab(p);y=p.getError();
if("FUCKING_BIG_ERROR"===y)return!1;p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,C);y=p.getError();y===p.INVALID_OPERATION&&"undefined"!==typeof p.PIXEL_PACK_BUFFER&&(p.bindBuffer(p.PIXEL_PACK_BUFFER,null),p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,C),y=p.getError());if(y!==p.NO_ERROR)return!1;u=!0;for(f=0;16>f;++f)u=u&&4>Math.abs(C[f]-127);u&&(l.Nd=M,l.ud=J);return u}function c(J,M){return H.ja&&a(J,p.FLOAT,new Float32Array(E),M)?(r=q.Nc,!0):!1}function d(J,M,u){if(!H.ka)return!1;var f=Ba.ze(E),
y=aa.Za(p);if(y&&y.HALF_FLOAT_OES&&a(J,y.HALF_FLOAT_OES,f,M)||p.HALF_FLOAT&&a(J,p.HALF_FLOAT,f,M))return r=q.Ga,!0;f=new Float32Array(E);if(a(J,p.FLOAT,f,M))return r=q.Ga,!0;p.bindTexture(p.TEXTURE_2D,u);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,2,2,0,p.RGBA,p.UNSIGNED_BYTE,null);p.bindFramebuffer(l.Xa,z);Ba.kd(p,u,2,2,f,!1,!1);p.bindFramebuffer(l.Xa,null);p.bindTexture(p.TEXTURE_2D,u);return a(J,null,null,M)?(r=q.Ga,!0):!1}function e(J,M,u){v=!0;if(d(J,!0,u)||c(M,!0))return!0;v=!1;return d(J,!1,u)||c(M,
!1)?!0:!1}function m(J){if(r===q.R){p=J||b;r=q.RGBA8;v=!0;aa.bd(p);H||(H=aa.Lb(p));va.reset();z=p.createFramebuffer();l.Xa=p.DRAW_FRAMEBUFFER||p.FRAMEBUFFER;p.bindFramebuffer(l.Xa,null);p.clearColor(0,0,0,0);p.viewport(0,0,2,2);A.R();I=A.Ra(p);J=p.createTexture();p.activeTexture(p.TEXTURE0);p.bindTexture(p.TEXTURE_2D,J);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.REPEAT);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.REPEAT);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);N=J;var M=
J=p.RGBA,u=p.RGBA16F,f=p.RGBA32F;f&&(J=f);u&&(M=u);if((u||f)&&e(M,J,N))return n(),!0;J=M=p.RGBA;if(e(M,J,N))return n(),!0;r=q.RGBA8;n();return!1}}function n(){p.deleteProgram(I.ra);p.deleteTexture(N);N=I=null}for(var q={R:-1,Nc:3,Ga:2,RGBA8:0},r=q.R,l={Nd:null,ud:null,Xa:null},v=!0,C=new Uint8Array(16),E=Array(64),g=0;4>g;++g)for(var t=0;4>t;++t){var x=0===(t+g)%2?1:0,k=4*g+t;E[4*k]=x;E[4*k+1]=x;E[4*k+2]=x;E[4*k+3]=x}var p=null,H=null,I=null,N=null,z=null;return{te:function(J){m(J);return v},Tc:function(J,
M){r===q.R&&(typeof("undefined"!==M)&&(H=M),m(J));return r!==q.RGBA8},bh:function(J){m(J);return r===q.Nc},hf:function(J){m(J);return r===q.Ga},Mg:function(J){m(J);return l.Nd},Te:function(J){m(J);return l.ud},m:function(){p=null;v=!0;r=q.R;H=null}}}(),Xb=function(){return{instance:function(a){var c=Y.instance(a.alpha),d=Y.instance(a.beta);return{He:function(){c.g(1);d.g(2)}}}}}(),Gb=function(){return{instance:function(a){var c=null,d=!1,e=!1,m=null,n=!1,q=!1,r=null,l="undefined"===typeof a.preprocessing?
!1:a.preprocessing,v="undefined"===typeof a.preprocessingSize?a.size:a.preprocessingSize;a.mask&&(d=!0,ba&&void 0!==ba.oe&&(a.mask=ba.oe+a.mask),c=Y.instance({isFloat:!1,url:a.mask}));var C=!1;a.customInputShader&&(C="s45",A.Pc({name:"_",id:C,h:a.customInputShader,Eh:["uSource"],precision:"lowp"}),A.T(C,[{type:"1i",name:"_",value:0}]));switch(l){case "sobel":r="s32";n=!0;break;case "meanNormalization":r="s33";n=!0;break;case "grayScale":r="s29";n=!1;break;case "grayScaleTilt":r="s30";q=!0;n=!1;break;
case "rgbGrayTilt":r="s31";q=!0;n=!1;break;case "copy":r=C?C:"s0";break;case "inputLightRegulation":r=C?C:"s29";m=Yb.instance({td:v,Md:a.size,Id:a.nBlurPass,mb:!1});e=!0;break;case "inputMix0":r="none";m=Zb.instance({D:v,ee:a.varianceMin,Sc:a.blurKernelSizePx,mb:!1});e=!0;break;case "direct":case "none":r="abort";break;default:r="s4"}q&&A.T(r,[{name:"u27",type:"1f",value:a.tilt}]);d&&(r+="Mask");var E=Y.instance({isFloat:!1,isPot:!1,width:a.size}),g={F:function(){return v},Wb:function(){return g.F()},
Xe:function(){return e?m.Xb():E},V:function(t){va.ha();"abort"!==r&&("none"!==r&&(A.set(r),n&&A.G("u28",1/a.size),E.da(),d&&c.g(1),U.l(!1,!1),E.g(0),t=E),e&&m.process(t))},m:function(){E.remove();d&&c.remove()}};return g}}}(),Hb=function(){return{instance:function(a){function c(h){m.forEach(function(F,K){n[K][0]=h[0][F];n[K][1]=h[1][F];n[K][2]=h[2][F];n[K][3]=h[3][F]});return n}"undefined"===typeof a.normalize&&(a.normalize=!1);var d={input:null,Ua:null,bc:null,ba:null,tb:null,oc:null,pc:null},e=
null,m=[],n=[],q=!1,r=null,l=!0,v=-1,C=a.isReorganize?a.isReorganize:!1,E=a.kernelsCount?!0:!1,g=a.dynPelu?Xb.instance(a.dynPelu):!1,t=g?!0:!1,x={isEnabled:!1};a.ff?(a.sparsity="undefined"!==typeof a.sparsity?a.sparsity:a.vb.Wb(),l=!1):"full"===a.connectivityUp&&(a.sparsity=a.vb.Wb());var k={elu:"s16",elu01:"s17",relu:"s15",arctan:"s19",sigmoid:"s14",copy:"s0",softplus:"s20",dynPelu:"s18"}[a.activation],p=a.sparsity*a.sparsity,H=!1,I=a.size,N="";if(a.maxPooling){switch(a.maxPooling.size){case 2:N=
"s34";break;case 4:N="s35"}H=!0;I/=a.maxPooling.size;d.oc=Y.instance({isFloat:!0,isPot:!1,width:I})}var z=void 0!==a.rf&&a.rf?!0:!1,J=null,M=null,u=null;if(z){J="s46"+a.index.toString();A.sd("s46",J,[((a.normalization.n-1)/2).toFixed(1)]);A.T(J,[{type:"1i",name:"u1",value:0},{type:"2f",name:"u8",value:[1/a.size,1/a.size]},{type:"1f",name:"u7",value:a.normalization.alpha},{type:"1f",name:"u10",value:a.normalization.beta},{type:"1f",name:"u31",value:a.normalization.k}]);var f={isFloat:!0,isPot:!0,width:a.size};
M=Y.instance(f);u=Y.instance(f)}var y=-1,G=null;l&&(d.ba=Y.instance({isFloat:!0,isPot:!1,width:a.size}));d.Ua=Y.instance(a.bias);var L={F:function(){return a.size},Wb:function(){return I},nd:function(){return a.classesCount},qe:function(h){e.g(h)},uf:function(){a.remap&&a.remap.isEnabled&&(x={isEnabled:!0,kf:Y.instance({isFloat:!1,isFlipY:!1,array:new Uint8Array(a.remap.maskTexture.data),width:a.remap.maskTexture.width,isPot:!1}),pb:a.remap.layers.map(function(h){return a.parent.We(h)}),depth:a.remap.depth})},
Ef:function(){switch(a.connectivityUp){case "direct":G=$b.instance(a.connectivity);break;case "square":G=ac.instance(a.connectivity);break;case "squareFast":G=bc.instance(a.connectivity,a.activation);break;case "full":G=cc.instance(a.connectivity);break;case "conv":v=a.kernelsCount,G=dc.instance(a.connectivity),C&&(d.tb=Y.instance({width:I,isFloat:!0,isFlipY:!1,isPot:!1}))}if(G.Ca){var h=a.size*a.sparsity;y=Math.log(h/a.size)/Math.log(2);d.input=Y.instance({isMipmap:!0,isFloat:!0,isPot:!0,width:h,
ic:y});d.bc=Y.instance({isFloat:!0,isPot:!0,width:a.size})}},V:function(h,F){e=h;G.Ca?(d.input.da(),E&&d.Ua.g(2),G.V(x),d.input.g(0),d.input.Le(y),d.bc.da(),E?A.set("s0"):(A.set("s28"),A.G("u26",p),d.Ua.g(1)),d.input.re(y,0),U.l(!1,!1),A.set(k),z?M.u():d.ba.u(),d.bc.g(0),t&&g.He(),U.l(!1,!1)):(d.ba.da(),d.Ua.g(1),G.V());z&&(A.set(J),u.u(),M.g(0),U.l(!1,!1),A.set("s47"),A.G("u7",1),d.ba.u(),u.g(1),U.l(!1,!1));if(l)return H?(d.oc.da(),d.ba.g(0),A.set(N),A.sa("u8",1/a.size,1/a.size),U.l(!1,!1),F=d.oc):
F=d.ba,F.g(0),C&&(d.tb.u(),A.set("s22"),A.sa("u13",v,I/v),U.l(!1,!1),F=d.tb,d.tb.g(0)),F;var K=d.ba;a.normalize&&(A.set("gpuRawAvg"===q?"s9":"s8"),A.G("u4",1/a.size),d.pc.da(),d.ba.g(0),U.l(!1,!1),K=d.pc);h=null;switch(q){case "cpuRGBA2Float":K.Zc(!1);F?h=L.vf(K).then(r):(K=L.wf(K),r(K));break;case "cpuMeanFloat":K.Zc(!0);F?h=K.yf().then(r):(K=K.zf(),r(K));break;case "gpuRawAvg":case "gpuRaw":K.g(0);case "none":null!==r&&r(K)}F&&null===h&&(h=Promise.resolve());return h},Be:function(h){h&&(q=h.qc||
"none",r=h.nc||null);d.ba=Y.instance({isFloat:!0,isPot:!0,isMipmap:!1,width:a.size});h="undefined"!==typeof a.classesCount&&a.classesCount?a.classesCount:a.size*a.size;for(var F=0,K=0,P=0;F<h;++F)m.push(K+(a.size-1-P)*a.size),n.push([-1,-1,-1,-1]),++K,K===a.size&&(K=0,++P);a.normalize&&(d.pc=Y.instance({isFloat:!0,isPot:!0,width:a.size}))},vf:function(h){return h.xf().then(c)},wf:function(h){h=h.Rd();c(h);return n},m:function(){for(var h in d){var F=d[h];F&&F.remove()}G&&(G.m(),G=null)}};a.vb&&L.Ef(a.vb);
return L}}}(),$b=function(){return{instance:function(a){var c=Y.instance(a.weights);return{Ca:!0,cb:function(){return 1},m:function(){c.remove()},$e:function(){return c},V:function(){A.set("s27");c.g(1);U.l(!1,!1)}}}}}(),cc=function(){return{instance:function(a){var c=a.fromLayerSize,d=Y.instance(a.weights);return{Ca:!0,cb:function(){return c},m:function(){d.remove()},V:function(e){if(e.isEnabled){A.set("s25");e.kf.g(3);var m,n=Math.min(e.pb.length,e.depth);for(m=0;m<n;++m)e.pb[m].qe(4+m)}else A.set("s24");
A.G("u17",a.toLayerSize);d.g(1);U.l(!1,!1)}}}}}(),ac=function(){return{instance:function(a){for(var c=a.fromLayerSize,d=a.toLayerSize,e=a.toSparsity,m=e*d,n=m/c,q=c/d,r=0,l=0,v=0,C=Array(e*d*e*d*4),E=Array(e*d*e*d*4),g=Array(c*c),t=0;t<g.length;++t)g[t]=0;t=Math.floor(e/2);for(var x=.5/d,k=.5/c,p=.5/m,H=0;H<d;++H)for(var I=Math.round(H*q),N=0;N<d;++N){var z=Math.round(N*q),J=H/d,M=N/d;J+=x;M+=x;for(var u=0;u<e;++u){var f=I+u-t;0>f&&(f+=c);f>=c&&(f-=c);for(var y=0;y<e;++y){var G=r/m,L=l/m,h=z+y-t;
0>h&&(h+=c);h>=c&&(h-=c);var F=f/c,K=h/c;L=1-L-1/m;F+=k;K+=k;G+=p;L+=p;var P=H*e+u,da=N*e+y;da=d*e-da-1;P=da*d*e+P;C[4*P]=G;C[4*P+1]=L;C[4*P+2]=F;C[4*P+3]=K;K=g[h*c+f]++;P=K%n;F=f*n+P;h=h*n+(K-P)/n;h=c*n-1-h;h=h*c*n+F;E[4*h]=G;E[4*h+1]=L;E[4*h+2]=J;E[4*h+3]=M;++r>=m&&(r=0,++l);++v}}}g=null;var ra=Y.instance(a.weights);delete a.weights.data;var za=Y.instance({width:m,isFloat:!0,array:new Float32Array(E),isPot:!0});E=null;var w=Y.instance({width:m,isFloat:!0,array:new Float32Array(C),isPot:!0});C=null;
return{Ca:!0,cb:function(){return n},m:function(){za.remove();w.remove();ra.remove()},V:function(){A.set("s23");ra.g(1);w.g(2);U.l(!1,!1)}}}}}(),dc=function(){return{instance:function(a){var c=a.kernelsCount,d=a.toSparsity,e=d*a.toLayerSize/a.fromLayerSize,m=Y.instance(a.weights);return{Ca:!0,cb:function(){return e},Wg:function(){return d},$e:function(){return m},m:function(){m.remove()},V:function(){A.set("s26");A.G("u23",c);A.G("u24",d);A.G("u17",a.toLayerSize);A.G("u25",a.fromLayerSize);m.g(1);
U.l(!1,!1)}}}}}(),bc=function(){return{instance:function(a,c){var d=a.fromLayerSize,e=a.toLayerSize,m=a.toSparsity,n=a.stride?a.stride:1,q=m*e/d,r=e<d,l=d/e,v=Y.instance(a.weights),C="s48"+[d.toString(),e.toString(),m.toString(),n.toString(),c].join("_");A.Je(C)||(a=Vb.Me(c,"gl_FragColor","gl_FragColor"),e=[{type:"1f",name:"u17",value:e},{type:"1f",name:"u30",value:n}],r&&e.push({type:"1f",name:"u25",value:d}),d=[(r?q:m).toFixed(1),a],r&&d.push(l.toFixed(1)),A.sd(r?"s40":"s39",C,d),A.T(C,e.concat([{type:"1i",
name:"u15",value:0},{type:"1i",name:"u22",value:1},{type:"1i",name:"u14",value:3}])));return{Ca:!1,cb:function(){return q},m:function(){v.remove()},V:function(){A.set(C);v.g(3);U.l(!1,!1)}}}}}(),Yb=function(){return{instance:function(a){var c=a.Id?a.Id:3,d=a.td?a.td:64,e=a.Md?a.Md:64,m=a.mb?!0:!1;a={isFloat:!1,width:d,isPot:!1,isFlipY:!1};var n=Y.instance(a),q=Y.instance(a),r=Y.instance(a),l=Y.instance(a),v=Y.instance({isFloat:!0,width:e,isPot:!1,isFlipY:!1}),C=1/d;return{process:function(E){A.set("s36");
l.u();U.l(m,!1);A.set("s37");for(var g=0;g<c;++g)n.u(),A.sa("u8",C,0),U.l(m,!1),r.u(),l.g(0),U.l(m,!1),q.u(),n.g(0),A.sa("u8",0,C),U.l(m,!1),l.u(),r.g(0),U.l(m,!1),g!==c-1&&q.g(0);A.set("s38");v.u();E.g(0);q.g(1);l.g(2);U.l(m,!1);v.g(0)},Xb:function(){return v}}}}}(),Zb=function(){return{instance:function(a){function c(v){return Y.instance({isFloat:v,width:d.D,isPot:!1,isFlipY:!1})}var d=Object.assign({ee:.1,Sc:9,D:128,mb:!1},a),e=c(!1),m=[c(!1),c(!1),c(!1)],n=[c(!1),c(!1),c(!1)],q=c(!0),r=[e,n[0],
n[1]];a="uniform sampler2D u1;const float e=1.1111,g=2.2222;uniform vec2 u32;varying vec2 vv0;void main(){float b=0.,c=0.;for(float a=-e;a<=e;a+=1.){vec2 i=u32*a,j=vv0+i*g;float d=1.2*a/e,f=exp(-d*d);b+=f*texture2D(u1,j).r,c+=f;}b/=c,gl_FragColor=vec4(b,0.,0.,1.);}".replace("1.1111",Math.round((d.Sc-1)/2).toFixed(2)).replace("2.2222",(1/d.D).toFixed(6));var l={u1:0};A.Qc([{id:"s50",name:"_",h:"uniform sampler2D u1;varying vec2 vv0;const vec3 f=vec3(.2126,.7152,.0722),g=vec3(1.,1.,1.);void main(){vec3 b=texture2D(u1,vv0).rgb;float a=dot(b,f);gl_FragColor=vec4(a,a,a,a);}",
j:l,i:["u1"],precision:"lowp"},{id:"s51",name:"_",h:a,j:l,i:["u1","u32"],precision:"lowp"},{id:"s52",name:"_",h:"uniform sampler2D u33,u34,u35,u36;const float f=1.1111;const vec3 g=vec3(1.,1.,1.);varying vec2 vv0;void main(){vec3 a=texture2D(u33,vv0).rgb;float c=texture2D(u34,vv0).r,d=texture2D(u35,vv0).r,h=texture2D(u36,vv0).r,i=a.r*a.r;vec3 b=vec3(c,d,h),j=max(g*f,abs(i-b*b)),k=sqrt(j);gl_FragColor=vec4(a.r,(a-b)/k);}".replace("1.1111",d.ee.toFixed(4)),j:{u33:0,u34:1,u35:2,u36:3},i:["u33","u34",
"u35","u36"],precision:"highp"}]);return{process:function(){A.set("s50");e.da();U.l(d.mb,!1);A.set("s51");for(var v=0;3>v;++v)A.sa("u32",1,0),m[v].u(),r[v].g(0),U.l(!1,!1),A.sa("u32",0,1),n[v].u(),m[v].g(0),U.l(!1,!1);A.set("s52");q.u();e.g(0);n[0].g(1);n[1].g(2);n[2].g(3);U.l(!1,!1);q.g(0)},Xb:function(){return q}}}}}(),W={Ze:function(){return W.Yc()?document.createElement("video"):!1},Ma:function(a,c){a[c]=!0;a.setAttribute(c,"true")},xe:function(){var a=!1,c=navigator.userAgent||navigator.vendor||
window.opera;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(c)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(c.substr(0,
4)))a=!0;return a},Vc:function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream},Ne:function(){var a=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return a&&a.length&&2<a.length?[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3]||0,10)]:[0,0,0]},Dd:function(){try{return window.matchMedia("(orientation: portrait)").matches?!0:!1}catch(a){return window.innerHeight>window.innerWidth}},we:function(){return W.Wc()||W.Vc()},Wc:function(){var a=navigator.userAgent.toLowerCase();
return-1!==a.indexOf("safari")&&-1===a.indexOf("chrome")?!0:!1},Ag:function(){return W.xe()?W.Dd()?window.innerHeight/window.innerWidth*45:45:45},Yc:function(){return navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?!0:!1},pause:function(a){a.pause()},rh:function(a){a.play()},release:function(a){a.pause();a.videoStream&&a.videoStream.stop();a.videoStream=null},Xc:function(a){if(!a)return a;var c=null;if(a.video){var d=function(e){return e&&"object"===typeof e?Object.assign({},e):e};c={};
"undefined"!==typeof a.video.width&&(c.width=d(a.video.width));"undefined"!==typeof a.video.height&&(c.height=d(a.video.height));"undefined"!==typeof a.video.facingMode&&(c.facingMode=d(a.video.facingMode))}c={audio:a.audio,video:c};"undefined"!==typeof a.deviceId&&W.Oc(c,a.deviceId);return c},Oc:function(a,c){c&&(a.video=a.video||{},a.video.deviceId={exact:c},a.video.facingMode&&delete a.video.facingMode)},$d:function(a){var c=a.video.width;a.video.width=a.video.height;a.video.height=c;return a},
Ae:function(a){function c(g){return[480,576,640,648,720,768,800,960,1080,1152,1280,1366,1920].sort(function(t,x){return Math.abs(t-g)-Math.abs(x-g)})}function d(g){var t=W.Xc(a);g=g(t);m.push(g);e(g)}function e(g){if(g.video&&g.video.facingMode&&g.video.facingMode.exact){var t=g.video.facingMode.exact;g=W.Xc(g);delete g.video.facingMode.exact;g.video.facingMode.ideal=t;m.push(g)}}var m=[];if(!a||!a.video)return m;e(a);if(a.video.width&&a.video.height){if(a.video.width.ideal&&a.video.height.ideal){var n=
c(a.video.width.ideal).slice(0,3),q=c(a.video.height.ideal).slice(0,3),r={},l=0;for(r.na=void 0;l<n.length;r={na:r.na},++l){r.na=n[l];var v={},C=0;for(v.ma=void 0;C<q.length;v={ma:v.ma},++C)if(v.ma=q[C],r.na!==a.video.width.ideal||v.ma!==a.video.height.ideal){var E=Math.max(r.na,v.ma)/Math.min(r.na,v.ma);E<4/3-.1||E>16/9+.1||d(function(g,t){return function(x){x.video.width.ideal=g.na;x.video.height.ideal=t.ma;return x}}(r,v))}}}d(function(g){return W.$d(g)})}a.video.width&&a.video.height&&(a.video.width.ideal&&
a.video.height.ideal&&d(function(g){delete g.video.width.ideal;delete g.video.height.ideal;return g}),d(function(g){delete g.video.width;delete g.video.height;return g}));a.video.facingMode&&(d(function(g){delete g.video.facingMode;return g}),a.video.width&&a.video.height&&d(function(g){W.$d(g);delete g.video.facingMode;return g}));m.push({audio:a.audio,video:!0});return m},Lf:function(a){if(W.Dd()){if(!a||!a.video)return!1;var c=a.video.width,d=a.video.height;if(!c||!d)return!1;if(c.ideal&&d.ideal&&
c.ideal>d.ideal)return a.video.height=c,a.video.width=d,!0}return!1},rb:function(a){a.volume=0;W.Ma(a,"muted");if(W.Wc()){if(1===a.volume){var c=function(){a.volume=0;window.removeEventListener("mousemove",c,!1);window.removeEventListener("touchstart",c,!1)};window.addEventListener("mousemove",c,!1);window.addEventListener("touchstart",c,!1)}setTimeout(function(){a.volume=0;W.Ma(a,"muted")},5)}},ce:function(a,c,d){return null===a?Promise.resolve():new Promise(function(e,m){if(a.srcObject&&a.srcObject.getVideoTracks){var n=
a.srcObject.getVideoTracks();1!==n.length?m("INVALID_TRACKNUMBER"):(n=n[0],c?W.get(a,e,m,d):(n.stop(),e()))}else m("BAD_IMPLEMENTATION")})},qd:function(a,c,d,e){function m(q){n||(n=!0,d(q))}var n=!1;return navigator.mediaDevices.getUserMedia(e).then(function(q){function r(){setTimeout(function(){if(a.currentTime){var v=a.videoWidth,C=a.videoHeight;if(0===v||0===C)m("VIDEO_NULLSIZE");else{v&&(a.style.width=v.toString()+"px");C&&(a.style.height=C.toString()+"px");v={ve:null,If:null,lf:null};try{var E=
q.getVideoTracks()[0];E&&(v.lf=E,v.ve=E.getCapabilities(),v.If=E.getSettings())}catch(g){}W.we()?a.parentNode&&null!==a.parentNode?(n||c(a,q,v),setTimeout(function(){a.play()},100)):(document.body.appendChild(a),W.rb(a),n||c(a,q,v),setTimeout(function(){a.style.transform="scale(0.0001,0.0001)";a.style.position="fixed";a.style.bottom="0px";a.style.right="0px";W.rb(a);setTimeout(function(){a.play()},100)},80)):n||c(a,q,v)}}else m("VIDEO_NOTSTARTED")},700)}function l(){a.removeEventListener("loadeddata",
l,!1);var v=a.play();W.rb(a);"undefined"===typeof v?r():v.then(function(){r()}).catch(function(){m("VIDEO_PLAYPROMISEREJECTED")})}"undefined"!==typeof a.srcObject?a.srcObject=q:(a.src=window.URL.createObjectURL(q),a.videoStream=q);W.rb(a);a.addEventListener("loadeddata",l,!1)}).catch(function(q){m(q)})},get:function(a,c,d,e){if(!a)return d&&d("VIDEO_NOTPROVIDED"),!1;if(!W.Yc())return d&&d("MEDIASTREAMAPI_NOTFOUND"),!1;if(e&&e.video){if(W.Vc()){var m=W.Ne();0!==m[0]&&(12>m[0]||12===m[0]&&2>m[1])&&
W.Lf(e)}e.video.width&&e.video.width.ideal&&(a.style.width=e.video.width.ideal+"px");e.video.height&&e.video.height.ideal&&(a.style.height=e.video.height.ideal+"px")}W.Ma(a,"autoplay");W.Ma(a,"playsinline");e&&e.audio?a.volume=0:W.Ma(a,"muted");W.qd(a,c,function(){function n(r){if(0===r.length)d("INVALID_FALLBACKCONSTRAINTS");else{var l=r.shift();W.qd(a,c,function(){n(r)},l)}}var q=W.Ae(e);n(q)},e)},Ye:function(a){if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices)return a(!1,"NOTSUPPORTED"),
!1;navigator.mediaDevices.enumerateDevices().then(function(c){(c=c.filter(function(d){return d.kind&&-1!==d.kind.toLowerCase().indexOf("video")&&d.label&&d.deviceId}))&&c.length&&0<c.length?a(c,!1):a(!1,"NODEVICESFOUND")}).catch(function(){a(!1,"PROMISEREJECTED")})},cg:function(a,c,d){var e={};e[c]=d;c=[];c.push(e);a.applyConstraints({advanced:c}).catch(function(){})}},pa=function(){function a(t,x,k,p,H,I){if(I===H.length)p();else{switch(H[I]){case "D":t();break;case "S":x().then(function(){g.ae();
a(t,x,k,p,H,++I)}).catch(p);return;case "R":k()}a(t,x,k,p,H,++I)}}var c={n:5,kc:1,Gd:0,bb:[35,49],Ya:[2,200],k:.7,Qf:200,tf:.05},d=-1,e=null,m=-1,n=-1,q=0,r=-1,l=-1,v=0,C=0,E=c.Ya[1],g={od:function(){switch(d){case -1:return-1;case 0:return l+e.Gd;case 1:return v}},Fg:function(t){return Math.pow(Math.min(Math.max(r,0),e.n-1)/(e.n-1),t||1)},A:function(t){e=Object.assign({},c,t);r=l=e.kc;d=0;g.reset()},ae:function(t){t=("undefined"===typeof t?Date.now():t)||0;var x=Math.min(Math.max(t-C,e.Ya[0]),e.Ya[1]);
E=x;C=t;var k=-1===m?0:e.k;m=Math.min(Math.max(1E3/x,5),120)*(1-k)+m*k;t-n>e.Qf&&5<++q&&(x=e.k,r=r*(1-x)+(m<e.bb[0]?l-1:m>e.bb[1]?l+1:l)*x,Math.abs(r-l)>1-e.tf&&(x=Math.min(Math.max(Math.round(r),0),e.n-1),x!==l&&(r=l=x,m=(e.bb[1]-e.bb[0])/2)),n=t)},rc:function(t,x,k,p,H){a(t,x,k,p,H,0)},vc:function(t){v=t;d=1},Gc:function(){d=0;g.reset()},reset:function(){E=c.Ya[1];n=m=-1;q=0},Qe:function(){return E}};return g}(),Ma=function(){function a(){d(k+t.jc);p.port.postMessage("DONE")}function c(){var f=
t.ga;z.isEnabled&&(f=Math.max(f,z.ga));N.Sa=0===f?window.requestAnimationFrame(d):window.requestAnimationFrame(e)}function d(f){I.ya&&null!==x&&(f-=k,f=Math.min(Math.max(f,t.$c[0]),t.$c[1]),k+=f,n(),z.isEnabled&&z.Y&&I.Z&&k-z.fc>t.Lc&&(v(),z.fc=k),x(k))}function e(f){I.ya&&(N.timeout=window.setTimeout(d.bind(null,f),t.ga))}function m(){x=null;I.ya=!1;n()}function n(){N.Sa&&(window.cancelAnimationFrame(N.Sa),N.Sa=null);N.timeout&&(window.clearTimeout(N.timeout),N.timeout=null)}function q(f){f&&!I.Z?
(I.Z=!0,H&&pa.Gc(),p.port.postMessage("STOP"),aa.be(!0),c()):!f&&I.Z&&(I.Z=!1,H&&pa.vc(1),aa.be(!1),p.port.postMessage("START"))}function r(f){f.target.hidden?M():J()}function l(f,y,G){y=f.createShader(y);f.shaderSource(y,G);f.compileShader(y);return y}function v(){z.Y=!1;var f=z.fb,y=z.gb,G=z.hb,L=z.X;f.uniform1f(z.rd,Math.random());z.za?y.beginQueryEXT(L,G):f.beginQuery(L,G);f.drawElements(f.POINTS,1,f.UNSIGNED_SHORT,0);z.za?y.endQueryEXT(L):f.endQuery(L);f.flush();E().then(function(h){h=t.ge*t.Jc*
1E3/h;z.Db=(z.Db+1)%t.Ea;z.hc[z.Db]=h;if(++z.Ed>t.Ea){z.ob.set(z.hc);z.ob.sort();h=z.ob[Math.floor(t.Ea/2)];z.$a=Math.max(z.$a,h);var F;for(F=0;F<z.Ec&&!(h>z.$a*(1-(t.Kc[F]+t.he*(F>=z.Bb?1:-1))));++F)F===z.Ec-1&&++F;F!==z.Bb&&(console.log("THERMAL THROTTLING LEVEL = "+F.toString()),z.Bb=F,z.ga=0===F?0:t.fe[F-1],t.Ic&&t.Ic(F))}z.Y=!0}).catch(function(){z.Y=!0})}function C(f){var y=z.fb,G=z.gb,L=z.hb;L=z.za?G.Cg(L,G.QUERY_RESULT_AVAILABLE_EXT):y.getQueryParameter(L,y.QUERY_RESULT_AVAILABLE);y=y.getParameter(G.GPU_DISJOINT_EXT);
L?f(!y):setTimeout(C.bind(null,f),.1)}function E(){return new Promise(function(f,y){C(function(G){if(G){G=z.fb;var L=z.gb,h=z.hb;G=z.za?L.getQueryObjectEXT(h,L.QUERY_RESULT_EXT):G.getQueryParameter(h,G.QUERY_RESULT);f(G)}else y()})})}var g={zd:!0,$c:[1,200],jc:20,ga:0,ie:!1,Jc:50,ge:240,Lc:3E3,Ea:3,Kc:[.2,.35,.5],he:.05,fe:[8,20,40],Ic:null},t=null,x=null,k=0,p=null,H=!1,I={qa:!1,Z:!0,ec:!1,dc:!1,cc:!1,ya:!1},N={Sa:null,timeout:null},z={isEnabled:!1,Y:!1,fb:null,gb:null,hb:null,X:null,rd:null,za:!0,
Bb:0,Ec:0,ga:0,fc:0,Ed:0,hc:null,ob:null,Db:0,$a:0},J=q.bind(null,!0),M=q.bind(null,!1),u={A:function(f){t=Object.assign(g,f);Object.assign(I,{Z:!0,qa:!0,ya:!1});if(t.ie){f=document.createElement("canvas");f.setAttribute("width","1");f.setAttribute("height","1");var y={antialias:!1};f=f.getContext("webgl2",y)||f.getContext("webgl",y);if(y=f.getExtension("EXT_disjoint_timer_query")||f.getExtension("EXT_disjoint_timer_query_webgl2")){z.fb=f;z.gb=y;z.isEnabled=!0;z.za=y.beginQueryEXT?!0:!1;var G=l(f,
f.VERTEX_SHADER,"attribute vec4 a0;void main(){gl_Position=a0;}"),L=l(f,f.FRAGMENT_SHADER,"precision lowp float;uniform float u37;void main(){vec4 a=u37*vec4(1.,2.,3.,4.);for(int b=0;b<666;b+=1)a=cos(a);gl_FragColor=a;}".replace("666",t.Jc.toString())),h=f.createProgram();f.attachShader(h,G);f.attachShader(h,L);f.linkProgram(h);G=f.getAttribLocation(h,"a0");z.rd=f.getUniformLocation(h,"u37");f.useProgram(h);f.enableVertexAttribArray(G);h=f.createBuffer();f.bindBuffer(f.ARRAY_BUFFER,h);f.bufferData(f.ARRAY_BUFFER,
new Float32Array([.5,.5,0,1]),f.STATIC_DRAW);f.vertexAttribPointer(G,4,f.FLOAT,!1,16,0);h=f.createBuffer();f.bindBuffer(f.ELEMENT_ARRAY_BUFFER,h);f.bufferData(f.ELEMENT_ARRAY_BUFFER,new Uint16Array([0]),f.STATIC_DRAW);f.disable(f.DEPTH_TEST);f.disable(f.DITHER);f.disable(f.STENCIL_TEST);f.viewport(0,0,1,1);h=z.za?y.createQueryEXT():f.createQuery();z.hb=h;z.X=y.TIME_ELAPSED_EXT||f.TIME_ELAPSED;z.Bb=0;z.Ec=t.Kc.length;z.ga=0;z.fc=-t.Lc;z.hc=new Float32Array(t.Ea);z.ob=new Float32Array(t.Ea);z.$a=0;
z.Db=0;z.Ed=0;z.Y=!0}}if(t.zd){f=!1;try{if("undefined"===typeof SharedWorker){var F=URL.createObjectURL(new Blob(["let handler = null;\n self.addEventListener('message', function(e){\n if (handler !== null){\n clearTimeout(handler);\n handler = null;\n }\n switch (e.data) {\n case 'START':\n case 'DONE':\n handler = setTimeout(function(){\n self.postMessage('TICK');\n }, "+t.jc.toString()+");\n break;\n case 'STOP':\n break;\n };\n }, false);"],
{type:"text/javascript"})),K=new Worker(F);K.addEventListener("message",a);p={Pd:K,port:K};I.ec=!0}else{var P=URL.createObjectURL(new Blob(["let handler = null;\n onconnect = function(e) {\n const port = e.ports[0];\n port.addEventListener('message', function(e) {\n \n if (handler !== null){\n clearTimeout(handler);\n handler = null;\n }\n switch (e.data) {\n case 'START':\n case 'DONE':\n handler = setTimeout(function(){\n port.postMessage('TICK');\n }, "+
t.jc.toString()+");\n break;\n case 'STOP':\n break;\n };\n \n });\n \n port.start();\n } // end onconnect()"],{type:"text/javascript"})),da=new SharedWorker(P);da.port.start();da.port.addEventListener("message",a);p={Pd:da,port:da.port};I.dc=!0}f=!0}catch(ra){}f&&("onvisibilitychange"in document?document.addEventListener("visibilitychange",r):(window.addEventListener("blur",M),window.addEventListener("focus",J)),I.cc=
!0)}H="undefined"!==typeof pa},m:function(){m();I.cc&&("onvisibilitychange"in document?document.removeEventListener("visibilitychange",r):(window.removeEventListener("blur",M),window.removeEventListener("focus",J)),I.cc=!1);I.dc?(p.port.close(),I.dc=!1):I.ec&&(p.Pd.terminate(),I.ec=!1);Object.assign(I,{Z:!0,qa:!1,ya:!1});x=null},hh:function(){return I.Z},update:function(f){Object.assign(t,f)},rc:function(f){I.qa||u.A({});n();I.ya=!0;x=f;I.Z&&c()},stop:m};return u}(),tb=function(){var a={Kd:4,ub:[1.5,
1.5,2],O:[.1,.1,.1],Td:1,D:-1,M:-1,Kf:2,sf:1,Ud:!0,Ie:.8},c=null,d=[],e=0,m=[.5,.5,1];return{A:function(n){c=Object.assign({},a,n);d.splice(0);n=c.ub[0]*c.O[0];var q=c.ub[1]*c.O[1],r=1/(1+c.ub[2]*c.O[2]),l=c.Td*Math.min(c.D,c.M),v=l/c.D;l/=c.M;var C=.5*c.Ie;C*=C;for(var E=0;E<c.Kd;++E){var g=Math.pow(r,E),t=v*g,x=l*g;g=t*n;var k=x*q,p=t/2;x/=2;for(var H=1+(1-p-p)/g,I=1+(1-x-x)/k,N=0;N<I;++N)for(var z=x+N*k,J=z-.5,M=0;M<H;++M){var u=p+M*g,f=u-.5;f*f+J*J>C||d.push([u,z,t*c.sf])}}c.Ud&&d.sort(function(y,
G){var L=y[0]-.5;y=y[1]-.5;var h=G[0]-.5;G=G[1]-.5;return L*L+y*y-(h*h+G*G)})},get:function(){var n=d.length;if(0===n)return m;e>=n&&(e=0);var q=d[Math.floor(e)];e=(e+1/c.Kf)%n;return q}}}(),ba={neuralNetworkPath:"NN_DEFAULT.json",fa:0,Eb:[2,8],Af:{threshold:1,nScaleLevels:2,scale0Factor:.8,overlapFactors:[2,2,3],scanCenterFirst:!0,nDetectsPerLoop:-1,multiDetectionThresholdFactors:[.5,.6],isCleanGLStateAtEachIteration:!0,animateProcessOrder:"DSR"},Nf:50,
Hd:.3,mf:8,pf:.3,Jf:{translationFactorRange:[.0015,.005],rotationFactorRange:[.003,.02],qualityFactorRange:[.9,.98],alphaRange:[.05,1],followZRotAlphaFactor:.8},Pa:[.65,1,.262],O:[.092,.092,.3],ke:.2,me:2,le:.1,qf:8,Jd:1,Ke:Za.qb.bind(null,.3,.7),Tf:20,Yd:3},oa={facingMode:"user",idealWidth:800,idealHeight:600,minWidth:480,maxWidth:1920,minHeight:480,maxHeight:1920,rotate:0,flipX:!1},ia={lc:-3,jf:-1,error:-2,ready:1,play:2,pause:3},na=ia.lc,B=null,ec={kb:!1,zc:null,element:null,N:null,H:[0,0],L:[.5,
.5],v:[.5,0,0,.5],wb:0,La:null,jb:!1},Q=null,fc={Ka:null,Va:null,antialias:!0,Mc:"./",Fa:null,ia:null,fa:ba.fa,Od:ba.fa,lb:!1,ua:!0},Oa=null,ea=null,sa=null,Pa=1,Na={uc:-1,Mb:-1},Z=null,gc={D:0,M:0,H:[0,0],xa:null},X={Da:null,buffer:null,O:null,Pa:null,aa:ba.Jd,Na:null},Sa=null,qa=null,O={o:1,pa:0,W:null,Ad:!1,Fd:0,mc:0},hb=[],ib=[],Eb={VERSION:"2.1.7",init:function(a){function c(){na!==ia.error&&2===++e&&(Ja(),xb(),Ia(),Q.Ka&&(na=ia.ready,Q.Ka(!1,{GL:b,canvasElement:Q.ia,videoTexture:B.N.get(),videoTransformMat2:B.v,
maxFacesDetected:O.o,videoElement:B.element}),fb()),eb())}if(na!==ia.lc)return a.callbackReady&&a.callbackReady("ALREADY_INITIALIZED"),!1;na=ia.jf;B=Object.assign({},ec);Q=Object.assign({},fc);Z=Object.assign({},gc);O.W=[0];X.O=ba.O.slice(0);X.Pa=ba.Pa.slice(0);"undefined"!==typeof a.antialias&&(Q.antialias=a.antialias);a.callbackReady&&(Q.Ka=a.callbackReady);a.callbackTrack&&(Q.Va=a.callbackTrack);a.nExpressions&&(X.aa=a.nExpressions);a.expressionsEasings&&(X.Na=a.expressionsEasings);"undefined"!==
typeof a.animateDelay&&(Q.fa=a.animateDelay);"undefined"!==typeof a.NNCPath&&(Q.Mc=a.NNCPath);"undefined"!==typeof a.NNC&&(Q.Fa=a.NNC);"undefined"!==typeof a.maxFacesDetected&&(O.o=Math.max(1,a.maxFacesDetected));"undefined"!==typeof a.followZRot&&(Q.ua=a.followZRot?!0:!1);if(O.o>ba.mf)return Ha("MAXFACES_TOOHIGH"),!1;if(!a.canvasId&&!a.canvas)return Ha("NO_CANVASID"),!1;Q.ia=a.canvas?a.canvas:document.getElementById(a.canvasId);if(!Q.ia)return Ha("INVALID_CANVASID"),!1;Z.D=Q.ia.width;Z.M=Q.ia.height;
if(!Z.D||!Z.M)return Ha("INVALID_CANVASDIMENSIONS"),!1;for(var d=0;d<O.o;++d)hb.push(new Float32Array(ba.qf)),ib.push(0);Ma.A({zd:a.isKeepRunningOnWinFocusLost||!1,ga:Q.fa});pa.A({kc:0,n:ba.Eb[1]-ba.Eb[0]+1,Gd:ba.Eb[0]});ea=Object.create(ba.Af);a.scanSettings&&(Object.assign(ea,a.scanSettings),-1!==ea.nDetectsPerLoop?pa.vc(ea.nDetectsPerLoop):pa.Gc());sa=Object.create(ba.Jf);a.stabilizationSettings&&Object.assign(sa,a.stabilizationSettings);var e=0;a.videoSettings&&a.videoSettings.videoElement?$a(a.videoSettings.videoElement,
c):(a.videoSettings&&Object.assign(oa,a.videoSettings),zb(a.onWebcamAsk,a.onWebcamGet,function(m){$a(m,c)}));Qb(function(m){if(!Rb())return!1;Oa=new Fb({pb:m.layers,qc:"gpuRawAvg",nc:Tb});A.Qc([{id:"s54",name:"_",ta:"attribute vec2 a0;uniform mat2 u38;varying vec2 vv0;void main(){gl_Position=vec4(a0,0.,1.),vv0=vec2(.5,.5)+u38*a0;}",Ta:["a0"],Ha:[2],h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",i:["u1","u38"],precision:"lowp"},{id:"s55",name:"_",h:"uniform sampler2D u1;varying vec2 vv0;void main(){gl_FragColor=texture2D(u1,vv0);}",
ta:"attribute vec2 a0;uniform sampler2D u39;uniform mat2 u38;uniform vec2 u40;uniform float u41,u42,u43;varying vec2 vv0;void main(){vec4 a=texture2D(u39,vec2(.17,u41));vec2 f=a.gb,g=a.a*u40,b=a0;b.x*=u43;float c=cos(u42),d=sin(u42);vec2 h=mat2(c,d,-d,c)*b,i=f+h*.5*g,j=i-.5;vv0=.5+2.*u38*j,gl_Position=vec4(a0,0.,1.);}",Ta:["a0"],Ha:[2],i:"u1 u39 u40 u41 u42 u43 u38".split(" "),precision:"lowp"},{id:"s56",name:"_",h:"uniform sampler2D u44,u39;uniform vec3 u45,u46;uniform float u47,u48,u41,u49,u42,u50;const vec4 e=vec4(.25,.25,.25,.25);void main(){vec4 d=texture2D(u44,vec2(.625,.625)),f=texture2D(u44,vec2(.875,.625)),a=texture2D(u39,vec2(.17,u41));float g=dot(d-f,e);bool h=g>u48;h?a.r=2.:a.r>u47?a.r=0.:a.r>1.9?a.r+=1.:0.,a.r*=u49;if(a.r<.9)a=vec4(1.,u45);else{a.r*=step(1.9,a.r);float i=dot(e,texture2D(u44,vec2(.875,.875))),j=dot(e,texture2D(u44,vec2(.125,.625))),k=dot(e,texture2D(u44,vec2(.375,.625))),b=cos(u42),c=sin(u42);vec2 l=mat2(b,c*u50,-c/u50,b)*vec2(i,j);a.gba+=vec3(l,k)*u46*a.a;}gl_FragColor=a;}",
ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",i:"u44 u39 u45 u47 u46 u49 u42 u50 u48 u41".split(" ")},{id:"s57",name:"_",ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",h:"uniform sampler2D u44;uniform float u49;const vec4 e=vec4(.25,.25,.25,.25);const vec3 f=vec3(.5,.5,.5);void main(){float a=dot(e,texture2D(u44,vec2(.125,.875))),b=dot(e,texture2D(u44,vec2(.375,.875))),c=dot(e,texture2D(u44,vec2(.625,.875))),d=dot(e,texture2D(u44,vec2(.625,.625)));vec3 g=vec3(a,b,c)*.5+f;gl_FragColor=vec4(g,d*u49);}",
i:["u44","u49"]},{id:"s58",name:"_",ta:"attribute vec2 a0;void main(){gl_Position=vec4(a0,0.,1.);}",h:"uniform sampler2D u44;const vec4 e=vec4(.25,.25,.25,.25);void main(){float a=dot(e,texture2D(u44,vec2(.375,.375))),b=dot(e,texture2D(u44,vec2(.625,.375))),c=dot(e,texture2D(u44,vec2(.875,.375))),d=dot(e,texture2D(u44,vec2(.125,.125)));gl_FragColor=vec4(a,b,c,d);}",i:["u44"]},{id:"s53",name:"_",h:"uniform sampler2D u39;uniform vec2 u51;uniform float u52;varying vec2 vv0;void main(){float f=step(.5,mod(gl_FragCoord.y+1.5,2.)),c=step(.33,vv0.x);vec4 a=texture2D(u39,vv0+u51);a.a=mix(a.a*u52,a.a,c);vec4 d=floor(255.*a),g=255.*(255.*a-d),b=mix(d,g,f)/255.;b.x=mix(step(a.x,1.5),b.x,c),gl_FragColor=b;}",
i:["u39","u52","u51"]}]);sb();Pb();kb();jb();c()});return!0},destroy:function(){Ma.m();return new Promise(function(a){Eb.toggle_pause(!0,!0).finally(function(){Oa&&Oa.m();Qa.m();Oa=qa=Sa=null;hb.splice(0);ib.splice(0);Z.xa=null;X.Da=null;B.N=null;na=ia.lc;a()}).catch(function(){})})},toggle_pause:function(a,c){if(!Ya())return Promise.reject("NOT_READY");var d=null;d=B.jb?Promise.resolve():c?W.ce(B.element,!a,B.La):Promise.resolve();a?rb():d.then(function(){eb()});return d},update_videoSettings:function(a){rb();
return new Promise(function(c,d){W.ce(B.element,!1,B.La).then(function(){Object.assign(oa,a);zb(null,null,function(e){$a(e,function(){Ja();Ia();eb();c()})})}).catch(d)})},toggle_slow:function(a){Ya()&&na===ia.play&&(a&&!Q.lb?(Q.Od=Q.fa,ea.nDetectsPerLoop=1,this.set_animateDelay(ba.Vf),Q.lb=!0):!a&&Q.lb&&(ea.nDetectsPerLoop=-1,this.set_animateDelay(Q.Od),Q.lb=!1))},set_animateDelay:function(a){Q.fa=a;Ma.update({ga:Q.fa})},resize:function(){if(!Ya())return!1;var a=Q.ia.width,c=Q.ia.height;if(!lb()&&
a===Z.D&&c===Z.M)return!1;Z.D=a;Z.M=c;A.R();kb();jb();Ja();Ia();return!0},set_inputTexture:function(a,c,d){B.H[0]=c;B.H[1]=d;B.N=Y.instance({width:c,height:d,Zb:a});B.kb=!0;Ja();fb();Ia()},reset_GLState:function(){fb();Z.xa.remove();X.Da.remove();sb()},render_video:function(){va.P();A.set("s54");b.viewport(0,0,Z.D,Z.M);B.N.g(0);U.l(!0,!0)},reset_inputTexture:function(){B.kb=!1;B.N=B.zc;lb();Ja();Ia()},get_videoDevices:function(a){return W.Ye(a)},set_scanSettings:function(a){Object.assign(ea,a);-1!==
ea.nDetectsPerLoop?pa.vc(ea.nDetectsPerLoop):pa.Gc();kb();jb()},set_stabilizationSettings:function(a){Object.assign(sa,a)},set_videoOrientation:function(a,c){Ya()&&(oa.flipX=c,oa.rotate=a,Ja(),Ia())},update_videoElement:function(a,c){$a(a?a:B.element,function(){xb();Ja();Ia();c&&c()})},create_new:function(){return window.JEELIZFACEFILTERGEN()}};return Eb};window.JEELIZFACEFILTER=window.JEELIZFACEFILTERGEN();
if(typeof(module)!=='undefined'){module.exports=window.JEELIZFACEFILTER;}
window.JEELIZFACEFILTER.FAKEDOM=FAKEDOM;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6
thirdparty/jeeliz/readme.md vendored Normal file
View File

@@ -0,0 +1,6 @@
Many of the files found in this folder are obtained from Jeeliz
jeelize/jeelizFaceFilter
Apache-2.0 License
https://github.com/jeeliz/jeelizFaceFilter/blob/master/LICENSE

1030
thirdparty/jeeliz/three.min.js vendored Normal file

File diff suppressed because one or more lines are too long

10
thirdparty/obs-websocket.min.js vendored Normal file

File diff suppressed because one or more lines are too long

3
thirdparty/readme.md vendored Normal file
View File

@@ -0,0 +1,3 @@
This folder primarily contains third-party libraries; MIT/Apache2.0 licenced.
Most the files are superficially needed and not required for the core function of VDO.Ninja; most anyways.