diff --git a/TODO.md b/TODO.md index 3d97a3e1..896cbd5b 100644 --- a/TODO.md +++ b/TODO.md @@ -6,6 +6,7 @@ WebGL shader optimizations for faster load and initial detection - Implement WebGL uniforms for shaders: - Fix shader packing: +- Event emitters
diff --git a/demo/benchmark/browser.html b/demo/benchmark/browser.html new file mode 100644 index 00000000..595ec88f --- /dev/null +++ b/demo/benchmark/browser.html @@ -0,0 +1,30 @@ + + + + + Human + + + + + + + + + + + + + +
+ +
+ + diff --git a/demo/benchmark/browser.js b/demo/benchmark/browser.js new file mode 100644 index 00000000..c5ccdb95 --- /dev/null +++ b/demo/benchmark/browser.js @@ -0,0 +1,51 @@ +// import * as tf from '../../assets/tf.es2017.js'; +// import '../../assets/tf-backend-webgpu.es2017.js'; +import Human from '../../dist/human.esm.js'; + +const loop = 20; + +// eslint-disable-next-line no-console +const log = (...msg) => console.log(...msg); + +const myConfig = { + backend: 'humangl', + modelBasePath: 'https://vladmandic.github.io/human/models', + wasmPath: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.9.0/dist/', + debug: true, + async: true, + cacheSensitivity: 0, + filter: { enabled: false }, + face: { + enabled: true, + detector: { enabled: true, rotation: false }, + mesh: { enabled: true }, + iris: { enabled: true }, + description: { enabled: true }, + emotion: { enabled: false }, + }, + hand: { enabled: true, rotation: false }, + body: { enabled: true }, + object: { enabled: false }, +}; + +async function main() { + const human = new Human(myConfig); + await human.tf.ready(); + log('Human:', human.version); + await human.load(); + const loaded = Object.keys(human.models).filter((a) => human.models[a]); + log('Loaded:', loaded); + log('Memory state:', human.tf.engine().memory()); + const element = document.getElementById('image'); + const processed = await human.image(element); + const t0 = performance.now(); + await human.detect(processed.tensor, myConfig); + const t1 = performance.now(); + log('Backend:', human.tf.getBackend()); + log('Warmup:', Math.round(t1 - t0)); + for (let i = 0; i < loop; i++) await human.detect(processed.tensor, myConfig); + const t2 = performance.now(); + log('Average:', Math.round((t2 - t1) / loop)); +} + +main(); diff --git a/demo/benchmark/node.js b/demo/benchmark/node.js new file mode 100644 index 00000000..1ddcf84f --- /dev/null +++ b/demo/benchmark/node.js @@ -0,0 +1,71 @@ +// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars +const tf = require('@tensorflow/tfjs-node-gpu'); +const log = require('@vladmandic/pilogger'); +const canvasJS = require('canvas'); +const Human = require('../../dist/human.node-gpu.js').default; + +const input = 'samples/groups/group1.jpg'; +const loop = 20; + +const myConfig = { + backend: 'tensorflow', + modelBasePath: 'https://vladmandic.github.io/human/models', + wasmPath: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.9.0/dist/', + debug: true, + async: true, + cacheSensitivity: 0, + filter: { enabled: false }, + face: { + enabled: true, + detector: { enabled: true, rotation: false }, + mesh: { enabled: true }, + iris: { enabled: true }, + description: { enabled: true }, + emotion: { enabled: true }, + }, + hand: { + enabled: true, + }, + body: { enabled: true }, + object: { enabled: false }, +}; + +async function getImage(human) { + const img = await canvasJS.loadImage(input); + const canvas = canvasJS.createCanvas(img.width, img.height); + const ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0, img.width, img.height); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const res = human.tf.tidy(() => { + const tensor = human.tf.tensor(Array.from(imageData.data), [canvas.height, canvas.width, 4], 'int32'); // create rgba image tensor from flat array + const channels = human.tf.split(tensor, 4, 2); // split rgba to channels + const rgb = human.tf.stack([channels[0], channels[1], channels[2]], 2); // stack channels back to rgb + const reshape = human.tf.reshape(rgb, [1, canvas.height, canvas.width, 3]); // move extra dim from the end of tensor and use it as batch number instead + return reshape; + }); + log.info('Image:', input, res.shape); + return res; +} + +async function main() { + log.header(); + const human = new Human(myConfig); + await human.tf.ready(); + log.info('Human:', human.version); + await human.load(); + const loaded = Object.keys(human.models).filter((a) => human.models[a]); + log.info('Loaded:', loaded); + log.info('Memory state:', human.tf.engine().memory()); + const tensor = await getImage(human); + log.state('Processing:', tensor['shape']); + const t0 = performance.now(); + await human.detect(tensor, myConfig); + const t1 = performance.now(); + log.state('Backend:', human.tf.getBackend()); + log.data('Warmup:', Math.round(t1 - t0)); + for (let i = 0; i < loop; i++) await human.detect(tensor, myConfig); + const t2 = performance.now(); + log.data('Average:', Math.round((t2 - t1) / loop)); +} + +main(); diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index 8097b99a..526e7641 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -4,14 +4,11000 @@ homepage: author: ' */ -var f5=Object.defineProperty;var kA=Object.getOwnPropertyDescriptor;var WA=Object.getOwnPropertyNames;var IA=Object.prototype.hasOwnProperty;var NA=e=>f5(e,"__esModule",{value:!0});var ue=(e,A)=>{NA(e);for(var t in A)f5(e,t,{get:A[t],enumerable:!0})},b=(e,A,t)=>{if(A&&typeof A=="object"||typeof A=="function")for(let r of WA(A))!IA.call(e,r)&&r!=="default"&&f5(e,r,{get:()=>A[r],enumerable:!(t=kA(A,r))||t.enumerable});return e};var pe=(e,A,t)=>{if(!A.has(e))throw TypeError("Cannot "+t)};var G=(e,A,t)=>(pe(e,A,"read from private field"),t?t.call(e):A.get(e)),e0=(e,A,t)=>{if(A.has(e))throw TypeError("Cannot add the same private member more than once");A instanceof WeakSet?A.add(e):A.set(e,t)},n0=(e,A,t,r)=>(pe(e,A,"write to private field"),r?r.call(e,t):A.set(e,t),t);function Z(e,A){let t=e.endsWith("/")?"":"/",o=A.startsWith(".")||A.startsWith("/")||A.startsWith("http:")||A.startsWith("https:")||A.startsWith("file:")?`${A}`:`${e}${t}${A}`;if(!o.toLocaleLowerCase().includes(".json"))throw new Error(`Human: ModelPath Error: ${o} Expecting JSON file`);return o}function M(...e){let A=new Date,t=`${A.getHours().toString().padStart(2,"0")}:${A.getMinutes().toString().padStart(2,"0")}:${A.getSeconds().toString().padStart(2,"0")}.${A.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(t,"Human:",...e)}var L=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function U(...e){let A=t=>t&&typeof t=="object";return e.reduce((t,r)=>(Object.keys(r||{}).forEach(o=>{let a=t[o],i=r[o];Array.isArray(a)&&Array.isArray(i)?t[o]=a.concat(...i):A(a)&&A(i)?t[o]=U(a,i):t[o]=i}),t),{})}var m5={backend:"webgl",modelBasePath:"../models/",wasmPath:"",debug:!0,async:!0,warmup:"full",cacheSensitivity:.75,skipFrame:!1,filter:{enabled:!0,width:0,height:0,flip:!1,return:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:15,skipFrames:15,minConfidence:.2,iouThreshold:.1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:11,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:17,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:1,minConfidence:.2,skipFrames:1},hand:{enabled:!0,rotation:!0,skipFrames:18,minConfidence:.8,iouThreshold:.2,maxDetected:1,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:19},segmentation:{enabled:!1,modelPath:"selfie.json"}};function be(){let e="",A="";if(typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let r=t[0].match(/\(([^()]+)\)/g);e=r&&r[0]?r[0].replace(/\(|\)/g,""):"",A=navigator.userAgent.replace(t[0],""),e[1]&&(A=A.replace(t[1],"")),A=A.replace(/ /g," ")}}else typeof process!="undefined"&&(e=`${process.platform} ${process.arch}`,A=`NodeJS ${process.version}`);return{platform:e,agent:A}}var n={};ue(n,{data:()=>qA,version:()=>GA});b(n,qt);b(n,Gt);b(n,Ut);b(n,Bt);b(n,Dt);b(n,Yt);import{version as OA}from"@tensorflow/tfjs/package.json";import{version as LA}from"@tensorflow/tfjs-core/package.json";import{version as HA}from"@tensorflow/tfjs-data/package.json";import{version as VA}from"@tensorflow/tfjs-layers/package.json";import{version as ZA}from"@tensorflow/tfjs-converter/package.json";import{version as FA}from"@tensorflow/tfjs-backend-cpu/package.json";import{version as XA}from"@tensorflow/tfjs-backend-webgl/package.json";import{version as CA}from"@tensorflow/tfjs-backend-wasm/package.json";import*as qt from"@tensorflow/tfjs-core/dist/index.js";import*as Gt from"@tensorflow/tfjs-layers/dist/index.js";import*as Ut from"@tensorflow/tfjs-converter/dist/index.js";import*as qA from"@tensorflow/tfjs-data/dist/index.js";import*as Bt from"@tensorflow/tfjs-backend-cpu/dist/index.js";import*as Dt from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as Yt from"@tensorflow/tfjs-backend-wasm/dist/index.js";var GA={tfjs:OA,"tfjs-core":LA,"tfjs-data":HA,"tfjs-layers":VA,"tfjs-converter":ZA,"tfjs-backend-cpu":FA,"tfjs-backend-webgl":XA,"tfjs-backend-wasm":CA};var D={name:"humangl",priority:99,canvas:null,gl:null,width:1024,height:1024,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function UA(){let e=D.gl;!e||(D.extensions=e.getSupportedExtensions())}function ge(){if(!n.findBackend(D.name)){try{D.canvas=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(D.width,D.height):document.createElement("canvas")}catch(e){M("error: cannot create canvas:",e);return}try{D.gl=D.canvas.getContext("webgl2",D.webGLattr)}catch(e){M("error: cannot get WebGL2 context:",e);return}try{n.setWebGLContext(2,D.gl)}catch(e){M("error: cannot set WebGL2 context:",e);return}try{let e=new n.GPGPUContext(D.gl);n.registerBackend(D.name,()=>new n.MathBackendWebGL(e),D.priority)}catch(e){M("error: cannot register WebGL backend:",e);return}try{n.getKernelsForBackend("webgl").forEach(A=>{let t={...A,backendName:D.name};n.registerKernel(t)})}catch(e){M("error: cannot update WebGL backend registration:",e);return}try{n.ENV.set("WEBGL_VERSION",2)}catch(e){M("error: cannot set WebGL backend flags:",e);return}UA(),M("backend registered:",D.name)}}function Me(e,A){let t=[e.startPoint[0]*A[0],e.startPoint[1]*A[1]],r=[e.endPoint[0]*A[0],e.endPoint[1]*A[1]];return{startPoint:t,endPoint:r}}function j0(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function S0(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function k0(e,A,t){let r=A.shape[1],o=A.shape[2],a=[[e.startPoint[1]/r,e.startPoint[0]/o,e.endPoint[1]/r,e.endPoint[0]/o]];return n.image.cropAndResize(A,a,[0],t)}function C0(e,A=1.5){let t=S0(e),r=j0(e),o=[A*r[0]/2,A*r[1]/2],a=[t[0]-o[0],t[1]-o[1]],i=[t[0]+o[0],t[1]+o[1]];return{startPoint:a,endPoint:i,landmarks:e.landmarks}}function q0(e){let A=S0(e),t=j0(e),o=Math.max(...t)/2,a=[Math.round(A[0]-o),Math.round(A[1]-o)],i=[Math.round(A[0]+o),Math.round(A[1]+o)];return{startPoint:a,endPoint:i,landmarks:e.landmarks}}function h5(e){let A=e.map(a=>a[0]),t=e.map(a=>a[1]),r=[Math.min(...A),Math.min(...t)],o=[Math.max(...A),Math.max(...t)];return{startPoint:r,endPoint:o,landmarks:e}}var Te=e=>({startPoint:n.slice(e,[0,0],[-1,2]),endPoint:n.slice(e,[0,2],[-1,2])});var G0=[[1,0,0],[0,1,0],[0,0,1]];function BA(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Pe(e,A){let t=Math.PI/2-Math.atan2(-(A[1]-e[1]),A[0]-e[0]);return BA(t)}function ve(e,A){return[[1,0,e],[0,1,A],[0,0,1]]}function l0(e,A){let t=0;for(let r=0;r{let l=n.image.resizeBilinear(A,[this.inputSize,this.inputSize]),c=n.sub(n.div(l,127.5),.5),d=this.model.execute(c),m;if(Array.isArray(d)){let u=d.sort((P,g)=>P.size-g.size),E=n.concat([u[0],u[2]],2),w=n.concat([u[1],u[3]],2),I=n.concat([w,E],1);m=n.squeeze(I,0)}else m=n.squeeze(d);let T=YA(m,this.anchors,[this.inputSize,this.inputSize]),f=n.slice(m,[0,0],[-1,1]),p=n.squeeze(n.sigmoid(f));return[m,T,p]});this.config=U(this.config,t);let i=await n.image.nonMaxSuppressionAsync(o,a,this.config.face.detector.maxDetected,this.config.face.detector.iouThreshold,this.config.face.detector.minConfidence),s=await i.array();n.dispose(i);let y=[],x=await a.data();for(let l=0;lthis.config.face.detector.minConfidence){let d=n.slice(o,[s[l],0],[1,-1]),m=Te(d);n.dispose(d);let T=this.anchorsData[s[l]],f=n.tidy(()=>n.reshape(n.squeeze(n.slice(r,[s[l],je-1],[1,-1])),[je,-1]));y.push({box:m,landmarks:f,anchor:T,confidence:c})}}return n.dispose(r),n.dispose(o),n.dispose(a),{boxes:y,scaleFactor:[A.shape[2]/this.inputSize,A.shape[1]/this.inputSize]}}};async function ke(e){let A=await n.loadGraphModel(Z(e.modelBasePath,e.face.detector.modelPath),{fromTFHub:e.face.detector.modelPath.includes("tfhub.dev")}),t=new Se(A,e);return!A||!A.modelUrl?M("load model failed:",e.face.detector.modelPath):e.debug&&M("load model:",A.modelUrl),t}var s0={silhouette:[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],lipsUpperOuter:[61,185,40,39,37,0,267,269,270,409,291],lipsLowerOuter:[146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[78,191,80,81,82,13,312,311,310,415,308],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],rightEyeUpper0:[246,161,160,159,158,157,173],rightEyeLower0:[33,7,163,144,145,153,154,155,133],rightEyeUpper1:[247,30,29,27,28,56,190],rightEyeLower1:[130,25,110,24,23,22,26,112,243],rightEyeUpper2:[113,225,224,223,222,221,189],rightEyeLower2:[226,31,228,229,230,231,232,233,244],rightEyeLower3:[143,111,117,118,119,120,121,128,245],rightEyebrowUpper:[156,70,63,105,66,107,55,193],rightEyebrowLower:[35,124,46,53,52,65],rightEyeIris:[473,474,475,476,477],leftEyeUpper0:[466,388,387,386,385,384,398],leftEyeLower0:[263,249,390,373,374,380,381,382,362],leftEyeUpper1:[467,260,259,257,258,286,414],leftEyeLower1:[359,255,339,254,253,252,256,341,463],leftEyeUpper2:[342,445,444,443,442,441,413],leftEyeLower2:[446,261,448,449,450,451,452,453,464],leftEyeLower3:[372,340,346,347,348,349,350,357,465],leftEyebrowUpper:[383,300,293,334,296,336,285,417],leftEyebrowLower:[265,353,276,283,282,295],leftEyeIris:[468,469,470,471,472],midwayBetweenEyes:[168],noseTip:[1],noseBottom:[2],noseRightCorner:[98],noseLeftCorner:[327],rightCheek:[205],leftCheek:[425]},p5=[{key:"EyeUpper0",indices:[9,10,11,12,13,14,15]},{key:"EyeUpper1",indices:[25,26,27,28,29,30,31]},{key:"EyeUpper2",indices:[41,42,43,44,45,46,47]},{key:"EyeLower0",indices:[0,1,2,3,4,5,6,7,8]},{key:"EyeLower1",indices:[16,17,18,19,20,21,22,23,24]},{key:"EyeLower2",indices:[32,33,34,35,36,37,38,39,40]},{key:"EyeLower3",indices:[54,55,56,57,58,59,60,61,62]}],W0=[[.499976992607117,.652534008026123],[.500025987625122,.547487020492554],[.499974012374878,.602371990680695],[.482113003730774,.471979022026062],[.500150978565216,.527155995368958],[.499909996986389,.498252987861633],[.499523013830185,.40106201171875],[.289712011814117,.380764007568359],[.499954998493195,.312398016452789],[.499987006187439,.269918978214264],[.500023007392883,.107050001621246],[.500023007392883,.666234016418457],[.5000159740448,.679224014282227],[.500023007392883,.692348003387451],[.499976992607117,.695277988910675],[.499976992607117,.70593398809433],[.499976992607117,.719385027885437],[.499976992607117,.737019002437592],[.499967992305756,.781370997428894],[.499816000461578,.562981009483337],[.473773002624512,.573909997940063],[.104906998574734,.254140973091125],[.365929991006851,.409575998783112],[.338757991790771,.41302502155304],[.311120003461838,.409460008144379],[.274657994508743,.389131009578705],[.393361985683441,.403706014156342],[.345234006643295,.344011008739471],[.370094001293182,.346076011657715],[.319321990013123,.347265005111694],[.297903001308441,.353591024875641],[.24779200553894,.410809993743896],[.396889001131058,.842755019664764],[.280097991228104,.375599980354309],[.106310002505779,.399955987930298],[.2099249958992,.391353011131287],[.355807989835739,.534406006336212],[.471751004457474,.65040397644043],[.474155008792877,.680191993713379],[.439785003662109,.657229006290436],[.414617002010345,.66654098033905],[.450374007225037,.680860996246338],[.428770989179611,.682690978050232],[.374971002340317,.727805018424988],[.486716985702515,.547628998756409],[.485300987958908,.527395009994507],[.257764995098114,.314490020275116],[.401223003864288,.455172002315521],[.429818987846375,.548614978790283],[.421351999044418,.533740997314453],[.276895999908447,.532056987285614],[.483370006084442,.499586999416351],[.33721199631691,.282882988452911],[.296391993761063,.293242990970612],[.169294998049736,.193813979625702],[.447580009698868,.302609980106354],[.392390012741089,.353887975215912],[.354490011930466,.696784019470215],[.067304998636246,.730105042457581],[.442739009857178,.572826027870178],[.457098007202148,.584792017936707],[.381974011659622,.694710969924927],[.392388999462128,.694203019142151],[.277076005935669,.271932005882263],[.422551989555359,.563233017921448],[.385919004678726,.281364023685455],[.383103013038635,.255840003490448],[.331431001424789,.119714021682739],[.229923993349075,.232002973556519],[.364500999450684,.189113974571228],[.229622006416321,.299540996551514],[.173287004232407,.278747975826263],[.472878992557526,.666198015213013],[.446828007698059,.668527007102966],[.422762006521225,.673889994621277],[.445307999849319,.580065965652466],[.388103008270264,.693961024284363],[.403039008378983,.706539988517761],[.403629004955292,.693953037261963],[.460041999816895,.557139039039612],[.431158006191254,.692366003990173],[.452181994915009,.692366003990173],[.475387006998062,.692366003990173],[.465828001499176,.779190003871918],[.472328990697861,.736225962638855],[.473087012767792,.717857003211975],[.473122000694275,.704625964164734],[.473033010959625,.695277988910675],[.427942007780075,.695277988910675],[.426479011774063,.703539967536926],[.423162013292313,.711845993995667],[.4183090031147,.720062971115112],[.390094995498657,.639572978019714],[.013953999616206,.560034036636353],[.499913990497589,.58014702796936],[.413199990987778,.69539999961853],[.409626007080078,.701822996139526],[.468080013990402,.601534962654114],[.422728985548019,.585985004901886],[.463079988956451,.593783974647522],[.37211999297142,.47341400384903],[.334562003612518,.496073007583618],[.411671012639999,.546965003013611],[.242175996303558,.14767599105835],[.290776997804642,.201445996761322],[.327338010072708,.256527006626129],[.399509996175766,.748921036720276],[.441727995872498,.261676013469696],[.429764986038208,.187834024429321],[.412198007106781,.108901023864746],[.288955003023148,.398952007293701],[.218936994671822,.435410976409912],[.41278201341629,.398970007896423],[.257135003805161,.355440020561218],[.427684992551804,.437960982322693],[.448339998722076,.536936044692993],[.178560003638268,.45755398273468],[.247308000922203,.457193970680237],[.286267012357712,.467674970626831],[.332827985286713,.460712015628815],[.368755996227264,.447206974029541],[.398963987827301,.432654976844788],[.476410001516342,.405806005001068],[.189241006970406,.523923993110657],[.228962004184723,.348950982093811],[.490725994110107,.562400996685028],[.404670000076294,.485132992267609],[.019469000399113,.401564002037048],[.426243007183075,.420431017875671],[.396993011236191,.548797011375427],[.266469985246658,.376977026462555],[.439121007919312,.51895797252655],[.032313998788595,.644356966018677],[.419054001569748,.387154996395111],[.462783008813858,.505746960639954],[.238978996872902,.779744982719421],[.198220998048782,.831938028335571],[.107550002634525,.540755033493042],[.183610007166862,.740257024765015],[.134409993886948,.333683013916016],[.385764002799988,.883153975009918],[.490967005491257,.579378008842468],[.382384985685349,.508572995662689],[.174399003386497,.397670984268188],[.318785011768341,.39623498916626],[.343364000320435,.400596976280212],[.396100014448166,.710216999053955],[.187885001301765,.588537991046906],[.430987000465393,.944064974784851],[.318993002176285,.898285031318665],[.266247987747192,.869701027870178],[.500023007392883,.190576016902924],[.499976992607117,.954452991485596],[.366169989109039,.398822009563446],[.393207013607025,.39553701877594],[.410373002290726,.391080021858215],[.194993004202843,.342101991176605],[.388664990663528,.362284004688263],[.365961998701096,.355970978736877],[.343364000320435,.355356991291046],[.318785011768341,.35834002494812],[.301414996385574,.363156020641327],[.058132998645306,.319076001644135],[.301414996385574,.387449026107788],[.499987989664078,.618434011936188],[.415838003158569,.624195992946625],[.445681989192963,.566076993942261],[.465844005346298,.620640993118286],[.49992299079895,.351523995399475],[.288718998432159,.819945991039276],[.335278987884521,.852819979190826],[.440512001514435,.902418971061707],[.128294005990028,.791940987110138],[.408771991729736,.373893976211548],[.455606997013092,.451801002025604],[.499877005815506,.908990025520325],[.375436991453171,.924192011356354],[.11421000212431,.615022003650665],[.448662012815475,.695277988910675],[.4480200111866,.704632043838501],[.447111994028091,.715808033943176],[.444831997156143,.730794012546539],[.430011987686157,.766808986663818],[.406787008047104,.685672998428345],[.400738000869751,.681069016456604],[.392399996519089,.677703022956848],[.367855995893478,.663918972015381],[.247923001646996,.601333022117615],[.452769994735718,.420849978923798],[.43639200925827,.359887003898621],[.416164010763168,.368713974952698],[.413385987281799,.692366003990173],[.228018000721931,.683571994304657],[.468268007040024,.352671027183533],[.411361992359161,.804327011108398],[.499989002943039,.469825029373169],[.479153990745544,.442654013633728],[.499974012374878,.439637005329132],[.432112008333206,.493588984012604],[.499886006116867,.866917014122009],[.49991300702095,.821729004383087],[.456548988819122,.819200992584229],[.344549000263214,.745438992977142],[.37890899181366,.574010014533997],[.374292999505997,.780184984207153],[.319687992334366,.570737957954407],[.357154995203018,.604269981384277],[.295284003019333,.621580958366394],[.447750002145767,.862477004528046],[.410986006259918,.508723020553589],[.31395098567009,.775308012962341],[.354128003120422,.812552988529205],[.324548006057739,.703992962837219],[.189096003770828,.646299958229065],[.279776990413666,.71465802192688],[.1338230073452,.682700991630554],[.336768001317978,.644733011722565],[.429883986711502,.466521978378296],[.455527991056442,.548622965812683],[.437114000320435,.558896005153656],[.467287987470627,.529924988746643],[.414712011814117,.335219979286194],[.37704598903656,.322777986526489],[.344107985496521,.320150971412659],[.312875986099243,.32233202457428],[.283526003360748,.333190023899078],[.241245999932289,.382785975933075],[.102986000478268,.468762993812561],[.267612010240555,.424560010433197],[.297879010438919,.433175981044769],[.333433985710144,.433878004550934],[.366427004337311,.426115989685059],[.396012008190155,.416696012020111],[.420121014118195,.41022801399231],[.007561000064015,.480777025222778],[.432949006557465,.569517970085144],[.458638995885849,.479089021682739],[.473466008901596,.545744001865387],[.476087987422943,.563830018043518],[.468472003936768,.555056989192963],[.433990985155106,.582361996173859],[.483518004417419,.562983989715576],[.482482999563217,.57784903049469],[.42645001411438,.389798998832703],[.438998997211456,.39649498462677],[.450067013502121,.400434017181396],[.289712011814117,.368252992630005],[.276670008897781,.363372981548309],[.517862021923065,.471948027610779],[.710287988185883,.380764007568359],[.526226997375488,.573909997940063],[.895093023777008,.254140973091125],[.634069979190826,.409575998783112],[.661242008209229,.41302502155304],[.688880026340485,.409460008144379],[.725341975688934,.389131009578705],[.606630027294159,.40370500087738],[.654766023159027,.344011008739471],[.629905998706818,.346076011657715],[.680678009986877,.347265005111694],[.702096998691559,.353591024875641],[.75221198797226,.410804986953735],[.602918028831482,.842862963676453],[.719901978969574,.375599980354309],[.893692970275879,.399959981441498],[.790081977844238,.391354024410248],[.643998026847839,.534487962722778],[.528249025344849,.65040397644043],[.525849997997284,.680191040039062],[.560214996337891,.657229006290436],[.585384011268616,.66654098033905],[.549625992774963,.680860996246338],[.57122802734375,.682691991329193],[.624852001667023,.72809898853302],[.513050019741058,.547281980514526],[.51509702205658,.527251958847046],[.742246985435486,.314507007598877],[.598631024360657,.454979002475739],[.570338010787964,.548575043678284],[.578631997108459,.533622980117798],[.723087012767792,.532054007053375],[.516445994377136,.499638974666595],[.662801027297974,.282917976379395],[.70362401008606,.293271005153656],[.830704987049103,.193813979625702],[.552385985851288,.302568018436432],[.607609987258911,.353887975215912],[.645429015159607,.696707010269165],[.932694971561432,.730105042457581],[.557260990142822,.572826027870178],[.542901992797852,.584792017936707],[.6180260181427,.694710969924927],[.607590973377228,.694203019142151],[.722943007946014,.271963000297546],[.577413976192474,.563166975975037],[.614082992076874,.281386971473694],[.616907000541687,.255886018276215],[.668509006500244,.119913995265961],[.770092010498047,.232020974159241],[.635536015033722,.189248979091644],[.77039098739624,.299556016921997],[.826722025871277,.278755009174347],[.527121007442474,.666198015213013],[.553171992301941,.668527007102966],[.577238023281097,.673889994621277],[.554691970348358,.580065965652466],[.611896991729736,.693961024284363],[.59696102142334,.706539988517761],[.596370995044708,.693953037261963],[.539958000183105,.557139039039612],[.568841993808746,.692366003990173],[.547818005084991,.692366003990173],[.52461302280426,.692366003990173],[.534089982509613,.779141008853912],[.527670979499817,.736225962638855],[.526912987232208,.717857003211975],[.526877999305725,.704625964164734],[.526966989040375,.695277988910675],[.572058022022247,.695277988910675],[.573521018028259,.703539967536926],[.57683801651001,.711845993995667],[.581691026687622,.720062971115112],[.609944999217987,.639909982681274],[.986046016216278,.560034036636353],[.5867999792099,.69539999961853],[.590372025966644,.701822996139526],[.531915009021759,.601536989212036],[.577268004417419,.585934996604919],[.536915004253387,.593786001205444],[.627542972564697,.473352015018463],[.665585994720459,.495950996875763],[.588353991508484,.546862006187439],[.757824003696442,.14767599105835],[.709249973297119,.201507985591888],[.672684013843536,.256581008434296],[.600408971309662,.74900496006012],[.55826598405838,.261672019958496],[.570303976535797,.187870979309082],[.588165998458862,.109044015407562],[.711045026779175,.398952007293701],[.781069993972778,.435405015945435],[.587247014045715,.398931980133057],[.742869973182678,.355445981025696],[.572156012058258,.437651991844177],[.55186802148819,.536570012569427],[.821442008018494,.457556009292603],[.752701997756958,.457181990146637],[.71375697851181,.467626988887787],[.66711300611496,.460672974586487],[.631101012229919,.447153985500336],[.6008620262146,.432473003864288],[.523481011390686,.405627012252808],[.810747981071472,.523926019668579],[.771045982837677,.348959028720856],[.509127020835876,.562718033790588],[.595292985439301,.485023975372314],[.980530977249146,.401564002037048],[.573499977588654,.420000016689301],[.602994978427887,.548687994480133],[.733529984951019,.376977026462555],[.560611009597778,.519016981124878],[.967685997486115,.644356966018677],[.580985009670258,.387160003185272],[.537728011608124,.505385041236877],[.760966002941132,.779752969741821],[.801778972148895,.831938028335571],[.892440974712372,.54076099395752],[.816350996494293,.740260004997253],[.865594983100891,.333687007427216],[.614073991775513,.883246004581451],[.508952975273132,.579437971115112],[.617941975593567,.508316040039062],[.825608015060425,.397674977779388],[.681214988231659,.39623498916626],[.656635999679565,.400596976280212],[.603900015354156,.710216999053955],[.81208598613739,.588539004325867],[.56801301240921,.944564998149872],[.681007981300354,.898285031318665],[.733752012252808,.869701027870178],[.633830010890961,.398822009563446],[.606792986392975,.39553701877594],[.589659988880157,.391062021255493],[.805015981197357,.342108011245728],[.611334979534149,.362284004688263],[.634037971496582,.355970978736877],[.656635999679565,.355356991291046],[.681214988231659,.35834002494812],[.698584973812103,.363156020641327],[.941866993904114,.319076001644135],[.698584973812103,.387449026107788],[.584177017211914,.624107003211975],[.554318010807037,.566076993942261],[.534153997898102,.62064003944397],[.711217999458313,.819975018501282],[.664629995822906,.852871000766754],[.559099972248077,.902631998062134],[.871706008911133,.791940987110138],[.591234028339386,.373893976211548],[.544341027736664,.451583981513977],[.624562978744507,.924192011356354],[.88577002286911,.615028977394104],[.551338016986847,.695277988910675],[.551980018615723,.704632043838501],[.552887976169586,.715808033943176],[.555167973041534,.730794012546539],[.569944024085999,.767035007476807],[.593203008174896,.685675978660583],[.599261999130249,.681069016456604],[.607599973678589,.677703022956848],[.631937980651855,.663500010967255],[.752032995223999,.601315021514893],[.547226011753082,.420395016670227],[.563543975353241,.359827995300293],[.583841025829315,.368713974952698],[.586614012718201,.692366003990173],[.771915018558502,.683578014373779],[.531597018241882,.352482974529266],[.588370978832245,.804440975189209],[.52079701423645,.442565023899078],[.567984998226166,.493479013442993],[.543282985687256,.819254994392395],[.655317008495331,.745514988899231],[.621008992195129,.574018001556396],[.625559985637665,.78031200170517],[.680198013782501,.570719003677368],[.64276397228241,.604337990283966],[.704662978649139,.621529996395111],[.552012026309967,.862591981887817],[.589071989059448,.508637011051178],[.685944974422455,.775357007980347],[.645735025405884,.812640011310577],[.675342977046967,.703978002071381],[.810858011245728,.646304965019226],[.72012197971344,.714666962623596],[.866151988506317,.682704985141754],[.663187026977539,.644596993923187],[.570082008838654,.466325998306274],[.544561982154846,.548375964164734],[.562758982181549,.558784961700439],[.531987011432648,.530140042304993],[.585271000862122,.335177004337311],[.622952997684479,.32277899980545],[.655896008014679,.320163011550903],[.687132000923157,.322345972061157],[.716481983661652,.333200991153717],[.758756995201111,.382786989212036],[.897013008594513,.468769013881683],[.732392013072968,.424547016620636],[.70211398601532,.433162987232208],[.66652500629425,.433866024017334],[.633504986763,.426087975502014],[.603875994682312,.416586995124817],[.579657971858978,.409945011138916],[.992439985275269,.480777025222778],[.567192018032074,.569419980049133],[.54136598110199,.478899002075195],[.526564002037048,.546118021011353],[.523913025856018,.563830018043518],[.531529009342194,.555056989192963],[.566035985946655,.582329034805298],[.51631098985672,.563053965568542],[.5174720287323,.577877044677734],[.573594987392426,.389806985855103],[.560697972774506,.395331978797913],[.549755990505219,.399751007556915],[.710287988185883,.368252992630005],[.723330020904541,.363372981548309]],p0=[127,34,139,11,0,37,232,231,120,72,37,39,128,121,47,232,121,128,104,69,67,175,171,148,157,154,155,118,50,101,73,39,40,9,151,108,48,115,131,194,204,211,74,40,185,80,42,183,40,92,186,230,229,118,202,212,214,83,18,17,76,61,146,160,29,30,56,157,173,106,204,194,135,214,192,203,165,98,21,71,68,51,45,4,144,24,23,77,146,91,205,50,187,201,200,18,91,106,182,90,91,181,85,84,17,206,203,36,148,171,140,92,40,39,193,189,244,159,158,28,247,246,161,236,3,196,54,68,104,193,168,8,117,228,31,189,193,55,98,97,99,126,47,100,166,79,218,155,154,26,209,49,131,135,136,150,47,126,217,223,52,53,45,51,134,211,170,140,67,69,108,43,106,91,230,119,120,226,130,247,63,53,52,238,20,242,46,70,156,78,62,96,46,53,63,143,34,227,173,155,133,123,117,111,44,125,19,236,134,51,216,206,205,154,153,22,39,37,167,200,201,208,36,142,100,57,212,202,20,60,99,28,158,157,35,226,113,160,159,27,204,202,210,113,225,46,43,202,204,62,76,77,137,123,116,41,38,72,203,129,142,64,98,240,49,102,64,41,73,74,212,216,207,42,74,184,169,170,211,170,149,176,105,66,69,122,6,168,123,147,187,96,77,90,65,55,107,89,90,180,101,100,120,63,105,104,93,137,227,15,86,85,129,102,49,14,87,86,55,8,9,100,47,121,145,23,22,88,89,179,6,122,196,88,95,96,138,172,136,215,58,172,115,48,219,42,80,81,195,3,51,43,146,61,171,175,199,81,82,38,53,46,225,144,163,110,246,33,7,52,65,66,229,228,117,34,127,234,107,108,69,109,108,151,48,64,235,62,78,191,129,209,126,111,35,143,163,161,246,117,123,50,222,65,52,19,125,141,221,55,65,3,195,197,25,7,33,220,237,44,70,71,139,122,193,245,247,130,33,71,21,162,153,158,159,170,169,150,188,174,196,216,186,92,144,160,161,2,97,167,141,125,241,164,167,37,72,38,12,145,159,160,38,82,13,63,68,71,226,35,111,158,153,154,101,50,205,206,92,165,209,198,217,165,167,97,220,115,218,133,112,243,239,238,241,214,135,169,190,173,133,171,208,32,125,44,237,86,87,178,85,86,179,84,85,180,83,84,181,201,83,182,137,93,132,76,62,183,61,76,184,57,61,185,212,57,186,214,207,187,34,143,156,79,239,237,123,137,177,44,1,4,201,194,32,64,102,129,213,215,138,59,166,219,242,99,97,2,94,141,75,59,235,24,110,228,25,130,226,23,24,229,22,23,230,26,22,231,112,26,232,189,190,243,221,56,190,28,56,221,27,28,222,29,27,223,30,29,224,247,30,225,238,79,20,166,59,75,60,75,240,147,177,215,20,79,166,187,147,213,112,233,244,233,128,245,128,114,188,114,217,174,131,115,220,217,198,236,198,131,134,177,132,58,143,35,124,110,163,7,228,110,25,356,389,368,11,302,267,452,350,349,302,303,269,357,343,277,452,453,357,333,332,297,175,152,377,384,398,382,347,348,330,303,304,270,9,336,337,278,279,360,418,262,431,304,408,409,310,415,407,270,409,410,450,348,347,422,430,434,313,314,17,306,307,375,387,388,260,286,414,398,335,406,418,364,367,416,423,358,327,251,284,298,281,5,4,373,374,253,307,320,321,425,427,411,421,313,18,321,405,406,320,404,405,315,16,17,426,425,266,377,400,369,322,391,269,417,465,464,386,257,258,466,260,388,456,399,419,284,332,333,417,285,8,346,340,261,413,441,285,327,460,328,355,371,329,392,439,438,382,341,256,429,420,360,364,394,379,277,343,437,443,444,283,275,440,363,431,262,369,297,338,337,273,375,321,450,451,349,446,342,467,293,334,282,458,461,462,276,353,383,308,324,325,276,300,293,372,345,447,382,398,362,352,345,340,274,1,19,456,248,281,436,427,425,381,256,252,269,391,393,200,199,428,266,330,329,287,273,422,250,462,328,258,286,384,265,353,342,387,259,257,424,431,430,342,353,276,273,335,424,292,325,307,366,447,345,271,303,302,423,266,371,294,455,460,279,278,294,271,272,304,432,434,427,272,407,408,394,430,431,395,369,400,334,333,299,351,417,168,352,280,411,325,319,320,295,296,336,319,403,404,330,348,349,293,298,333,323,454,447,15,16,315,358,429,279,14,15,316,285,336,9,329,349,350,374,380,252,318,402,403,6,197,419,318,319,325,367,364,365,435,367,397,344,438,439,272,271,311,195,5,281,273,287,291,396,428,199,311,271,268,283,444,445,373,254,339,263,466,249,282,334,296,449,347,346,264,447,454,336,296,299,338,10,151,278,439,455,292,407,415,358,371,355,340,345,372,390,249,466,346,347,280,442,443,282,19,94,370,441,442,295,248,419,197,263,255,359,440,275,274,300,383,368,351,412,465,263,467,466,301,368,389,380,374,386,395,378,379,412,351,419,436,426,322,373,390,388,2,164,393,370,462,461,164,0,267,302,11,12,374,373,387,268,12,13,293,300,301,446,261,340,385,384,381,330,266,425,426,423,391,429,355,437,391,327,326,440,457,438,341,382,362,459,457,461,434,430,394,414,463,362,396,369,262,354,461,457,316,403,402,315,404,403,314,405,404,313,406,405,421,418,406,366,401,361,306,408,407,291,409,408,287,410,409,432,436,410,434,416,411,264,368,383,309,438,457,352,376,401,274,275,4,421,428,262,294,327,358,433,416,367,289,455,439,462,370,326,2,326,370,305,460,455,254,449,448,255,261,446,253,450,449,252,451,450,256,452,451,341,453,452,413,464,463,441,413,414,258,442,441,257,443,442,259,444,443,260,445,444,467,342,445,459,458,250,289,392,290,290,328,460,376,433,435,250,290,392,411,416,433,341,463,464,453,464,465,357,465,412,343,412,399,360,363,440,437,399,456,420,456,363,401,435,288,372,383,353,339,255,249,448,261,255,133,243,190,133,155,112,33,246,247,33,130,25,398,384,286,362,398,414,362,463,341,263,359,467,263,249,255,466,467,260,75,60,166,238,239,79,162,127,139,72,11,37,121,232,120,73,72,39,114,128,47,233,232,128,103,104,67,152,175,148,173,157,155,119,118,101,74,73,40,107,9,108,49,48,131,32,194,211,184,74,185,191,80,183,185,40,186,119,230,118,210,202,214,84,83,17,77,76,146,161,160,30,190,56,173,182,106,194,138,135,192,129,203,98,54,21,68,5,51,4,145,144,23,90,77,91,207,205,187,83,201,18,181,91,182,180,90,181,16,85,17,205,206,36,176,148,140,165,92,39,245,193,244,27,159,28,30,247,161,174,236,196,103,54,104,55,193,8,111,117,31,221,189,55,240,98,99,142,126,100,219,166,218,112,155,26,198,209,131,169,135,150,114,47,217,224,223,53,220,45,134,32,211,140,109,67,108,146,43,91,231,230,120,113,226,247,105,63,52,241,238,242,124,46,156,95,78,96,70,46,63,116,143,227,116,123,111,1,44,19,3,236,51,207,216,205,26,154,22,165,39,167,199,200,208,101,36,100,43,57,202,242,20,99,56,28,157,124,35,113,29,160,27,211,204,210,124,113,46,106,43,204,96,62,77,227,137,116,73,41,72,36,203,142,235,64,240,48,49,64,42,41,74,214,212,207,183,42,184,210,169,211,140,170,176,104,105,69,193,122,168,50,123,187,89,96,90,66,65,107,179,89,180,119,101,120,68,63,104,234,93,227,16,15,85,209,129,49,15,14,86,107,55,9,120,100,121,153,145,22,178,88,179,197,6,196,89,88,96,135,138,136,138,215,172,218,115,219,41,42,81,5,195,51,57,43,61,208,171,199,41,81,38,224,53,225,24,144,110,105,52,66,118,229,117,227,34,234,66,107,69,10,109,151,219,48,235,183,62,191,142,129,126,116,111,143,7,163,246,118,117,50,223,222,52,94,19,141,222,221,65,196,3,197,45,220,44,156,70,139,188,122,245,139,71,162,145,153,159,149,170,150,122,188,196,206,216,92,163,144,161,164,2,167,242,141,241,0,164,37,11,72,12,144,145,160,12,38,13,70,63,71,31,226,111,157,158,154,36,101,205,203,206,165,126,209,217,98,165,97,237,220,218,237,239,241,210,214,169,140,171,32,241,125,237,179,86,178,180,85,179,181,84,180,182,83,181,194,201,182,177,137,132,184,76,183,185,61,184,186,57,185,216,212,186,192,214,187,139,34,156,218,79,237,147,123,177,45,44,4,208,201,32,98,64,129,192,213,138,235,59,219,141,242,97,97,2,141,240,75,235,229,24,228,31,25,226,230,23,229,231,22,230,232,26,231,233,112,232,244,189,243,189,221,190,222,28,221,223,27,222,224,29,223,225,30,224,113,247,225,99,60,240,213,147,215,60,20,166,192,187,213,243,112,244,244,233,245,245,128,188,188,114,174,134,131,220,174,217,236,236,198,134,215,177,58,156,143,124,25,110,7,31,228,25,264,356,368,0,11,267,451,452,349,267,302,269,350,357,277,350,452,357,299,333,297,396,175,377,381,384,382,280,347,330,269,303,270,151,9,337,344,278,360,424,418,431,270,304,409,272,310,407,322,270,410,449,450,347,432,422,434,18,313,17,291,306,375,259,387,260,424,335,418,434,364,416,391,423,327,301,251,298,275,281,4,254,373,253,375,307,321,280,425,411,200,421,18,335,321,406,321,320,405,314,315,17,423,426,266,396,377,369,270,322,269,413,417,464,385,386,258,248,456,419,298,284,333,168,417,8,448,346,261,417,413,285,326,327,328,277,355,329,309,392,438,381,382,256,279,429,360,365,364,379,355,277,437,282,443,283,281,275,363,395,431,369,299,297,337,335,273,321,348,450,349,359,446,467,283,293,282,250,458,462,300,276,383,292,308,325,283,276,293,264,372,447,346,352,340,354,274,19,363,456,281,426,436,425,380,381,252,267,269,393,421,200,428,371,266,329,432,287,422,290,250,328,385,258,384,446,265,342,386,387,257,422,424,430,445,342,276,422,273,424,306,292,307,352,366,345,268,271,302,358,423,371,327,294,460,331,279,294,303,271,304,436,432,427,304,272,408,395,394,431,378,395,400,296,334,299,6,351,168,376,352,411,307,325,320,285,295,336,320,319,404,329,330,349,334,293,333,366,323,447,316,15,315,331,358,279,317,14,316,8,285,9,277,329,350,253,374,252,319,318,403,351,6,419,324,318,325,397,367,365,288,435,397,278,344,439,310,272,311,248,195,281,375,273,291,175,396,199,312,311,268,276,283,445,390,373,339,295,282,296,448,449,346,356,264,454,337,336,299,337,338,151,294,278,455,308,292,415,429,358,355,265,340,372,388,390,466,352,346,280,295,442,282,354,19,370,285,441,295,195,248,197,457,440,274,301,300,368,417,351,465,251,301,389,385,380,386,394,395,379,399,412,419,410,436,322,387,373,388,326,2,393,354,370,461,393,164,267,268,302,12,386,374,387,312,268,13,298,293,301,265,446,340,380,385,381,280,330,425,322,426,391,420,429,437,393,391,326,344,440,438,458,459,461,364,434,394,428,396,262,274,354,457,317,316,402,316,315,403,315,314,404,314,313,405,313,421,406,323,366,361,292,306,407,306,291,408,291,287,409,287,432,410,427,434,411,372,264,383,459,309,457,366,352,401,1,274,4,418,421,262,331,294,358,435,433,367,392,289,439,328,462,326,94,2,370,289,305,455,339,254,448,359,255,446,254,253,449,253,252,450,252,256,451,256,341,452,414,413,463,286,441,414,286,258,441,258,257,442,257,259,443,259,260,444,260,467,445,309,459,250,305,289,290,305,290,460,401,376,435,309,250,392,376,411,433,453,341,464,357,453,465,343,357,412,437,343,399,344,360,440,420,437,456,360,420,363,361,401,288,265,372,353,390,339,249,339,448,255];var JA=[127,234,132,58,172,150,149,148,152,377,378,379,397,288,361,454,356,70,63,105,66,107,336,296,334,293,300,168,6,195,4,98,97,2,326,327,33,160,158,133,153,144,362,385,387,263,373,380,57,40,37,0,267,270,287,321,314,17,84,91,78,81,13,311,308,402,14,178],KA=[33,133,362,263,1,62,308,159,145,386,374,6,102,331,2,13,14,70,105,107,336,334,300,54,10,284,50,280,234,454,58,288,152],QA=[33,133,362,263,1,78,308],s2=JA.map(e=>W0[e]),a2=KA.map(e=>W0[e]),i2=QA.map(e=>W0[e]);var b5=s0.leftEyeLower0,g5=s0.rightEyeLower0,P0={leftBounds:[b5[0],b5[b5.length-1]],rightBounds:[g5[0],g5[g5.length-1]]},We={count:468,mouth:13,symmetryLine:[13,s0.midwayBetweenEyes[0]]},_A={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},v0={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};function U0(e,A,t,r){for(let o=0;o[a[0]/this.meshSize*(c[0]-this.meshSize/2),a[1]/this.meshSize*(c[1]-this.meshSize/2),c[2]]),s=r!==0?u5(r,[0,0]):G0,y=r!==0?i.map(c=>[...Re(c,s),c[2]]):i,x=r!==0?Ee(o):G0,l=[...S0({startPoint:t.startPoint,endPoint:t.endPoint}),1];return y.map(c=>[Math.round(c[0]+l0(l,x[0])),Math.round(c[1]+l0(l,x[1])),Math.round(c[2])])}getLeftToRightEyeDepthDifference(A){let t=A[P0.leftBounds[0]][2],r=A[P0.rightBounds[0]][2];return t-r}getEyeBox(A,t,r,o,a=!1){let i=q0(C0(h5([A[r],A[o]]),this.irisEnlarge)),s=j0(i),y=n.image.cropAndResize(t,[[i.startPoint[1]/this.meshSize,i.startPoint[0]/this.meshSize,i.endPoint[1]/this.meshSize,i.endPoint[0]/this.meshSize]],[0],[this.irisSize,this.irisSize]);if(a&&n.ENV.flags.IS_BROWSER){let x=n.image.flipLeftRight(y);n.dispose(y),y=x}return{box:i,boxSize:s,crop:y}}getEyeCoords(A,t,r,o=!1){let a=[];for(let i=0;i{let x=i;return y===2?x=o:y===4&&(x=a),[s[0],s[1],x]})}correctFaceRotation(A,t,r){let[o,a]=t.landmarks.length>=We.count?We.symmetryLine:_A.symmetryLine,i=Pe(t.landmarks[o],t.landmarks[a]),s=S0({startPoint:t.startPoint,endPoint:t.endPoint}),y=[s[0]/r.shape[2],s[1]/r.shape[1]],x=n.image.rotateWithOffset(r,i,0,y),l=u5(-i,s),c=A.face.mesh.enabled?k0({startPoint:t.startPoint,endPoint:t.endPoint},x,[this.meshSize,this.meshSize]):k0({startPoint:t.startPoint,endPoint:t.endPoint},x,[this.boxSize,this.boxSize]),d=n.div(c,255);return n.dispose(c),n.dispose(x),[i,l,d]}async augmentIris(A,t){let{box:r,boxSize:o,crop:a}=this.getEyeBox(A,t,P0.leftBounds[0],P0.leftBounds[1],!0),{box:i,boxSize:s,crop:y}=this.getEyeBox(A,t,P0.rightBounds[0],P0.rightBounds[1]),x=n.concat([a,y]);n.dispose(a),n.dispose(y);let l=this.irisModel.predict(x);n.dispose(x);let c=await l.data();n.dispose(l);let d=c.slice(0,v0.numCoordinates*3),{rawCoords:m,iris:T}=this.getEyeCoords(d,r,o,!0),f=c.slice(v0.numCoordinates*3),{rawCoords:p,iris:u}=this.getEyeCoords(f,i,s),E=this.getLeftToRightEyeDepthDifference(A);Math.abs(E)<30?(U0(A,m,"left",null),U0(A,p,"right",null)):E<1?U0(A,m,"left",["EyeUpper0","EyeLower0"]):U0(A,p,"right",["EyeUpper0","EyeLower0"]);let w=this.getAdjustedIrisCoords(A,T,"left"),I=this.getAdjustedIrisCoords(A,u,"right");return A.concat(w).concat(I)}async predict(A,t){let r=!1,o;if((this.skipped===0||this.skipped>t.face.detector.skipFrames||!t.face.mesh.enabled||!t.skipFrame)&&(o=await this.boundingBoxDetector.getBoundingBoxes(A,t),this.skipped=0),t.skipFrame&&this.skipped++,!t.skipFrame||o&&o.boxes&&(!t.face.mesh.enabled||o.boxes.length!==this.detectedFaces&&this.detectedFaces!==t.face.detector.maxDetected)){this.storedBoxes=[],this.detectedFaces=0;for(let s of o.boxes){let y=await s.box.startPoint.data(),x=await s.box.endPoint.data(),l=await s.landmarks.array();this.storedBoxes.push({startPoint:y,endPoint:x,landmarks:l,confidence:s.confidence})}this.storedBoxes.length>0&&(r=!0)}if(r){if(!o||!o.boxes||o.boxes.length===0)return this.storedBoxes=[],this.detectedFaces=0,null;for(let s=0;s{n.dispose(s.box.startPoint),n.dispose(s.box.endPoint),n.dispose(s.landmarks)});let a=[],i=[];for(let s of this.storedBoxes){let y,x=0,l;if(t.face.detector.rotation&&t.face.mesh.enabled&&n.ENV.flags.IS_BROWSER)[x,l,y]=this.correctFaceRotation(t,s,A);else{l=G0;let c=A.clone(),d=t.face.mesh.enabled?k0({startPoint:s.startPoint,endPoint:s.endPoint},c,[this.meshSize,this.meshSize]):k0({startPoint:s.startPoint,endPoint:s.endPoint},c,[this.boxSize,this.boxSize]);y=n.div(d,255),n.dispose(d),n.dispose(c)}if(!t.face.mesh.enabled)a.push({mesh:[],box:s,faceConfidence:null,boxConfidence:s.confidence,confidence:s.confidence,image:y});else{let[c,d,m]=this.meshDetector.execute(y);n.dispose(c);let T=(await d.data())[0];n.dispose(d);let f=n.reshape(m,[-1,3]),p=await f.array();if(n.dispose(m),n.dispose(f),Ts.confidence>t.face.detector.minConfidence)),this.detectedFaces=a.length,a}};var X=[null,null,null],T5;async function Ie(e,A){let t=await T5.predict(e,A),r=[],o=0;for(let a of t||[]){if(!a||a.isDisposedInternal)continue;let i=a.mesh.map(l=>[l[0]/(e.shape[2]||0),l[1]/(e.shape[1]||0),l[2]/T5.meshSize]),s={};if(a.mesh&&a.mesh.length>0)for(let l of Object.keys(s0))s[l]=s0[l].map(c=>a.mesh[c]);let y=a.box?[Math.trunc(Math.max(0,a.box.startPoint[0])),Math.trunc(Math.max(0,a.box.startPoint[1])),Math.trunc(Math.min(e.shape[2]||0,a.box.endPoint[0])-Math.max(0,a.box.startPoint[0])),Math.trunc(Math.min(e.shape[1]||0,a.box.endPoint[1])-Math.max(0,a.box.startPoint[1]))]:[0,0,0,0],x=a.box?[a.box.startPoint[0]/(e.shape[2]||0),a.box.startPoint[1]/(e.shape[1]||0),(a.box.endPoint[0]-a.box.startPoint[0])/(e.shape[2]||0),(a.box.endPoint[1]-a.box.startPoint[1])/(e.shape[1]||0)]:[0,0,0,0];r.push({id:o++,score:Math.round(100*a.faceConfidence||100*a.boxConfidence||0)/100,boxScore:Math.round(100*a.boxConfidence)/100,faceScore:Math.round(100*a.faceConfidence)/100,box:y,boxRaw:x,mesh:a.mesh,meshRaw:i,annotations:s,tensor:a.image}),a.coords&&n.dispose(a.coords)}return r}async function P5(e){return!X[0]&&e.face.enabled||!X[1]&&e.face.mesh.enabled||!X[2]&&e.face.iris.enabled?(X=await Promise.all([!X[0]&&e.face.enabled?ke(e):null,!X[1]&&e.face.mesh.enabled?n.loadGraphModel(Z(e.modelBasePath,e.face.mesh.modelPath),{fromTFHub:e.face.mesh.modelPath.includes("tfhub.dev")}):null,!X[2]&&e.face.iris.enabled?n.loadGraphModel(Z(e.modelBasePath,e.face.iris.modelPath),{fromTFHub:e.face.iris.modelPath.includes("tfhub.dev")}):null]),e.face.mesh.enabled&&(!X[1]||!X[1].modelUrl?M("load model failed:",e.face.mesh.modelPath):e.debug&&M("load model:",X[1].modelUrl)),e.face.iris.enabled&&(!X[2]||!X[2].modelUrl?M("load model failed:",e.face.iris.modelPath):e.debug&&M("load model:",X[2].modelUrl))):e.debug&&(X[0]&&M("cached model:",X[0].model.modelUrl),X[1]&&M("cached model:",X[1].modelUrl),X[2]&&M("cached model:",X[2].modelUrl)),T5=new M5(X[0],X[1],X[2]),X}var Ne=p0,Oe=W0;var o0,B0=[],Le=0,v5=Number.MAX_SAFE_INTEGER;async function z5(e){let A=Z(e.modelBasePath,e.face.description.modelPath);return o0?e.debug&&M("cached model:",A):(o0=await n.loadGraphModel(A),o0?e.debug&&M("load model:",A):M("load model failed:",e.face.description.modelPath)),o0}function E5(e,A,t=2){if(!e||!A||(e==null?void 0:e.length)===0||(A==null?void 0:A.length)===0||(e==null?void 0:e.length)!==(A==null?void 0:A.length))return 0;let r=5*e.map((a,i)=>Math.abs(e[i]-A[i])**t).reduce((a,i)=>a+i,0)**(1/t);return Math.max(0,100-r)/100}function He(e,A,t=0){let r={similarity:0,name:"",source:"",embedding:[]};if(!e||!A||!Array.isArray(e)||!Array.isArray(A))return r;for(let o of A)if(o.embedding&&o.name){let a=E5(e,o.embedding);a>t&&a>r.similarity&&(r={...o,similarity:a})}return r}function R5(e){return n.tidy(()=>{let t=e.image||e.tensor||e;if(!(t instanceof n.Tensor))return null;let r=[[.05,.15,.85,.85]];if(!o0.inputs[0].shape)return null;let o=t.shape.length===3?n.image.cropAndResize(n.expandDims(t,0),r,[0],[o0.inputs[0].shape[2],o0.inputs[0].shape[1]]):n.image.cropAndResize(t,r,[0],[o0.inputs[0].shape[2],o0.inputs[0].shape[1]]);return n.mul(o,255)})}async function w5(e,A,t,r){var o,a;return o0?v50?(v5++,B0[t]):(v5=0,new Promise(async i=>{let s=R5(e),y,x={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(A.face.description.enabled&&(y=await o0.predict(s)),n.dispose(s),y){let l=await y.find(u=>u.shape[1]===1).data(),c=Math.trunc(200*Math.abs(l[0]-.5))/100;c>A.face.description.minConfidence&&(x.gender=l[0]<=.5?"female":"male",x.genderScore=Math.min(.99,c));let m=(await n.argMax(y.find(u=>u.shape[1]===100),1).data())[0],T=await y.find(u=>u.shape[1]===100).data();x.age=Math.round(T[m-1]>T[m+1]?10*m-100*T[m-1]:10*m+100*T[m+1])/10;let p=await y.find(u=>u.shape[1]===1024).data();x.descriptor=[...p],y.forEach(u=>n.dispose(u))}B0[t]=x,Le=r,i(x)})):null}var $A=["angry","disgust","fear","happy","sad","surprise","neutral"],r0,D0=[],Ve=0,j5=Number.MAX_SAFE_INTEGER,S5=[.2989,.587,.114];async function k5(e){return r0?e.debug&&M("cached model:",r0.modelUrl):(r0=await n.loadGraphModel(Z(e.modelBasePath,e.face.emotion.modelPath)),!r0||!r0.modelUrl?M("load model failed:",e.face.emotion.modelPath):e.debug&&M("load model:",r0.modelUrl)),r0}async function W5(e,A,t,r){return r0?j50?(j5++,D0[t]):(j5=0,new Promise(async o=>{let a=n.image.resizeBilinear(e,[r0.inputs[0].shape[2],r0.inputs[0].shape[1]],!1),[i,s,y]=n.split(a,3,3);n.dispose(a);let x=n.mul(i,S5[0]),l=n.mul(s,S5[1]),c=n.mul(y,S5[2]);n.dispose(i),n.dispose(s),n.dispose(y);let d=n.addN([x,l,c]);n.dispose(x),n.dispose(l),n.dispose(c);let m=n.tidy(()=>n.mul(n.sub(d,.5),2));n.dispose(d);let T=[];if(A.face.emotion.enabled){let f=await r0.predict(m),p=await f.data();n.dispose(f);for(let u=0;uA.face.emotion.minConfidence&&T.push({score:Math.min(.99,Math.trunc(100*p[u])/100),emotion:$A[u]});T.sort((u,E)=>E.score-u.score)}n.dispose(m),D0[t]=T,Ve=r,o(T)})):null}var I0=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],Ze=I0.length,N0=I0.reduce((e,A,t)=>(e[A]=t,e),{}),et=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],At=et.map(([e,A])=>[N0[e],N0[A]]),Fe=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function Xe(e){let A=e.reduce(({maxX:t,maxY:r,minX:o,minY:a},{position:{x:i,y:s}})=>({maxX:Math.max(t,i),maxY:Math.max(r,s),minX:Math.min(o,i),minY:Math.min(a,s)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[A.minX,A.minY,A.maxX-A.minX,A.maxY-A.minY]}function Ce(e,[A,t],[r,o]){let a=A/r,i=t/o,s=(x,l)=>({id:l,score:x.score,boxRaw:[x.box[0]/o,x.box[1]/r,x.box[2]/o,x.box[3]/r],box:[Math.trunc(x.box[0]*i),Math.trunc(x.box[1]*a),Math.trunc(x.box[2]*i),Math.trunc(x.box[3]*a)],keypoints:x.keypoints.map(({score:c,part:d,position:m})=>({score:c,part:d,position:[Math.trunc(m.x*i),Math.trunc(m.y*a)],positionRaw:[m.x/r,m.y/r]}))});return e.map((x,l)=>s(x,l))}var I5=class{constructor(A,t){this.priorityQueue=new Array(A),this.numberOfElements=-1,this.getElementValue=t}enqueue(A){this.priorityQueue[++this.numberOfElements]=A,this.swim(this.numberOfElements)}dequeue(){let A=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,A}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(A){for(;A>0&&this.less(Math.floor(A/2),A);)this.exchange(A,Math.floor(A/2)),A=Math.floor(A/2)}sink(A){for(;2*A<=this.numberOfElements;){let t=2*A;if(tt?t:e}function qe(e,A,t,r){let o=t-e,a=r-A;return o*o+a*a}function H5(e,A){return{x:e.x+A.x,y:e.y+A.y}}var Y0=1,z0=16,tt=50**2;function Ge(e,A,t,r,o,a,i=2){let s=u=>({y:a.get(u.y,u.x,e),x:a.get(u.y,u.x,a.shape[2]/2+e)}),y=(u,E,w)=>({y:L5(Math.round(u.y/z0),0,E-1),x:L5(Math.round(u.x/z0),0,w-1)}),[x,l]=r.shape,c=y(A.position,x,l),d=s(c),T=H5(A.position,d);for(let u=0;u[N0[d],N0[m]]),i=a.map(([,d])=>d),s=a.map(([d])=>d),y=A.shape[2],x=i.length,l=new Array(y),c=O5(e.part,z0,t);l[e.part.id]={score:e.score,part:I0[e.part.id],position:c};for(let d=x-1;d>=0;--d){let m=i[d],T=s[d];l[m]&&!l[T]&&(l[T]=Ge(d,l[m],T,A,t,o))}for(let d=0;dA){s=!1;break}if(!s)break}return s}function rt(e,A){let[t,r,o]=A.shape,a=new I5(t*r*o,({score:i})=>i);for(let i=0;i{var i;let a=(i=o[r])==null?void 0:i.position;return a?qe(t,A,a.y,a.x)<=tt:!1})}function st(e,A){return A.reduce((r,{position:o,score:a},i)=>(Ue(e,o,i)||(r+=a),r),0)/A.length}function Be(e,A,t,r,o,a){let i=[],s=rt(a,A);for(;i.lengthm.score>a);let c=st(i,l),d=Xe(l);c>a&&i.push({keypoints:l,box:d,score:Math.round(100*c)/100})}return i}var K,at=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"];async function V5(e,A){let t=n.tidy(()=>{if(!K.inputs[0].shape)return[];let i=n.image.resizeBilinear(e,[K.inputs[0].shape[2],K.inputs[0].shape[1]]),s=n.sub(n.div(n.cast(i,"float32"),127.5),1),x=K.execute(s,at).map(l=>n.squeeze(l,[0]));return x[1]=x[1].sigmoid(),x}),r=await Promise.all(t.map(i=>i.buffer()));for(let i of t)n.dispose(i);let o=await Be(r[0],r[1],r[2],r[3],A.body.maxDetected,A.body.minConfidence);return K.inputs[0].shape?Ce(o,[e.shape[1],e.shape[2]],[K.inputs[0].shape[2],K.inputs[0].shape[1]]):[]}async function Z5(e){return K?e.debug&&M("cached model:",K.modelUrl):(K=await n.loadGraphModel(Z(e.modelBasePath,e.body.modelPath)),!K||!K.modelUrl?M("load model failed:",e.body.modelPath):e.debug&&M("load model:",K.modelUrl)),K}function J0(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function O0(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function De(e,A,t){let r=A.shape[1],o=A.shape[2],a=[[e.startPoint[1]/r,e.startPoint[0]/o,e.endPoint[1]/r,e.endPoint[0]/o]];return n.image.cropAndResize(A,a,[0],t)}function Ye(e,A){let t=[e.startPoint[0]*A[0],e.startPoint[1]*A[1]],r=[e.endPoint[0]*A[0],e.endPoint[1]*A[1]],o=e.palmLandmarks.map(a=>[a[0]*A[0],a[1]*A[1]]);return{startPoint:t,endPoint:r,palmLandmarks:o,confidence:e.confidence}}function K0(e,A=1.5){let t=O0(e),r=J0(e),o=[A*r[0]/2,A*r[1]/2],a=[t[0]-o[0],t[1]-o[1]],i=[t[0]+o[0],t[1]+o[1]];return{startPoint:a,endPoint:i,palmLandmarks:e.palmLandmarks}}function Q0(e){let A=O0(e),t=J0(e),o=Math.max(...t)/2,a=[A[0]-o,A[1]-o],i=[A[0]+o,A[1]+o];return{startPoint:a,endPoint:i,palmLandmarks:e.palmLandmarks}}var Je=[{x:.015625,y:.015625},{x:.015625,y:.015625},{x:.046875,y:.015625},{x:.046875,y:.015625},{x:.078125,y:.015625},{x:.078125,y:.015625},{x:.109375,y:.015625},{x:.109375,y:.015625},{x:.140625,y:.015625},{x:.140625,y:.015625},{x:.171875,y:.015625},{x:.171875,y:.015625},{x:.203125,y:.015625},{x:.203125,y:.015625},{x:.234375,y:.015625},{x:.234375,y:.015625},{x:.265625,y:.015625},{x:.265625,y:.015625},{x:.296875,y:.015625},{x:.296875,y:.015625},{x:.328125,y:.015625},{x:.328125,y:.015625},{x:.359375,y:.015625},{x:.359375,y:.015625},{x:.390625,y:.015625},{x:.390625,y:.015625},{x:.421875,y:.015625},{x:.421875,y:.015625},{x:.453125,y:.015625},{x:.453125,y:.015625},{x:.484375,y:.015625},{x:.484375,y:.015625},{x:.515625,y:.015625},{x:.515625,y:.015625},{x:.546875,y:.015625},{x:.546875,y:.015625},{x:.578125,y:.015625},{x:.578125,y:.015625},{x:.609375,y:.015625},{x:.609375,y:.015625},{x:.640625,y:.015625},{x:.640625,y:.015625},{x:.671875,y:.015625},{x:.671875,y:.015625},{x:.703125,y:.015625},{x:.703125,y:.015625},{x:.734375,y:.015625},{x:.734375,y:.015625},{x:.765625,y:.015625},{x:.765625,y:.015625},{x:.796875,y:.015625},{x:.796875,y:.015625},{x:.828125,y:.015625},{x:.828125,y:.015625},{x:.859375,y:.015625},{x:.859375,y:.015625},{x:.890625,y:.015625},{x:.890625,y:.015625},{x:.921875,y:.015625},{x:.921875,y:.015625},{x:.953125,y:.015625},{x:.953125,y:.015625},{x:.984375,y:.015625},{x:.984375,y:.015625},{x:.015625,y:.046875},{x:.015625,y:.046875},{x:.046875,y:.046875},{x:.046875,y:.046875},{x:.078125,y:.046875},{x:.078125,y:.046875},{x:.109375,y:.046875},{x:.109375,y:.046875},{x:.140625,y:.046875},{x:.140625,y:.046875},{x:.171875,y:.046875},{x:.171875,y:.046875},{x:.203125,y:.046875},{x:.203125,y:.046875},{x:.234375,y:.046875},{x:.234375,y:.046875},{x:.265625,y:.046875},{x:.265625,y:.046875},{x:.296875,y:.046875},{x:.296875,y:.046875},{x:.328125,y:.046875},{x:.328125,y:.046875},{x:.359375,y:.046875},{x:.359375,y:.046875},{x:.390625,y:.046875},{x:.390625,y:.046875},{x:.421875,y:.046875},{x:.421875,y:.046875},{x:.453125,y:.046875},{x:.453125,y:.046875},{x:.484375,y:.046875},{x:.484375,y:.046875},{x:.515625,y:.046875},{x:.515625,y:.046875},{x:.546875,y:.046875},{x:.546875,y:.046875},{x:.578125,y:.046875},{x:.578125,y:.046875},{x:.609375,y:.046875},{x:.609375,y:.046875},{x:.640625,y:.046875},{x:.640625,y:.046875},{x:.671875,y:.046875},{x:.671875,y:.046875},{x:.703125,y:.046875},{x:.703125,y:.046875},{x:.734375,y:.046875},{x:.734375,y:.046875},{x:.765625,y:.046875},{x:.765625,y:.046875},{x:.796875,y:.046875},{x:.796875,y:.046875},{x:.828125,y:.046875},{x:.828125,y:.046875},{x:.859375,y:.046875},{x:.859375,y:.046875},{x:.890625,y:.046875},{x:.890625,y:.046875},{x:.921875,y:.046875},{x:.921875,y:.046875},{x:.953125,y:.046875},{x:.953125,y:.046875},{x:.984375,y:.046875},{x:.984375,y:.046875},{x:.015625,y:.078125},{x:.015625,y:.078125},{x:.046875,y:.078125},{x:.046875,y:.078125},{x:.078125,y:.078125},{x:.078125,y:.078125},{x:.109375,y:.078125},{x:.109375,y:.078125},{x:.140625,y:.078125},{x:.140625,y:.078125},{x:.171875,y:.078125},{x:.171875,y:.078125},{x:.203125,y:.078125},{x:.203125,y:.078125},{x:.234375,y:.078125},{x:.234375,y:.078125},{x:.265625,y:.078125},{x:.265625,y:.078125},{x:.296875,y:.078125},{x:.296875,y:.078125},{x:.328125,y:.078125},{x:.328125,y:.078125},{x:.359375,y:.078125},{x:.359375,y:.078125},{x:.390625,y:.078125},{x:.390625,y:.078125},{x:.421875,y:.078125},{x:.421875,y:.078125},{x:.453125,y:.078125},{x:.453125,y:.078125},{x:.484375,y:.078125},{x:.484375,y:.078125},{x:.515625,y:.078125},{x:.515625,y:.078125},{x:.546875,y:.078125},{x:.546875,y:.078125},{x:.578125,y:.078125},{x:.578125,y:.078125},{x:.609375,y:.078125},{x:.609375,y:.078125},{x:.640625,y:.078125},{x:.640625,y:.078125},{x:.671875,y:.078125},{x:.671875,y:.078125},{x:.703125,y:.078125},{x:.703125,y:.078125},{x:.734375,y:.078125},{x:.734375,y:.078125},{x:.765625,y:.078125},{x:.765625,y:.078125},{x:.796875,y:.078125},{x:.796875,y:.078125},{x:.828125,y:.078125},{x:.828125,y:.078125},{x:.859375,y:.078125},{x:.859375,y:.078125},{x:.890625,y:.078125},{x:.890625,y:.078125},{x:.921875,y:.078125},{x:.921875,y:.078125},{x:.953125,y:.078125},{x:.953125,y:.078125},{x:.984375,y:.078125},{x:.984375,y:.078125},{x:.015625,y:.109375},{x:.015625,y:.109375},{x:.046875,y:.109375},{x:.046875,y:.109375},{x:.078125,y:.109375},{x:.078125,y:.109375},{x:.109375,y:.109375},{x:.109375,y:.109375},{x:.140625,y:.109375},{x:.140625,y:.109375},{x:.171875,y:.109375},{x:.171875,y:.109375},{x:.203125,y:.109375},{x:.203125,y:.109375},{x:.234375,y:.109375},{x:.234375,y:.109375},{x:.265625,y:.109375},{x:.265625,y:.109375},{x:.296875,y:.109375},{x:.296875,y:.109375},{x:.328125,y:.109375},{x:.328125,y:.109375},{x:.359375,y:.109375},{x:.359375,y:.109375},{x:.390625,y:.109375},{x:.390625,y:.109375},{x:.421875,y:.109375},{x:.421875,y:.109375},{x:.453125,y:.109375},{x:.453125,y:.109375},{x:.484375,y:.109375},{x:.484375,y:.109375},{x:.515625,y:.109375},{x:.515625,y:.109375},{x:.546875,y:.109375},{x:.546875,y:.109375},{x:.578125,y:.109375},{x:.578125,y:.109375},{x:.609375,y:.109375},{x:.609375,y:.109375},{x:.640625,y:.109375},{x:.640625,y:.109375},{x:.671875,y:.109375},{x:.671875,y:.109375},{x:.703125,y:.109375},{x:.703125,y:.109375},{x:.734375,y:.109375},{x:.734375,y:.109375},{x:.765625,y:.109375},{x:.765625,y:.109375},{x:.796875,y:.109375},{x:.796875,y:.109375},{x:.828125,y:.109375},{x:.828125,y:.109375},{x:.859375,y:.109375},{x:.859375,y:.109375},{x:.890625,y:.109375},{x:.890625,y:.109375},{x:.921875,y:.109375},{x:.921875,y:.109375},{x:.953125,y:.109375},{x:.953125,y:.109375},{x:.984375,y:.109375},{x:.984375,y:.109375},{x:.015625,y:.140625},{x:.015625,y:.140625},{x:.046875,y:.140625},{x:.046875,y:.140625},{x:.078125,y:.140625},{x:.078125,y:.140625},{x:.109375,y:.140625},{x:.109375,y:.140625},{x:.140625,y:.140625},{x:.140625,y:.140625},{x:.171875,y:.140625},{x:.171875,y:.140625},{x:.203125,y:.140625},{x:.203125,y:.140625},{x:.234375,y:.140625},{x:.234375,y:.140625},{x:.265625,y:.140625},{x:.265625,y:.140625},{x:.296875,y:.140625},{x:.296875,y:.140625},{x:.328125,y:.140625},{x:.328125,y:.140625},{x:.359375,y:.140625},{x:.359375,y:.140625},{x:.390625,y:.140625},{x:.390625,y:.140625},{x:.421875,y:.140625},{x:.421875,y:.140625},{x:.453125,y:.140625},{x:.453125,y:.140625},{x:.484375,y:.140625},{x:.484375,y:.140625},{x:.515625,y:.140625},{x:.515625,y:.140625},{x:.546875,y:.140625},{x:.546875,y:.140625},{x:.578125,y:.140625},{x:.578125,y:.140625},{x:.609375,y:.140625},{x:.609375,y:.140625},{x:.640625,y:.140625},{x:.640625,y:.140625},{x:.671875,y:.140625},{x:.671875,y:.140625},{x:.703125,y:.140625},{x:.703125,y:.140625},{x:.734375,y:.140625},{x:.734375,y:.140625},{x:.765625,y:.140625},{x:.765625,y:.140625},{x:.796875,y:.140625},{x:.796875,y:.140625},{x:.828125,y:.140625},{x:.828125,y:.140625},{x:.859375,y:.140625},{x:.859375,y:.140625},{x:.890625,y:.140625},{x:.890625,y:.140625},{x:.921875,y:.140625},{x:.921875,y:.140625},{x:.953125,y:.140625},{x:.953125,y:.140625},{x:.984375,y:.140625},{x:.984375,y:.140625},{x:.015625,y:.171875},{x:.015625,y:.171875},{x:.046875,y:.171875},{x:.046875,y:.171875},{x:.078125,y:.171875},{x:.078125,y:.171875},{x:.109375,y:.171875},{x:.109375,y:.171875},{x:.140625,y:.171875},{x:.140625,y:.171875},{x:.171875,y:.171875},{x:.171875,y:.171875},{x:.203125,y:.171875},{x:.203125,y:.171875},{x:.234375,y:.171875},{x:.234375,y:.171875},{x:.265625,y:.171875},{x:.265625,y:.171875},{x:.296875,y:.171875},{x:.296875,y:.171875},{x:.328125,y:.171875},{x:.328125,y:.171875},{x:.359375,y:.171875},{x:.359375,y:.171875},{x:.390625,y:.171875},{x:.390625,y:.171875},{x:.421875,y:.171875},{x:.421875,y:.171875},{x:.453125,y:.171875},{x:.453125,y:.171875},{x:.484375,y:.171875},{x:.484375,y:.171875},{x:.515625,y:.171875},{x:.515625,y:.171875},{x:.546875,y:.171875},{x:.546875,y:.171875},{x:.578125,y:.171875},{x:.578125,y:.171875},{x:.609375,y:.171875},{x:.609375,y:.171875},{x:.640625,y:.171875},{x:.640625,y:.171875},{x:.671875,y:.171875},{x:.671875,y:.171875},{x:.703125,y:.171875},{x:.703125,y:.171875},{x:.734375,y:.171875},{x:.734375,y:.171875},{x:.765625,y:.171875},{x:.765625,y:.171875},{x:.796875,y:.171875},{x:.796875,y:.171875},{x:.828125,y:.171875},{x:.828125,y:.171875},{x:.859375,y:.171875},{x:.859375,y:.171875},{x:.890625,y:.171875},{x:.890625,y:.171875},{x:.921875,y:.171875},{x:.921875,y:.171875},{x:.953125,y:.171875},{x:.953125,y:.171875},{x:.984375,y:.171875},{x:.984375,y:.171875},{x:.015625,y:.203125},{x:.015625,y:.203125},{x:.046875,y:.203125},{x:.046875,y:.203125},{x:.078125,y:.203125},{x:.078125,y:.203125},{x:.109375,y:.203125},{x:.109375,y:.203125},{x:.140625,y:.203125},{x:.140625,y:.203125},{x:.171875,y:.203125},{x:.171875,y:.203125},{x:.203125,y:.203125},{x:.203125,y:.203125},{x:.234375,y:.203125},{x:.234375,y:.203125},{x:.265625,y:.203125},{x:.265625,y:.203125},{x:.296875,y:.203125},{x:.296875,y:.203125},{x:.328125,y:.203125},{x:.328125,y:.203125},{x:.359375,y:.203125},{x:.359375,y:.203125},{x:.390625,y:.203125},{x:.390625,y:.203125},{x:.421875,y:.203125},{x:.421875,y:.203125},{x:.453125,y:.203125},{x:.453125,y:.203125},{x:.484375,y:.203125},{x:.484375,y:.203125},{x:.515625,y:.203125},{x:.515625,y:.203125},{x:.546875,y:.203125},{x:.546875,y:.203125},{x:.578125,y:.203125},{x:.578125,y:.203125},{x:.609375,y:.203125},{x:.609375,y:.203125},{x:.640625,y:.203125},{x:.640625,y:.203125},{x:.671875,y:.203125},{x:.671875,y:.203125},{x:.703125,y:.203125},{x:.703125,y:.203125},{x:.734375,y:.203125},{x:.734375,y:.203125},{x:.765625,y:.203125},{x:.765625,y:.203125},{x:.796875,y:.203125},{x:.796875,y:.203125},{x:.828125,y:.203125},{x:.828125,y:.203125},{x:.859375,y:.203125},{x:.859375,y:.203125},{x:.890625,y:.203125},{x:.890625,y:.203125},{x:.921875,y:.203125},{x:.921875,y:.203125},{x:.953125,y:.203125},{x:.953125,y:.203125},{x:.984375,y:.203125},{x:.984375,y:.203125},{x:.015625,y:.234375},{x:.015625,y:.234375},{x:.046875,y:.234375},{x:.046875,y:.234375},{x:.078125,y:.234375},{x:.078125,y:.234375},{x:.109375,y:.234375},{x:.109375,y:.234375},{x:.140625,y:.234375},{x:.140625,y:.234375},{x:.171875,y:.234375},{x:.171875,y:.234375},{x:.203125,y:.234375},{x:.203125,y:.234375},{x:.234375,y:.234375},{x:.234375,y:.234375},{x:.265625,y:.234375},{x:.265625,y:.234375},{x:.296875,y:.234375},{x:.296875,y:.234375},{x:.328125,y:.234375},{x:.328125,y:.234375},{x:.359375,y:.234375},{x:.359375,y:.234375},{x:.390625,y:.234375},{x:.390625,y:.234375},{x:.421875,y:.234375},{x:.421875,y:.234375},{x:.453125,y:.234375},{x:.453125,y:.234375},{x:.484375,y:.234375},{x:.484375,y:.234375},{x:.515625,y:.234375},{x:.515625,y:.234375},{x:.546875,y:.234375},{x:.546875,y:.234375},{x:.578125,y:.234375},{x:.578125,y:.234375},{x:.609375,y:.234375},{x:.609375,y:.234375},{x:.640625,y:.234375},{x:.640625,y:.234375},{x:.671875,y:.234375},{x:.671875,y:.234375},{x:.703125,y:.234375},{x:.703125,y:.234375},{x:.734375,y:.234375},{x:.734375,y:.234375},{x:.765625,y:.234375},{x:.765625,y:.234375},{x:.796875,y:.234375},{x:.796875,y:.234375},{x:.828125,y:.234375},{x:.828125,y:.234375},{x:.859375,y:.234375},{x:.859375,y:.234375},{x:.890625,y:.234375},{x:.890625,y:.234375},{x:.921875,y:.234375},{x:.921875,y:.234375},{x:.953125,y:.234375},{x:.953125,y:.234375},{x:.984375,y:.234375},{x:.984375,y:.234375},{x:.015625,y:.265625},{x:.015625,y:.265625},{x:.046875,y:.265625},{x:.046875,y:.265625},{x:.078125,y:.265625},{x:.078125,y:.265625},{x:.109375,y:.265625},{x:.109375,y:.265625},{x:.140625,y:.265625},{x:.140625,y:.265625},{x:.171875,y:.265625},{x:.171875,y:.265625},{x:.203125,y:.265625},{x:.203125,y:.265625},{x:.234375,y:.265625},{x:.234375,y:.265625},{x:.265625,y:.265625},{x:.265625,y:.265625},{x:.296875,y:.265625},{x:.296875,y:.265625},{x:.328125,y:.265625},{x:.328125,y:.265625},{x:.359375,y:.265625},{x:.359375,y:.265625},{x:.390625,y:.265625},{x:.390625,y:.265625},{x:.421875,y:.265625},{x:.421875,y:.265625},{x:.453125,y:.265625},{x:.453125,y:.265625},{x:.484375,y:.265625},{x:.484375,y:.265625},{x:.515625,y:.265625},{x:.515625,y:.265625},{x:.546875,y:.265625},{x:.546875,y:.265625},{x:.578125,y:.265625},{x:.578125,y:.265625},{x:.609375,y:.265625},{x:.609375,y:.265625},{x:.640625,y:.265625},{x:.640625,y:.265625},{x:.671875,y:.265625},{x:.671875,y:.265625},{x:.703125,y:.265625},{x:.703125,y:.265625},{x:.734375,y:.265625},{x:.734375,y:.265625},{x:.765625,y:.265625},{x:.765625,y:.265625},{x:.796875,y:.265625},{x:.796875,y:.265625},{x:.828125,y:.265625},{x:.828125,y:.265625},{x:.859375,y:.265625},{x:.859375,y:.265625},{x:.890625,y:.265625},{x:.890625,y:.265625},{x:.921875,y:.265625},{x:.921875,y:.265625},{x:.953125,y:.265625},{x:.953125,y:.265625},{x:.984375,y:.265625},{x:.984375,y:.265625},{x:.015625,y:.296875},{x:.015625,y:.296875},{x:.046875,y:.296875},{x:.046875,y:.296875},{x:.078125,y:.296875},{x:.078125,y:.296875},{x:.109375,y:.296875},{x:.109375,y:.296875},{x:.140625,y:.296875},{x:.140625,y:.296875},{x:.171875,y:.296875},{x:.171875,y:.296875},{x:.203125,y:.296875},{x:.203125,y:.296875},{x:.234375,y:.296875},{x:.234375,y:.296875},{x:.265625,y:.296875},{x:.265625,y:.296875},{x:.296875,y:.296875},{x:.296875,y:.296875},{x:.328125,y:.296875},{x:.328125,y:.296875},{x:.359375,y:.296875},{x:.359375,y:.296875},{x:.390625,y:.296875},{x:.390625,y:.296875},{x:.421875,y:.296875},{x:.421875,y:.296875},{x:.453125,y:.296875},{x:.453125,y:.296875},{x:.484375,y:.296875},{x:.484375,y:.296875},{x:.515625,y:.296875},{x:.515625,y:.296875},{x:.546875,y:.296875},{x:.546875,y:.296875},{x:.578125,y:.296875},{x:.578125,y:.296875},{x:.609375,y:.296875},{x:.609375,y:.296875},{x:.640625,y:.296875},{x:.640625,y:.296875},{x:.671875,y:.296875},{x:.671875,y:.296875},{x:.703125,y:.296875},{x:.703125,y:.296875},{x:.734375,y:.296875},{x:.734375,y:.296875},{x:.765625,y:.296875},{x:.765625,y:.296875},{x:.796875,y:.296875},{x:.796875,y:.296875},{x:.828125,y:.296875},{x:.828125,y:.296875},{x:.859375,y:.296875},{x:.859375,y:.296875},{x:.890625,y:.296875},{x:.890625,y:.296875},{x:.921875,y:.296875},{x:.921875,y:.296875},{x:.953125,y:.296875},{x:.953125,y:.296875},{x:.984375,y:.296875},{x:.984375,y:.296875},{x:.015625,y:.328125},{x:.015625,y:.328125},{x:.046875,y:.328125},{x:.046875,y:.328125},{x:.078125,y:.328125},{x:.078125,y:.328125},{x:.109375,y:.328125},{x:.109375,y:.328125},{x:.140625,y:.328125},{x:.140625,y:.328125},{x:.171875,y:.328125},{x:.171875,y:.328125},{x:.203125,y:.328125},{x:.203125,y:.328125},{x:.234375,y:.328125},{x:.234375,y:.328125},{x:.265625,y:.328125},{x:.265625,y:.328125},{x:.296875,y:.328125},{x:.296875,y:.328125},{x:.328125,y:.328125},{x:.328125,y:.328125},{x:.359375,y:.328125},{x:.359375,y:.328125},{x:.390625,y:.328125},{x:.390625,y:.328125},{x:.421875,y:.328125},{x:.421875,y:.328125},{x:.453125,y:.328125},{x:.453125,y:.328125},{x:.484375,y:.328125},{x:.484375,y:.328125},{x:.515625,y:.328125},{x:.515625,y:.328125},{x:.546875,y:.328125},{x:.546875,y:.328125},{x:.578125,y:.328125},{x:.578125,y:.328125},{x:.609375,y:.328125},{x:.609375,y:.328125},{x:.640625,y:.328125},{x:.640625,y:.328125},{x:.671875,y:.328125},{x:.671875,y:.328125},{x:.703125,y:.328125},{x:.703125,y:.328125},{x:.734375,y:.328125},{x:.734375,y:.328125},{x:.765625,y:.328125},{x:.765625,y:.328125},{x:.796875,y:.328125},{x:.796875,y:.328125},{x:.828125,y:.328125},{x:.828125,y:.328125},{x:.859375,y:.328125},{x:.859375,y:.328125},{x:.890625,y:.328125},{x:.890625,y:.328125},{x:.921875,y:.328125},{x:.921875,y:.328125},{x:.953125,y:.328125},{x:.953125,y:.328125},{x:.984375,y:.328125},{x:.984375,y:.328125},{x:.015625,y:.359375},{x:.015625,y:.359375},{x:.046875,y:.359375},{x:.046875,y:.359375},{x:.078125,y:.359375},{x:.078125,y:.359375},{x:.109375,y:.359375},{x:.109375,y:.359375},{x:.140625,y:.359375},{x:.140625,y:.359375},{x:.171875,y:.359375},{x:.171875,y:.359375},{x:.203125,y:.359375},{x:.203125,y:.359375},{x:.234375,y:.359375},{x:.234375,y:.359375},{x:.265625,y:.359375},{x:.265625,y:.359375},{x:.296875,y:.359375},{x:.296875,y:.359375},{x:.328125,y:.359375},{x:.328125,y:.359375},{x:.359375,y:.359375},{x:.359375,y:.359375},{x:.390625,y:.359375},{x:.390625,y:.359375},{x:.421875,y:.359375},{x:.421875,y:.359375},{x:.453125,y:.359375},{x:.453125,y:.359375},{x:.484375,y:.359375},{x:.484375,y:.359375},{x:.515625,y:.359375},{x:.515625,y:.359375},{x:.546875,y:.359375},{x:.546875,y:.359375},{x:.578125,y:.359375},{x:.578125,y:.359375},{x:.609375,y:.359375},{x:.609375,y:.359375},{x:.640625,y:.359375},{x:.640625,y:.359375},{x:.671875,y:.359375},{x:.671875,y:.359375},{x:.703125,y:.359375},{x:.703125,y:.359375},{x:.734375,y:.359375},{x:.734375,y:.359375},{x:.765625,y:.359375},{x:.765625,y:.359375},{x:.796875,y:.359375},{x:.796875,y:.359375},{x:.828125,y:.359375},{x:.828125,y:.359375},{x:.859375,y:.359375},{x:.859375,y:.359375},{x:.890625,y:.359375},{x:.890625,y:.359375},{x:.921875,y:.359375},{x:.921875,y:.359375},{x:.953125,y:.359375},{x:.953125,y:.359375},{x:.984375,y:.359375},{x:.984375,y:.359375},{x:.015625,y:.390625},{x:.015625,y:.390625},{x:.046875,y:.390625},{x:.046875,y:.390625},{x:.078125,y:.390625},{x:.078125,y:.390625},{x:.109375,y:.390625},{x:.109375,y:.390625},{x:.140625,y:.390625},{x:.140625,y:.390625},{x:.171875,y:.390625},{x:.171875,y:.390625},{x:.203125,y:.390625},{x:.203125,y:.390625},{x:.234375,y:.390625},{x:.234375,y:.390625},{x:.265625,y:.390625},{x:.265625,y:.390625},{x:.296875,y:.390625},{x:.296875,y:.390625},{x:.328125,y:.390625},{x:.328125,y:.390625},{x:.359375,y:.390625},{x:.359375,y:.390625},{x:.390625,y:.390625},{x:.390625,y:.390625},{x:.421875,y:.390625},{x:.421875,y:.390625},{x:.453125,y:.390625},{x:.453125,y:.390625},{x:.484375,y:.390625},{x:.484375,y:.390625},{x:.515625,y:.390625},{x:.515625,y:.390625},{x:.546875,y:.390625},{x:.546875,y:.390625},{x:.578125,y:.390625},{x:.578125,y:.390625},{x:.609375,y:.390625},{x:.609375,y:.390625},{x:.640625,y:.390625},{x:.640625,y:.390625},{x:.671875,y:.390625},{x:.671875,y:.390625},{x:.703125,y:.390625},{x:.703125,y:.390625},{x:.734375,y:.390625},{x:.734375,y:.390625},{x:.765625,y:.390625},{x:.765625,y:.390625},{x:.796875,y:.390625},{x:.796875,y:.390625},{x:.828125,y:.390625},{x:.828125,y:.390625},{x:.859375,y:.390625},{x:.859375,y:.390625},{x:.890625,y:.390625},{x:.890625,y:.390625},{x:.921875,y:.390625},{x:.921875,y:.390625},{x:.953125,y:.390625},{x:.953125,y:.390625},{x:.984375,y:.390625},{x:.984375,y:.390625},{x:.015625,y:.421875},{x:.015625,y:.421875},{x:.046875,y:.421875},{x:.046875,y:.421875},{x:.078125,y:.421875},{x:.078125,y:.421875},{x:.109375,y:.421875},{x:.109375,y:.421875},{x:.140625,y:.421875},{x:.140625,y:.421875},{x:.171875,y:.421875},{x:.171875,y:.421875},{x:.203125,y:.421875},{x:.203125,y:.421875},{x:.234375,y:.421875},{x:.234375,y:.421875},{x:.265625,y:.421875},{x:.265625,y:.421875},{x:.296875,y:.421875},{x:.296875,y:.421875},{x:.328125,y:.421875},{x:.328125,y:.421875},{x:.359375,y:.421875},{x:.359375,y:.421875},{x:.390625,y:.421875},{x:.390625,y:.421875},{x:.421875,y:.421875},{x:.421875,y:.421875},{x:.453125,y:.421875},{x:.453125,y:.421875},{x:.484375,y:.421875},{x:.484375,y:.421875},{x:.515625,y:.421875},{x:.515625,y:.421875},{x:.546875,y:.421875},{x:.546875,y:.421875},{x:.578125,y:.421875},{x:.578125,y:.421875},{x:.609375,y:.421875},{x:.609375,y:.421875},{x:.640625,y:.421875},{x:.640625,y:.421875},{x:.671875,y:.421875},{x:.671875,y:.421875},{x:.703125,y:.421875},{x:.703125,y:.421875},{x:.734375,y:.421875},{x:.734375,y:.421875},{x:.765625,y:.421875},{x:.765625,y:.421875},{x:.796875,y:.421875},{x:.796875,y:.421875},{x:.828125,y:.421875},{x:.828125,y:.421875},{x:.859375,y:.421875},{x:.859375,y:.421875},{x:.890625,y:.421875},{x:.890625,y:.421875},{x:.921875,y:.421875},{x:.921875,y:.421875},{x:.953125,y:.421875},{x:.953125,y:.421875},{x:.984375,y:.421875},{x:.984375,y:.421875},{x:.015625,y:.453125},{x:.015625,y:.453125},{x:.046875,y:.453125},{x:.046875,y:.453125},{x:.078125,y:.453125},{x:.078125,y:.453125},{x:.109375,y:.453125},{x:.109375,y:.453125},{x:.140625,y:.453125},{x:.140625,y:.453125},{x:.171875,y:.453125},{x:.171875,y:.453125},{x:.203125,y:.453125},{x:.203125,y:.453125},{x:.234375,y:.453125},{x:.234375,y:.453125},{x:.265625,y:.453125},{x:.265625,y:.453125},{x:.296875,y:.453125},{x:.296875,y:.453125},{x:.328125,y:.453125},{x:.328125,y:.453125},{x:.359375,y:.453125},{x:.359375,y:.453125},{x:.390625,y:.453125},{x:.390625,y:.453125},{x:.421875,y:.453125},{x:.421875,y:.453125},{x:.453125,y:.453125},{x:.453125,y:.453125},{x:.484375,y:.453125},{x:.484375,y:.453125},{x:.515625,y:.453125},{x:.515625,y:.453125},{x:.546875,y:.453125},{x:.546875,y:.453125},{x:.578125,y:.453125},{x:.578125,y:.453125},{x:.609375,y:.453125},{x:.609375,y:.453125},{x:.640625,y:.453125},{x:.640625,y:.453125},{x:.671875,y:.453125},{x:.671875,y:.453125},{x:.703125,y:.453125},{x:.703125,y:.453125},{x:.734375,y:.453125},{x:.734375,y:.453125},{x:.765625,y:.453125},{x:.765625,y:.453125},{x:.796875,y:.453125},{x:.796875,y:.453125},{x:.828125,y:.453125},{x:.828125,y:.453125},{x:.859375,y:.453125},{x:.859375,y:.453125},{x:.890625,y:.453125},{x:.890625,y:.453125},{x:.921875,y:.453125},{x:.921875,y:.453125},{x:.953125,y:.453125},{x:.953125,y:.453125},{x:.984375,y:.453125},{x:.984375,y:.453125},{x:.015625,y:.484375},{x:.015625,y:.484375},{x:.046875,y:.484375},{x:.046875,y:.484375},{x:.078125,y:.484375},{x:.078125,y:.484375},{x:.109375,y:.484375},{x:.109375,y:.484375},{x:.140625,y:.484375},{x:.140625,y:.484375},{x:.171875,y:.484375},{x:.171875,y:.484375},{x:.203125,y:.484375},{x:.203125,y:.484375},{x:.234375,y:.484375},{x:.234375,y:.484375},{x:.265625,y:.484375},{x:.265625,y:.484375},{x:.296875,y:.484375},{x:.296875,y:.484375},{x:.328125,y:.484375},{x:.328125,y:.484375},{x:.359375,y:.484375},{x:.359375,y:.484375},{x:.390625,y:.484375},{x:.390625,y:.484375},{x:.421875,y:.484375},{x:.421875,y:.484375},{x:.453125,y:.484375},{x:.453125,y:.484375},{x:.484375,y:.484375},{x:.484375,y:.484375},{x:.515625,y:.484375},{x:.515625,y:.484375},{x:.546875,y:.484375},{x:.546875,y:.484375},{x:.578125,y:.484375},{x:.578125,y:.484375},{x:.609375,y:.484375},{x:.609375,y:.484375},{x:.640625,y:.484375},{x:.640625,y:.484375},{x:.671875,y:.484375},{x:.671875,y:.484375},{x:.703125,y:.484375},{x:.703125,y:.484375},{x:.734375,y:.484375},{x:.734375,y:.484375},{x:.765625,y:.484375},{x:.765625,y:.484375},{x:.796875,y:.484375},{x:.796875,y:.484375},{x:.828125,y:.484375},{x:.828125,y:.484375},{x:.859375,y:.484375},{x:.859375,y:.484375},{x:.890625,y:.484375},{x:.890625,y:.484375},{x:.921875,y:.484375},{x:.921875,y:.484375},{x:.953125,y:.484375},{x:.953125,y:.484375},{x:.984375,y:.484375},{x:.984375,y:.484375},{x:.015625,y:.515625},{x:.015625,y:.515625},{x:.046875,y:.515625},{x:.046875,y:.515625},{x:.078125,y:.515625},{x:.078125,y:.515625},{x:.109375,y:.515625},{x:.109375,y:.515625},{x:.140625,y:.515625},{x:.140625,y:.515625},{x:.171875,y:.515625},{x:.171875,y:.515625},{x:.203125,y:.515625},{x:.203125,y:.515625},{x:.234375,y:.515625},{x:.234375,y:.515625},{x:.265625,y:.515625},{x:.265625,y:.515625},{x:.296875,y:.515625},{x:.296875,y:.515625},{x:.328125,y:.515625},{x:.328125,y:.515625},{x:.359375,y:.515625},{x:.359375,y:.515625},{x:.390625,y:.515625},{x:.390625,y:.515625},{x:.421875,y:.515625},{x:.421875,y:.515625},{x:.453125,y:.515625},{x:.453125,y:.515625},{x:.484375,y:.515625},{x:.484375,y:.515625},{x:.515625,y:.515625},{x:.515625,y:.515625},{x:.546875,y:.515625},{x:.546875,y:.515625},{x:.578125,y:.515625},{x:.578125,y:.515625},{x:.609375,y:.515625},{x:.609375,y:.515625},{x:.640625,y:.515625},{x:.640625,y:.515625},{x:.671875,y:.515625},{x:.671875,y:.515625},{x:.703125,y:.515625},{x:.703125,y:.515625},{x:.734375,y:.515625},{x:.734375,y:.515625},{x:.765625,y:.515625},{x:.765625,y:.515625},{x:.796875,y:.515625},{x:.796875,y:.515625},{x:.828125,y:.515625},{x:.828125,y:.515625},{x:.859375,y:.515625},{x:.859375,y:.515625},{x:.890625,y:.515625},{x:.890625,y:.515625},{x:.921875,y:.515625},{x:.921875,y:.515625},{x:.953125,y:.515625},{x:.953125,y:.515625},{x:.984375,y:.515625},{x:.984375,y:.515625},{x:.015625,y:.546875},{x:.015625,y:.546875},{x:.046875,y:.546875},{x:.046875,y:.546875},{x:.078125,y:.546875},{x:.078125,y:.546875},{x:.109375,y:.546875},{x:.109375,y:.546875},{x:.140625,y:.546875},{x:.140625,y:.546875},{x:.171875,y:.546875},{x:.171875,y:.546875},{x:.203125,y:.546875},{x:.203125,y:.546875},{x:.234375,y:.546875},{x:.234375,y:.546875},{x:.265625,y:.546875},{x:.265625,y:.546875},{x:.296875,y:.546875},{x:.296875,y:.546875},{x:.328125,y:.546875},{x:.328125,y:.546875},{x:.359375,y:.546875},{x:.359375,y:.546875},{x:.390625,y:.546875},{x:.390625,y:.546875},{x:.421875,y:.546875},{x:.421875,y:.546875},{x:.453125,y:.546875},{x:.453125,y:.546875},{x:.484375,y:.546875},{x:.484375,y:.546875},{x:.515625,y:.546875},{x:.515625,y:.546875},{x:.546875,y:.546875},{x:.546875,y:.546875},{x:.578125,y:.546875},{x:.578125,y:.546875},{x:.609375,y:.546875},{x:.609375,y:.546875},{x:.640625,y:.546875},{x:.640625,y:.546875},{x:.671875,y:.546875},{x:.671875,y:.546875},{x:.703125,y:.546875},{x:.703125,y:.546875},{x:.734375,y:.546875},{x:.734375,y:.546875},{x:.765625,y:.546875},{x:.765625,y:.546875},{x:.796875,y:.546875},{x:.796875,y:.546875},{x:.828125,y:.546875},{x:.828125,y:.546875},{x:.859375,y:.546875},{x:.859375,y:.546875},{x:.890625,y:.546875},{x:.890625,y:.546875},{x:.921875,y:.546875},{x:.921875,y:.546875},{x:.953125,y:.546875},{x:.953125,y:.546875},{x:.984375,y:.546875},{x:.984375,y:.546875},{x:.015625,y:.578125},{x:.015625,y:.578125},{x:.046875,y:.578125},{x:.046875,y:.578125},{x:.078125,y:.578125},{x:.078125,y:.578125},{x:.109375,y:.578125},{x:.109375,y:.578125},{x:.140625,y:.578125},{x:.140625,y:.578125},{x:.171875,y:.578125},{x:.171875,y:.578125},{x:.203125,y:.578125},{x:.203125,y:.578125},{x:.234375,y:.578125},{x:.234375,y:.578125},{x:.265625,y:.578125},{x:.265625,y:.578125},{x:.296875,y:.578125},{x:.296875,y:.578125},{x:.328125,y:.578125},{x:.328125,y:.578125},{x:.359375,y:.578125},{x:.359375,y:.578125},{x:.390625,y:.578125},{x:.390625,y:.578125},{x:.421875,y:.578125},{x:.421875,y:.578125},{x:.453125,y:.578125},{x:.453125,y:.578125},{x:.484375,y:.578125},{x:.484375,y:.578125},{x:.515625,y:.578125},{x:.515625,y:.578125},{x:.546875,y:.578125},{x:.546875,y:.578125},{x:.578125,y:.578125},{x:.578125,y:.578125},{x:.609375,y:.578125},{x:.609375,y:.578125},{x:.640625,y:.578125},{x:.640625,y:.578125},{x:.671875,y:.578125},{x:.671875,y:.578125},{x:.703125,y:.578125},{x:.703125,y:.578125},{x:.734375,y:.578125},{x:.734375,y:.578125},{x:.765625,y:.578125},{x:.765625,y:.578125},{x:.796875,y:.578125},{x:.796875,y:.578125},{x:.828125,y:.578125},{x:.828125,y:.578125},{x:.859375,y:.578125},{x:.859375,y:.578125},{x:.890625,y:.578125},{x:.890625,y:.578125},{x:.921875,y:.578125},{x:.921875,y:.578125},{x:.953125,y:.578125},{x:.953125,y:.578125},{x:.984375,y:.578125},{x:.984375,y:.578125},{x:.015625,y:.609375},{x:.015625,y:.609375},{x:.046875,y:.609375},{x:.046875,y:.609375},{x:.078125,y:.609375},{x:.078125,y:.609375},{x:.109375,y:.609375},{x:.109375,y:.609375},{x:.140625,y:.609375},{x:.140625,y:.609375},{x:.171875,y:.609375},{x:.171875,y:.609375},{x:.203125,y:.609375},{x:.203125,y:.609375},{x:.234375,y:.609375},{x:.234375,y:.609375},{x:.265625,y:.609375},{x:.265625,y:.609375},{x:.296875,y:.609375},{x:.296875,y:.609375},{x:.328125,y:.609375},{x:.328125,y:.609375},{x:.359375,y:.609375},{x:.359375,y:.609375},{x:.390625,y:.609375},{x:.390625,y:.609375},{x:.421875,y:.609375},{x:.421875,y:.609375},{x:.453125,y:.609375},{x:.453125,y:.609375},{x:.484375,y:.609375},{x:.484375,y:.609375},{x:.515625,y:.609375},{x:.515625,y:.609375},{x:.546875,y:.609375},{x:.546875,y:.609375},{x:.578125,y:.609375},{x:.578125,y:.609375},{x:.609375,y:.609375},{x:.609375,y:.609375},{x:.640625,y:.609375},{x:.640625,y:.609375},{x:.671875,y:.609375},{x:.671875,y:.609375},{x:.703125,y:.609375},{x:.703125,y:.609375},{x:.734375,y:.609375},{x:.734375,y:.609375},{x:.765625,y:.609375},{x:.765625,y:.609375},{x:.796875,y:.609375},{x:.796875,y:.609375},{x:.828125,y:.609375},{x:.828125,y:.609375},{x:.859375,y:.609375},{x:.859375,y:.609375},{x:.890625,y:.609375},{x:.890625,y:.609375},{x:.921875,y:.609375},{x:.921875,y:.609375},{x:.953125,y:.609375},{x:.953125,y:.609375},{x:.984375,y:.609375},{x:.984375,y:.609375},{x:.015625,y:.640625},{x:.015625,y:.640625},{x:.046875,y:.640625},{x:.046875,y:.640625},{x:.078125,y:.640625},{x:.078125,y:.640625},{x:.109375,y:.640625},{x:.109375,y:.640625},{x:.140625,y:.640625},{x:.140625,y:.640625},{x:.171875,y:.640625},{x:.171875,y:.640625},{x:.203125,y:.640625},{x:.203125,y:.640625},{x:.234375,y:.640625},{x:.234375,y:.640625},{x:.265625,y:.640625},{x:.265625,y:.640625},{x:.296875,y:.640625},{x:.296875,y:.640625},{x:.328125,y:.640625},{x:.328125,y:.640625},{x:.359375,y:.640625},{x:.359375,y:.640625},{x:.390625,y:.640625},{x:.390625,y:.640625},{x:.421875,y:.640625},{x:.421875,y:.640625},{x:.453125,y:.640625},{x:.453125,y:.640625},{x:.484375,y:.640625},{x:.484375,y:.640625},{x:.515625,y:.640625},{x:.515625,y:.640625},{x:.546875,y:.640625},{x:.546875,y:.640625},{x:.578125,y:.640625},{x:.578125,y:.640625},{x:.609375,y:.640625},{x:.609375,y:.640625},{x:.640625,y:.640625},{x:.640625,y:.640625},{x:.671875,y:.640625},{x:.671875,y:.640625},{x:.703125,y:.640625},{x:.703125,y:.640625},{x:.734375,y:.640625},{x:.734375,y:.640625},{x:.765625,y:.640625},{x:.765625,y:.640625},{x:.796875,y:.640625},{x:.796875,y:.640625},{x:.828125,y:.640625},{x:.828125,y:.640625},{x:.859375,y:.640625},{x:.859375,y:.640625},{x:.890625,y:.640625},{x:.890625,y:.640625},{x:.921875,y:.640625},{x:.921875,y:.640625},{x:.953125,y:.640625},{x:.953125,y:.640625},{x:.984375,y:.640625},{x:.984375,y:.640625},{x:.015625,y:.671875},{x:.015625,y:.671875},{x:.046875,y:.671875},{x:.046875,y:.671875},{x:.078125,y:.671875},{x:.078125,y:.671875},{x:.109375,y:.671875},{x:.109375,y:.671875},{x:.140625,y:.671875},{x:.140625,y:.671875},{x:.171875,y:.671875},{x:.171875,y:.671875},{x:.203125,y:.671875},{x:.203125,y:.671875},{x:.234375,y:.671875},{x:.234375,y:.671875},{x:.265625,y:.671875},{x:.265625,y:.671875},{x:.296875,y:.671875},{x:.296875,y:.671875},{x:.328125,y:.671875},{x:.328125,y:.671875},{x:.359375,y:.671875},{x:.359375,y:.671875},{x:.390625,y:.671875},{x:.390625,y:.671875},{x:.421875,y:.671875},{x:.421875,y:.671875},{x:.453125,y:.671875},{x:.453125,y:.671875},{x:.484375,y:.671875},{x:.484375,y:.671875},{x:.515625,y:.671875},{x:.515625,y:.671875},{x:.546875,y:.671875},{x:.546875,y:.671875},{x:.578125,y:.671875},{x:.578125,y:.671875},{x:.609375,y:.671875},{x:.609375,y:.671875},{x:.640625,y:.671875},{x:.640625,y:.671875},{x:.671875,y:.671875},{x:.671875,y:.671875},{x:.703125,y:.671875},{x:.703125,y:.671875},{x:.734375,y:.671875},{x:.734375,y:.671875},{x:.765625,y:.671875},{x:.765625,y:.671875},{x:.796875,y:.671875},{x:.796875,y:.671875},{x:.828125,y:.671875},{x:.828125,y:.671875},{x:.859375,y:.671875},{x:.859375,y:.671875},{x:.890625,y:.671875},{x:.890625,y:.671875},{x:.921875,y:.671875},{x:.921875,y:.671875},{x:.953125,y:.671875},{x:.953125,y:.671875},{x:.984375,y:.671875},{x:.984375,y:.671875},{x:.015625,y:.703125},{x:.015625,y:.703125},{x:.046875,y:.703125},{x:.046875,y:.703125},{x:.078125,y:.703125},{x:.078125,y:.703125},{x:.109375,y:.703125},{x:.109375,y:.703125},{x:.140625,y:.703125},{x:.140625,y:.703125},{x:.171875,y:.703125},{x:.171875,y:.703125},{x:.203125,y:.703125},{x:.203125,y:.703125},{x:.234375,y:.703125},{x:.234375,y:.703125},{x:.265625,y:.703125},{x:.265625,y:.703125},{x:.296875,y:.703125},{x:.296875,y:.703125},{x:.328125,y:.703125},{x:.328125,y:.703125},{x:.359375,y:.703125},{x:.359375,y:.703125},{x:.390625,y:.703125},{x:.390625,y:.703125},{x:.421875,y:.703125},{x:.421875,y:.703125},{x:.453125,y:.703125},{x:.453125,y:.703125},{x:.484375,y:.703125},{x:.484375,y:.703125},{x:.515625,y:.703125},{x:.515625,y:.703125},{x:.546875,y:.703125},{x:.546875,y:.703125},{x:.578125,y:.703125},{x:.578125,y:.703125},{x:.609375,y:.703125},{x:.609375,y:.703125},{x:.640625,y:.703125},{x:.640625,y:.703125},{x:.671875,y:.703125},{x:.671875,y:.703125},{x:.703125,y:.703125},{x:.703125,y:.703125},{x:.734375,y:.703125},{x:.734375,y:.703125},{x:.765625,y:.703125},{x:.765625,y:.703125},{x:.796875,y:.703125},{x:.796875,y:.703125},{x:.828125,y:.703125},{x:.828125,y:.703125},{x:.859375,y:.703125},{x:.859375,y:.703125},{x:.890625,y:.703125},{x:.890625,y:.703125},{x:.921875,y:.703125},{x:.921875,y:.703125},{x:.953125,y:.703125},{x:.953125,y:.703125},{x:.984375,y:.703125},{x:.984375,y:.703125},{x:.015625,y:.734375},{x:.015625,y:.734375},{x:.046875,y:.734375},{x:.046875,y:.734375},{x:.078125,y:.734375},{x:.078125,y:.734375},{x:.109375,y:.734375},{x:.109375,y:.734375},{x:.140625,y:.734375},{x:.140625,y:.734375},{x:.171875,y:.734375},{x:.171875,y:.734375},{x:.203125,y:.734375},{x:.203125,y:.734375},{x:.234375,y:.734375},{x:.234375,y:.734375},{x:.265625,y:.734375},{x:.265625,y:.734375},{x:.296875,y:.734375},{x:.296875,y:.734375},{x:.328125,y:.734375},{x:.328125,y:.734375},{x:.359375,y:.734375},{x:.359375,y:.734375},{x:.390625,y:.734375},{x:.390625,y:.734375},{x:.421875,y:.734375},{x:.421875,y:.734375},{x:.453125,y:.734375},{x:.453125,y:.734375},{x:.484375,y:.734375},{x:.484375,y:.734375},{x:.515625,y:.734375},{x:.515625,y:.734375},{x:.546875,y:.734375},{x:.546875,y:.734375},{x:.578125,y:.734375},{x:.578125,y:.734375},{x:.609375,y:.734375},{x:.609375,y:.734375},{x:.640625,y:.734375},{x:.640625,y:.734375},{x:.671875,y:.734375},{x:.671875,y:.734375},{x:.703125,y:.734375},{x:.703125,y:.734375},{x:.734375,y:.734375},{x:.734375,y:.734375},{x:.765625,y:.734375},{x:.765625,y:.734375},{x:.796875,y:.734375},{x:.796875,y:.734375},{x:.828125,y:.734375},{x:.828125,y:.734375},{x:.859375,y:.734375},{x:.859375,y:.734375},{x:.890625,y:.734375},{x:.890625,y:.734375},{x:.921875,y:.734375},{x:.921875,y:.734375},{x:.953125,y:.734375},{x:.953125,y:.734375},{x:.984375,y:.734375},{x:.984375,y:.734375},{x:.015625,y:.765625},{x:.015625,y:.765625},{x:.046875,y:.765625},{x:.046875,y:.765625},{x:.078125,y:.765625},{x:.078125,y:.765625},{x:.109375,y:.765625},{x:.109375,y:.765625},{x:.140625,y:.765625},{x:.140625,y:.765625},{x:.171875,y:.765625},{x:.171875,y:.765625},{x:.203125,y:.765625},{x:.203125,y:.765625},{x:.234375,y:.765625},{x:.234375,y:.765625},{x:.265625,y:.765625},{x:.265625,y:.765625},{x:.296875,y:.765625},{x:.296875,y:.765625},{x:.328125,y:.765625},{x:.328125,y:.765625},{x:.359375,y:.765625},{x:.359375,y:.765625},{x:.390625,y:.765625},{x:.390625,y:.765625},{x:.421875,y:.765625},{x:.421875,y:.765625},{x:.453125,y:.765625},{x:.453125,y:.765625},{x:.484375,y:.765625},{x:.484375,y:.765625},{x:.515625,y:.765625},{x:.515625,y:.765625},{x:.546875,y:.765625},{x:.546875,y:.765625},{x:.578125,y:.765625},{x:.578125,y:.765625},{x:.609375,y:.765625},{x:.609375,y:.765625},{x:.640625,y:.765625},{x:.640625,y:.765625},{x:.671875,y:.765625},{x:.671875,y:.765625},{x:.703125,y:.765625},{x:.703125,y:.765625},{x:.734375,y:.765625},{x:.734375,y:.765625},{x:.765625,y:.765625},{x:.765625,y:.765625},{x:.796875,y:.765625},{x:.796875,y:.765625},{x:.828125,y:.765625},{x:.828125,y:.765625},{x:.859375,y:.765625},{x:.859375,y:.765625},{x:.890625,y:.765625},{x:.890625,y:.765625},{x:.921875,y:.765625},{x:.921875,y:.765625},{x:.953125,y:.765625},{x:.953125,y:.765625},{x:.984375,y:.765625},{x:.984375,y:.765625},{x:.015625,y:.796875},{x:.015625,y:.796875},{x:.046875,y:.796875},{x:.046875,y:.796875},{x:.078125,y:.796875},{x:.078125,y:.796875},{x:.109375,y:.796875},{x:.109375,y:.796875},{x:.140625,y:.796875},{x:.140625,y:.796875},{x:.171875,y:.796875},{x:.171875,y:.796875},{x:.203125,y:.796875},{x:.203125,y:.796875},{x:.234375,y:.796875},{x:.234375,y:.796875},{x:.265625,y:.796875},{x:.265625,y:.796875},{x:.296875,y:.796875},{x:.296875,y:.796875},{x:.328125,y:.796875},{x:.328125,y:.796875},{x:.359375,y:.796875},{x:.359375,y:.796875},{x:.390625,y:.796875},{x:.390625,y:.796875},{x:.421875,y:.796875},{x:.421875,y:.796875},{x:.453125,y:.796875},{x:.453125,y:.796875},{x:.484375,y:.796875},{x:.484375,y:.796875},{x:.515625,y:.796875},{x:.515625,y:.796875},{x:.546875,y:.796875},{x:.546875,y:.796875},{x:.578125,y:.796875},{x:.578125,y:.796875},{x:.609375,y:.796875},{x:.609375,y:.796875},{x:.640625,y:.796875},{x:.640625,y:.796875},{x:.671875,y:.796875},{x:.671875,y:.796875},{x:.703125,y:.796875},{x:.703125,y:.796875},{x:.734375,y:.796875},{x:.734375,y:.796875},{x:.765625,y:.796875},{x:.765625,y:.796875},{x:.796875,y:.796875},{x:.796875,y:.796875},{x:.828125,y:.796875},{x:.828125,y:.796875},{x:.859375,y:.796875},{x:.859375,y:.796875},{x:.890625,y:.796875},{x:.890625,y:.796875},{x:.921875,y:.796875},{x:.921875,y:.796875},{x:.953125,y:.796875},{x:.953125,y:.796875},{x:.984375,y:.796875},{x:.984375,y:.796875},{x:.015625,y:.828125},{x:.015625,y:.828125},{x:.046875,y:.828125},{x:.046875,y:.828125},{x:.078125,y:.828125},{x:.078125,y:.828125},{x:.109375,y:.828125},{x:.109375,y:.828125},{x:.140625,y:.828125},{x:.140625,y:.828125},{x:.171875,y:.828125},{x:.171875,y:.828125},{x:.203125,y:.828125},{x:.203125,y:.828125},{x:.234375,y:.828125},{x:.234375,y:.828125},{x:.265625,y:.828125},{x:.265625,y:.828125},{x:.296875,y:.828125},{x:.296875,y:.828125},{x:.328125,y:.828125},{x:.328125,y:.828125},{x:.359375,y:.828125},{x:.359375,y:.828125},{x:.390625,y:.828125},{x:.390625,y:.828125},{x:.421875,y:.828125},{x:.421875,y:.828125},{x:.453125,y:.828125},{x:.453125,y:.828125},{x:.484375,y:.828125},{x:.484375,y:.828125},{x:.515625,y:.828125},{x:.515625,y:.828125},{x:.546875,y:.828125},{x:.546875,y:.828125},{x:.578125,y:.828125},{x:.578125,y:.828125},{x:.609375,y:.828125},{x:.609375,y:.828125},{x:.640625,y:.828125},{x:.640625,y:.828125},{x:.671875,y:.828125},{x:.671875,y:.828125},{x:.703125,y:.828125},{x:.703125,y:.828125},{x:.734375,y:.828125},{x:.734375,y:.828125},{x:.765625,y:.828125},{x:.765625,y:.828125},{x:.796875,y:.828125},{x:.796875,y:.828125},{x:.828125,y:.828125},{x:.828125,y:.828125},{x:.859375,y:.828125},{x:.859375,y:.828125},{x:.890625,y:.828125},{x:.890625,y:.828125},{x:.921875,y:.828125},{x:.921875,y:.828125},{x:.953125,y:.828125},{x:.953125,y:.828125},{x:.984375,y:.828125},{x:.984375,y:.828125},{x:.015625,y:.859375},{x:.015625,y:.859375},{x:.046875,y:.859375},{x:.046875,y:.859375},{x:.078125,y:.859375},{x:.078125,y:.859375},{x:.109375,y:.859375},{x:.109375,y:.859375},{x:.140625,y:.859375},{x:.140625,y:.859375},{x:.171875,y:.859375},{x:.171875,y:.859375},{x:.203125,y:.859375},{x:.203125,y:.859375},{x:.234375,y:.859375},{x:.234375,y:.859375},{x:.265625,y:.859375},{x:.265625,y:.859375},{x:.296875,y:.859375},{x:.296875,y:.859375},{x:.328125,y:.859375},{x:.328125,y:.859375},{x:.359375,y:.859375},{x:.359375,y:.859375},{x:.390625,y:.859375},{x:.390625,y:.859375},{x:.421875,y:.859375},{x:.421875,y:.859375},{x:.453125,y:.859375},{x:.453125,y:.859375},{x:.484375,y:.859375},{x:.484375,y:.859375},{x:.515625,y:.859375},{x:.515625,y:.859375},{x:.546875,y:.859375},{x:.546875,y:.859375},{x:.578125,y:.859375},{x:.578125,y:.859375},{x:.609375,y:.859375},{x:.609375,y:.859375},{x:.640625,y:.859375},{x:.640625,y:.859375},{x:.671875,y:.859375},{x:.671875,y:.859375},{x:.703125,y:.859375},{x:.703125,y:.859375},{x:.734375,y:.859375},{x:.734375,y:.859375},{x:.765625,y:.859375},{x:.765625,y:.859375},{x:.796875,y:.859375},{x:.796875,y:.859375},{x:.828125,y:.859375},{x:.828125,y:.859375},{x:.859375,y:.859375},{x:.859375,y:.859375},{x:.890625,y:.859375},{x:.890625,y:.859375},{x:.921875,y:.859375},{x:.921875,y:.859375},{x:.953125,y:.859375},{x:.953125,y:.859375},{x:.984375,y:.859375},{x:.984375,y:.859375},{x:.015625,y:.890625},{x:.015625,y:.890625},{x:.046875,y:.890625},{x:.046875,y:.890625},{x:.078125,y:.890625},{x:.078125,y:.890625},{x:.109375,y:.890625},{x:.109375,y:.890625},{x:.140625,y:.890625},{x:.140625,y:.890625},{x:.171875,y:.890625},{x:.171875,y:.890625},{x:.203125,y:.890625},{x:.203125,y:.890625},{x:.234375,y:.890625},{x:.234375,y:.890625},{x:.265625,y:.890625},{x:.265625,y:.890625},{x:.296875,y:.890625},{x:.296875,y:.890625},{x:.328125,y:.890625},{x:.328125,y:.890625},{x:.359375,y:.890625},{x:.359375,y:.890625},{x:.390625,y:.890625},{x:.390625,y:.890625},{x:.421875,y:.890625},{x:.421875,y:.890625},{x:.453125,y:.890625},{x:.453125,y:.890625},{x:.484375,y:.890625},{x:.484375,y:.890625},{x:.515625,y:.890625},{x:.515625,y:.890625},{x:.546875,y:.890625},{x:.546875,y:.890625},{x:.578125,y:.890625},{x:.578125,y:.890625},{x:.609375,y:.890625},{x:.609375,y:.890625},{x:.640625,y:.890625},{x:.640625,y:.890625},{x:.671875,y:.890625},{x:.671875,y:.890625},{x:.703125,y:.890625},{x:.703125,y:.890625},{x:.734375,y:.890625},{x:.734375,y:.890625},{x:.765625,y:.890625},{x:.765625,y:.890625},{x:.796875,y:.890625},{x:.796875,y:.890625},{x:.828125,y:.890625},{x:.828125,y:.890625},{x:.859375,y:.890625},{x:.859375,y:.890625},{x:.890625,y:.890625},{x:.890625,y:.890625},{x:.921875,y:.890625},{x:.921875,y:.890625},{x:.953125,y:.890625},{x:.953125,y:.890625},{x:.984375,y:.890625},{x:.984375,y:.890625},{x:.015625,y:.921875},{x:.015625,y:.921875},{x:.046875,y:.921875},{x:.046875,y:.921875},{x:.078125,y:.921875},{x:.078125,y:.921875},{x:.109375,y:.921875},{x:.109375,y:.921875},{x:.140625,y:.921875},{x:.140625,y:.921875},{x:.171875,y:.921875},{x:.171875,y:.921875},{x:.203125,y:.921875},{x:.203125,y:.921875},{x:.234375,y:.921875},{x:.234375,y:.921875},{x:.265625,y:.921875},{x:.265625,y:.921875},{x:.296875,y:.921875},{x:.296875,y:.921875},{x:.328125,y:.921875},{x:.328125,y:.921875},{x:.359375,y:.921875},{x:.359375,y:.921875},{x:.390625,y:.921875},{x:.390625,y:.921875},{x:.421875,y:.921875},{x:.421875,y:.921875},{x:.453125,y:.921875},{x:.453125,y:.921875},{x:.484375,y:.921875},{x:.484375,y:.921875},{x:.515625,y:.921875},{x:.515625,y:.921875},{x:.546875,y:.921875},{x:.546875,y:.921875},{x:.578125,y:.921875},{x:.578125,y:.921875},{x:.609375,y:.921875},{x:.609375,y:.921875},{x:.640625,y:.921875},{x:.640625,y:.921875},{x:.671875,y:.921875},{x:.671875,y:.921875},{x:.703125,y:.921875},{x:.703125,y:.921875},{x:.734375,y:.921875},{x:.734375,y:.921875},{x:.765625,y:.921875},{x:.765625,y:.921875},{x:.796875,y:.921875},{x:.796875,y:.921875},{x:.828125,y:.921875},{x:.828125,y:.921875},{x:.859375,y:.921875},{x:.859375,y:.921875},{x:.890625,y:.921875},{x:.890625,y:.921875},{x:.921875,y:.921875},{x:.921875,y:.921875},{x:.953125,y:.921875},{x:.953125,y:.921875},{x:.984375,y:.921875},{x:.984375,y:.921875},{x:.015625,y:.953125},{x:.015625,y:.953125},{x:.046875,y:.953125},{x:.046875,y:.953125},{x:.078125,y:.953125},{x:.078125,y:.953125},{x:.109375,y:.953125},{x:.109375,y:.953125},{x:.140625,y:.953125},{x:.140625,y:.953125},{x:.171875,y:.953125},{x:.171875,y:.953125},{x:.203125,y:.953125},{x:.203125,y:.953125},{x:.234375,y:.953125},{x:.234375,y:.953125},{x:.265625,y:.953125},{x:.265625,y:.953125},{x:.296875,y:.953125},{x:.296875,y:.953125},{x:.328125,y:.953125},{x:.328125,y:.953125},{x:.359375,y:.953125},{x:.359375,y:.953125},{x:.390625,y:.953125},{x:.390625,y:.953125},{x:.421875,y:.953125},{x:.421875,y:.953125},{x:.453125,y:.953125},{x:.453125,y:.953125},{x:.484375,y:.953125},{x:.484375,y:.953125},{x:.515625,y:.953125},{x:.515625,y:.953125},{x:.546875,y:.953125},{x:.546875,y:.953125},{x:.578125,y:.953125},{x:.578125,y:.953125},{x:.609375,y:.953125},{x:.609375,y:.953125},{x:.640625,y:.953125},{x:.640625,y:.953125},{x:.671875,y:.953125},{x:.671875,y:.953125},{x:.703125,y:.953125},{x:.703125,y:.953125},{x:.734375,y:.953125},{x:.734375,y:.953125},{x:.765625,y:.953125},{x:.765625,y:.953125},{x:.796875,y:.953125},{x:.796875,y:.953125},{x:.828125,y:.953125},{x:.828125,y:.953125},{x:.859375,y:.953125},{x:.859375,y:.953125},{x:.890625,y:.953125},{x:.890625,y:.953125},{x:.921875,y:.953125},{x:.921875,y:.953125},{x:.953125,y:.953125},{x:.953125,y:.953125},{x:.984375,y:.953125},{x:.984375,y:.953125},{x:.015625,y:.984375},{x:.015625,y:.984375},{x:.046875,y:.984375},{x:.046875,y:.984375},{x:.078125,y:.984375},{x:.078125,y:.984375},{x:.109375,y:.984375},{x:.109375,y:.984375},{x:.140625,y:.984375},{x:.140625,y:.984375},{x:.171875,y:.984375},{x:.171875,y:.984375},{x:.203125,y:.984375},{x:.203125,y:.984375},{x:.234375,y:.984375},{x:.234375,y:.984375},{x:.265625,y:.984375},{x:.265625,y:.984375},{x:.296875,y:.984375},{x:.296875,y:.984375},{x:.328125,y:.984375},{x:.328125,y:.984375},{x:.359375,y:.984375},{x:.359375,y:.984375},{x:.390625,y:.984375},{x:.390625,y:.984375},{x:.421875,y:.984375},{x:.421875,y:.984375},{x:.453125,y:.984375},{x:.453125,y:.984375},{x:.484375,y:.984375},{x:.484375,y:.984375},{x:.515625,y:.984375},{x:.515625,y:.984375},{x:.546875,y:.984375},{x:.546875,y:.984375},{x:.578125,y:.984375},{x:.578125,y:.984375},{x:.609375,y:.984375},{x:.609375,y:.984375},{x:.640625,y:.984375},{x:.640625,y:.984375},{x:.671875,y:.984375},{x:.671875,y:.984375},{x:.703125,y:.984375},{x:.703125,y:.984375},{x:.734375,y:.984375},{x:.734375,y:.984375},{x:.765625,y:.984375},{x:.765625,y:.984375},{x:.796875,y:.984375},{x:.796875,y:.984375},{x:.828125,y:.984375},{x:.828125,y:.984375},{x:.859375,y:.984375},{x:.859375,y:.984375},{x:.890625,y:.984375},{x:.890625,y:.984375},{x:.921875,y:.984375},{x:.921875,y:.984375},{x:.953125,y:.984375},{x:.953125,y:.984375},{x:.984375,y:.984375},{x:.984375,y:.984375},{x:.03125,y:.03125},{x:.03125,y:.03125},{x:.09375,y:.03125},{x:.09375,y:.03125},{x:.15625,y:.03125},{x:.15625,y:.03125},{x:.21875,y:.03125},{x:.21875,y:.03125},{x:.28125,y:.03125},{x:.28125,y:.03125},{x:.34375,y:.03125},{x:.34375,y:.03125},{x:.40625,y:.03125},{x:.40625,y:.03125},{x:.46875,y:.03125},{x:.46875,y:.03125},{x:.53125,y:.03125},{x:.53125,y:.03125},{x:.59375,y:.03125},{x:.59375,y:.03125},{x:.65625,y:.03125},{x:.65625,y:.03125},{x:.71875,y:.03125},{x:.71875,y:.03125},{x:.78125,y:.03125},{x:.78125,y:.03125},{x:.84375,y:.03125},{x:.84375,y:.03125},{x:.90625,y:.03125},{x:.90625,y:.03125},{x:.96875,y:.03125},{x:.96875,y:.03125},{x:.03125,y:.09375},{x:.03125,y:.09375},{x:.09375,y:.09375},{x:.09375,y:.09375},{x:.15625,y:.09375},{x:.15625,y:.09375},{x:.21875,y:.09375},{x:.21875,y:.09375},{x:.28125,y:.09375},{x:.28125,y:.09375},{x:.34375,y:.09375},{x:.34375,y:.09375},{x:.40625,y:.09375},{x:.40625,y:.09375},{x:.46875,y:.09375},{x:.46875,y:.09375},{x:.53125,y:.09375},{x:.53125,y:.09375},{x:.59375,y:.09375},{x:.59375,y:.09375},{x:.65625,y:.09375},{x:.65625,y:.09375},{x:.71875,y:.09375},{x:.71875,y:.09375},{x:.78125,y:.09375},{x:.78125,y:.09375},{x:.84375,y:.09375},{x:.84375,y:.09375},{x:.90625,y:.09375},{x:.90625,y:.09375},{x:.96875,y:.09375},{x:.96875,y:.09375},{x:.03125,y:.15625},{x:.03125,y:.15625},{x:.09375,y:.15625},{x:.09375,y:.15625},{x:.15625,y:.15625},{x:.15625,y:.15625},{x:.21875,y:.15625},{x:.21875,y:.15625},{x:.28125,y:.15625},{x:.28125,y:.15625},{x:.34375,y:.15625},{x:.34375,y:.15625},{x:.40625,y:.15625},{x:.40625,y:.15625},{x:.46875,y:.15625},{x:.46875,y:.15625},{x:.53125,y:.15625},{x:.53125,y:.15625},{x:.59375,y:.15625},{x:.59375,y:.15625},{x:.65625,y:.15625},{x:.65625,y:.15625},{x:.71875,y:.15625},{x:.71875,y:.15625},{x:.78125,y:.15625},{x:.78125,y:.15625},{x:.84375,y:.15625},{x:.84375,y:.15625},{x:.90625,y:.15625},{x:.90625,y:.15625},{x:.96875,y:.15625},{x:.96875,y:.15625},{x:.03125,y:.21875},{x:.03125,y:.21875},{x:.09375,y:.21875},{x:.09375,y:.21875},{x:.15625,y:.21875},{x:.15625,y:.21875},{x:.21875,y:.21875},{x:.21875,y:.21875},{x:.28125,y:.21875},{x:.28125,y:.21875},{x:.34375,y:.21875},{x:.34375,y:.21875},{x:.40625,y:.21875},{x:.40625,y:.21875},{x:.46875,y:.21875},{x:.46875,y:.21875},{x:.53125,y:.21875},{x:.53125,y:.21875},{x:.59375,y:.21875},{x:.59375,y:.21875},{x:.65625,y:.21875},{x:.65625,y:.21875},{x:.71875,y:.21875},{x:.71875,y:.21875},{x:.78125,y:.21875},{x:.78125,y:.21875},{x:.84375,y:.21875},{x:.84375,y:.21875},{x:.90625,y:.21875},{x:.90625,y:.21875},{x:.96875,y:.21875},{x:.96875,y:.21875},{x:.03125,y:.28125},{x:.03125,y:.28125},{x:.09375,y:.28125},{x:.09375,y:.28125},{x:.15625,y:.28125},{x:.15625,y:.28125},{x:.21875,y:.28125},{x:.21875,y:.28125},{x:.28125,y:.28125},{x:.28125,y:.28125},{x:.34375,y:.28125},{x:.34375,y:.28125},{x:.40625,y:.28125},{x:.40625,y:.28125},{x:.46875,y:.28125},{x:.46875,y:.28125},{x:.53125,y:.28125},{x:.53125,y:.28125},{x:.59375,y:.28125},{x:.59375,y:.28125},{x:.65625,y:.28125},{x:.65625,y:.28125},{x:.71875,y:.28125},{x:.71875,y:.28125},{x:.78125,y:.28125},{x:.78125,y:.28125},{x:.84375,y:.28125},{x:.84375,y:.28125},{x:.90625,y:.28125},{x:.90625,y:.28125},{x:.96875,y:.28125},{x:.96875,y:.28125},{x:.03125,y:.34375},{x:.03125,y:.34375},{x:.09375,y:.34375},{x:.09375,y:.34375},{x:.15625,y:.34375},{x:.15625,y:.34375},{x:.21875,y:.34375},{x:.21875,y:.34375},{x:.28125,y:.34375},{x:.28125,y:.34375},{x:.34375,y:.34375},{x:.34375,y:.34375},{x:.40625,y:.34375},{x:.40625,y:.34375},{x:.46875,y:.34375},{x:.46875,y:.34375},{x:.53125,y:.34375},{x:.53125,y:.34375},{x:.59375,y:.34375},{x:.59375,y:.34375},{x:.65625,y:.34375},{x:.65625,y:.34375},{x:.71875,y:.34375},{x:.71875,y:.34375},{x:.78125,y:.34375},{x:.78125,y:.34375},{x:.84375,y:.34375},{x:.84375,y:.34375},{x:.90625,y:.34375},{x:.90625,y:.34375},{x:.96875,y:.34375},{x:.96875,y:.34375},{x:.03125,y:.40625},{x:.03125,y:.40625},{x:.09375,y:.40625},{x:.09375,y:.40625},{x:.15625,y:.40625},{x:.15625,y:.40625},{x:.21875,y:.40625},{x:.21875,y:.40625},{x:.28125,y:.40625},{x:.28125,y:.40625},{x:.34375,y:.40625},{x:.34375,y:.40625},{x:.40625,y:.40625},{x:.40625,y:.40625},{x:.46875,y:.40625},{x:.46875,y:.40625},{x:.53125,y:.40625},{x:.53125,y:.40625},{x:.59375,y:.40625},{x:.59375,y:.40625},{x:.65625,y:.40625},{x:.65625,y:.40625},{x:.71875,y:.40625},{x:.71875,y:.40625},{x:.78125,y:.40625},{x:.78125,y:.40625},{x:.84375,y:.40625},{x:.84375,y:.40625},{x:.90625,y:.40625},{x:.90625,y:.40625},{x:.96875,y:.40625},{x:.96875,y:.40625},{x:.03125,y:.46875},{x:.03125,y:.46875},{x:.09375,y:.46875},{x:.09375,y:.46875},{x:.15625,y:.46875},{x:.15625,y:.46875},{x:.21875,y:.46875},{x:.21875,y:.46875},{x:.28125,y:.46875},{x:.28125,y:.46875},{x:.34375,y:.46875},{x:.34375,y:.46875},{x:.40625,y:.46875},{x:.40625,y:.46875},{x:.46875,y:.46875},{x:.46875,y:.46875},{x:.53125,y:.46875},{x:.53125,y:.46875},{x:.59375,y:.46875},{x:.59375,y:.46875},{x:.65625,y:.46875},{x:.65625,y:.46875},{x:.71875,y:.46875},{x:.71875,y:.46875},{x:.78125,y:.46875},{x:.78125,y:.46875},{x:.84375,y:.46875},{x:.84375,y:.46875},{x:.90625,y:.46875},{x:.90625,y:.46875},{x:.96875,y:.46875},{x:.96875,y:.46875},{x:.03125,y:.53125},{x:.03125,y:.53125},{x:.09375,y:.53125},{x:.09375,y:.53125},{x:.15625,y:.53125},{x:.15625,y:.53125},{x:.21875,y:.53125},{x:.21875,y:.53125},{x:.28125,y:.53125},{x:.28125,y:.53125},{x:.34375,y:.53125},{x:.34375,y:.53125},{x:.40625,y:.53125},{x:.40625,y:.53125},{x:.46875,y:.53125},{x:.46875,y:.53125},{x:.53125,y:.53125},{x:.53125,y:.53125},{x:.59375,y:.53125},{x:.59375,y:.53125},{x:.65625,y:.53125},{x:.65625,y:.53125},{x:.71875,y:.53125},{x:.71875,y:.53125},{x:.78125,y:.53125},{x:.78125,y:.53125},{x:.84375,y:.53125},{x:.84375,y:.53125},{x:.90625,y:.53125},{x:.90625,y:.53125},{x:.96875,y:.53125},{x:.96875,y:.53125},{x:.03125,y:.59375},{x:.03125,y:.59375},{x:.09375,y:.59375},{x:.09375,y:.59375},{x:.15625,y:.59375},{x:.15625,y:.59375},{x:.21875,y:.59375},{x:.21875,y:.59375},{x:.28125,y:.59375},{x:.28125,y:.59375},{x:.34375,y:.59375},{x:.34375,y:.59375},{x:.40625,y:.59375},{x:.40625,y:.59375},{x:.46875,y:.59375},{x:.46875,y:.59375},{x:.53125,y:.59375},{x:.53125,y:.59375},{x:.59375,y:.59375},{x:.59375,y:.59375},{x:.65625,y:.59375},{x:.65625,y:.59375},{x:.71875,y:.59375},{x:.71875,y:.59375},{x:.78125,y:.59375},{x:.78125,y:.59375},{x:.84375,y:.59375},{x:.84375,y:.59375},{x:.90625,y:.59375},{x:.90625,y:.59375},{x:.96875,y:.59375},{x:.96875,y:.59375},{x:.03125,y:.65625},{x:.03125,y:.65625},{x:.09375,y:.65625},{x:.09375,y:.65625},{x:.15625,y:.65625},{x:.15625,y:.65625},{x:.21875,y:.65625},{x:.21875,y:.65625},{x:.28125,y:.65625},{x:.28125,y:.65625},{x:.34375,y:.65625},{x:.34375,y:.65625},{x:.40625,y:.65625},{x:.40625,y:.65625},{x:.46875,y:.65625},{x:.46875,y:.65625},{x:.53125,y:.65625},{x:.53125,y:.65625},{x:.59375,y:.65625},{x:.59375,y:.65625},{x:.65625,y:.65625},{x:.65625,y:.65625},{x:.71875,y:.65625},{x:.71875,y:.65625},{x:.78125,y:.65625},{x:.78125,y:.65625},{x:.84375,y:.65625},{x:.84375,y:.65625},{x:.90625,y:.65625},{x:.90625,y:.65625},{x:.96875,y:.65625},{x:.96875,y:.65625},{x:.03125,y:.71875},{x:.03125,y:.71875},{x:.09375,y:.71875},{x:.09375,y:.71875},{x:.15625,y:.71875},{x:.15625,y:.71875},{x:.21875,y:.71875},{x:.21875,y:.71875},{x:.28125,y:.71875},{x:.28125,y:.71875},{x:.34375,y:.71875},{x:.34375,y:.71875},{x:.40625,y:.71875},{x:.40625,y:.71875},{x:.46875,y:.71875},{x:.46875,y:.71875},{x:.53125,y:.71875},{x:.53125,y:.71875},{x:.59375,y:.71875},{x:.59375,y:.71875},{x:.65625,y:.71875},{x:.65625,y:.71875},{x:.71875,y:.71875},{x:.71875,y:.71875},{x:.78125,y:.71875},{x:.78125,y:.71875},{x:.84375,y:.71875},{x:.84375,y:.71875},{x:.90625,y:.71875},{x:.90625,y:.71875},{x:.96875,y:.71875},{x:.96875,y:.71875},{x:.03125,y:.78125},{x:.03125,y:.78125},{x:.09375,y:.78125},{x:.09375,y:.78125},{x:.15625,y:.78125},{x:.15625,y:.78125},{x:.21875,y:.78125},{x:.21875,y:.78125},{x:.28125,y:.78125},{x:.28125,y:.78125},{x:.34375,y:.78125},{x:.34375,y:.78125},{x:.40625,y:.78125},{x:.40625,y:.78125},{x:.46875,y:.78125},{x:.46875,y:.78125},{x:.53125,y:.78125},{x:.53125,y:.78125},{x:.59375,y:.78125},{x:.59375,y:.78125},{x:.65625,y:.78125},{x:.65625,y:.78125},{x:.71875,y:.78125},{x:.71875,y:.78125},{x:.78125,y:.78125},{x:.78125,y:.78125},{x:.84375,y:.78125},{x:.84375,y:.78125},{x:.90625,y:.78125},{x:.90625,y:.78125},{x:.96875,y:.78125},{x:.96875,y:.78125},{x:.03125,y:.84375},{x:.03125,y:.84375},{x:.09375,y:.84375},{x:.09375,y:.84375},{x:.15625,y:.84375},{x:.15625,y:.84375},{x:.21875,y:.84375},{x:.21875,y:.84375},{x:.28125,y:.84375},{x:.28125,y:.84375},{x:.34375,y:.84375},{x:.34375,y:.84375},{x:.40625,y:.84375},{x:.40625,y:.84375},{x:.46875,y:.84375},{x:.46875,y:.84375},{x:.53125,y:.84375},{x:.53125,y:.84375},{x:.59375,y:.84375},{x:.59375,y:.84375},{x:.65625,y:.84375},{x:.65625,y:.84375},{x:.71875,y:.84375},{x:.71875,y:.84375},{x:.78125,y:.84375},{x:.78125,y:.84375},{x:.84375,y:.84375},{x:.84375,y:.84375},{x:.90625,y:.84375},{x:.90625,y:.84375},{x:.96875,y:.84375},{x:.96875,y:.84375},{x:.03125,y:.90625},{x:.03125,y:.90625},{x:.09375,y:.90625},{x:.09375,y:.90625},{x:.15625,y:.90625},{x:.15625,y:.90625},{x:.21875,y:.90625},{x:.21875,y:.90625},{x:.28125,y:.90625},{x:.28125,y:.90625},{x:.34375,y:.90625},{x:.34375,y:.90625},{x:.40625,y:.90625},{x:.40625,y:.90625},{x:.46875,y:.90625},{x:.46875,y:.90625},{x:.53125,y:.90625},{x:.53125,y:.90625},{x:.59375,y:.90625},{x:.59375,y:.90625},{x:.65625,y:.90625},{x:.65625,y:.90625},{x:.71875,y:.90625},{x:.71875,y:.90625},{x:.78125,y:.90625},{x:.78125,y:.90625},{x:.84375,y:.90625},{x:.84375,y:.90625},{x:.90625,y:.90625},{x:.90625,y:.90625},{x:.96875,y:.90625},{x:.96875,y:.90625},{x:.03125,y:.96875},{x:.03125,y:.96875},{x:.09375,y:.96875},{x:.09375,y:.96875},{x:.15625,y:.96875},{x:.15625,y:.96875},{x:.21875,y:.96875},{x:.21875,y:.96875},{x:.28125,y:.96875},{x:.28125,y:.96875},{x:.34375,y:.96875},{x:.34375,y:.96875},{x:.40625,y:.96875},{x:.40625,y:.96875},{x:.46875,y:.96875},{x:.46875,y:.96875},{x:.53125,y:.96875},{x:.53125,y:.96875},{x:.59375,y:.96875},{x:.59375,y:.96875},{x:.65625,y:.96875},{x:.65625,y:.96875},{x:.71875,y:.96875},{x:.71875,y:.96875},{x:.78125,y:.96875},{x:.78125,y:.96875},{x:.84375,y:.96875},{x:.84375,y:.96875},{x:.90625,y:.96875},{x:.90625,y:.96875},{x:.96875,y:.96875},{x:.96875,y:.96875},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375}];var F5=class{constructor(A){this.model=A,this.anchors=Je.map(t=>[t.x,t.y]),this.anchorsTensor=n.tensor2d(this.anchors),this.inputSize=this.model&&this.model.inputs&&this.model.inputs[0].shape?this.model.inputs[0].shape[2]:0,this.inputSizeTensor=n.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=n.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(A){return n.tidy(()=>{let t=n.slice(A,[0,0],[-1,2]),r=n.slice(A,[0,2],[-1,2]),o=n.add(n.div(t,this.inputSizeTensor),this.anchorsTensor),a=n.div(r,this.doubleInputSizeTensor),i=n.mul(n.sub(o,a),this.inputSizeTensor),s=n.mul(n.add(o,a),this.inputSizeTensor);return n.concat2d([i,s],1)})}normalizeLandmarks(A,t){return n.tidy(()=>{let r=n.add(n.div(n.reshape(A,[-1,7,2]),this.inputSizeTensor),this.anchors[t]);return n.mul(r,this.inputSizeTensor)})}async getBoxes(A,t){let r={};r.batched=this.model.predict(A),r.predictions=n.squeeze(r.batched),r.scores=n.tidy(()=>n.squeeze(n.sigmoid(n.slice(r.predictions,[0,0],[-1,1]))));let o=await r.scores.data();r.boxes=n.slice(r.predictions,[0,1],[-1,4]),r.norm=this.normalizeBoxes(r.boxes),r.nms=await n.image.nonMaxSuppressionAsync(r.norm,r.scores,10*t.hand.maxDetected,t.hand.iouThreshold,t.hand.minConfidence);let a=await r.nms.array(),i=[];for(let s of a){let y=n.slice(r.norm,[s,0],[1,-1]),x=n.tidy(()=>n.reshape(this.normalizeLandmarks(n.slice(r.predictions,[s,5],[1,14]),s),[-1,2]));i.push({box:y,palmLandmarks:x,confidence:o[s]})}for(let s of Object.keys(r))n.dispose(r[s]);return i}async estimateHandBounds(A,t){let r=A.shape[1],o=A.shape[2],a=n.tidy(()=>n.sub(n.div(n.image.resizeBilinear(A,[this.inputSize,this.inputSize]),127.5),1)),i=await this.getBoxes(a,t);n.dispose(a);let s=[];if(!i||i.length===0)return s;for(let y of i){let x=await y.box.data(),l=x.slice(0,2),c=x.slice(2,4),d=await y.palmLandmarks.array();n.dispose(y.box),n.dispose(y.palmLandmarks),s.push(Ye({startPoint:l,endPoint:c,palmLandmarks:d,confidence:y.confidence},[o/this.inputSize,r/this.inputSize]))}return s}};function it(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Ke(e,A){let t=Math.PI/2-Math.atan2(-(A[1]-e[1]),A[0]-e[0]);return it(t)}var Qe=(e,A)=>[[1,0,e],[0,1,A],[0,0,1]];function c0(e,A){let t=0;for(let r=0;ri[0]),r=A.map(i=>i[1]),o=[Math.min(...t),Math.min(...r)],a=[Math.max(...t),Math.max(...r)];return{startPoint:o,endPoint:a}}getBoxForPalmLandmarks(A,t){let r=A.map(a=>C5([...a,1],t)),o=this.calculateLandmarksBoundingBox(r);return K0(Q0(o),yt)}getBoxForHandLandmarks(A){let t=this.calculateLandmarksBoundingBox(A),r=K0(Q0(t),eA);r.palmLandmarks=[];for(let o=0;o[i[0]*(m[0]-this.inputSize/2),i[1]*(m[1]-this.inputSize/2),i[2]*m[2]]),y=X5(r,[0,0]),x=s.map(m=>[...C5(m,y),m[2]]),l=$e(o),c=[...O0(t),1],d=[c0(c,l[0]),c0(c,l[1])];return x.map(m=>[Math.trunc(m[0]+d[0]),Math.trunc(m[1]+d[1]),Math.trunc(m[2])])}async estimateHands(A,t){let r=!1,o;(this.skipped===0||this.skipped>t.hand.skipFrames||!t.hand.landmarks||!t.skipFrame)&&(o=await this.handDetector.estimateHandBounds(A,t),this.skipped=0),t.skipFrame&&this.skipped++,o&&o.length>0&&(o.length!==this.detectedHands&&this.detectedHands!==t.hand.maxDetected||!t.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...o],this.storedBoxes.length>0&&(r=!0));let a=[];for(let i=0;i=t.hand.minConfidence/4){let w=n.reshape(u,[-1,3]),I=await w.array();n.dispose(u),n.dispose(w);let P=this.transformRawCoords(I,m,y,d),g=this.getBoxForHandLandmarks(P);this.storedBoxes[i]={...g,confidence:E};let v={landmarks:P,confidence:E,box:{topLeft:g.startPoint,bottomRight:g.endPoint}};a.push(v)}else this.storedBoxes[i]=null;n.dispose(u)}else{let y=K0(Q0(s),eA),x={confidence:s.confidence,box:{topLeft:y.startPoint,bottomRight:y.endPoint}};a.push(x)}}return this.storedBoxes=this.storedBoxes.filter(i=>i!==null),this.detectedHands=a.length,a}};var N={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>N.nameMapping[e],getPoints:e=>N.pointsMapping[e]},B={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>B.nameMapping[e]},W={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>W.nameMapping[e]};var b0={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function tA(e,A,t,r){let o=(A-r)/(e-t),a=Math.atan(o)*180/Math.PI;return a<=0?a=-a:a>0&&(a=180-a),a}function nA(e,A){let t=tA(e[0],e[1],A[0],A[1]);if(e.length===2)return t;let r=tA(e[1],e[2],A[1],A[2]);return[t,r]}function oA(e,A=1){let t=0,r=0,o=0;return e>=75&&e<=105?t=1*A:e>=25&&e<=155?r=1*A:o=1*A,[t,r,o]}function dt(e,A,t){let r=e[0]-A[0],o=e[0]-t[0],a=A[0]-t[0],i=e[1]-A[1],s=e[1]-t[1],y=A[1]-t[1],x=e[2]-A[2],l=e[2]-t[2],c=A[2]-t[2],d=Math.sqrt(r*r+i*i+x*x),m=Math.sqrt(o*o+s*s+l*l),T=Math.sqrt(a*a+y*y+c*c),f=(T*T+d*d-m*m)/(2*T*d);f>1?f=1:f<-1&&(f=-1);let p=Math.acos(f);p=57.2958*p%180;let u;return p>b0.NO_CURL_START_LIMIT?u=B.none:p>b0.HALF_CURL_START_LIMIT?u=B.half:u=B.full,u}function rA(e,A,t,r){let o;return r===Math.abs(e)?e>0?o=W.horizontalLeft:o=W.horizontalRight:r===Math.abs(A)?A>0?o=W.horizontalLeft:o=W.horizontalRight:t>0?o=W.horizontalLeft:o=W.horizontalRight,o}function sA(e,A,t,r){let o;return r===Math.abs(e)?e<0?o=W.verticalDown:o=W.verticalUp:r===Math.abs(A)?A<0?o=W.verticalDown:o=W.verticalUp:t<0?o=W.verticalDown:o=W.verticalUp,o}function ft(e,A,t,r,o,a,i,s){let y,x=sA(e,A,t,r),l=rA(o,a,i,s);return x===W.verticalUp?l===W.horizontalLeft?y=W.diagonalUpLeft:y=W.diagonalUpRight:l===W.horizontalLeft?y=W.diagonalDownLeft:y=W.diagonalDownRight,y}function mt(e,A,t,r){let o=e[0]-A[0],a=e[0]-t[0],i=A[0]-t[0],s=e[1]-A[1],y=e[1]-t[1],x=A[1]-t[1],l=Math.max(Math.abs(o),Math.abs(a),Math.abs(i)),c=Math.max(Math.abs(s),Math.abs(y),Math.abs(x)),d=0,m=0,T=0,f=c/(l+1e-5);f>1.5?d+=b0.DISTANCE_VOTE_POWER:f>.66?m+=b0.DISTANCE_VOTE_POWER:T+=b0.DISTANCE_VOTE_POWER;let p=Math.sqrt(o*o+s*s),u=Math.sqrt(a*a+y*y),E=Math.sqrt(i*i+x*x),w=Math.max(p,u,E),I=e[0],P=e[1],g=t[0],v=t[1];w===p?(g=t[0],v=t[1]):w===E&&(I=A[0],P=A[1]);let O=nA([I,P],[g,v]),H=oA(O,b0.TOTAL_ANGLE_VOTE_POWER);d+=H[0],m+=H[1],T+=H[2];for(let V of r){let z=oA(V,b0.SINGLE_ANGLE_VOTE_POWER);d+=z[0],m+=z[1],T+=z[2]}let S;return d===Math.max(d,m,T)?S=sA(y,s,x,c):T===Math.max(m,T)?S=rA(a,o,i,l):S=ft(y,s,x,c,a,o,i,l),S}function G5(e){let A=[],t=[],r=[],o=[];if(!e)return{curls:r,directions:o};for(let a of N.all){let i=N.getPoints(a),s=[],y=[];for(let x of i){let l=e[x[0]],c=e[x[1]],d=nA(l,c),m=d[0],T=d[1];s.push(m),y.push(T)}A.push(s),t.push(y)}for(let a of N.all){let i=a===N.thumb?1:0,s=N.getPoints(a),y=e[s[i][0]],x=e[s[i+1][1]],l=e[s[3][1]],c=dt(y,x,l),d=mt(y,x,l,A[a].slice(i));r[a]=c,o[a]=d}return{curls:r,directions:o}}var L0=class{constructor(A){this.name=A,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}addCurl(A,t,r){typeof this.curls[A]=="undefined"&&(this.curls[A]=[]),this.curls[A].push([t,r])}addDirection(A,t,r){this.directions[A]||(this.directions[A]=[]),this.directions[A].push([t,r])}setWeight(A,t){this.weights[A]=t;let r=this.weights.reduce((o,a)=>o+a,0);this.weightsRelative=this.weights.map(o=>o*5/r)}matchAgainst(A,t){let r=0;for(let o in A){let a=A[o],i=this.curls[o];if(typeof i=="undefined"){r+=this.weightsRelative[o];continue}for(let[s,y]of i)if(a===s){r+=y*this.weightsRelative[o];break}}for(let o in t){let a=t[o],i=this.directions[o];if(typeof i=="undefined"){r+=this.weightsRelative[o];continue}for(let[s,y]of i)if(a===s){r+=y*this.weightsRelative[o];break}}return r/10}};var d0=new L0("thumbs up");d0.addCurl(N.thumb,B.none,1);d0.addDirection(N.thumb,W.verticalUp,1);d0.addDirection(N.thumb,W.diagonalUpLeft,.25);d0.addDirection(N.thumb,W.diagonalUpRight,.25);for(let e of[N.index,N.middle,N.ring,N.pinky])d0.addCurl(e,B.full,1),d0.addDirection(e,W.horizontalLeft,1),d0.addDirection(e,W.horizontalRight,1);var C=new L0("victory");C.addCurl(N.thumb,B.half,.5);C.addCurl(N.thumb,B.none,.5);C.addDirection(N.thumb,W.verticalUp,1);C.addDirection(N.thumb,W.diagonalUpLeft,1);C.addCurl(N.index,B.none,1);C.addDirection(N.index,W.verticalUp,.75);C.addDirection(N.index,W.diagonalUpLeft,1);C.addCurl(N.middle,B.none,1);C.addDirection(N.middle,W.verticalUp,1);C.addDirection(N.middle,W.diagonalUpLeft,.75);C.addCurl(N.ring,B.full,1);C.addDirection(N.ring,W.verticalUp,.2);C.addDirection(N.ring,W.diagonalUpLeft,1);C.addDirection(N.ring,W.horizontalLeft,.2);C.addCurl(N.pinky,B.full,1);C.addDirection(N.pinky,W.verticalUp,.2);C.addDirection(N.pinky,W.diagonalUpLeft,1);C.addDirection(N.pinky,W.horizontalLeft,.2);C.setWeight(N.index,2);C.setWeight(N.middle,2);var aA=[d0,C];var ht=.7;function iA(e){let A=G5(e),t={};for(let r of N.all)t[N.getName(r)]={curl:B.getName(A.curls[r]),direction:W.getName(A.directions[r])};return t}function xA(e){let A=G5(e),t=[];for(let r of aA){let o=r.matchAgainst(A.curls,A.directions);o>=ht&&t.push({name:r.name,confidence:o})}return t}var yA={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},f0,m0,lA;async function U5(e,A){let t=await lA.estimateHands(e,A);if(!t)return[];let r=[];for(let o=0;ot[o].landmarks[c]);let i=t[o].landmarks,s=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],y=[0,0,0,0];if(i&&i.length>0){for(let l of i)l[0]s[2]&&(s[2]=l[0]),l[1]>s[3]&&(s[3]=l[1]);s[2]-=s[0],s[3]-=s[1],y=[s[0]/(e.shape[2]||0),s[1]/(e.shape[1]||0),s[2]/(e.shape[2]||0),s[3]/(e.shape[1]||0)]}else s=t[o].box?[Math.trunc(Math.max(0,t[o].box.topLeft[0])),Math.trunc(Math.max(0,t[o].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,t[o].box.bottomRight[0])-Math.max(0,t[o].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,t[o].box.bottomRight[1])-Math.max(0,t[o].box.topLeft[1]))]:[0,0,0,0],y=[t[o].box.topLeft[0]/(e.shape[2]||0),t[o].box.topLeft[1]/(e.shape[1]||0),(t[o].box.bottomRight[0]-t[o].box.topLeft[0])/(e.shape[2]||0),(t[o].box.bottomRight[1]-t[o].box.topLeft[1])/(e.shape[1]||0)];let x=iA(i);r.push({id:o,score:Math.round(100*t[o].confidence)/100,box:s,boxRaw:y,keypoints:i,annotations:a,landmarks:x})}return r}async function B5(e){!f0||!m0?([f0,m0]=await Promise.all([e.hand.enabled?n.loadGraphModel(Z(e.modelBasePath,e.hand.detector.modelPath),{fromTFHub:e.hand.detector.modelPath.includes("tfhub.dev")}):null,e.hand.landmarks?n.loadGraphModel(Z(e.modelBasePath,e.hand.skeleton.modelPath),{fromTFHub:e.hand.skeleton.modelPath.includes("tfhub.dev")}):null]),e.hand.enabled&&(!f0||!f0.modelUrl?M("load model failed:",e.hand.detector.modelPath):e.debug&&M("load model:",f0.modelUrl),!m0||!m0.modelUrl?M("load model failed:",e.hand.skeleton.modelPath):e.debug&&M("load model:",m0.modelUrl))):(e.debug&&M("cached model:",f0.modelUrl),e.debug&&M("cached model:",m0.modelUrl));let A=new F5(f0);return lA=new q5(A,m0),[f0,m0]}var cA=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPalm","rightPalm","leftIndex","rightIndex","leftPinky","rightPinky","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","midHip","forehead","leftThumb","leftHand","rightThumb","rightHand"],dA=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","left:15","right:16","left:17","right:18","left:19","right:20","left:21","right:22","leftChest","rightChest","neck","forehead","left:27","right:28","left:29","right:30"];var Y;async function _0(e){return Y?e.debug&&M("cached model:",Y.modelUrl):(Y=await n.loadGraphModel(Z(e.modelBasePath,e.body.modelPath)),Y.width=parseInt(Y.signature.inputs["input_1:0"].tensorShape.dim[2].size),Y.height=parseInt(Y.signature.inputs["input_1:0"].tensorShape.dim[1].size),!Y||!Y.modelUrl?M("load model failed:",e.body.modelPath):e.debug&&M("load model:",Y.modelUrl)),Y}async function D5(e,A){if(!Y)return[];if(!A.body.enabled)return[];let t={width:e.shape[2]||0,height:e.shape[1]||0},r=n.image.resizeBilinear(e,[Y.width,Y.height],!1),o=n.div(r,[255]);n.dispose(r);let a=await Y.predict(o),i=a.find(p=>p.size===195||p.size===155),s=await(i==null?void 0:i.data())||[];a.forEach(p=>n.dispose(p)),n.dispose(o);let y=[],x=(s==null?void 0:s.length)===195?cA:dA,l=5;for(let p=0;pp.position[0]),d=y.map(p=>p.position[1]),m=[Math.min(...c),Math.min(...d),Math.max(...c)-Math.min(...c),Math.max(...d)-Math.min(...c)],T=[0,0,0,0],f=y.reduce((p,u)=>u.score>p?u.score:p,0);return[{id:0,score:f,box:m,boxRaw:T,keypoints:y}]}var J,a0=[],Y5=[0,0,0,0],J5=[0,0,0,0],$0=0,K5=Number.MAX_SAFE_INTEGER,ut=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","pelvis","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"];async function fA(e){return J?e.debug&&M("cached model:",J.modelUrl):(J=await n.loadGraphModel(Z(e.modelBasePath,e.body.modelPath)),!J||!J.modelUrl?M("load model failed:",e.body.modelPath):e.debug&&M("load model:",J.modelUrl)),J}function pt(e,A){let[t,r]=e.shape;return n.tidy(()=>{let o=(s,y)=>n.sub(s,n.mul(n.div(s,n.scalar(y,"int32")),n.scalar(y,"int32"))),a=n.reshape(e,[r*t]),i=n.max(a,0).dataSync()[0];if(i>A){let s=n.argMax(a,0),y=o(s,t).dataSync()[0],x=n.div(s,n.scalar(t,"int32")).dataSync()[0];return[y,x,i]}return[0,0,i]})}async function Q5(e,A){return K50?(K5++,[{id:0,score:$0,box:Y5,boxRaw:J5,keypoints:a0}]):(K5=0,new Promise(async t=>{let r=n.tidy(()=>{if(!J.inputs[0].shape)return null;let x=n.image.resizeBilinear(e,[J.inputs[0].shape[2],J.inputs[0].shape[1]],!1);return n.mul(x,2).sub(1)}),o;if(A.body.enabled&&(o=await J.predict(r)),n.dispose(r),o){a0.length=0;let x=o.squeeze();n.dispose(o);let l=x.unstack(2);n.dispose(x);for(let c=0;cA.body.minConfidence&&a0.push({score:Math.round(100*T)/100,part:ut[c],positionRaw:[d/J.inputs[0].shape[2],m/J.inputs[0].shape[1]],position:[Math.round(e.shape[2]*d/J.inputs[0].shape[2]),Math.round(e.shape[1]*m/J.inputs[0].shape[1])]})}l.forEach(c=>n.dispose(c))}$0=a0.reduce((x,l)=>l.score>x?l.score:x,0);let a=a0.map(x=>x.position[0]),i=a0.map(x=>x.position[1]);Y5=[Math.min(...a),Math.min(...i),Math.max(...a)-Math.min(...a),Math.max(...i)-Math.min(...i)];let s=a0.map(x=>x.positionRaw[0]),y=a0.map(x=>x.positionRaw[1]);J5=[Math.min(...s),Math.min(...y),Math.max(...s)-Math.min(...s),Math.max(...y)-Math.min(...y)],t([{id:0,score:$0,box:Y5,boxRaw:J5,keypoints:a0}])}))}var i0,A0=[],_5=[0,0,0,0],x0=[0,0,0,0],y0=0,$5=Number.MAX_SAFE_INTEGER,mA=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"];async function ee(e){return i0?e.debug&&M("cached model:",i0.modelUrl):(i0=await n.loadGraphModel(Z(e.modelBasePath,e.body.modelPath)),!i0||!i0.modelUrl?M("load model failed:",e.body.modelPath):e.debug&&M("load model:",i0.modelUrl)),i0}async function bt(e,A,t){A0.length=0;let r=e[0][0];for(let x=0;xA.body.minConfidence&&A0.push({score:Math.round(100*y0)/100,part:mA[x],positionRaw:[r[x][1],r[x][0]],position:[Math.round((t.shape[2]||0)*r[x][1]),Math.round((t.shape[1]||0)*r[x][0])]});y0=A0.reduce((x,l)=>l.score>x?l.score:x,0);let o=A0.map(x=>x.position[0]),a=A0.map(x=>x.position[1]);_5=[Math.min(...o),Math.min(...a),Math.max(...o)-Math.min(...o),Math.max(...a)-Math.min(...a)];let i=A0.map(x=>x.positionRaw[0]),s=A0.map(x=>x.positionRaw[1]);x0=[Math.min(...i),Math.min(...s),Math.max(...i)-Math.min(...i),Math.max(...s)-Math.min(...s)];let y=[];return y.push({id:0,score:y0,box:_5,boxRaw:x0,keypoints:A0}),y}async function gt(e,A,t){let r=[];for(let o=0;oA.body.minConfidence&&A0.push({part:mA[i],score:s,positionRaw:[a[3*i+1],a[3*i+0]],position:[Math.trunc(a[3*i+1]*(t.shape[2]||0)),Math.trunc(a[3*i+0]*(t.shape[1]||0))]})}x0=[a[51+1],a[51+0],a[51+3]-a[51+1],a[51+2]-a[51+0]],r.push({id:o,score:y0,boxRaw:x0,box:[Math.trunc(x0[0]*(t.shape[2]||0)),Math.trunc(x0[1]*(t.shape[1]||0)),Math.trunc(x0[2]*(t.shape[2]||0)),Math.trunc(x0[3]*(t.shape[1]||0))],keypoints:A0})}}return r}async function Ae(e,A){return $50?($5++,[{id:0,score:y0,box:_5,boxRaw:x0,keypoints:A0}]):($5=0,new Promise(async t=>{let r=n.tidy(()=>{if(!i0.inputs[0].shape)return null;let s=i0.inputs[0].shape[2];s===-1&&(s=256);let y=n.image.resizeBilinear(e,[s,s],!1);return n.cast(y,"int32")}),o;A.body.enabled&&(o=await i0.predict(r)),n.dispose(r),o||t([]);let a=await o.array(),i;o.shape[2]===17?i=await bt(a,A,e):o.shape[2]===56&&(i=await gt(a,A,e)),n.dispose(o),t(i)}))}var E0=[{class:1,label:"person"},{class:2,label:"bicycle"},{class:3,label:"car"},{class:4,label:"motorcycle"},{class:5,label:"airplane"},{class:6,label:"bus"},{class:7,label:"train"},{class:8,label:"truck"},{class:9,label:"boat"},{class:10,label:"traffic light"},{class:11,label:"fire hydrant"},{class:12,label:"stop sign"},{class:13,label:"parking meter"},{class:14,label:"bench"},{class:15,label:"bird"},{class:16,label:"cat"},{class:17,label:"dog"},{class:18,label:"horse"},{class:19,label:"sheep"},{class:20,label:"cow"},{class:21,label:"elephant"},{class:22,label:"bear"},{class:23,label:"zebra"},{class:24,label:"giraffe"},{class:25,label:"backpack"},{class:26,label:"umbrella"},{class:27,label:"handbag"},{class:28,label:"tie"},{class:29,label:"suitcase"},{class:30,label:"frisbee"},{class:31,label:"skis"},{class:32,label:"snowboard"},{class:33,label:"sports ball"},{class:34,label:"kite"},{class:35,label:"baseball bat"},{class:36,label:"baseball glove"},{class:37,label:"skateboard"},{class:38,label:"surfboard"},{class:39,label:"tennis racket"},{class:40,label:"bottle"},{class:41,label:"wine glass"},{class:42,label:"cup"},{class:43,label:"fork"},{class:44,label:"knife"},{class:45,label:"spoon"},{class:46,label:"bowl"},{class:47,label:"banana"},{class:48,label:"apple"},{class:49,label:"sandwich"},{class:50,label:"orange"},{class:51,label:"broccoli"},{class:52,label:"carrot"},{class:53,label:"hot dog"},{class:54,label:"pizza"},{class:55,label:"donut"},{class:56,label:"cake"},{class:57,label:"chair"},{class:58,label:"couch"},{class:59,label:"potted plant"},{class:60,label:"bed"},{class:61,label:"dining table"},{class:62,label:"toilet"},{class:63,label:"tv"},{class:64,label:"laptop"},{class:65,label:"mouse"},{class:66,label:"remote"},{class:67,label:"keyboard"},{class:68,label:"cell phone"},{class:69,label:"microwave"},{class:70,label:"oven"},{class:71,label:"toaster"},{class:72,label:"sink"},{class:73,label:"refrigerator"},{class:74,label:"book"},{class:75,label:"clock"},{class:76,label:"vase"},{class:77,label:"scissors"},{class:78,label:"teddy bear"},{class:79,label:"hair drier"},{class:80,label:"toothbrush"}];var Q,te=[],ne=Number.MAX_SAFE_INTEGER,e5=2.5;async function oe(e){if(Q)e.debug&&M("cached model:",Q.modelUrl);else{Q=await n.loadGraphModel(Z(e.modelBasePath,e.object.modelPath));let A=Object.values(Q.modelSignature.inputs);if(Q.inputSize=Array.isArray(A)?parseInt(A[0].tensorShape.dim[2].size):null,!Q.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${e.object.modelPath}`);!Q||!Q.modelUrl?M("load model failed:",e.object.modelPath):e.debug&&M("load model:",Q.modelUrl)}return Q}async function Mt(e,A,t,r){let o=0,a=[];for(let x of[1,2,4])n.tidy(async()=>{var p,u;let l=x*13,c=(p=e.find(E=>E.shape[1]===l**2&&E.shape[2]===E0.length))==null?void 0:p.squeeze(),d=(u=e.find(E=>E.shape[1]===l**2&&E.shape[2]r.object.minConfidence&&w!==61){let P=(.5+Math.trunc(E%l))/l,g=(.5+Math.trunc(E/l))/l,v=T[E].map($=>$*(l/x/A)),[h,k]=[P-e5/x*v[0],g-e5/x*v[1]],[O,H]=[P+e5/x*v[2]-h,g+e5/x*v[3]-k],S=[h,k,O,H];S=S.map($=>Math.max(0,Math.min($,1)));let V=[S[0]*t[0],S[1]*t[1],S[2]*t[0],S[3]*t[1]],z={id:o++,score:Math.round(100*I)/100,class:w+1,label:E0[w].label,box:V.map($=>Math.trunc($)),boxRaw:S};a.push(z)}}});e.forEach(x=>n.dispose(x));let i=a.map(x=>[x.boxRaw[1],x.boxRaw[0],x.boxRaw[3],x.boxRaw[2]]),s=a.map(x=>x.score),y=[];if(i&&i.length>0){let x=await n.image.nonMaxSuppressionAsync(i,s,r.object.maxDetected,r.object.iouThreshold,r.object.minConfidence);y=await x.data(),n.dispose(x)}return a=a.filter((x,l)=>y.includes(l)).sort((x,l)=>l.score-x.score),a}async function re(e,A){return ne0?(ne++,te):(ne=0,new Promise(async t=>{let r=[e.shape[2],e.shape[1]],o=n.image.resizeBilinear(e,[Q.inputSize,Q.inputSize],!1),a=n.div(o,255),i=a.transpose([0,3,1,2]);n.dispose(a),n.dispose(o);let s;A.object.enabled&&(s=await Q.predict(i)),n.dispose(i);let y=await Mt(s,Q.inputSize,r,A);te=y,t(y)}))}var _,se=[],ae=Number.MAX_SAFE_INTEGER;async function ie(e){if(_)e.debug&&M("cached model:",_.modelUrl);else{_=await n.loadGraphModel(Z(e.modelBasePath,e.object.modelPath));let A=Object.values(_.modelSignature.inputs);if(_.inputSize=Array.isArray(A)?parseInt(A[0].tensorShape.dim[2].size):null,!_.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${e.object.modelPath}`);!_||!_.modelUrl?M("load model failed:",e.object.modelPath):e.debug&&M("load model:",_.modelUrl)}return _}async function Tt(e,A,t,r){if(!e)return[];let o=[],a=await e.array(),i=n.squeeze(e);n.dispose(e);let s=n.split(i,6,1);n.dispose(i);let y=n.stack([s[1],s[0],s[3],s[2]],1),x=n.squeeze(y),l=n.squeeze(s[4]),c=n.squeeze(s[5]);s.forEach(f=>n.dispose(f));let d=await n.image.nonMaxSuppressionAsync(x,l,r.object.maxDetected,r.object.iouThreshold,r.object.minConfidence);n.dispose(x),n.dispose(l),n.dispose(c);let m=await d.data();n.dispose(d);let T=0;for(let f of m){let p=Math.trunc(100*a[0][f][4])/100,u=a[0][f][5],E=E0[u].label,[w,I]=[a[0][f][0]/A,a[0][f][1]/A],P=[w,I,a[0][f][2]/A-w,a[0][f][3]/A-I],g=[Math.trunc(P[0]*t[0]),Math.trunc(P[1]*t[1]),Math.trunc(P[2]*t[0]),Math.trunc(P[3]*t[1])];o.push({id:T++,score:p,class:u,label:E,box:g,boxRaw:P})}return o}async function xe(e,A){return ae0?(ae++,se):(ae=0,new Promise(async t=>{let r=[e.shape[2],e.shape[1]],o=n.image.resizeBilinear(e,[_.inputSize,_.inputSize]),a=A.object.enabled?_.execute(o,["tower_0/detections"]):null;n.dispose(o);let i=await Tt(a,_.inputSize,r,A);se=i,t(i)}))}function Pt(e,A,t){let r=function(s,y,x){let l=new RegExp("\\b"+y+" \\w+ (\\w+)","ig");s.replace(l,(c,d)=>(x[d]=0,c))},o=function(s,y){let x=e.createShader(y);if(e.shaderSource(x,s),e.compileShader(x),!e.getShaderParameter(x,e.COMPILE_STATUS))throw new Error("Filter: GL compile failed",e.getShaderInfoLog(x));return x};this.uniform={},this.attribute={};let a=o(A,e.VERTEX_SHADER),i=o(t,e.FRAGMENT_SHADER);if(this.id=e.createProgram(),e.attachShader(this.id,a),e.attachShader(this.id,i),e.linkProgram(this.id),!e.getProgramParameter(this.id,e.LINK_STATUS))throw new Error("Filter: GL link failed",e.getProgramInfoLog(this.id));e.useProgram(this.id),r(A,"attribute",this.attribute);for(let s in this.attribute)this.attribute[s]=e.getAttribLocation(this.id,s);r(A,"uniform",this.uniform),r(t,"uniform",this.uniform);for(let s in this.uniform)this.uniform[s]=e.getUniformLocation(this.id,s)}function hA(e){e||(e={});let A=0,t=null,r=!1,o=-1,a=[null,null],i=[],s=-1,y=-1,x=null,l=null,c={},d=e.canvas||document.createElement("canvas"),m={},T={INTERMEDIATE:1},f=d.getContext("webgl");if(!f)throw new Error("Filter: getContext() failed");this.addFilter=function(P){let g=Array.prototype.slice.call(arguments,1),v=c[P];i.push({func:v,args:g})},this.reset=function(){i=[]};let p=function(P,g){if(!(P===s&&g===y)){if(d.width=P,s=P,d.height=g,y=g,!x){let v=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);x=f.createBuffer(),f.bindBuffer(f.ARRAY_BUFFER,x),f.bufferData(f.ARRAY_BUFFER,v,f.STATIC_DRAW),f.pixelStorei(f.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}f.viewport(0,0,s,y),a=[null,null]}},u=function(P,g){let v=f.createFramebuffer();f.bindFramebuffer(f.FRAMEBUFFER,v);let h=f.createRenderbuffer();f.bindRenderbuffer(f.RENDERBUFFER,h);let k=f.createTexture();return f.bindTexture(f.TEXTURE_2D,k),f.texImage2D(f.TEXTURE_2D,0,f.RGBA,P,g,0,f.RGBA,f.UNSIGNED_BYTE,null),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_MAG_FILTER,f.LINEAR),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_MIN_FILTER,f.LINEAR),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_WRAP_S,f.CLAMP_TO_EDGE),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_WRAP_T,f.CLAMP_TO_EDGE),f.framebufferTexture2D(f.FRAMEBUFFER,f.COLOR_ATTACHMENT0,f.TEXTURE_2D,k,0),f.bindTexture(f.TEXTURE_2D,null),f.bindFramebuffer(f.FRAMEBUFFER,null),{fbo:v,texture:k}},E=function(P){return a[P]=a[P]||u(s,y),a[P]},w=function(P=null){var k,O;let g=null,v=null,h=!1;A===0?g=t:g=(k=E(o))==null?void 0:k.texture,A++,r&&!(P&T.INTERMEDIATE)?(v=null,h=A%2==0):(o=(o+1)%2,v=(O=E(o))==null?void 0:O.fbo),f.bindTexture(f.TEXTURE_2D,g),f.bindFramebuffer(f.FRAMEBUFFER,v),f.uniform1f(l.uniform.flipY,h?-1:1),f.drawArrays(f.TRIANGLES,0,6)};this.apply=function(P){if(p(P.width,P.height),A=0,t||(t=f.createTexture()),f.bindTexture(f.TEXTURE_2D,t),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_WRAP_S,f.CLAMP_TO_EDGE),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_WRAP_T,f.CLAMP_TO_EDGE),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_MIN_FILTER,f.NEAREST),f.texParameteri(f.TEXTURE_2D,f.TEXTURE_MAG_FILTER,f.NEAREST),f.texImage2D(f.TEXTURE_2D,0,f.RGBA,f.RGBA,f.UNSIGNED_BYTE,P),i.length===0)return w(),d;for(let g=0;g0,a=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!a)return{tensor:null,canvas:R};let i=o,s=a;if(i>A5&&(i=A5,s=i*a/o),s>A5&&(s=A5,i=s*o/a),A.filter.width>0?i=A.filter.width:A.filter.height>0&&(i=o*(A.filter.height/a)),A.filter.height>0?s=A.filter.height:A.filter.width>0&&(s=a*(A.filter.width/o)),!i||!s)throw new Error("Human: Input cannot determine dimension");(!R||(R==null?void 0:R.width)!==i||(R==null?void 0:R.height)!==s)&&(R=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(i,s):document.createElement("canvas"),(R==null?void 0:R.width)!==i&&(R.width=i),(R==null?void 0:R.height)!==s&&(R.height=s));let y=R.getContext("2d");if(e instanceof ImageData?y.putImageData(e,0,0):A.filter.flip&&typeof y.translate!="undefined"?(y.translate(o,0),y.scale(-1,1),y.drawImage(e,0,0,o,a,0,0,R==null?void 0:R.width,R==null?void 0:R.height),y.setTransform(1,0,0,1,0,0)):y.drawImage(e,0,0,o,a,0,0,R==null?void 0:R.width,R==null?void 0:R.height),A.filter.enabled){if((!q||!F||R.width!==F.width||(R==null?void 0:R.height)!==(F==null?void 0:F.height))&&(F=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(R==null?void 0:R.width,R==null?void 0:R.height):document.createElement("canvas"),(F==null?void 0:F.width)!==(R==null?void 0:R.width)&&(F.width=R==null?void 0:R.width),(F==null?void 0:F.height)!==(R==null?void 0:R.height)&&(F.height=R==null?void 0:R.height),q=n.ENV.flags.IS_BROWSER?new hA({canvas:F}):null),!q)return{tensor:null,canvas:R};q.reset(),q.addFilter("brightness",A.filter.brightness),A.filter.contrast!==0&&q.addFilter("contrast",A.filter.contrast),A.filter.sharpness!==0&&q.addFilter("sharpen",A.filter.sharpness),A.filter.blur!==0&&q.addFilter("blur",A.filter.blur),A.filter.saturation!==0&&q.addFilter("saturation",A.filter.saturation),A.filter.hue!==0&&q.addFilter("hue",A.filter.hue),A.filter.negative&&q.addFilter("negative"),A.filter.sepia&&q.addFilter("sepia"),A.filter.vintage&&q.addFilter("brownie"),A.filter.sepia&&q.addFilter("sepia"),A.filter.kodachrome&&q.addFilter("kodachrome"),A.filter.technicolor&&q.addFilter("technicolor"),A.filter.polaroid&&q.addFilter("polaroid"),A.filter.pixelate!==0&&q.addFilter("pixelate",A.filter.pixelate),q.apply(R)}else F=R,q&&(q=null);if(!t){let x;if(F.data){let l=[F.height,F.width,3];x=n.tensor3d(F.data,l,"int32")}else if(F instanceof ImageData)x=n.browser?n.browser.fromPixels(F):null;else if(A.backend==="webgl"||A.backend==="humangl"){let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(i,s):document.createElement("canvas");l.width=i,l.height=s;let c=l.getContext("2d");c==null||c.drawImage(F,0,0),x=n.browser?n.browser.fromPixels(l):null}else{let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(i,s):document.createElement("canvas");l.width=i,l.height=s;let c=l.getContext("2d");c==null||c.drawImage(F,0,0);let d=c==null?void 0:c.getImageData(0,0,i,s);x=n.browser?n.browser.fromPixels(d):null}if(x){let l=n.cast(x,"float32");t=n.expandDims(l,0),n.dispose(x),n.dispose(l)}}}let r=A.filter.return?F:null;return{tensor:t,canvas:r}}var t0,ye=!1;async function t5(e){return t0?e.debug&&M("cached model:",t0.modelUrl):(t0=await n.loadGraphModel(Z(e.modelBasePath,e.segmentation.modelPath)),!t0||!t0.modelUrl?M("load model failed:",e.segmentation.modelPath):e.debug&&M("load model:",t0.modelUrl)),t0}async function le(e){var T,f;let A=((T=e.tensor)==null?void 0:T.shape[1])||0,t=((f=e.tensor)==null?void 0:f.shape[2])||0;if(!e.tensor||!t0||!t0.inputs[0].shape)return null;let r=n.image.resizeBilinear(e.tensor,[t0.inputs[0].shape[1],t0.inputs[0].shape[2]],!1),o=n.div(r,255),a=t0.predict(o);n.dispose(r),n.dispose(o);let i=n.squeeze(a,0),s;if(i.shape[2]===2){let p=i.softmax(),[u,E]=n.unstack(p,2),w=n.expandDims(E,2),I=n.expandDims(w,0);n.dispose(p),n.dispose(u),n.dispose(E);let P=n.image.cropAndResize(I,[[0,0,.5,.5]],[0],[A,t]);s=n.squeeze(P,0),n.dispose(P),n.dispose(w),n.dispose(I)}else s=n.image.resizeBilinear(i,[A,t]);if(typeof document=="undefined")return s.data();let y=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,t):document.createElement("canvas");y.width=A,y.height=t,n.browser&&await n.browser.toPixels(s,y),n.dispose(s),n.dispose(i),n.dispose(a);let x=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,t):document.createElement("canvas");x.width=A,x.height=t;let l=x.getContext("2d");l.filter="blur(8px",await l.drawImage(y,0,0);let c=l.getImageData(0,0,A,t).data,d=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,t):document.createElement("canvas");d.width=A,d.height=t;let m=d.getContext("2d");return e.canvas&&await m.drawImage(e.canvas,0,0),m.globalCompositeOperation="darken",m.filter="blur(8px)",await m.drawImage(y,0,0),m.globalCompositeOperation="source-over",m.filter="none",e.canvas=d,c}async function uA(e,A,t){var a;if(ye)return null;ye=!0,t0||await t5(t);let r=g0(e,t),o=await le(r);if(n.dispose(r.tensor),A&&o){let i=g0(A,t),s=i.canvas;n.dispose(i.tensor);let y=r.canvas,x=(a=y.getContext("2d"))==null?void 0:a.getImageData(0,0,y.width,y.height).data,l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(y.width,y.height):document.createElement("canvas");l.width=y.width,l.height=y.height;let c=l.getContext("2d");c.globalCompositeOperation="copy",c.drawImage(s,0,0,l.width,l.height);let d=c.getImageData(0,0,l.width,l.height);for(let m=0;m{let A=(c,d)=>Math.atan2(c[1]-d[1],c[0]-d[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let t=[0,-.1],r=1,o=e.mesh[33][2]>e.mesh[263][2],a=o?e.mesh[473]:e.mesh[468],i=o?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],s=o?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],y=[(i[0]-a[0])/s[0]-t[0],r*(a[1]-i[1])/s[1]-t[1]],x=Math.sqrt(y[0]**2+y[1]**2);return x=Math.min(x,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(A([0,0],y)+Math.PI/2)%Math.PI,strength:x}},zt=(e,A)=>{let t=p=>{let u=Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);return p[0]/=u,p[1]/=u,p[2]/=u,p},r=(p,u)=>{let E=p[0]-u[0],w=p[1]-u[1],I=p[2]-u[2];return[E,w,I]},o=(p,u)=>{let E=p[1]*u[2]-p[2]*u[1],w=p[2]*u[0]-p[0]*u[2],I=p[0]*u[1]-p[1]*u[0];return[E,w,I]},a=p=>{let[u,E,w,I,P,g,v,h,k]=p,O,H,S;return I<1?I>-1?(S=Math.asin(I),H=Math.atan2(-v,u),O=Math.atan2(-g,P)):(S=-Math.PI/2,H=-Math.atan2(h,k),O=0):(S=Math.PI/2,H=Math.atan2(h,k),O=0),isNaN(O)&&(O=0),isNaN(H)&&(H=0),isNaN(S)&&(S=0),{pitch:2*-O,yaw:2*-H,roll:2*-S}},i=p=>{let u=(w,I,P,g)=>Math.atan2(g-I,P-w);return{pitch:u(p[10][1],p[10][2],p[152][1],p[152][2]),yaw:u(p[33][0],p[33][2],p[263][0],p[263][2]),roll:u(p[33][0],p[33][1],p[263][0],p[263][1])}},s=e.meshRaw;if(!s||s.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let y=Math.max(e.boxRaw[2]*A[0],e.boxRaw[3]*A[1])/1.5,x=[s[10],s[152],s[234],s[454]].map(p=>[p[0]*A[0]/y,p[1]*A[1]/y,p[2]]),l=t(r(x[1],x[0])),c=t(r(x[3],x[2])),d=t(o(c,l));c=o(l,d);let m=[c[0],c[1],c[2],l[0],l[1],l[2],d[0],d[1],d[2]],T=a(m),f=s.length===478?vt(e):{bearing:0,strength:0};return{angle:T,matrix:m,gaze:f}},ce=async(e,A)=>{var c,d,m,T,f,p;let t,r,o,a,i,s,y,x=[];e.state="run:face",t=L();let l=await Ie(A,e.config);if(e.performance.face=Math.trunc(L()-t),!A.shape||A.shape.length!==4)return[];if(!l)return[];for(let u=0;u{if(!e)return[];let A=[];for(let t=0;ty.part==="leftWrist"),o=e[t].keypoints.find(y=>y.part==="rightWrist"),a=e[t].keypoints.find(y=>y.part==="nose");a&&r&&o&&r.position.yy.part==="leftShoulder"),s=e[t].keypoints.find(y=>y.part==="rightShoulder");i&&s&&A.push({body:t,gesture:`leaning ${i.position.y>s.position.y?"left":"right"}`})}return A},gA=e=>{if(!e)return[];let A=[];for(let t=0;t0){let r=e[t].mesh[33][2]-e[t].mesh[263][2];Math.abs(r)<10?A.push({face:t,gesture:"facing center"}):A.push({face:t,gesture:`facing ${r<0?"left":"right"}`}),Math.abs(e[t].mesh[374][1]-e[t].mesh[386][1])/Math.abs(e[t].mesh[443][1]-e[t].mesh[450][1])<.2&&A.push({face:t,gesture:"blink left eye"}),Math.abs(e[t].mesh[145][1]-e[t].mesh[159][1])/Math.abs(e[t].mesh[223][1]-e[t].mesh[230][1])<.2&&A.push({face:t,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[t].mesh[13][1]-e[t].mesh[14][1])/Math.abs(e[t].mesh[10][1]-e[t].mesh[152][1]));i>10&&A.push({face:t,gesture:`mouth ${Math.trunc(i)}% open`});let s=e[t].mesh[152][2];Math.abs(s)>10&&A.push({face:t,gesture:`head ${s<0?"up":"down"}`})}return A},MA=e=>{if(!e)return[];let A=[];for(let t=0;t.06||c>.06)&&(x=!1),d>.06&&A.push({iris:t,gesture:"looking right"}),c>.06&&A.push({iris:t,gesture:"looking left"});let m=Math.abs(e[t].mesh[145][1]-e[t].annotations.rightEyeIris[0][1])/e[t].box[3],T=Math.abs(e[t].mesh[374][1]-e[t].annotations.leftEyeIris[0][1])/e[t].box[3];(T<.01||m<.01||T>.022||m>.022)&&(x=!1),(T<.01||m<.01)&&A.push({iris:t,gesture:"looking down"}),(T>.022||m>.022)&&A.push({iris:t,gesture:"looking up"}),x&&A.push({iris:t,gesture:"looking center"})}return A},TA=e=>{if(!e)return[];let A=[];for(let t=0;t0){let a=r.reduce((s,y)=>s.position[2]s.position[1]wt,body:()=>zA,canvas:()=>Rt,face:()=>vA,gesture:()=>PA,hand:()=>EA,object:()=>RA,options:()=>h0,person:()=>Et});var h0={color:"rgba(173, 216, 230, 0.6)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",font:'small-caps 14px "Segoe UI"',lineHeight:18,lineWidth:4,pointSize:2,roundRect:8,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawPolygons:!0,drawGaze:!0,fillPolygons:!1,useDepth:!0,useCurves:!1,bufferedOutput:!0},u0=e=>{if(e&&e.getContext)return e.getContext("2d");throw new Error("Human: Invalid Canvas")},n5=e=>Math.round(e*180/Math.PI);function de(e,A,t,r=0,o){e.fillStyle=o.useDepth&&r?`rgba(${127.5+2*r}, ${127.5-2*r}, 255, 0.3)`:o.color,e.beginPath(),e.arc(A,t,o.pointSize,0,2*Math.PI),e.fill()}function H0(e,A,t,r,o,a){if(e.beginPath(),a.useCurves){let i=(A+A+r)/2,s=(t+t+o)/2;e.ellipse(i,s,r/2,o/2,0,0,2*Math.PI)}else e.lineWidth=a.lineWidth,e.moveTo(A+a.roundRect,t),e.lineTo(A+r-a.roundRect,t),e.quadraticCurveTo(A+r,t,A+r,t+a.roundRect),e.lineTo(A+r,t+o-a.roundRect),e.quadraticCurveTo(A+r,t+o,A+r-a.roundRect,t+o),e.lineTo(A+a.roundRect,t+o),e.quadraticCurveTo(A,t+o,A,t+o-a.roundRect),e.lineTo(A,t+a.roundRect),e.quadraticCurveTo(A,t,A+a.roundRect,t),e.closePath();e.stroke()}function fe(e,A=[],t){if(!(A===void 0||A.length===0)){e.beginPath(),e.moveTo(A[0][0],A[0][1]);for(let r of A){let o=r[2]||0;e.strokeStyle=t.useDepth&&o?`rgba(${127.5+2*o}, ${127.5-2*o}, 255, 0.3)`:t.color,e.fillStyle=t.useDepth&&o?`rgba(${127.5+2*o}, ${127.5-2*o}, 255, 0.3)`:t.color,e.lineTo(r[0],Math.round(r[1]))}e.stroke(),t.fillPolygons&&(e.closePath(),e.fill())}}function V0(e,A=[],t){if(!(A===void 0||A.length===0)){if(!t.useCurves||A.length<=2){fe(e,A,t);return}e.moveTo(A[0][0],A[0][1]);for(let r=0;r1&&y[1].length>0){let x=s[1]>0?`#${s[1]}`:"",l=`${s[0]} ${x}: ${y[1]}`;r.shadowColor&&r.shadowColor!==""&&(o.fillStyle=r.shadowColor,o.fillText(l,8,2+a*r.lineHeight)),o.fillStyle=r.labelColor,o.fillText(l,6,0+a*r.lineHeight),a+=1}}}async function vA(e,A,t){var a,i,s,y;let r=U(h0,t);if(!A||!e)return;let o=u0(e);for(let x of A){o.font=r.font,o.strokeStyle=r.color,o.fillStyle=r.color,r.drawBoxes&&H0(o,x.box[0],x.box[1],x.box[2],x.box[3],r);let l=[];if(l.push(`face: ${Math.trunc(100*x.score)}%`),x.genderScore&&l.push(`${x.gender||""} ${Math.trunc(100*x.genderScore)}%`),x.age&&l.push(`age: ${x.age||""}`),x.iris&&l.push(`distance: ${x.iris}`),x.emotion&&x.emotion.length>0){let c=x.emotion.map(d=>`${Math.trunc(100*d.score)}% ${d.emotion}`);c.length>3&&(c.length=3),l.push(c.join(" "))}x.rotation&&x.rotation.angle&&x.rotation.gaze&&(x.rotation.angle.roll&&l.push(`roll: ${n5(x.rotation.angle.roll)}\xB0 yaw:${n5(x.rotation.angle.yaw)}\xB0 pitch:${n5(x.rotation.angle.pitch)}\xB0`),x.rotation.gaze.bearing&&l.push(`gaze: ${n5(x.rotation.gaze.bearing)}\xB0`)),l.length===0&&l.push("face"),o.fillStyle=r.color;for(let c=l.length-1;c>=0;c--){let d=Math.max(x.box[0],0),m=c*r.lineHeight+x.box[1];r.shadowColor&&r.shadowColor!==""&&(o.fillStyle=r.shadowColor,o.fillText(l[c],d+5,m+16)),o.fillStyle=r.labelColor,o.fillText(l[c],d+4,m+15)}if(o.lineWidth=1,x.mesh&&x.mesh.length>0){if(r.drawPoints)for(let c of x.mesh)de(o,c[0],c[1],c[2],r);if(r.drawPolygons){o.lineWidth=1;for(let c=0;cx.mesh[m]);fe(o,d,r)}if(x.annotations&&x.annotations.leftEyeIris){o.strokeStyle=r.useDepth?"rgba(255, 200, 255, 0.3)":r.color,o.beginPath();let c=Math.abs(x.annotations.leftEyeIris[3][0]-x.annotations.leftEyeIris[1][0])/2,d=Math.abs(x.annotations.leftEyeIris[4][1]-x.annotations.leftEyeIris[2][1])/2;o.ellipse(x.annotations.leftEyeIris[0][0],x.annotations.leftEyeIris[0][1],c,d,0,0,2*Math.PI),o.stroke(),r.fillPolygons&&(o.fillStyle=r.useDepth?"rgba(255, 255, 200, 0.3)":r.color,o.fill())}if(x.annotations&&x.annotations.rightEyeIris){o.strokeStyle=r.useDepth?"rgba(255, 200, 255, 0.3)":r.color,o.beginPath();let c=Math.abs(x.annotations.rightEyeIris[3][0]-x.annotations.rightEyeIris[1][0])/2,d=Math.abs(x.annotations.rightEyeIris[4][1]-x.annotations.rightEyeIris[2][1])/2;o.ellipse(x.annotations.rightEyeIris[0][0],x.annotations.rightEyeIris[0][1],c,d,0,0,2*Math.PI),o.stroke(),r.fillPolygons&&(o.fillStyle=r.useDepth?"rgba(255, 255, 200, 0.3)":r.color,o.fill())}if(r.drawGaze&&((i=(a=x.rotation)==null?void 0:a.gaze)==null?void 0:i.strength)&&((y=(s=x.rotation)==null?void 0:s.gaze)==null?void 0:y.bearing)&&x.annotations.leftEyeIris&&x.annotations.rightEyeIris&&x.annotations.leftEyeIris[0]&&x.annotations.rightEyeIris[0]){o.strokeStyle="pink",o.beginPath();let c=[x.annotations.leftEyeIris[0][0]+Math.sin(x.rotation.gaze.bearing)*x.rotation.gaze.strength*x.box[3],x.annotations.leftEyeIris[0][1]+Math.cos(x.rotation.gaze.bearing)*x.rotation.gaze.strength*x.box[2]];o.moveTo(x.annotations.leftEyeIris[0][0],x.annotations.leftEyeIris[0][1]),o.lineTo(c[0],c[1]);let d=[x.annotations.rightEyeIris[0][0]+Math.sin(x.rotation.gaze.bearing)*x.rotation.gaze.strength*x.box[3],x.annotations.rightEyeIris[0][1]+Math.cos(x.rotation.gaze.bearing)*x.rotation.gaze.strength*x.box[2]];o.moveTo(x.annotations.rightEyeIris[0][0],x.annotations.rightEyeIris[0][1]),o.lineTo(d[0],d[1]),o.stroke()}}}}}async function zA(e,A,t){var a;let r=U(h0,t);if(!A||!e)return;let o=u0(e);o.lineJoin="round";for(let i=0;ix.part==="leftShoulder"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightShoulder"),s&&y.push([s.position[0],s.position[1]]),V0(o,y,r),y.length=0,s=A[i].keypoints.find(x=>x.part==="rightShoulder"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightHip"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftHip"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftShoulder"),s&&y.push([s.position[0],s.position[1]]),y.length===4&&fe(o,y,r),y.length=0,s=A[i].keypoints.find(x=>x.part==="leftHip"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftKnee"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftAnkle"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftHeel"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftFoot"),s&&y.push([s.position[0],s.position[1]]),V0(o,y,r),y.length=0,s=A[i].keypoints.find(x=>x.part==="rightHip"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightKnee"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightAnkle"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightHeel"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightFoot"),s&&y.push([s.position[0],s.position[1]]),V0(o,y,r),y.length=0,s=A[i].keypoints.find(x=>x.part==="leftShoulder"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftElbow"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftWrist"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="leftPalm"),s&&y.push([s.position[0],s.position[1]]),V0(o,y,r),y.length=0,s=A[i].keypoints.find(x=>x.part==="rightShoulder"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightElbow"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightWrist"),s&&y.push([s.position[0],s.position[1]]),s=A[i].keypoints.find(x=>x.part==="rightPalm"),s&&y.push([s.position[0],s.position[1]]),V0(o,y,r)}}}async function EA(e,A,t){let r=U(h0,t);if(!A||!e)return;let o=u0(e);o.lineJoin="round",o.font=r.font;for(let a of A){if(r.drawBoxes&&(o.strokeStyle=r.color,o.fillStyle=r.color,H0(o,a.box[0],a.box[1],a.box[2],a.box[3],r),r.drawLabels&&(r.shadowColor&&r.shadowColor!==""&&(o.fillStyle=r.shadowColor,o.fillText("hand",a.box[0]+3,1+a.box[1]+r.lineHeight,a.box[2])),o.fillStyle=r.labelColor,o.fillText("hand",a.box[0]+2,0+a.box[1]+r.lineHeight,a.box[2])),o.stroke()),r.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let i of a.keypoints)o.fillStyle=r.useDepth?`rgba(${127.5+2*i[2]}, ${127.5-2*i[2]}, 255, 0.5)`:r.color,de(o,i[0],i[1],0,r);if(r.drawLabels){let i=(s,y)=>{!s||(o.fillStyle=r.useDepth?`rgba(${127.5+2*s[s.length-1][2]}, ${127.5-2*s[s.length-1][2]}, 255, 0.5)`:r.color,o.fillText(y,s[s.length-1][0]+4,s[s.length-1][1]+4))};o.font=r.font,i(a.annotations.index,"index"),i(a.annotations.middle,"middle"),i(a.annotations.ring,"ring"),i(a.annotations.pinky,"pinky"),i(a.annotations.thumb,"thumb"),i(a.annotations.palm,"palm")}if(r.drawPolygons){let i=s=>{if(!!s)for(let y=0;y0?y-1:0][0],s[y>0?y-1:0][1]),o.lineTo(s[y][0],s[y][1]),o.stroke()};o.lineWidth=r.lineWidth,i(a.annotations.index),i(a.annotations.middle),i(a.annotations.ring),i(a.annotations.pinky),i(a.annotations.thumb)}}}async function RA(e,A,t){let r=U(h0,t);if(!A||!e)return;let o=u0(e);o.lineJoin="round",o.font=r.font;for(let a of A)if(r.drawBoxes){if(o.strokeStyle=r.color,o.fillStyle=r.color,H0(o,a.box[0],a.box[1],a.box[2],a.box[3],r),r.drawLabels){let i=`${a.label} ${Math.round(100*a.score)}%`;r.shadowColor&&r.shadowColor!==""&&(o.fillStyle=r.shadowColor,o.fillText(i,a.box[0]+3,1+a.box[1]+r.lineHeight,a.box[2])),o.fillStyle=r.labelColor,o.fillText(i,a.box[0]+2,0+a.box[1]+r.lineHeight,a.box[2])}o.stroke()}}async function Et(e,A,t){let r=U(h0,t);if(!A||!e)return;let o=u0(e);o.lineJoin="round",o.font=r.font;for(let a=0;az.box[0]&&v.box[0]z.box[1]&&v.box[1]+v.box[3]h.body.box[0]&&z.box[0]+z.box[2]h.body.box[1]&&z.box[1]+z.box[3]h.body.box[0]&&z.box[1]+z.box[3]>h.body.box[1]&&z.box[1]+z.box[3]{z&&z.length===4&&(k.push(z[0],z[0]+z[2]),O.push(z[1],z[1]+z[3]))};H((u=h.face)==null?void 0:u.box),H((E=h.body)==null?void 0:E.box),H((I=(w=h.hands)==null?void 0:w.left)==null?void 0:I.box),H((g=(P=h.hands)==null?void 0:P.right)==null?void 0:g.box);let S=Math.min(...k),V=Math.min(...O);h.box=[S,V,Math.max(...k)-S,Math.max(...O)-V],o&&o[1]&&o[2]&&(h.boxRaw=[h.box[0]/o[2],h.box[1]/o[1],h.box[2]/o[2],h.box[3]/o[1]]),i.push(h)}return i}var j={face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};function jA(e){var r,o,a,i,s,y,x,l,c,d,m,T,f,p,u,E,w,I,P,g,v;if(!e)return{face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0};let A=Date.now()-e.timestamp,t=A<1e3?8-Math.log(A+1):1;if(j.canvas=e.canvas,!j.body||e.body.length!==j.body.length)j.body=JSON.parse(JSON.stringify(e.body));else for(let h=0;h((t-1)*j.body[h].box[V]+S)/t),O=e.body[h].boxRaw.map((S,V)=>((t-1)*j.body[h].boxRaw[V]+S)/t),H=e.body[h].keypoints.map((S,V)=>({score:S.score,part:S.part,position:[j.body[h].keypoints[V]?((t-1)*j.body[h].keypoints[V].position[0]+S.position[0])/t:S.position[0],j.body[h].keypoints[V]?((t-1)*j.body[h].keypoints[V].position[1]+S.position[1])/t:S.position[1]],positionRaw:[j.body[h].keypoints[V]?((t-1)*j.body[h].keypoints[V].positionRaw[0]+S.positionRaw[0])/t:S.position[0],j.body[h].keypoints[V]?((t-1)*j.body[h].keypoints[V].positionRaw[1]+S.positionRaw[1])/t:S.position[1]]}));j.body[h]={...e.body[h],box:k,boxRaw:O,keypoints:H}}if(!j.hand||e.hand.length!==j.hand.length)j.hand=JSON.parse(JSON.stringify(e.hand));else for(let h=0;h((t-1)*j.hand[h].box[$]+z)/t),O=e.hand[h].boxRaw.map((z,$)=>((t-1)*j.hand[h].boxRaw[$]+z)/t),H=e.hand[h].keypoints?e.hand[h].keypoints.map((z,$)=>z.map((c5,d5)=>((t-1)*j.hand[h].keypoints[$][d5]+c5)/t)):[],S=Object.keys(e.hand[h].annotations),V={};for(let z of S)V[z]=e.hand[h].annotations[z].map(($,c5)=>$.map((d5,SA)=>((t-1)*j.hand[h].annotations[z][c5][SA]+d5)/t));j.hand[h]={...e.hand[h],box:k,boxRaw:O,keypoints:H,annotations:V}}if(!j.face||e.face.length!==j.face.length)j.face=JSON.parse(JSON.stringify(e.face));else for(let h=0;h((t-1)*j.face[h].box[V]+S)/t),O=e.face[h].boxRaw.map((S,V)=>((t-1)*j.face[h].boxRaw[V]+S)/t),H={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};H.matrix=(r=e.face[h].rotation)==null?void 0:r.matrix,H.angle={roll:((t-1)*(((a=(o=j.face[h].rotation)==null?void 0:o.angle)==null?void 0:a.roll)||0)+(((s=(i=e.face[h].rotation)==null?void 0:i.angle)==null?void 0:s.roll)||0))/t,yaw:((t-1)*(((x=(y=j.face[h].rotation)==null?void 0:y.angle)==null?void 0:x.yaw)||0)+(((c=(l=e.face[h].rotation)==null?void 0:l.angle)==null?void 0:c.yaw)||0))/t,pitch:((t-1)*(((m=(d=j.face[h].rotation)==null?void 0:d.angle)==null?void 0:m.pitch)||0)+(((f=(T=e.face[h].rotation)==null?void 0:T.angle)==null?void 0:f.pitch)||0))/t},H.gaze={bearing:((t-1)*(((u=(p=j.face[h].rotation)==null?void 0:p.gaze)==null?void 0:u.bearing)||0)+(((w=(E=e.face[h].rotation)==null?void 0:E.gaze)==null?void 0:w.bearing)||0))/t,strength:((t-1)*(((P=(I=j.face[h].rotation)==null?void 0:I.gaze)==null?void 0:P.strength)||0)+(((v=(g=e.face[h].rotation)==null?void 0:g.gaze)==null?void 0:v.strength)||0))/t},j.face[h]={...e.face[h],rotation:H,box:k,boxRaw:O}}if(!j.object||e.object.length!==j.object.length)j.object=JSON.parse(JSON.stringify(e.object));else for(let h=0;h((t-1)*j.object[h].box[S]+H)/t),O=e.object[h].boxRaw.map((H,S)=>((t-1)*j.object[h].boxRaw[S]+H)/t);j.object[h]={...e.object[h],box:k,boxRaw:O}}if(e.persons){let h=e.persons;if(!j.persons||h.length!==j.persons.length)j.persons=JSON.parse(JSON.stringify(h));else for(let k=0;k((t-1)*j.persons[k].box[H]+O)/t)}return e.gesture&&(j.gesture=e.gesture),e.performance&&(j.performance=e.performance),j}var o5=` +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __export = (target, all2) => { + __markAsModule(target); + for (var name in all2) + __defProp(target, name, { get: all2[name], enumerable: true }); +}; +var __reExport = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable }); + } + return target; +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/helpers.ts +function join(folder, file) { + const separator = folder.endsWith("/") ? "" : "/"; + const skipJoin = file.startsWith(".") || file.startsWith("/") || file.startsWith("http:") || file.startsWith("https:") || file.startsWith("file:"); + const path = skipJoin ? `${file}` : `${folder}${separator}${file}`; + if (!path.toLocaleLowerCase().includes(".json")) + throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`); + return path; +} +function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/config.ts +var config = { + backend: "webgl", + modelBasePath: "../models/", + wasmPath: "", + debug: true, + async: true, + warmup: "full", + cacheSensitivity: 0.75, + skipFrame: false, + filter: { + enabled: true, + width: 0, + height: 0, + flip: false, + return: true, + brightness: 0, + contrast: 0, + sharpness: 0, + blur: 0, + saturation: 0, + hue: 0, + negative: false, + sepia: false, + vintage: false, + kodachrome: false, + technicolor: false, + polaroid: false, + pixelate: 0 + }, + gesture: { + enabled: true + }, + face: { + enabled: true, + detector: { + modelPath: "blazeface.json", + rotation: true, + maxDetected: 15, + skipFrames: 15, + minConfidence: 0.2, + iouThreshold: 0.1, + return: false + }, + mesh: { + enabled: true, + modelPath: "facemesh.json" + }, + iris: { + enabled: true, + modelPath: "iris.json" + }, + description: { + enabled: true, + modelPath: "faceres.json", + skipFrames: 11, + minConfidence: 0.1 + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 17, + modelPath: "emotion.json" + } + }, + body: { + enabled: true, + modelPath: "movenet-lightning.json", + maxDetected: 1, + minConfidence: 0.2, + skipFrames: 1 + }, + hand: { + enabled: true, + rotation: true, + skipFrames: 18, + minConfidence: 0.8, + iouThreshold: 0.2, + maxDetected: 1, + landmarks: true, + detector: { + modelPath: "handdetect.json" + }, + skeleton: { + modelPath: "handskeleton.json" + } + }, + object: { + enabled: false, + modelPath: "mb3-centernet.json", + minConfidence: 0.2, + iouThreshold: 0.4, + maxDetected: 10, + skipFrames: 19 + }, + segmentation: { + enabled: false, + modelPath: "selfie.json" + } +}; + +// src/sysinfo.ts +function info() { + let platform = ""; + let agent = ""; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + const platformMatch = raw[0].match(/\(([^()]+)\)/g); + platform = platformMatch && platformMatch[0] ? platformMatch[0].replace(/\(|\)/g, "") : ""; + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return { platform, agent }; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + data: () => data, + version: () => version +}); +__reExport(tfjs_esm_exports, dist_star); +__reExport(tfjs_esm_exports, dist_star2); +__reExport(tfjs_esm_exports, dist_star3); +__reExport(tfjs_esm_exports, dist_star4); +__reExport(tfjs_esm_exports, dist_star5); +__reExport(tfjs_esm_exports, dist_star6); +import { version as tfjsVersion } from "@tensorflow/tfjs/package.json"; +import { version as tfjsCoreVersion } from "@tensorflow/tfjs-core/package.json"; +import { version as tfjsDataVersion } from "@tensorflow/tfjs-data/package.json"; +import { version as tfjsLayersVersion } from "@tensorflow/tfjs-layers/package.json"; +import { version as tfjsConverterVersion } from "@tensorflow/tfjs-converter/package.json"; +import { version as tfjsBackendCPUVersion } from "@tensorflow/tfjs-backend-cpu/package.json"; +import { version as tfjsBackendWebGLVersion } from "@tensorflow/tfjs-backend-webgl/package.json"; +import { version as tfjsBackendWASMVersion } from "@tensorflow/tfjs-backend-wasm/package.json"; +import * as dist_star from "@tensorflow/tfjs-core/dist/index.js"; +import * as dist_star2 from "@tensorflow/tfjs-layers/dist/index.js"; +import * as dist_star3 from "@tensorflow/tfjs-converter/dist/index.js"; +import * as data from "@tensorflow/tfjs-data/dist/index.js"; +import * as dist_star4 from "@tensorflow/tfjs-backend-cpu/dist/index.js"; +import * as dist_star5 from "@tensorflow/tfjs-backend-webgl/dist/index.js"; +import * as dist_star6 from "@tensorflow/tfjs-backend-wasm/dist/index.js"; +var version = { + tfjs: tfjsVersion, + "tfjs-core": tfjsCoreVersion, + "tfjs-data": tfjsDataVersion, + "tfjs-layers": tfjsLayersVersion, + "tfjs-converter": tfjsConverterVersion, + "tfjs-backend-cpu": tfjsBackendCPUVersion, + "tfjs-backend-webgl": tfjsBackendWebGLVersion, + "tfjs-backend-wasm": tfjsBackendWASMVersion +}; + +// src/tfjs/backend.ts +var config2 = { + name: "humangl", + priority: 99, + canvas: null, + gl: null, + width: 1024, + height: 1024, + extensions: [], + webGLattr: { + alpha: false, + antialias: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + depth: false, + stencil: false, + failIfMajorPerformanceCaveat: false, + desynchronized: true + } +}; +function extensions() { + const gl = config2.gl; + if (!gl) + return; + config2.extensions = gl.getSupportedExtensions(); +} +function register() { + if (!tfjs_esm_exports.findBackend(config2.name)) { + try { + config2.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config2.width, config2.height) : document.createElement("canvas"); + } catch (err) { + log("error: cannot create canvas:", err); + return; + } + try { + config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr); + } catch (err) { + log("error: cannot get WebGL2 context:", err); + return; + } + try { + tfjs_esm_exports.setWebGLContext(2, config2.gl); + } catch (err) { + log("error: cannot set WebGL2 context:", err); + return; + } + try { + const ctx = new tfjs_esm_exports.GPGPUContext(config2.gl); + tfjs_esm_exports.registerBackend(config2.name, () => new tfjs_esm_exports.MathBackendWebGL(ctx), config2.priority); + } catch (err) { + log("error: cannot register WebGL backend:", err); + return; + } + try { + const kernels = tfjs_esm_exports.getKernelsForBackend("webgl"); + kernels.forEach((kernelConfig) => { + const newKernelConfig = { ...kernelConfig, backendName: config2.name }; + tfjs_esm_exports.registerKernel(newKernelConfig); + }); + } catch (err) { + log("error: cannot update WebGL backend registration:", err); + return; + } + try { + tfjs_esm_exports.ENV.set("WEBGL_VERSION", 2); + } catch (err) { + log("error: cannot set WebGL backend flags:", err); + return; + } + extensions(); + log("backend registered:", config2.name); + } +} + +// src/blazeface/box.ts +function scaleBoxCoordinates(box6, factor) { + const startPoint = [box6.startPoint[0] * factor[0], box6.startPoint[1] * factor[1]]; + const endPoint = [box6.endPoint[0] * factor[0], box6.endPoint[1] * factor[1]]; + return { startPoint, endPoint }; +} +function getBoxSize(box6) { + return [ + Math.abs(box6.endPoint[0] - box6.startPoint[0]), + Math.abs(box6.endPoint[1] - box6.startPoint[1]) + ]; +} +function getBoxCenter(box6) { + return [ + box6.startPoint[0] + (box6.endPoint[0] - box6.startPoint[0]) / 2, + box6.startPoint[1] + (box6.endPoint[1] - box6.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize(box6, image18, cropSize) { + const h = image18.shape[1]; + const w = image18.shape[2]; + const boxes = [[ + box6.startPoint[1] / h, + box6.startPoint[0] / w, + box6.endPoint[1] / h, + box6.endPoint[0] / w + ]]; + return tfjs_esm_exports.image.cropAndResize(image18, boxes, [0], cropSize); +} +function enlargeBox(box6, factor = 1.5) { + const center = getBoxCenter(box6); + const size = getBoxSize(box6); + const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; + const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; + const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; + return { startPoint, endPoint, landmarks: box6.landmarks }; +} +function squarifyBox(box6) { + const centers = getBoxCenter(box6); + const size = getBoxSize(box6); + const maxEdge = Math.max(...size); + const halfSize = maxEdge / 2; + const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)]; + const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)]; + return { startPoint, endPoint, landmarks: box6.landmarks }; +} +function calculateLandmarksBoundingBox(landmarks) { + const xs = landmarks.map((d) => d[0]); + const ys = landmarks.map((d) => d[1]); + const startPoint = [Math.min(...xs), Math.min(...ys)]; + const endPoint = [Math.max(...xs), Math.max(...ys)]; + return { startPoint, endPoint, landmarks }; +} +var createBox = (startEndTensor) => ({ + startPoint: tfjs_esm_exports.slice(startEndTensor, [0, 0], [-1, 2]), + endPoint: tfjs_esm_exports.slice(startEndTensor, [0, 2], [-1, 2]) +}); + +// src/blazeface/util.ts +var IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; +function normalizeRadians(angle) { + return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); +} +function computeRotation(point1, point2) { + const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); + return normalizeRadians(radians); +} +function buildTranslationMatrix(x, y) { + return [[1, 0, x], [0, 1, y], [0, 0, 1]]; +} +function dot(v1, v2) { + let product = 0; + for (let i = 0; i < v1.length; i++) { + product += v1[i] * v2[i]; + } + return product; +} +function getColumnFrom2DArr(arr, columnIndex) { + const column = []; + for (let i = 0; i < arr.length; i++) { + column.push(arr[i][columnIndex]); + } + return column; +} +function multiplyTransformMatrices(mat1, mat2) { + const product = []; + const size = mat1.length; + for (let row = 0; row < size; row++) { + product.push([]); + for (let col = 0; col < size; col++) { + product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col))); + } + } + return product; +} +function buildRotationMatrix(rotation, center) { + const cosA = Math.cos(rotation); + const sinA = Math.sin(rotation); + const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; + const translationMatrix = buildTranslationMatrix(center[0], center[1]); + const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix); + const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]); + return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix); +} +function invertTransformMatrix(matrix) { + const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; + const translationComponent = [matrix[0][2], matrix[1][2]]; + const invertedTranslation = [ + -dot(rotationComponent[0], translationComponent), + -dot(rotationComponent[1], translationComponent) + ]; + return [ + rotationComponent[0].concat(invertedTranslation[0]), + rotationComponent[1].concat(invertedTranslation[1]), + [0, 0, 1] + ]; +} +function rotatePoint(homogeneousCoordinate, rotationMatrix) { + return [ + dot(homogeneousCoordinate, rotationMatrix[0]), + dot(homogeneousCoordinate, rotationMatrix[1]) + ]; +} +function generateAnchors(inputSize) { + const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] }; + const anchors3 = []; + for (let i = 0; i < spec.strides.length; i++) { + const stride = spec.strides[i]; + const gridRows = Math.floor((inputSize + stride - 1) / stride); + const gridCols = Math.floor((inputSize + stride - 1) / stride); + const anchorsNum = spec.anchors[i]; + for (let gridY = 0; gridY < gridRows; gridY++) { + const anchorY = stride * (gridY + 0.5); + for (let gridX = 0; gridX < gridCols; gridX++) { + const anchorX = stride * (gridX + 0.5); + for (let n = 0; n < anchorsNum; n++) { + anchors3.push([anchorX, anchorY]); + } + } + } + } + return anchors3; +} + +// src/blazeface/blazeface.ts +var keypointsCount = 6; +function decodeBounds(boxOutputs, anchors3, inputSize) { + const boxStarts = tfjs_esm_exports.slice(boxOutputs, [0, 1], [-1, 2]); + const centers = tfjs_esm_exports.add(boxStarts, anchors3); + const boxSizes = tfjs_esm_exports.slice(boxOutputs, [0, 3], [-1, 2]); + const boxSizesNormalized = tfjs_esm_exports.div(boxSizes, inputSize); + const centersNormalized = tfjs_esm_exports.div(centers, inputSize); + const halfBoxSize = tfjs_esm_exports.div(boxSizesNormalized, 2); + const starts = tfjs_esm_exports.sub(centersNormalized, halfBoxSize); + const ends = tfjs_esm_exports.add(centersNormalized, halfBoxSize); + const startNormalized = tfjs_esm_exports.mul(starts, inputSize); + const endNormalized = tfjs_esm_exports.mul(ends, inputSize); + const concatAxis = 1; + return tfjs_esm_exports.concat2d([startNormalized, endNormalized], concatAxis); +} +var BlazeFaceModel = class { + constructor(model10, config3) { + this.model = model10; + this.anchorsData = generateAnchors(model10.inputs[0].shape[1]); + this.anchors = tfjs_esm_exports.tensor2d(this.anchorsData); + this.inputSize = model10.inputs[0].shape[2]; + this.config = config3; + } + async getBoundingBoxes(inputImage, userConfig) { + if (!inputImage || inputImage["isDisposedInternal"] || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) + return null; + const [batch, boxes, scores] = tfjs_esm_exports.tidy(() => { + const resizedImage = tfjs_esm_exports.image.resizeBilinear(inputImage, [this.inputSize, this.inputSize]); + const normalizedImage = tfjs_esm_exports.sub(tfjs_esm_exports.div(resizedImage, 127.5), 0.5); + const res = this.model.execute(normalizedImage); + let batchOut; + if (Array.isArray(res)) { + const sorted = res.sort((a, b) => a.size - b.size); + const concat384 = tfjs_esm_exports.concat([sorted[0], sorted[2]], 2); + const concat512 = tfjs_esm_exports.concat([sorted[1], sorted[3]], 2); + const concat3 = tfjs_esm_exports.concat([concat512, concat384], 1); + batchOut = tfjs_esm_exports.squeeze(concat3, 0); + } else { + batchOut = tfjs_esm_exports.squeeze(res); + } + const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]); + const logits = tfjs_esm_exports.slice(batchOut, [0, 0], [-1, 1]); + const scoresOut = tfjs_esm_exports.squeeze(tfjs_esm_exports.sigmoid(logits)); + return [batchOut, boxesOut, scoresOut]; + }); + this.config = mergeDeep(this.config, userConfig); + const nmsTensor = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence); + const nms = await nmsTensor.array(); + tfjs_esm_exports.dispose(nmsTensor); + const annotatedBoxes = []; + const scoresData = await scores.data(); + for (let i = 0; i < nms.length; i++) { + const confidence = scoresData[nms[i]]; + if (confidence > this.config.face.detector.minConfidence) { + const boundingBox = tfjs_esm_exports.slice(boxes, [nms[i], 0], [1, -1]); + const localBox = createBox(boundingBox); + tfjs_esm_exports.dispose(boundingBox); + const anchor = this.anchorsData[nms[i]]; + const landmarks = tfjs_esm_exports.tidy(() => tfjs_esm_exports.reshape(tfjs_esm_exports.squeeze(tfjs_esm_exports.slice(batch, [nms[i], keypointsCount - 1], [1, -1])), [keypointsCount, -1])); + annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence }); + } + } + tfjs_esm_exports.dispose(batch); + tfjs_esm_exports.dispose(boxes); + tfjs_esm_exports.dispose(scores); + return { + boxes: annotatedBoxes, + scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize] + }; + } +}; +async function load(config3) { + const model10 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.detector.modelPath), { fromTFHub: config3.face.detector.modelPath.includes("tfhub.dev") }); + const blazeFace = new BlazeFaceModel(model10, config3); + if (!model10 || !model10.modelUrl) + log("load model failed:", config3.face.detector.modelPath); + else if (config3.debug) + log("load model:", model10.modelUrl); + return blazeFace; +} + +// src/blazeface/coords.ts +var MESH_ANNOTATIONS = { + silhouette: [ + 10, + 338, + 297, + 332, + 284, + 251, + 389, + 356, + 454, + 323, + 361, + 288, + 397, + 365, + 379, + 378, + 400, + 377, + 152, + 148, + 176, + 149, + 150, + 136, + 172, + 58, + 132, + 93, + 234, + 127, + 162, + 21, + 54, + 103, + 67, + 109 + ], + lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291], + lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], + lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], + lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], + rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], + rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], + rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], + rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], + rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], + rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], + rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], + rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], + rightEyebrowLower: [35, 124, 46, 53, 52, 65], + rightEyeIris: [473, 474, 475, 476, 477], + leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398], + leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362], + leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414], + leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463], + leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413], + leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464], + leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465], + leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417], + leftEyebrowLower: [265, 353, 276, 283, 282, 295], + leftEyeIris: [468, 469, 470, 471, 472], + midwayBetweenEyes: [168], + noseTip: [1], + noseBottom: [2], + noseRightCorner: [98], + noseLeftCorner: [327], + rightCheek: [205], + leftCheek: [425] +}; +var MESH_TO_IRIS_INDICES_MAP = [ + { key: "EyeUpper0", indices: [9, 10, 11, 12, 13, 14, 15] }, + { key: "EyeUpper1", indices: [25, 26, 27, 28, 29, 30, 31] }, + { key: "EyeUpper2", indices: [41, 42, 43, 44, 45, 46, 47] }, + { key: "EyeLower0", indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, + { key: "EyeLower1", indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, + { key: "EyeLower2", indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, + { key: "EyeLower3", indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] } +]; +var UV468 = [ + [0.499976992607117, 0.652534008026123], + [0.500025987625122, 0.547487020492554], + [0.499974012374878, 0.602371990680695], + [0.482113003730774, 0.471979022026062], + [0.500150978565216, 0.527155995368958], + [0.499909996986389, 0.498252987861633], + [0.499523013830185, 0.40106201171875], + [0.289712011814117, 0.380764007568359], + [0.499954998493195, 0.312398016452789], + [0.499987006187439, 0.269918978214264], + [0.500023007392883, 0.107050001621246], + [0.500023007392883, 0.666234016418457], + [0.5000159740448, 0.679224014282227], + [0.500023007392883, 0.692348003387451], + [0.499976992607117, 0.695277988910675], + [0.499976992607117, 0.70593398809433], + [0.499976992607117, 0.719385027885437], + [0.499976992607117, 0.737019002437592], + [0.499967992305756, 0.781370997428894], + [0.499816000461578, 0.562981009483337], + [0.473773002624512, 0.573909997940063], + [0.104906998574734, 0.254140973091125], + [0.365929991006851, 0.409575998783112], + [0.338757991790771, 0.41302502155304], + [0.311120003461838, 0.409460008144379], + [0.274657994508743, 0.389131009578705], + [0.393361985683441, 0.403706014156342], + [0.345234006643295, 0.344011008739471], + [0.370094001293182, 0.346076011657715], + [0.319321990013123, 0.347265005111694], + [0.297903001308441, 0.353591024875641], + [0.24779200553894, 0.410809993743896], + [0.396889001131058, 0.842755019664764], + [0.280097991228104, 0.375599980354309], + [0.106310002505779, 0.399955987930298], + [0.2099249958992, 0.391353011131287], + [0.355807989835739, 0.534406006336212], + [0.471751004457474, 0.65040397644043], + [0.474155008792877, 0.680191993713379], + [0.439785003662109, 0.657229006290436], + [0.414617002010345, 0.66654098033905], + [0.450374007225037, 0.680860996246338], + [0.428770989179611, 0.682690978050232], + [0.374971002340317, 0.727805018424988], + [0.486716985702515, 0.547628998756409], + [0.485300987958908, 0.527395009994507], + [0.257764995098114, 0.314490020275116], + [0.401223003864288, 0.455172002315521], + [0.429818987846375, 0.548614978790283], + [0.421351999044418, 0.533740997314453], + [0.276895999908447, 0.532056987285614], + [0.483370006084442, 0.499586999416351], + [0.33721199631691, 0.282882988452911], + [0.296391993761063, 0.293242990970612], + [0.169294998049736, 0.193813979625702], + [0.447580009698868, 0.302609980106354], + [0.392390012741089, 0.353887975215912], + [0.354490011930466, 0.696784019470215], + [0.067304998636246, 0.730105042457581], + [0.442739009857178, 0.572826027870178], + [0.457098007202148, 0.584792017936707], + [0.381974011659622, 0.694710969924927], + [0.392388999462128, 0.694203019142151], + [0.277076005935669, 0.271932005882263], + [0.422551989555359, 0.563233017921448], + [0.385919004678726, 0.281364023685455], + [0.383103013038635, 0.255840003490448], + [0.331431001424789, 0.119714021682739], + [0.229923993349075, 0.232002973556519], + [0.364500999450684, 0.189113974571228], + [0.229622006416321, 0.299540996551514], + [0.173287004232407, 0.278747975826263], + [0.472878992557526, 0.666198015213013], + [0.446828007698059, 0.668527007102966], + [0.422762006521225, 0.673889994621277], + [0.445307999849319, 0.580065965652466], + [0.388103008270264, 0.693961024284363], + [0.403039008378983, 0.706539988517761], + [0.403629004955292, 0.693953037261963], + [0.460041999816895, 0.557139039039612], + [0.431158006191254, 0.692366003990173], + [0.452181994915009, 0.692366003990173], + [0.475387006998062, 0.692366003990173], + [0.465828001499176, 0.779190003871918], + [0.472328990697861, 0.736225962638855], + [0.473087012767792, 0.717857003211975], + [0.473122000694275, 0.704625964164734], + [0.473033010959625, 0.695277988910675], + [0.427942007780075, 0.695277988910675], + [0.426479011774063, 0.703539967536926], + [0.423162013292313, 0.711845993995667], + [0.4183090031147, 0.720062971115112], + [0.390094995498657, 0.639572978019714], + [0.013953999616206, 0.560034036636353], + [0.499913990497589, 0.58014702796936], + [0.413199990987778, 0.69539999961853], + [0.409626007080078, 0.701822996139526], + [0.468080013990402, 0.601534962654114], + [0.422728985548019, 0.585985004901886], + [0.463079988956451, 0.593783974647522], + [0.37211999297142, 0.47341400384903], + [0.334562003612518, 0.496073007583618], + [0.411671012639999, 0.546965003013611], + [0.242175996303558, 0.14767599105835], + [0.290776997804642, 0.201445996761322], + [0.327338010072708, 0.256527006626129], + [0.399509996175766, 0.748921036720276], + [0.441727995872498, 0.261676013469696], + [0.429764986038208, 0.187834024429321], + [0.412198007106781, 0.108901023864746], + [0.288955003023148, 0.398952007293701], + [0.218936994671822, 0.435410976409912], + [0.41278201341629, 0.398970007896423], + [0.257135003805161, 0.355440020561218], + [0.427684992551804, 0.437960982322693], + [0.448339998722076, 0.536936044692993], + [0.178560003638268, 0.45755398273468], + [0.247308000922203, 0.457193970680237], + [0.286267012357712, 0.467674970626831], + [0.332827985286713, 0.460712015628815], + [0.368755996227264, 0.447206974029541], + [0.398963987827301, 0.432654976844788], + [0.476410001516342, 0.405806005001068], + [0.189241006970406, 0.523923993110657], + [0.228962004184723, 0.348950982093811], + [0.490725994110107, 0.562400996685028], + [0.404670000076294, 0.485132992267609], + [0.019469000399113, 0.401564002037048], + [0.426243007183075, 0.420431017875671], + [0.396993011236191, 0.548797011375427], + [0.266469985246658, 0.376977026462555], + [0.439121007919312, 0.51895797252655], + [0.032313998788595, 0.644356966018677], + [0.419054001569748, 0.387154996395111], + [0.462783008813858, 0.505746960639954], + [0.238978996872902, 0.779744982719421], + [0.198220998048782, 0.831938028335571], + [0.107550002634525, 0.540755033493042], + [0.183610007166862, 0.740257024765015], + [0.134409993886948, 0.333683013916016], + [0.385764002799988, 0.883153975009918], + [0.490967005491257, 0.579378008842468], + [0.382384985685349, 0.508572995662689], + [0.174399003386497, 0.397670984268188], + [0.318785011768341, 0.39623498916626], + [0.343364000320435, 0.400596976280212], + [0.396100014448166, 0.710216999053955], + [0.187885001301765, 0.588537991046906], + [0.430987000465393, 0.944064974784851], + [0.318993002176285, 0.898285031318665], + [0.266247987747192, 0.869701027870178], + [0.500023007392883, 0.190576016902924], + [0.499976992607117, 0.954452991485596], + [0.366169989109039, 0.398822009563446], + [0.393207013607025, 0.39553701877594], + [0.410373002290726, 0.391080021858215], + [0.194993004202843, 0.342101991176605], + [0.388664990663528, 0.362284004688263], + [0.365961998701096, 0.355970978736877], + [0.343364000320435, 0.355356991291046], + [0.318785011768341, 0.35834002494812], + [0.301414996385574, 0.363156020641327], + [0.058132998645306, 0.319076001644135], + [0.301414996385574, 0.387449026107788], + [0.499987989664078, 0.618434011936188], + [0.415838003158569, 0.624195992946625], + [0.445681989192963, 0.566076993942261], + [0.465844005346298, 0.620640993118286], + [0.49992299079895, 0.351523995399475], + [0.288718998432159, 0.819945991039276], + [0.335278987884521, 0.852819979190826], + [0.440512001514435, 0.902418971061707], + [0.128294005990028, 0.791940987110138], + [0.408771991729736, 0.373893976211548], + [0.455606997013092, 0.451801002025604], + [0.499877005815506, 0.908990025520325], + [0.375436991453171, 0.924192011356354], + [0.11421000212431, 0.615022003650665], + [0.448662012815475, 0.695277988910675], + [0.4480200111866, 0.704632043838501], + [0.447111994028091, 0.715808033943176], + [0.444831997156143, 0.730794012546539], + [0.430011987686157, 0.766808986663818], + [0.406787008047104, 0.685672998428345], + [0.400738000869751, 0.681069016456604], + [0.392399996519089, 0.677703022956848], + [0.367855995893478, 0.663918972015381], + [0.247923001646996, 0.601333022117615], + [0.452769994735718, 0.420849978923798], + [0.43639200925827, 0.359887003898621], + [0.416164010763168, 0.368713974952698], + [0.413385987281799, 0.692366003990173], + [0.228018000721931, 0.683571994304657], + [0.468268007040024, 0.352671027183533], + [0.411361992359161, 0.804327011108398], + [0.499989002943039, 0.469825029373169], + [0.479153990745544, 0.442654013633728], + [0.499974012374878, 0.439637005329132], + [0.432112008333206, 0.493588984012604], + [0.499886006116867, 0.866917014122009], + [0.49991300702095, 0.821729004383087], + [0.456548988819122, 0.819200992584229], + [0.344549000263214, 0.745438992977142], + [0.37890899181366, 0.574010014533997], + [0.374292999505997, 0.780184984207153], + [0.319687992334366, 0.570737957954407], + [0.357154995203018, 0.604269981384277], + [0.295284003019333, 0.621580958366394], + [0.447750002145767, 0.862477004528046], + [0.410986006259918, 0.508723020553589], + [0.31395098567009, 0.775308012962341], + [0.354128003120422, 0.812552988529205], + [0.324548006057739, 0.703992962837219], + [0.189096003770828, 0.646299958229065], + [0.279776990413666, 0.71465802192688], + [0.1338230073452, 0.682700991630554], + [0.336768001317978, 0.644733011722565], + [0.429883986711502, 0.466521978378296], + [0.455527991056442, 0.548622965812683], + [0.437114000320435, 0.558896005153656], + [0.467287987470627, 0.529924988746643], + [0.414712011814117, 0.335219979286194], + [0.37704598903656, 0.322777986526489], + [0.344107985496521, 0.320150971412659], + [0.312875986099243, 0.32233202457428], + [0.283526003360748, 0.333190023899078], + [0.241245999932289, 0.382785975933075], + [0.102986000478268, 0.468762993812561], + [0.267612010240555, 0.424560010433197], + [0.297879010438919, 0.433175981044769], + [0.333433985710144, 0.433878004550934], + [0.366427004337311, 0.426115989685059], + [0.396012008190155, 0.416696012020111], + [0.420121014118195, 0.41022801399231], + [0.007561000064015, 0.480777025222778], + [0.432949006557465, 0.569517970085144], + [0.458638995885849, 0.479089021682739], + [0.473466008901596, 0.545744001865387], + [0.476087987422943, 0.563830018043518], + [0.468472003936768, 0.555056989192963], + [0.433990985155106, 0.582361996173859], + [0.483518004417419, 0.562983989715576], + [0.482482999563217, 0.57784903049469], + [0.42645001411438, 0.389798998832703], + [0.438998997211456, 0.39649498462677], + [0.450067013502121, 0.400434017181396], + [0.289712011814117, 0.368252992630005], + [0.276670008897781, 0.363372981548309], + [0.517862021923065, 0.471948027610779], + [0.710287988185883, 0.380764007568359], + [0.526226997375488, 0.573909997940063], + [0.895093023777008, 0.254140973091125], + [0.634069979190826, 0.409575998783112], + [0.661242008209229, 0.41302502155304], + [0.688880026340485, 0.409460008144379], + [0.725341975688934, 0.389131009578705], + [0.606630027294159, 0.40370500087738], + [0.654766023159027, 0.344011008739471], + [0.629905998706818, 0.346076011657715], + [0.680678009986877, 0.347265005111694], + [0.702096998691559, 0.353591024875641], + [0.75221198797226, 0.410804986953735], + [0.602918028831482, 0.842862963676453], + [0.719901978969574, 0.375599980354309], + [0.893692970275879, 0.399959981441498], + [0.790081977844238, 0.391354024410248], + [0.643998026847839, 0.534487962722778], + [0.528249025344849, 0.65040397644043], + [0.525849997997284, 0.680191040039062], + [0.560214996337891, 0.657229006290436], + [0.585384011268616, 0.66654098033905], + [0.549625992774963, 0.680860996246338], + [0.57122802734375, 0.682691991329193], + [0.624852001667023, 0.72809898853302], + [0.513050019741058, 0.547281980514526], + [0.51509702205658, 0.527251958847046], + [0.742246985435486, 0.314507007598877], + [0.598631024360657, 0.454979002475739], + [0.570338010787964, 0.548575043678284], + [0.578631997108459, 0.533622980117798], + [0.723087012767792, 0.532054007053375], + [0.516445994377136, 0.499638974666595], + [0.662801027297974, 0.282917976379395], + [0.70362401008606, 0.293271005153656], + [0.830704987049103, 0.193813979625702], + [0.552385985851288, 0.302568018436432], + [0.607609987258911, 0.353887975215912], + [0.645429015159607, 0.696707010269165], + [0.932694971561432, 0.730105042457581], + [0.557260990142822, 0.572826027870178], + [0.542901992797852, 0.584792017936707], + [0.6180260181427, 0.694710969924927], + [0.607590973377228, 0.694203019142151], + [0.722943007946014, 0.271963000297546], + [0.577413976192474, 0.563166975975037], + [0.614082992076874, 0.281386971473694], + [0.616907000541687, 0.255886018276215], + [0.668509006500244, 0.119913995265961], + [0.770092010498047, 0.232020974159241], + [0.635536015033722, 0.189248979091644], + [0.77039098739624, 0.299556016921997], + [0.826722025871277, 0.278755009174347], + [0.527121007442474, 0.666198015213013], + [0.553171992301941, 0.668527007102966], + [0.577238023281097, 0.673889994621277], + [0.554691970348358, 0.580065965652466], + [0.611896991729736, 0.693961024284363], + [0.59696102142334, 0.706539988517761], + [0.596370995044708, 0.693953037261963], + [0.539958000183105, 0.557139039039612], + [0.568841993808746, 0.692366003990173], + [0.547818005084991, 0.692366003990173], + [0.52461302280426, 0.692366003990173], + [0.534089982509613, 0.779141008853912], + [0.527670979499817, 0.736225962638855], + [0.526912987232208, 0.717857003211975], + [0.526877999305725, 0.704625964164734], + [0.526966989040375, 0.695277988910675], + [0.572058022022247, 0.695277988910675], + [0.573521018028259, 0.703539967536926], + [0.57683801651001, 0.711845993995667], + [0.581691026687622, 0.720062971115112], + [0.609944999217987, 0.639909982681274], + [0.986046016216278, 0.560034036636353], + [0.5867999792099, 0.69539999961853], + [0.590372025966644, 0.701822996139526], + [0.531915009021759, 0.601536989212036], + [0.577268004417419, 0.585934996604919], + [0.536915004253387, 0.593786001205444], + [0.627542972564697, 0.473352015018463], + [0.665585994720459, 0.495950996875763], + [0.588353991508484, 0.546862006187439], + [0.757824003696442, 0.14767599105835], + [0.709249973297119, 0.201507985591888], + [0.672684013843536, 0.256581008434296], + [0.600408971309662, 0.74900496006012], + [0.55826598405838, 0.261672019958496], + [0.570303976535797, 0.187870979309082], + [0.588165998458862, 0.109044015407562], + [0.711045026779175, 0.398952007293701], + [0.781069993972778, 0.435405015945435], + [0.587247014045715, 0.398931980133057], + [0.742869973182678, 0.355445981025696], + [0.572156012058258, 0.437651991844177], + [0.55186802148819, 0.536570012569427], + [0.821442008018494, 0.457556009292603], + [0.752701997756958, 0.457181990146637], + [0.71375697851181, 0.467626988887787], + [0.66711300611496, 0.460672974586487], + [0.631101012229919, 0.447153985500336], + [0.6008620262146, 0.432473003864288], + [0.523481011390686, 0.405627012252808], + [0.810747981071472, 0.523926019668579], + [0.771045982837677, 0.348959028720856], + [0.509127020835876, 0.562718033790588], + [0.595292985439301, 0.485023975372314], + [0.980530977249146, 0.401564002037048], + [0.573499977588654, 0.420000016689301], + [0.602994978427887, 0.548687994480133], + [0.733529984951019, 0.376977026462555], + [0.560611009597778, 0.519016981124878], + [0.967685997486115, 0.644356966018677], + [0.580985009670258, 0.387160003185272], + [0.537728011608124, 0.505385041236877], + [0.760966002941132, 0.779752969741821], + [0.801778972148895, 0.831938028335571], + [0.892440974712372, 0.54076099395752], + [0.816350996494293, 0.740260004997253], + [0.865594983100891, 0.333687007427216], + [0.614073991775513, 0.883246004581451], + [0.508952975273132, 0.579437971115112], + [0.617941975593567, 0.508316040039062], + [0.825608015060425, 0.397674977779388], + [0.681214988231659, 0.39623498916626], + [0.656635999679565, 0.400596976280212], + [0.603900015354156, 0.710216999053955], + [0.81208598613739, 0.588539004325867], + [0.56801301240921, 0.944564998149872], + [0.681007981300354, 0.898285031318665], + [0.733752012252808, 0.869701027870178], + [0.633830010890961, 0.398822009563446], + [0.606792986392975, 0.39553701877594], + [0.589659988880157, 0.391062021255493], + [0.805015981197357, 0.342108011245728], + [0.611334979534149, 0.362284004688263], + [0.634037971496582, 0.355970978736877], + [0.656635999679565, 0.355356991291046], + [0.681214988231659, 0.35834002494812], + [0.698584973812103, 0.363156020641327], + [0.941866993904114, 0.319076001644135], + [0.698584973812103, 0.387449026107788], + [0.584177017211914, 0.624107003211975], + [0.554318010807037, 0.566076993942261], + [0.534153997898102, 0.62064003944397], + [0.711217999458313, 0.819975018501282], + [0.664629995822906, 0.852871000766754], + [0.559099972248077, 0.902631998062134], + [0.871706008911133, 0.791940987110138], + [0.591234028339386, 0.373893976211548], + [0.544341027736664, 0.451583981513977], + [0.624562978744507, 0.924192011356354], + [0.88577002286911, 0.615028977394104], + [0.551338016986847, 0.695277988910675], + [0.551980018615723, 0.704632043838501], + [0.552887976169586, 0.715808033943176], + [0.555167973041534, 0.730794012546539], + [0.569944024085999, 0.767035007476807], + [0.593203008174896, 0.685675978660583], + [0.599261999130249, 0.681069016456604], + [0.607599973678589, 0.677703022956848], + [0.631937980651855, 0.663500010967255], + [0.752032995223999, 0.601315021514893], + [0.547226011753082, 0.420395016670227], + [0.563543975353241, 0.359827995300293], + [0.583841025829315, 0.368713974952698], + [0.586614012718201, 0.692366003990173], + [0.771915018558502, 0.683578014373779], + [0.531597018241882, 0.352482974529266], + [0.588370978832245, 0.804440975189209], + [0.52079701423645, 0.442565023899078], + [0.567984998226166, 0.493479013442993], + [0.543282985687256, 0.819254994392395], + [0.655317008495331, 0.745514988899231], + [0.621008992195129, 0.574018001556396], + [0.625559985637665, 0.78031200170517], + [0.680198013782501, 0.570719003677368], + [0.64276397228241, 0.604337990283966], + [0.704662978649139, 0.621529996395111], + [0.552012026309967, 0.862591981887817], + [0.589071989059448, 0.508637011051178], + [0.685944974422455, 0.775357007980347], + [0.645735025405884, 0.812640011310577], + [0.675342977046967, 0.703978002071381], + [0.810858011245728, 0.646304965019226], + [0.72012197971344, 0.714666962623596], + [0.866151988506317, 0.682704985141754], + [0.663187026977539, 0.644596993923187], + [0.570082008838654, 0.466325998306274], + [0.544561982154846, 0.548375964164734], + [0.562758982181549, 0.558784961700439], + [0.531987011432648, 0.530140042304993], + [0.585271000862122, 0.335177004337311], + [0.622952997684479, 0.32277899980545], + [0.655896008014679, 0.320163011550903], + [0.687132000923157, 0.322345972061157], + [0.716481983661652, 0.333200991153717], + [0.758756995201111, 0.382786989212036], + [0.897013008594513, 0.468769013881683], + [0.732392013072968, 0.424547016620636], + [0.70211398601532, 0.433162987232208], + [0.66652500629425, 0.433866024017334], + [0.633504986763, 0.426087975502014], + [0.603875994682312, 0.416586995124817], + [0.579657971858978, 0.409945011138916], + [0.992439985275269, 0.480777025222778], + [0.567192018032074, 0.569419980049133], + [0.54136598110199, 0.478899002075195], + [0.526564002037048, 0.546118021011353], + [0.523913025856018, 0.563830018043518], + [0.531529009342194, 0.555056989192963], + [0.566035985946655, 0.582329034805298], + [0.51631098985672, 0.563053965568542], + [0.5174720287323, 0.577877044677734], + [0.573594987392426, 0.389806985855103], + [0.560697972774506, 0.395331978797913], + [0.549755990505219, 0.399751007556915], + [0.710287988185883, 0.368252992630005], + [0.723330020904541, 0.363372981548309] +]; +var TRI468 = [ + 127, + 34, + 139, + 11, + 0, + 37, + 232, + 231, + 120, + 72, + 37, + 39, + 128, + 121, + 47, + 232, + 121, + 128, + 104, + 69, + 67, + 175, + 171, + 148, + 157, + 154, + 155, + 118, + 50, + 101, + 73, + 39, + 40, + 9, + 151, + 108, + 48, + 115, + 131, + 194, + 204, + 211, + 74, + 40, + 185, + 80, + 42, + 183, + 40, + 92, + 186, + 230, + 229, + 118, + 202, + 212, + 214, + 83, + 18, + 17, + 76, + 61, + 146, + 160, + 29, + 30, + 56, + 157, + 173, + 106, + 204, + 194, + 135, + 214, + 192, + 203, + 165, + 98, + 21, + 71, + 68, + 51, + 45, + 4, + 144, + 24, + 23, + 77, + 146, + 91, + 205, + 50, + 187, + 201, + 200, + 18, + 91, + 106, + 182, + 90, + 91, + 181, + 85, + 84, + 17, + 206, + 203, + 36, + 148, + 171, + 140, + 92, + 40, + 39, + 193, + 189, + 244, + 159, + 158, + 28, + 247, + 246, + 161, + 236, + 3, + 196, + 54, + 68, + 104, + 193, + 168, + 8, + 117, + 228, + 31, + 189, + 193, + 55, + 98, + 97, + 99, + 126, + 47, + 100, + 166, + 79, + 218, + 155, + 154, + 26, + 209, + 49, + 131, + 135, + 136, + 150, + 47, + 126, + 217, + 223, + 52, + 53, + 45, + 51, + 134, + 211, + 170, + 140, + 67, + 69, + 108, + 43, + 106, + 91, + 230, + 119, + 120, + 226, + 130, + 247, + 63, + 53, + 52, + 238, + 20, + 242, + 46, + 70, + 156, + 78, + 62, + 96, + 46, + 53, + 63, + 143, + 34, + 227, + 173, + 155, + 133, + 123, + 117, + 111, + 44, + 125, + 19, + 236, + 134, + 51, + 216, + 206, + 205, + 154, + 153, + 22, + 39, + 37, + 167, + 200, + 201, + 208, + 36, + 142, + 100, + 57, + 212, + 202, + 20, + 60, + 99, + 28, + 158, + 157, + 35, + 226, + 113, + 160, + 159, + 27, + 204, + 202, + 210, + 113, + 225, + 46, + 43, + 202, + 204, + 62, + 76, + 77, + 137, + 123, + 116, + 41, + 38, + 72, + 203, + 129, + 142, + 64, + 98, + 240, + 49, + 102, + 64, + 41, + 73, + 74, + 212, + 216, + 207, + 42, + 74, + 184, + 169, + 170, + 211, + 170, + 149, + 176, + 105, + 66, + 69, + 122, + 6, + 168, + 123, + 147, + 187, + 96, + 77, + 90, + 65, + 55, + 107, + 89, + 90, + 180, + 101, + 100, + 120, + 63, + 105, + 104, + 93, + 137, + 227, + 15, + 86, + 85, + 129, + 102, + 49, + 14, + 87, + 86, + 55, + 8, + 9, + 100, + 47, + 121, + 145, + 23, + 22, + 88, + 89, + 179, + 6, + 122, + 196, + 88, + 95, + 96, + 138, + 172, + 136, + 215, + 58, + 172, + 115, + 48, + 219, + 42, + 80, + 81, + 195, + 3, + 51, + 43, + 146, + 61, + 171, + 175, + 199, + 81, + 82, + 38, + 53, + 46, + 225, + 144, + 163, + 110, + 246, + 33, + 7, + 52, + 65, + 66, + 229, + 228, + 117, + 34, + 127, + 234, + 107, + 108, + 69, + 109, + 108, + 151, + 48, + 64, + 235, + 62, + 78, + 191, + 129, + 209, + 126, + 111, + 35, + 143, + 163, + 161, + 246, + 117, + 123, + 50, + 222, + 65, + 52, + 19, + 125, + 141, + 221, + 55, + 65, + 3, + 195, + 197, + 25, + 7, + 33, + 220, + 237, + 44, + 70, + 71, + 139, + 122, + 193, + 245, + 247, + 130, + 33, + 71, + 21, + 162, + 153, + 158, + 159, + 170, + 169, + 150, + 188, + 174, + 196, + 216, + 186, + 92, + 144, + 160, + 161, + 2, + 97, + 167, + 141, + 125, + 241, + 164, + 167, + 37, + 72, + 38, + 12, + 145, + 159, + 160, + 38, + 82, + 13, + 63, + 68, + 71, + 226, + 35, + 111, + 158, + 153, + 154, + 101, + 50, + 205, + 206, + 92, + 165, + 209, + 198, + 217, + 165, + 167, + 97, + 220, + 115, + 218, + 133, + 112, + 243, + 239, + 238, + 241, + 214, + 135, + 169, + 190, + 173, + 133, + 171, + 208, + 32, + 125, + 44, + 237, + 86, + 87, + 178, + 85, + 86, + 179, + 84, + 85, + 180, + 83, + 84, + 181, + 201, + 83, + 182, + 137, + 93, + 132, + 76, + 62, + 183, + 61, + 76, + 184, + 57, + 61, + 185, + 212, + 57, + 186, + 214, + 207, + 187, + 34, + 143, + 156, + 79, + 239, + 237, + 123, + 137, + 177, + 44, + 1, + 4, + 201, + 194, + 32, + 64, + 102, + 129, + 213, + 215, + 138, + 59, + 166, + 219, + 242, + 99, + 97, + 2, + 94, + 141, + 75, + 59, + 235, + 24, + 110, + 228, + 25, + 130, + 226, + 23, + 24, + 229, + 22, + 23, + 230, + 26, + 22, + 231, + 112, + 26, + 232, + 189, + 190, + 243, + 221, + 56, + 190, + 28, + 56, + 221, + 27, + 28, + 222, + 29, + 27, + 223, + 30, + 29, + 224, + 247, + 30, + 225, + 238, + 79, + 20, + 166, + 59, + 75, + 60, + 75, + 240, + 147, + 177, + 215, + 20, + 79, + 166, + 187, + 147, + 213, + 112, + 233, + 244, + 233, + 128, + 245, + 128, + 114, + 188, + 114, + 217, + 174, + 131, + 115, + 220, + 217, + 198, + 236, + 198, + 131, + 134, + 177, + 132, + 58, + 143, + 35, + 124, + 110, + 163, + 7, + 228, + 110, + 25, + 356, + 389, + 368, + 11, + 302, + 267, + 452, + 350, + 349, + 302, + 303, + 269, + 357, + 343, + 277, + 452, + 453, + 357, + 333, + 332, + 297, + 175, + 152, + 377, + 384, + 398, + 382, + 347, + 348, + 330, + 303, + 304, + 270, + 9, + 336, + 337, + 278, + 279, + 360, + 418, + 262, + 431, + 304, + 408, + 409, + 310, + 415, + 407, + 270, + 409, + 410, + 450, + 348, + 347, + 422, + 430, + 434, + 313, + 314, + 17, + 306, + 307, + 375, + 387, + 388, + 260, + 286, + 414, + 398, + 335, + 406, + 418, + 364, + 367, + 416, + 423, + 358, + 327, + 251, + 284, + 298, + 281, + 5, + 4, + 373, + 374, + 253, + 307, + 320, + 321, + 425, + 427, + 411, + 421, + 313, + 18, + 321, + 405, + 406, + 320, + 404, + 405, + 315, + 16, + 17, + 426, + 425, + 266, + 377, + 400, + 369, + 322, + 391, + 269, + 417, + 465, + 464, + 386, + 257, + 258, + 466, + 260, + 388, + 456, + 399, + 419, + 284, + 332, + 333, + 417, + 285, + 8, + 346, + 340, + 261, + 413, + 441, + 285, + 327, + 460, + 328, + 355, + 371, + 329, + 392, + 439, + 438, + 382, + 341, + 256, + 429, + 420, + 360, + 364, + 394, + 379, + 277, + 343, + 437, + 443, + 444, + 283, + 275, + 440, + 363, + 431, + 262, + 369, + 297, + 338, + 337, + 273, + 375, + 321, + 450, + 451, + 349, + 446, + 342, + 467, + 293, + 334, + 282, + 458, + 461, + 462, + 276, + 353, + 383, + 308, + 324, + 325, + 276, + 300, + 293, + 372, + 345, + 447, + 382, + 398, + 362, + 352, + 345, + 340, + 274, + 1, + 19, + 456, + 248, + 281, + 436, + 427, + 425, + 381, + 256, + 252, + 269, + 391, + 393, + 200, + 199, + 428, + 266, + 330, + 329, + 287, + 273, + 422, + 250, + 462, + 328, + 258, + 286, + 384, + 265, + 353, + 342, + 387, + 259, + 257, + 424, + 431, + 430, + 342, + 353, + 276, + 273, + 335, + 424, + 292, + 325, + 307, + 366, + 447, + 345, + 271, + 303, + 302, + 423, + 266, + 371, + 294, + 455, + 460, + 279, + 278, + 294, + 271, + 272, + 304, + 432, + 434, + 427, + 272, + 407, + 408, + 394, + 430, + 431, + 395, + 369, + 400, + 334, + 333, + 299, + 351, + 417, + 168, + 352, + 280, + 411, + 325, + 319, + 320, + 295, + 296, + 336, + 319, + 403, + 404, + 330, + 348, + 349, + 293, + 298, + 333, + 323, + 454, + 447, + 15, + 16, + 315, + 358, + 429, + 279, + 14, + 15, + 316, + 285, + 336, + 9, + 329, + 349, + 350, + 374, + 380, + 252, + 318, + 402, + 403, + 6, + 197, + 419, + 318, + 319, + 325, + 367, + 364, + 365, + 435, + 367, + 397, + 344, + 438, + 439, + 272, + 271, + 311, + 195, + 5, + 281, + 273, + 287, + 291, + 396, + 428, + 199, + 311, + 271, + 268, + 283, + 444, + 445, + 373, + 254, + 339, + 263, + 466, + 249, + 282, + 334, + 296, + 449, + 347, + 346, + 264, + 447, + 454, + 336, + 296, + 299, + 338, + 10, + 151, + 278, + 439, + 455, + 292, + 407, + 415, + 358, + 371, + 355, + 340, + 345, + 372, + 390, + 249, + 466, + 346, + 347, + 280, + 442, + 443, + 282, + 19, + 94, + 370, + 441, + 442, + 295, + 248, + 419, + 197, + 263, + 255, + 359, + 440, + 275, + 274, + 300, + 383, + 368, + 351, + 412, + 465, + 263, + 467, + 466, + 301, + 368, + 389, + 380, + 374, + 386, + 395, + 378, + 379, + 412, + 351, + 419, + 436, + 426, + 322, + 373, + 390, + 388, + 2, + 164, + 393, + 370, + 462, + 461, + 164, + 0, + 267, + 302, + 11, + 12, + 374, + 373, + 387, + 268, + 12, + 13, + 293, + 300, + 301, + 446, + 261, + 340, + 385, + 384, + 381, + 330, + 266, + 425, + 426, + 423, + 391, + 429, + 355, + 437, + 391, + 327, + 326, + 440, + 457, + 438, + 341, + 382, + 362, + 459, + 457, + 461, + 434, + 430, + 394, + 414, + 463, + 362, + 396, + 369, + 262, + 354, + 461, + 457, + 316, + 403, + 402, + 315, + 404, + 403, + 314, + 405, + 404, + 313, + 406, + 405, + 421, + 418, + 406, + 366, + 401, + 361, + 306, + 408, + 407, + 291, + 409, + 408, + 287, + 410, + 409, + 432, + 436, + 410, + 434, + 416, + 411, + 264, + 368, + 383, + 309, + 438, + 457, + 352, + 376, + 401, + 274, + 275, + 4, + 421, + 428, + 262, + 294, + 327, + 358, + 433, + 416, + 367, + 289, + 455, + 439, + 462, + 370, + 326, + 2, + 326, + 370, + 305, + 460, + 455, + 254, + 449, + 448, + 255, + 261, + 446, + 253, + 450, + 449, + 252, + 451, + 450, + 256, + 452, + 451, + 341, + 453, + 452, + 413, + 464, + 463, + 441, + 413, + 414, + 258, + 442, + 441, + 257, + 443, + 442, + 259, + 444, + 443, + 260, + 445, + 444, + 467, + 342, + 445, + 459, + 458, + 250, + 289, + 392, + 290, + 290, + 328, + 460, + 376, + 433, + 435, + 250, + 290, + 392, + 411, + 416, + 433, + 341, + 463, + 464, + 453, + 464, + 465, + 357, + 465, + 412, + 343, + 412, + 399, + 360, + 363, + 440, + 437, + 399, + 456, + 420, + 456, + 363, + 401, + 435, + 288, + 372, + 383, + 353, + 339, + 255, + 249, + 448, + 261, + 255, + 133, + 243, + 190, + 133, + 155, + 112, + 33, + 246, + 247, + 33, + 130, + 25, + 398, + 384, + 286, + 362, + 398, + 414, + 362, + 463, + 341, + 263, + 359, + 467, + 263, + 249, + 255, + 466, + 467, + 260, + 75, + 60, + 166, + 238, + 239, + 79, + 162, + 127, + 139, + 72, + 11, + 37, + 121, + 232, + 120, + 73, + 72, + 39, + 114, + 128, + 47, + 233, + 232, + 128, + 103, + 104, + 67, + 152, + 175, + 148, + 173, + 157, + 155, + 119, + 118, + 101, + 74, + 73, + 40, + 107, + 9, + 108, + 49, + 48, + 131, + 32, + 194, + 211, + 184, + 74, + 185, + 191, + 80, + 183, + 185, + 40, + 186, + 119, + 230, + 118, + 210, + 202, + 214, + 84, + 83, + 17, + 77, + 76, + 146, + 161, + 160, + 30, + 190, + 56, + 173, + 182, + 106, + 194, + 138, + 135, + 192, + 129, + 203, + 98, + 54, + 21, + 68, + 5, + 51, + 4, + 145, + 144, + 23, + 90, + 77, + 91, + 207, + 205, + 187, + 83, + 201, + 18, + 181, + 91, + 182, + 180, + 90, + 181, + 16, + 85, + 17, + 205, + 206, + 36, + 176, + 148, + 140, + 165, + 92, + 39, + 245, + 193, + 244, + 27, + 159, + 28, + 30, + 247, + 161, + 174, + 236, + 196, + 103, + 54, + 104, + 55, + 193, + 8, + 111, + 117, + 31, + 221, + 189, + 55, + 240, + 98, + 99, + 142, + 126, + 100, + 219, + 166, + 218, + 112, + 155, + 26, + 198, + 209, + 131, + 169, + 135, + 150, + 114, + 47, + 217, + 224, + 223, + 53, + 220, + 45, + 134, + 32, + 211, + 140, + 109, + 67, + 108, + 146, + 43, + 91, + 231, + 230, + 120, + 113, + 226, + 247, + 105, + 63, + 52, + 241, + 238, + 242, + 124, + 46, + 156, + 95, + 78, + 96, + 70, + 46, + 63, + 116, + 143, + 227, + 116, + 123, + 111, + 1, + 44, + 19, + 3, + 236, + 51, + 207, + 216, + 205, + 26, + 154, + 22, + 165, + 39, + 167, + 199, + 200, + 208, + 101, + 36, + 100, + 43, + 57, + 202, + 242, + 20, + 99, + 56, + 28, + 157, + 124, + 35, + 113, + 29, + 160, + 27, + 211, + 204, + 210, + 124, + 113, + 46, + 106, + 43, + 204, + 96, + 62, + 77, + 227, + 137, + 116, + 73, + 41, + 72, + 36, + 203, + 142, + 235, + 64, + 240, + 48, + 49, + 64, + 42, + 41, + 74, + 214, + 212, + 207, + 183, + 42, + 184, + 210, + 169, + 211, + 140, + 170, + 176, + 104, + 105, + 69, + 193, + 122, + 168, + 50, + 123, + 187, + 89, + 96, + 90, + 66, + 65, + 107, + 179, + 89, + 180, + 119, + 101, + 120, + 68, + 63, + 104, + 234, + 93, + 227, + 16, + 15, + 85, + 209, + 129, + 49, + 15, + 14, + 86, + 107, + 55, + 9, + 120, + 100, + 121, + 153, + 145, + 22, + 178, + 88, + 179, + 197, + 6, + 196, + 89, + 88, + 96, + 135, + 138, + 136, + 138, + 215, + 172, + 218, + 115, + 219, + 41, + 42, + 81, + 5, + 195, + 51, + 57, + 43, + 61, + 208, + 171, + 199, + 41, + 81, + 38, + 224, + 53, + 225, + 24, + 144, + 110, + 105, + 52, + 66, + 118, + 229, + 117, + 227, + 34, + 234, + 66, + 107, + 69, + 10, + 109, + 151, + 219, + 48, + 235, + 183, + 62, + 191, + 142, + 129, + 126, + 116, + 111, + 143, + 7, + 163, + 246, + 118, + 117, + 50, + 223, + 222, + 52, + 94, + 19, + 141, + 222, + 221, + 65, + 196, + 3, + 197, + 45, + 220, + 44, + 156, + 70, + 139, + 188, + 122, + 245, + 139, + 71, + 162, + 145, + 153, + 159, + 149, + 170, + 150, + 122, + 188, + 196, + 206, + 216, + 92, + 163, + 144, + 161, + 164, + 2, + 167, + 242, + 141, + 241, + 0, + 164, + 37, + 11, + 72, + 12, + 144, + 145, + 160, + 12, + 38, + 13, + 70, + 63, + 71, + 31, + 226, + 111, + 157, + 158, + 154, + 36, + 101, + 205, + 203, + 206, + 165, + 126, + 209, + 217, + 98, + 165, + 97, + 237, + 220, + 218, + 237, + 239, + 241, + 210, + 214, + 169, + 140, + 171, + 32, + 241, + 125, + 237, + 179, + 86, + 178, + 180, + 85, + 179, + 181, + 84, + 180, + 182, + 83, + 181, + 194, + 201, + 182, + 177, + 137, + 132, + 184, + 76, + 183, + 185, + 61, + 184, + 186, + 57, + 185, + 216, + 212, + 186, + 192, + 214, + 187, + 139, + 34, + 156, + 218, + 79, + 237, + 147, + 123, + 177, + 45, + 44, + 4, + 208, + 201, + 32, + 98, + 64, + 129, + 192, + 213, + 138, + 235, + 59, + 219, + 141, + 242, + 97, + 97, + 2, + 141, + 240, + 75, + 235, + 229, + 24, + 228, + 31, + 25, + 226, + 230, + 23, + 229, + 231, + 22, + 230, + 232, + 26, + 231, + 233, + 112, + 232, + 244, + 189, + 243, + 189, + 221, + 190, + 222, + 28, + 221, + 223, + 27, + 222, + 224, + 29, + 223, + 225, + 30, + 224, + 113, + 247, + 225, + 99, + 60, + 240, + 213, + 147, + 215, + 60, + 20, + 166, + 192, + 187, + 213, + 243, + 112, + 244, + 244, + 233, + 245, + 245, + 128, + 188, + 188, + 114, + 174, + 134, + 131, + 220, + 174, + 217, + 236, + 236, + 198, + 134, + 215, + 177, + 58, + 156, + 143, + 124, + 25, + 110, + 7, + 31, + 228, + 25, + 264, + 356, + 368, + 0, + 11, + 267, + 451, + 452, + 349, + 267, + 302, + 269, + 350, + 357, + 277, + 350, + 452, + 357, + 299, + 333, + 297, + 396, + 175, + 377, + 381, + 384, + 382, + 280, + 347, + 330, + 269, + 303, + 270, + 151, + 9, + 337, + 344, + 278, + 360, + 424, + 418, + 431, + 270, + 304, + 409, + 272, + 310, + 407, + 322, + 270, + 410, + 449, + 450, + 347, + 432, + 422, + 434, + 18, + 313, + 17, + 291, + 306, + 375, + 259, + 387, + 260, + 424, + 335, + 418, + 434, + 364, + 416, + 391, + 423, + 327, + 301, + 251, + 298, + 275, + 281, + 4, + 254, + 373, + 253, + 375, + 307, + 321, + 280, + 425, + 411, + 200, + 421, + 18, + 335, + 321, + 406, + 321, + 320, + 405, + 314, + 315, + 17, + 423, + 426, + 266, + 396, + 377, + 369, + 270, + 322, + 269, + 413, + 417, + 464, + 385, + 386, + 258, + 248, + 456, + 419, + 298, + 284, + 333, + 168, + 417, + 8, + 448, + 346, + 261, + 417, + 413, + 285, + 326, + 327, + 328, + 277, + 355, + 329, + 309, + 392, + 438, + 381, + 382, + 256, + 279, + 429, + 360, + 365, + 364, + 379, + 355, + 277, + 437, + 282, + 443, + 283, + 281, + 275, + 363, + 395, + 431, + 369, + 299, + 297, + 337, + 335, + 273, + 321, + 348, + 450, + 349, + 359, + 446, + 467, + 283, + 293, + 282, + 250, + 458, + 462, + 300, + 276, + 383, + 292, + 308, + 325, + 283, + 276, + 293, + 264, + 372, + 447, + 346, + 352, + 340, + 354, + 274, + 19, + 363, + 456, + 281, + 426, + 436, + 425, + 380, + 381, + 252, + 267, + 269, + 393, + 421, + 200, + 428, + 371, + 266, + 329, + 432, + 287, + 422, + 290, + 250, + 328, + 385, + 258, + 384, + 446, + 265, + 342, + 386, + 387, + 257, + 422, + 424, + 430, + 445, + 342, + 276, + 422, + 273, + 424, + 306, + 292, + 307, + 352, + 366, + 345, + 268, + 271, + 302, + 358, + 423, + 371, + 327, + 294, + 460, + 331, + 279, + 294, + 303, + 271, + 304, + 436, + 432, + 427, + 304, + 272, + 408, + 395, + 394, + 431, + 378, + 395, + 400, + 296, + 334, + 299, + 6, + 351, + 168, + 376, + 352, + 411, + 307, + 325, + 320, + 285, + 295, + 336, + 320, + 319, + 404, + 329, + 330, + 349, + 334, + 293, + 333, + 366, + 323, + 447, + 316, + 15, + 315, + 331, + 358, + 279, + 317, + 14, + 316, + 8, + 285, + 9, + 277, + 329, + 350, + 253, + 374, + 252, + 319, + 318, + 403, + 351, + 6, + 419, + 324, + 318, + 325, + 397, + 367, + 365, + 288, + 435, + 397, + 278, + 344, + 439, + 310, + 272, + 311, + 248, + 195, + 281, + 375, + 273, + 291, + 175, + 396, + 199, + 312, + 311, + 268, + 276, + 283, + 445, + 390, + 373, + 339, + 295, + 282, + 296, + 448, + 449, + 346, + 356, + 264, + 454, + 337, + 336, + 299, + 337, + 338, + 151, + 294, + 278, + 455, + 308, + 292, + 415, + 429, + 358, + 355, + 265, + 340, + 372, + 388, + 390, + 466, + 352, + 346, + 280, + 295, + 442, + 282, + 354, + 19, + 370, + 285, + 441, + 295, + 195, + 248, + 197, + 457, + 440, + 274, + 301, + 300, + 368, + 417, + 351, + 465, + 251, + 301, + 389, + 385, + 380, + 386, + 394, + 395, + 379, + 399, + 412, + 419, + 410, + 436, + 322, + 387, + 373, + 388, + 326, + 2, + 393, + 354, + 370, + 461, + 393, + 164, + 267, + 268, + 302, + 12, + 386, + 374, + 387, + 312, + 268, + 13, + 298, + 293, + 301, + 265, + 446, + 340, + 380, + 385, + 381, + 280, + 330, + 425, + 322, + 426, + 391, + 420, + 429, + 437, + 393, + 391, + 326, + 344, + 440, + 438, + 458, + 459, + 461, + 364, + 434, + 394, + 428, + 396, + 262, + 274, + 354, + 457, + 317, + 316, + 402, + 316, + 315, + 403, + 315, + 314, + 404, + 314, + 313, + 405, + 313, + 421, + 406, + 323, + 366, + 361, + 292, + 306, + 407, + 306, + 291, + 408, + 291, + 287, + 409, + 287, + 432, + 410, + 427, + 434, + 411, + 372, + 264, + 383, + 459, + 309, + 457, + 366, + 352, + 401, + 1, + 274, + 4, + 418, + 421, + 262, + 331, + 294, + 358, + 435, + 433, + 367, + 392, + 289, + 439, + 328, + 462, + 326, + 94, + 2, + 370, + 289, + 305, + 455, + 339, + 254, + 448, + 359, + 255, + 446, + 254, + 253, + 449, + 253, + 252, + 450, + 252, + 256, + 451, + 256, + 341, + 452, + 414, + 413, + 463, + 286, + 441, + 414, + 286, + 258, + 441, + 258, + 257, + 442, + 257, + 259, + 443, + 259, + 260, + 444, + 260, + 467, + 445, + 309, + 459, + 250, + 305, + 289, + 290, + 305, + 290, + 460, + 401, + 376, + 435, + 309, + 250, + 392, + 376, + 411, + 433, + 453, + 341, + 464, + 357, + 453, + 465, + 343, + 357, + 412, + 437, + 343, + 399, + 344, + 360, + 440, + 420, + 437, + 456, + 360, + 420, + 363, + 361, + 401, + 288, + 265, + 372, + 353, + 390, + 339, + 249, + 339, + 448, + 255 +]; +var VTX68 = [ + 127, + 234, + 132, + 58, + 172, + 150, + 149, + 148, + 152, + 377, + 378, + 379, + 397, + 288, + 361, + 454, + 356, + 70, + 63, + 105, + 66, + 107, + 336, + 296, + 334, + 293, + 300, + 168, + 6, + 195, + 4, + 98, + 97, + 2, + 326, + 327, + 33, + 160, + 158, + 133, + 153, + 144, + 362, + 385, + 387, + 263, + 373, + 380, + 57, + 40, + 37, + 0, + 267, + 270, + 287, + 321, + 314, + 17, + 84, + 91, + 78, + 81, + 13, + 311, + 308, + 402, + 14, + 178 +]; +var VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152]; +var VTX7 = [33, 133, 362, 263, 1, 78, 308]; +var UV68 = VTX68.map((x) => UV468[x]); +var UV33 = VTX33.map((x) => UV468[x]); +var UV7 = VTX7.map((x) => UV468[x]); + +// src/blazeface/facepipeline.ts +var leftOutline = MESH_ANNOTATIONS["leftEyeLower0"]; +var rightOutline = MESH_ANNOTATIONS["rightEyeLower0"]; +var eyeLandmarks = { + leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]], + rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]] +}; +var meshLandmarks = { + count: 468, + mouth: 13, + symmetryLine: [13, MESH_ANNOTATIONS["midwayBetweenEyes"][0]] +}; +var blazeFaceLandmarks = { + leftEye: 0, + rightEye: 1, + nose: 2, + mouth: 3, + leftEar: 4, + rightEar: 5, + symmetryLine: [3, 2] +}; +var irisLandmarks = { + upperCenter: 3, + lowerCenter: 4, + index: 71, + numCoordinates: 76 +}; +function replaceRawCoordinates(rawCoords, newCoords, prefix, keys) { + for (let i = 0; i < MESH_TO_IRIS_INDICES_MAP.length; i++) { + const { key, indices } = MESH_TO_IRIS_INDICES_MAP[i]; + const originalIndices = MESH_ANNOTATIONS[`${prefix}${key}`]; + if (!keys || keys.includes(key)) { + for (let j = 0; j < indices.length; j++) { + const index = indices[j]; + rawCoords[originalIndices[j]] = [ + newCoords[index][0], + newCoords[index][1], + (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2 + ]; + } + } + } +} +var Pipeline = class { + constructor(boundingBoxDetector, meshDetector, irisModel) { + var _a, _b; + this.storedBoxes = []; + this.boundingBoxDetector = boundingBoxDetector; + this.meshDetector = meshDetector; + this.irisModel = irisModel; + this.boxSize = ((_a = boundingBoxDetector == null ? void 0 : boundingBoxDetector.model) == null ? void 0 : _a.inputs[0].shape[2]) || 0; + this.meshSize = (meshDetector == null ? void 0 : meshDetector.inputs[0].shape[2]) || ((_b = boundingBoxDetector == null ? void 0 : boundingBoxDetector.model) == null ? void 0 : _b.inputs[0].shape[2]); + this.irisSize = (irisModel == null ? void 0 : irisModel.inputs[0].shape[1]) || 0; + this.irisEnlarge = 2.3; + this.skipped = 0; + this.detectedFaces = 0; + } + transformRawCoords(rawCoords, box6, angle, rotationMatrix) { + const boxSize = getBoxSize({ startPoint: box6.startPoint, endPoint: box6.endPoint }); + const coordsScaled = rawCoords.map((coord) => [ + boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2), + boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2), + coord[2] + ]); + const coordsRotationMatrix = angle !== 0 ? buildRotationMatrix(angle, [0, 0]) : IDENTITY_MATRIX; + const coordsRotated = angle !== 0 ? coordsScaled.map((coord) => [...rotatePoint(coord, coordsRotationMatrix), coord[2]]) : coordsScaled; + const inverseRotationMatrix = angle !== 0 ? invertTransformMatrix(rotationMatrix) : IDENTITY_MATRIX; + const boxCenter = [...getBoxCenter({ startPoint: box6.startPoint, endPoint: box6.endPoint }), 1]; + return coordsRotated.map((coord) => [ + Math.round(coord[0] + dot(boxCenter, inverseRotationMatrix[0])), + Math.round(coord[1] + dot(boxCenter, inverseRotationMatrix[1])), + Math.round(coord[2]) + ]); + } + getLeftToRightEyeDepthDifference(rawCoords) { + const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2]; + const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2]; + return leftEyeZ - rightEyeZ; + } + getEyeBox(rawCoords, face5, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) { + const box6 = squarifyBox(enlargeBox(calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge)); + const boxSize = getBoxSize(box6); + let crop = tfjs_esm_exports.image.cropAndResize(face5, [[ + box6.startPoint[1] / this.meshSize, + box6.startPoint[0] / this.meshSize, + box6.endPoint[1] / this.meshSize, + box6.endPoint[0] / this.meshSize + ]], [0], [this.irisSize, this.irisSize]); + if (flip && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + const flipped = tfjs_esm_exports.image.flipLeftRight(crop); + tfjs_esm_exports.dispose(crop); + crop = flipped; + } + return { box: box6, boxSize, crop }; + } + getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) { + const eyeRawCoords = []; + for (let i = 0; i < irisLandmarks.numCoordinates; i++) { + const x = eyeData[i * 3]; + const y = eyeData[i * 3 + 1]; + const z = eyeData[i * 3 + 2]; + eyeRawCoords.push([ + (flip ? 1 - x / this.irisSize : x / this.irisSize) * eyeBoxSize[0] + eyeBox.startPoint[0], + y / this.irisSize * eyeBoxSize[1] + eyeBox.startPoint[1], + z + ]); + } + return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) }; + } + getAdjustedIrisCoords(rawCoords, irisCoords, direction) { + const upperCenterZ = rawCoords[MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2]; + const lowerCenterZ = rawCoords[MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2]; + const averageZ = (upperCenterZ + lowerCenterZ) / 2; + return irisCoords.map((coord, i) => { + let z = averageZ; + if (i === 2) { + z = upperCenterZ; + } else if (i === 4) { + z = lowerCenterZ; + } + return [coord[0], coord[1], z]; + }); + } + correctFaceRotation(config3, box6, input) { + const [indexOfMouth, indexOfForehead] = box6.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; + const angle = computeRotation(box6.landmarks[indexOfMouth], box6.landmarks[indexOfForehead]); + const faceCenter = getBoxCenter({ startPoint: box6.startPoint, endPoint: box6.endPoint }); + const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; + const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); + const rotationMatrix = buildRotationMatrix(-angle, faceCenter); + const cut = config3.face.mesh.enabled ? cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, rotatedImage, [this.meshSize, this.meshSize]) : cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, rotatedImage, [this.boxSize, this.boxSize]); + const face5 = tfjs_esm_exports.div(cut, 255); + tfjs_esm_exports.dispose(cut); + tfjs_esm_exports.dispose(rotatedImage); + return [angle, rotationMatrix, face5]; + } + async augmentIris(rawCoords, face5) { + const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face5, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true); + const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face5, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]); + const combined = tfjs_esm_exports.concat([leftEyeCrop, rightEyeCrop]); + tfjs_esm_exports.dispose(leftEyeCrop); + tfjs_esm_exports.dispose(rightEyeCrop); + const eyePredictions = this.irisModel.predict(combined); + tfjs_esm_exports.dispose(combined); + const eyePredictionsData = await eyePredictions.data(); + tfjs_esm_exports.dispose(eyePredictions); + const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3); + const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true); + const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3); + const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize); + const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords); + if (Math.abs(leftToRightEyeDepthDifference) < 30) { + replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", null); + replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", null); + } else if (leftToRightEyeDepthDifference < 1) { + replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); + } else { + replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); + } + const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); + const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); + const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); + return newCoords; + } + async predict(input, config3) { + let useFreshBox = false; + let detector; + if (this.skipped === 0 || this.skipped > config3.face.detector.skipFrames || !config3.face.mesh.enabled || !config3.skipFrame) { + detector = await this.boundingBoxDetector.getBoundingBoxes(input, config3); + this.skipped = 0; + } + if (config3.skipFrame) + this.skipped++; + if (!config3.skipFrame || detector && detector.boxes && (!config3.face.mesh.enabled || detector.boxes.length !== this.detectedFaces && this.detectedFaces !== config3.face.detector.maxDetected)) { + this.storedBoxes = []; + this.detectedFaces = 0; + for (const possible of detector.boxes) { + const startPoint = await possible.box.startPoint.data(); + const endPoint = await possible.box.endPoint.data(); + const landmarks = await possible.landmarks.array(); + this.storedBoxes.push({ startPoint, endPoint, landmarks, confidence: possible.confidence }); + } + if (this.storedBoxes.length > 0) + useFreshBox = true; + } + if (useFreshBox) { + if (!detector || !detector.boxes || detector.boxes.length === 0) { + this.storedBoxes = []; + this.detectedFaces = 0; + return null; + } + for (let i = 0; i < this.storedBoxes.length; i++) { + const scaledBox = scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor); + const enlargedBox = enlargeBox(scaledBox); + const squarifiedBox = squarifyBox(enlargedBox); + const landmarks = this.storedBoxes[i].landmarks; + const confidence = this.storedBoxes[i].confidence; + this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks }; + } + } + if (detector && detector.boxes) { + detector.boxes.forEach((prediction) => { + tfjs_esm_exports.dispose(prediction.box.startPoint); + tfjs_esm_exports.dispose(prediction.box.endPoint); + tfjs_esm_exports.dispose(prediction.landmarks); + }); + } + const results = []; + const newBoxes = []; + for (let box6 of this.storedBoxes) { + let face5; + let angle = 0; + let rotationMatrix; + if (config3.face.detector.rotation && config3.face.mesh.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + [angle, rotationMatrix, face5] = this.correctFaceRotation(config3, box6, input); + } else { + rotationMatrix = IDENTITY_MATRIX; + const clonedImage = input.clone(); + const cut = config3.face.mesh.enabled ? cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, clonedImage, [this.meshSize, this.meshSize]) : cutBoxFromImageAndResize({ startPoint: box6.startPoint, endPoint: box6.endPoint }, clonedImage, [this.boxSize, this.boxSize]); + face5 = tfjs_esm_exports.div(cut, 255); + tfjs_esm_exports.dispose(cut); + tfjs_esm_exports.dispose(clonedImage); + } + if (!config3.face.mesh.enabled) { + results.push({ + mesh: [], + box: box6, + faceConfidence: null, + boxConfidence: box6.confidence, + confidence: box6.confidence, + image: face5 + }); + } else { + const [contours, confidence, contourCoords] = this.meshDetector.execute(face5); + tfjs_esm_exports.dispose(contours); + const faceConfidence = (await confidence.data())[0]; + tfjs_esm_exports.dispose(confidence); + const coordsReshaped = tfjs_esm_exports.reshape(contourCoords, [-1, 3]); + let rawCoords = await coordsReshaped.array(); + tfjs_esm_exports.dispose(contourCoords); + tfjs_esm_exports.dispose(coordsReshaped); + if (faceConfidence < config3.face.detector.minConfidence) { + box6.confidence = faceConfidence; + tfjs_esm_exports.dispose(face5); + } else { + if (config3.face.iris.enabled) + rawCoords = await this.augmentIris(rawCoords, face5); + const mesh = this.transformRawCoords(rawCoords, box6, angle, rotationMatrix); + box6 = { ...enlargeBox(calculateLandmarksBoundingBox(mesh), 1.5), confidence: box6.confidence }; + if (config3.face.detector.rotation && config3.face.mesh.enabled && config3.face.description.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { + [angle, rotationMatrix, face5] = this.correctFaceRotation(config3, box6, input); + } + results.push({ + mesh, + box: box6, + faceConfidence, + boxConfidence: box6.confidence, + confidence: faceConfidence, + image: face5 + }); + box6 = { ...squarifyBox(box6), confidence: box6.confidence, faceConfidence }; + } + } + newBoxes.push(box6); + } + if (config3.face.mesh.enabled) + this.storedBoxes = newBoxes.filter((a) => a.confidence > config3.face.detector.minConfidence); + this.detectedFaces = results.length; + return results; + } +}; + +// src/blazeface/facemesh.ts +var faceModels = [null, null, null]; +var facePipeline; +async function predict(input, config3) { + const predictions = await facePipeline.predict(input, config3); + const results = []; + let id = 0; + for (const prediction of predictions || []) { + if (!prediction || prediction.isDisposedInternal) + continue; + const meshRaw = prediction.mesh.map((pt) => [ + pt[0] / (input.shape[2] || 0), + pt[1] / (input.shape[1] || 0), + pt[2] / facePipeline.meshSize + ]); + const annotations3 = {}; + if (prediction.mesh && prediction.mesh.length > 0) { + for (const key of Object.keys(MESH_ANNOTATIONS)) + annotations3[key] = MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]); + } + const clampedBox = prediction.box ? [ + Math.trunc(Math.max(0, prediction.box.startPoint[0])), + Math.trunc(Math.max(0, prediction.box.startPoint[1])), + Math.trunc(Math.min(input.shape[2] || 0, prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])), + Math.trunc(Math.min(input.shape[1] || 0, prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])) + ] : [0, 0, 0, 0]; + const boxRaw3 = prediction.box ? [ + prediction.box.startPoint[0] / (input.shape[2] || 0), + prediction.box.startPoint[1] / (input.shape[1] || 0), + (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0), + (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0) + ] : [0, 0, 0, 0]; + results.push({ + id: id++, + score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100, + boxScore: Math.round(100 * prediction.boxConfidence) / 100, + faceScore: Math.round(100 * prediction.faceConfidence) / 100, + box: clampedBox, + boxRaw: boxRaw3, + mesh: prediction.mesh, + meshRaw, + annotations: annotations3, + tensor: prediction.image + }); + if (prediction.coords) + tfjs_esm_exports.dispose(prediction.coords); + } + return results; +} +async function load2(config3) { + if (!faceModels[0] && config3.face.enabled || !faceModels[1] && config3.face.mesh.enabled || !faceModels[2] && config3.face.iris.enabled) { + faceModels = await Promise.all([ + !faceModels[0] && config3.face.enabled ? load(config3) : null, + !faceModels[1] && config3.face.mesh.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.mesh.modelPath), { fromTFHub: config3.face.mesh.modelPath.includes("tfhub.dev") }) : null, + !faceModels[2] && config3.face.iris.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.iris.modelPath), { fromTFHub: config3.face.iris.modelPath.includes("tfhub.dev") }) : null + ]); + if (config3.face.mesh.enabled) { + if (!faceModels[1] || !faceModels[1]["modelUrl"]) + log("load model failed:", config3.face.mesh.modelPath); + else if (config3.debug) + log("load model:", faceModels[1]["modelUrl"]); + } + if (config3.face.iris.enabled) { + if (!faceModels[2] || !faceModels[2]["modelUrl"]) + log("load model failed:", config3.face.iris.modelPath); + else if (config3.debug) + log("load model:", faceModels[2]["modelUrl"]); + } + } else if (config3.debug) { + if (faceModels[0]) + log("cached model:", faceModels[0].model["modelUrl"]); + if (faceModels[1]) + log("cached model:", faceModels[1]["modelUrl"]); + if (faceModels[2]) + log("cached model:", faceModels[2]["modelUrl"]); + } + facePipeline = new Pipeline(faceModels[0], faceModels[1], faceModels[2]); + return faceModels; +} +var triangulation = TRI468; +var uvmap = UV468; + +// src/faceres/faceres.ts +var model; +var last = []; +var lastCount = 0; +var skipped = Number.MAX_SAFE_INTEGER; +async function load3(config3) { + const modelUrl = join(config3.modelBasePath, config3.face.description.modelPath); + if (!model) { + model = await tfjs_esm_exports.loadGraphModel(modelUrl); + if (!model) + log("load model failed:", config3.face.description.modelPath); + else if (config3.debug) + log("load model:", modelUrl); + } else if (config3.debug) + log("cached model:", modelUrl); + return model; +} +function similarity(embedding1, embedding2, order = 2) { + if (!embedding1 || !embedding2) + return 0; + if ((embedding1 == null ? void 0 : embedding1.length) === 0 || (embedding2 == null ? void 0 : embedding2.length) === 0) + return 0; + if ((embedding1 == null ? void 0 : embedding1.length) !== (embedding2 == null ? void 0 : embedding2.length)) + return 0; + const distance = 5 * embedding1.map((_val, i) => Math.abs(embedding1[i] - embedding2[i]) ** order).reduce((sum, now2) => sum + now2, 0) ** (1 / order); + const res = Math.max(0, 100 - distance) / 100; + return res; +} +function match(embedding, db, threshold = 0) { + let best = { similarity: 0, name: "", source: "", embedding: [] }; + if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) + return best; + for (const f of db) { + if (f.embedding && f.name) { + const perc = similarity(embedding, f.embedding); + if (perc > threshold && perc > best.similarity) + best = { ...f, similarity: perc }; + } + } + return best; +} +function enhance(input) { + const image18 = tfjs_esm_exports.tidy(() => { + const tensor2 = input.image || input.tensor || input; + if (!(tensor2 instanceof tfjs_esm_exports.Tensor)) + return null; + const box6 = [[0.05, 0.15, 0.85, 0.85]]; + if (!model.inputs[0].shape) + return null; + const crop = tensor2.shape.length === 3 ? tfjs_esm_exports.image.cropAndResize(tfjs_esm_exports.expandDims(tensor2, 0), box6, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) : tfjs_esm_exports.image.cropAndResize(tensor2, box6, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]); + const norm = tfjs_esm_exports.mul(crop, 255); + return norm; + }); + return image18; +} +async function predict2(image18, config3, idx, count2) { + var _a, _b; + if (!model) + return null; + if (skipped < config3.face.description.skipFrames && config3.skipFrame && lastCount === count2 && ((_a = last[idx]) == null ? void 0 : _a.age) && ((_b = last[idx]) == null ? void 0 : _b.age) > 0) { + skipped++; + return last[idx]; + } + skipped = 0; + return new Promise(async (resolve) => { + const enhanced = enhance(image18); + let resT; + const obj = { + age: 0, + gender: "unknown", + genderScore: 0, + descriptor: [] + }; + if (config3.face.description.enabled) + resT = await model.predict(enhanced); + tfjs_esm_exports.dispose(enhanced); + if (resT) { + const gender = await resT.find((t) => t.shape[1] === 1).data(); + const confidence = Math.trunc(200 * Math.abs(gender[0] - 0.5)) / 100; + if (confidence > config3.face.description.minConfidence) { + obj.gender = gender[0] <= 0.5 ? "female" : "male"; + obj.genderScore = Math.min(0.99, confidence); + } + const argmax = tfjs_esm_exports.argMax(resT.find((t) => t.shape[1] === 100), 1); + const age = (await argmax.data())[0]; + const all2 = await resT.find((t) => t.shape[1] === 100).data(); + obj.age = Math.round(all2[age - 1] > all2[age + 1] ? 10 * age - 100 * all2[age - 1] : 10 * age + 100 * all2[age + 1]) / 10; + const desc = resT.find((t) => t.shape[1] === 1024); + const descriptor = await desc.data(); + obj.descriptor = [...descriptor]; + resT.forEach((t) => tfjs_esm_exports.dispose(t)); + } + last[idx] = obj; + lastCount = count2; + resolve(obj); + }); +} + +// src/emotion/emotion.ts +var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]; +var model2; +var last2 = []; +var lastCount2 = 0; +var skipped2 = Number.MAX_SAFE_INTEGER; +var rgb = [0.2989, 0.587, 0.114]; +async function load4(config3) { + if (!model2) { + model2 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.emotion.modelPath)); + if (!model2 || !model2.modelUrl) + log("load model failed:", config3.face.emotion.modelPath); + else if (config3.debug) + log("load model:", model2.modelUrl); + } else if (config3.debug) + log("cached model:", model2.modelUrl); + return model2; +} +async function predict3(image18, config3, idx, count2) { + if (!model2) + return null; + if (skipped2 < config3.face.emotion.skipFrames && config3.skipFrame && lastCount2 === count2 && last2[idx] && last2[idx].length > 0) { + skipped2++; + return last2[idx]; + } + skipped2 = 0; + return new Promise(async (resolve) => { + const resize = tfjs_esm_exports.image.resizeBilinear(image18, [model2.inputs[0].shape[2], model2.inputs[0].shape[1]], false); + const [red, green, blue] = tfjs_esm_exports.split(resize, 3, 3); + tfjs_esm_exports.dispose(resize); + const redNorm = tfjs_esm_exports.mul(red, rgb[0]); + const greenNorm = tfjs_esm_exports.mul(green, rgb[1]); + const blueNorm = tfjs_esm_exports.mul(blue, rgb[2]); + tfjs_esm_exports.dispose(red); + tfjs_esm_exports.dispose(green); + tfjs_esm_exports.dispose(blue); + const grayscale = tfjs_esm_exports.addN([redNorm, greenNorm, blueNorm]); + tfjs_esm_exports.dispose(redNorm); + tfjs_esm_exports.dispose(greenNorm); + tfjs_esm_exports.dispose(blueNorm); + const normalize = tfjs_esm_exports.tidy(() => tfjs_esm_exports.mul(tfjs_esm_exports.sub(grayscale, 0.5), 2)); + tfjs_esm_exports.dispose(grayscale); + const obj = []; + if (config3.face.emotion.enabled) { + const emotionT = await model2.predict(normalize); + const data2 = await emotionT.data(); + tfjs_esm_exports.dispose(emotionT); + for (let i = 0; i < data2.length; i++) { + if (data2[i] > config3.face.emotion.minConfidence) + obj.push({ score: Math.min(0.99, Math.trunc(100 * data2[i]) / 100), emotion: annotations[i] }); + } + obj.sort((a, b) => b.score - a.score); + } + tfjs_esm_exports.dispose(normalize); + last2[idx] = obj; + lastCount2 = count2; + resolve(obj); + }); +} + +// src/posenet/keypoints.ts +var partNames = [ + "nose", + "leftEye", + "rightEye", + "leftEar", + "rightEar", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle" +]; +var count = partNames.length; +var partIds = partNames.reduce((result, jointName, i) => { + result[jointName] = i; + return result; +}, {}); +var connectedPartNames = [ + ["leftHip", "leftShoulder"], + ["leftElbow", "leftShoulder"], + ["leftElbow", "leftWrist"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["rightHip", "rightShoulder"], + ["rightElbow", "rightShoulder"], + ["rightElbow", "rightWrist"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"], + ["leftShoulder", "rightShoulder"], + ["leftHip", "rightHip"] +]; +var connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [partIds[jointNameA], partIds[jointNameB]]); +var poseChain = [ + ["nose", "leftEye"], + ["leftEye", "leftEar"], + ["nose", "rightEye"], + ["rightEye", "rightEar"], + ["nose", "leftShoulder"], + ["leftShoulder", "leftElbow"], + ["leftElbow", "leftWrist"], + ["leftShoulder", "leftHip"], + ["leftHip", "leftKnee"], + ["leftKnee", "leftAnkle"], + ["nose", "rightShoulder"], + ["rightShoulder", "rightElbow"], + ["rightElbow", "rightWrist"], + ["rightShoulder", "rightHip"], + ["rightHip", "rightKnee"], + ["rightKnee", "rightAnkle"] +]; + +// src/posenet/utils.ts +function getBoundingBox(keypoints3) { + const coord = keypoints3.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({ + maxX: Math.max(maxX, x), + maxY: Math.max(maxY, y), + minX: Math.min(minX, x), + minY: Math.min(minY, y) + }), { + maxX: Number.NEGATIVE_INFINITY, + maxY: Number.NEGATIVE_INFINITY, + minX: Number.POSITIVE_INFINITY, + minY: Number.POSITIVE_INFINITY + }); + return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY]; +} +function scalePoses(poses2, [height, width], [inputResolutionHeight, inputResolutionWidth]) { + const scaleY = height / inputResolutionHeight; + const scaleX = width / inputResolutionWidth; + const scalePose = (pose, i) => ({ + id: i, + score: pose.score, + boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight], + box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)], + keypoints: pose.keypoints.map(({ score: score3, part, position }) => ({ + score: score3, + part, + position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)], + positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] + })) + }); + const scaledPoses = poses2.map((pose, i) => scalePose(pose, i)); + return scaledPoses; +} +var MaxHeap = class { + constructor(maxSize2, getElementValue) { + this.priorityQueue = new Array(maxSize2); + this.numberOfElements = -1; + this.getElementValue = getElementValue; + } + enqueue(x) { + this.priorityQueue[++this.numberOfElements] = x; + this.swim(this.numberOfElements); + } + dequeue() { + const max2 = this.priorityQueue[0]; + this.exchange(0, this.numberOfElements--); + this.sink(0); + this.priorityQueue[this.numberOfElements + 1] = null; + return max2; + } + empty() { + return this.numberOfElements === -1; + } + size() { + return this.numberOfElements + 1; + } + all() { + return this.priorityQueue.slice(0, this.numberOfElements + 1); + } + max() { + return this.priorityQueue[0]; + } + swim(k) { + while (k > 0 && this.less(Math.floor(k / 2), k)) { + this.exchange(k, Math.floor(k / 2)); + k = Math.floor(k / 2); + } + } + sink(k) { + while (2 * k <= this.numberOfElements) { + let j = 2 * k; + if (j < this.numberOfElements && this.less(j, j + 1)) + j++; + if (!this.less(k, j)) + break; + this.exchange(k, j); + k = j; + } + } + getValueAt(i) { + return this.getElementValue(this.priorityQueue[i]); + } + less(i, j) { + return this.getValueAt(i) < this.getValueAt(j); + } + exchange(i, j) { + const t = this.priorityQueue[i]; + this.priorityQueue[i] = this.priorityQueue[j]; + this.priorityQueue[j] = t; + } +}; +function getOffsetPoint(y, x, keypoint, offsets) { + return { + y: offsets.get(y, x, keypoint), + x: offsets.get(y, x, keypoint + count) + }; +} +function getImageCoords(part, outputStride2, offsets) { + const { heatmapY, heatmapX, id: keypoint } = part; + const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets); + return { + x: part.heatmapX * outputStride2 + x, + y: part.heatmapY * outputStride2 + y + }; +} +function clamp(a, min, max2) { + if (a < min) + return min; + if (a > max2) + return max2; + return a; +} +function squaredDistance(y1, x1, y2, x2) { + const dy = y2 - y1; + const dx = x2 - x1; + return dy * dy + dx * dx; +} +function addVectors(a, b) { + return { x: a.x + b.x, y: a.y + b.y }; +} + +// src/posenet/poses.ts +var localMaximumRadius = 1; +var outputStride = 16; +var squaredNmsRadius = 50 ** 2; +function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) { + const getDisplacement = (point2) => ({ + y: displacements.get(point2.y, point2.x, edgeId), + x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId) + }); + const getStridedIndexNearPoint = (point2, height2, width2) => ({ + y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1), + x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1) + }); + const [height, width] = scores.shape; + const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width); + const displacement = getDisplacement(sourceKeypointIndices); + const displacedPoint = addVectors(sourceKeypoint.position, displacement); + let targetKeypoint = displacedPoint; + for (let i = 0; i < offsetRefineStep; i++) { + const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); + const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets); + targetKeypoint = addVectors({ x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride }, { x: offsetPoint.x, y: offsetPoint.y }); + } + const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); + const score3 = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId); + return { position: targetKeypoint, part: partNames[targetId], score: score3 }; +} +function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) { + const tuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]); + const edgesFwd = tuples.map(([, childJointId]) => childJointId); + const edgesBwd = tuples.map(([parentJointId]) => parentJointId); + const numParts = scores.shape[2]; + const numEdges = edgesFwd.length; + const keypoints3 = new Array(numParts); + const rootPoint = getImageCoords(root.part, outputStride, offsets); + keypoints3[root.part.id] = { + score: root.score, + part: partNames[root.part.id], + position: rootPoint + }; + for (let edge = numEdges - 1; edge >= 0; --edge) { + const sourceId = edgesFwd[edge]; + const targetId = edgesBwd[edge]; + if (keypoints3[sourceId] && !keypoints3[targetId]) { + keypoints3[targetId] = traverse(edge, keypoints3[sourceId], targetId, scores, offsets, displacementsBwd); + } + } + for (let edge = 0; edge < numEdges; ++edge) { + const sourceId = edgesBwd[edge]; + const targetId = edgesFwd[edge]; + if (keypoints3[sourceId] && !keypoints3[targetId]) { + keypoints3[targetId] = traverse(edge, keypoints3[sourceId], targetId, scores, offsets, displacementsFwd); + } + } + return keypoints3; +} +function scoreIsMaximumInLocalWindow(keypointId, score3, heatmapY, heatmapX, scores) { + const [height, width] = scores.shape; + let localMaximum = true; + const yStart = Math.max(heatmapY - localMaximumRadius, 0); + const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height); + for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) { + const xStart = Math.max(heatmapX - localMaximumRadius, 0); + const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width); + for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) { + if (scores.get(yCurrent, xCurrent, keypointId) > score3) { + localMaximum = false; + break; + } + } + if (!localMaximum) + break; + } + return localMaximum; +} +function buildPartWithScoreQueue(minConfidence2, scores) { + const [height, width, numKeypoints] = scores.shape; + const queue = new MaxHeap(height * width * numKeypoints, ({ score: score3 }) => score3); + for (let heatmapY = 0; heatmapY < height; ++heatmapY) { + for (let heatmapX = 0; heatmapX < width; ++heatmapX) { + for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) { + const score3 = scores.get(heatmapY, heatmapX, keypointId); + if (score3 < minConfidence2) + continue; + if (scoreIsMaximumInLocalWindow(keypointId, score3, heatmapY, heatmapX, scores)) + queue.enqueue({ score: score3, part: { heatmapY, heatmapX, id: keypointId } }); + } + } + } + return queue; +} +function withinRadius(poses2, { x, y }, keypointId) { + return poses2.some(({ keypoints: keypoints3 }) => { + var _a; + const correspondingKeypoint = (_a = keypoints3[keypointId]) == null ? void 0 : _a.position; + if (!correspondingKeypoint) + return false; + return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius; + }); +} +function getInstanceScore(existingPoses, keypoints3) { + const notOverlappedKeypointScores = keypoints3.reduce((result, { position, score: score3 }, keypointId) => { + if (!withinRadius(existingPoses, position, keypointId)) + result += score3; + return result; + }, 0); + return notOverlappedKeypointScores / keypoints3.length; +} +function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence2) { + const poses2 = []; + const queue = buildPartWithScoreQueue(minConfidence2, scores); + while (poses2.length < maxDetected && !queue.empty()) { + const root = queue.dequeue(); + const rootImageCoords = getImageCoords(root.part, outputStride, offsets); + if (withinRadius(poses2, rootImageCoords, root.part.id)) + continue; + let keypoints3 = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd); + keypoints3 = keypoints3.filter((a) => a.score > minConfidence2); + const score3 = getInstanceScore(poses2, keypoints3); + const box6 = getBoundingBox(keypoints3); + if (score3 > minConfidence2) + poses2.push({ keypoints: keypoints3, box: box6, score: Math.round(100 * score3) / 100 }); + } + return poses2; +} + +// src/posenet/posenet.ts +var model3; +var poseNetOutputs = ["MobilenetV1/offset_2/BiasAdd", "MobilenetV1/heatmap_2/BiasAdd", "MobilenetV1/displacement_fwd_2/BiasAdd", "MobilenetV1/displacement_bwd_2/BiasAdd"]; +async function predict4(input, config3) { + const res = tfjs_esm_exports.tidy(() => { + if (!model3.inputs[0].shape) + return []; + const resized = tfjs_esm_exports.image.resizeBilinear(input, [model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); + const normalized = tfjs_esm_exports.sub(tfjs_esm_exports.div(tfjs_esm_exports.cast(resized, "float32"), 127.5), 1); + const results = model3.execute(normalized, poseNetOutputs); + const results3d = results.map((y) => tfjs_esm_exports.squeeze(y, [0])); + results3d[1] = results3d[1].sigmoid(); + return results3d; + }); + const buffers = await Promise.all(res.map((tensor2) => tensor2.buffer())); + for (const t of res) + tfjs_esm_exports.dispose(t); + const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); + if (!model3.inputs[0].shape) + return []; + const scaled = scalePoses(decoded, [input.shape[1], input.shape[2]], [model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); + return scaled; +} +async function load5(config3) { + if (!model3) { + model3 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + if (!model3 || !model3["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model3["modelUrl"]); + } else if (config3.debug) + log("cached model:", model3["modelUrl"]); + return model3; +} + +// src/handpose/box.ts +function getBoxSize2(box6) { + return [ + Math.abs(box6.endPoint[0] - box6.startPoint[0]), + Math.abs(box6.endPoint[1] - box6.startPoint[1]) + ]; +} +function getBoxCenter2(box6) { + return [ + box6.startPoint[0] + (box6.endPoint[0] - box6.startPoint[0]) / 2, + box6.startPoint[1] + (box6.endPoint[1] - box6.startPoint[1]) / 2 + ]; +} +function cutBoxFromImageAndResize2(box6, image18, cropSize) { + const h = image18.shape[1]; + const w = image18.shape[2]; + const boxes = [[ + box6.startPoint[1] / h, + box6.startPoint[0] / w, + box6.endPoint[1] / h, + box6.endPoint[0] / w + ]]; + return tfjs_esm_exports.image.cropAndResize(image18, boxes, [0], cropSize); +} +function scaleBoxCoordinates2(box6, factor) { + const startPoint = [box6.startPoint[0] * factor[0], box6.startPoint[1] * factor[1]]; + const endPoint = [box6.endPoint[0] * factor[0], box6.endPoint[1] * factor[1]]; + const palmLandmarks = box6.palmLandmarks.map((coord) => { + const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]]; + return scaledCoord; + }); + return { startPoint, endPoint, palmLandmarks, confidence: box6.confidence }; +} +function enlargeBox2(box6, factor = 1.5) { + const center = getBoxCenter2(box6); + const size = getBoxSize2(box6); + const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; + const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; + const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; + return { startPoint, endPoint, palmLandmarks: box6.palmLandmarks }; +} +function squarifyBox2(box6) { + const centers = getBoxCenter2(box6); + const size = getBoxSize2(box6); + const maxEdge = Math.max(...size); + const halfSize = maxEdge / 2; + const startPoint = [centers[0] - halfSize, centers[1] - halfSize]; + const endPoint = [centers[0] + halfSize, centers[1] + halfSize]; + return { startPoint, endPoint, palmLandmarks: box6.palmLandmarks }; +} + +// src/handpose/anchors.ts +var anchors = [ + { x: 0.015625, y: 0.015625 }, + { x: 0.015625, y: 0.015625 }, + { x: 0.046875, y: 0.015625 }, + { x: 0.046875, y: 0.015625 }, + { x: 0.078125, y: 0.015625 }, + { x: 0.078125, y: 0.015625 }, + { x: 0.109375, y: 0.015625 }, + { x: 0.109375, y: 0.015625 }, + { x: 0.140625, y: 0.015625 }, + { x: 0.140625, y: 0.015625 }, + { x: 0.171875, y: 0.015625 }, + { x: 0.171875, y: 0.015625 }, + { x: 0.203125, y: 0.015625 }, + { x: 0.203125, y: 0.015625 }, + { x: 0.234375, y: 0.015625 }, + { x: 0.234375, y: 0.015625 }, + { x: 0.265625, y: 0.015625 }, + { x: 0.265625, y: 0.015625 }, + { x: 0.296875, y: 0.015625 }, + { x: 0.296875, y: 0.015625 }, + { x: 0.328125, y: 0.015625 }, + { x: 0.328125, y: 0.015625 }, + { x: 0.359375, y: 0.015625 }, + { x: 0.359375, y: 0.015625 }, + { x: 0.390625, y: 0.015625 }, + { x: 0.390625, y: 0.015625 }, + { x: 0.421875, y: 0.015625 }, + { x: 0.421875, y: 0.015625 }, + { x: 0.453125, y: 0.015625 }, + { x: 0.453125, y: 0.015625 }, + { x: 0.484375, y: 0.015625 }, + { x: 0.484375, y: 0.015625 }, + { x: 0.515625, y: 0.015625 }, + { x: 0.515625, y: 0.015625 }, + { x: 0.546875, y: 0.015625 }, + { x: 0.546875, y: 0.015625 }, + { x: 0.578125, y: 0.015625 }, + { x: 0.578125, y: 0.015625 }, + { x: 0.609375, y: 0.015625 }, + { x: 0.609375, y: 0.015625 }, + { x: 0.640625, y: 0.015625 }, + { x: 0.640625, y: 0.015625 }, + { x: 0.671875, y: 0.015625 }, + { x: 0.671875, y: 0.015625 }, + { x: 0.703125, y: 0.015625 }, + { x: 0.703125, y: 0.015625 }, + { x: 0.734375, y: 0.015625 }, + { x: 0.734375, y: 0.015625 }, + { x: 0.765625, y: 0.015625 }, + { x: 0.765625, y: 0.015625 }, + { x: 0.796875, y: 0.015625 }, + { x: 0.796875, y: 0.015625 }, + { x: 0.828125, y: 0.015625 }, + { x: 0.828125, y: 0.015625 }, + { x: 0.859375, y: 0.015625 }, + { x: 0.859375, y: 0.015625 }, + { x: 0.890625, y: 0.015625 }, + { x: 0.890625, y: 0.015625 }, + { x: 0.921875, y: 0.015625 }, + { x: 0.921875, y: 0.015625 }, + { x: 0.953125, y: 0.015625 }, + { x: 0.953125, y: 0.015625 }, + { x: 0.984375, y: 0.015625 }, + { x: 0.984375, y: 0.015625 }, + { x: 0.015625, y: 0.046875 }, + { x: 0.015625, y: 0.046875 }, + { x: 0.046875, y: 0.046875 }, + { x: 0.046875, y: 0.046875 }, + { x: 0.078125, y: 0.046875 }, + { x: 0.078125, y: 0.046875 }, + { x: 0.109375, y: 0.046875 }, + { x: 0.109375, y: 0.046875 }, + { x: 0.140625, y: 0.046875 }, + { x: 0.140625, y: 0.046875 }, + { x: 0.171875, y: 0.046875 }, + { x: 0.171875, y: 0.046875 }, + { x: 0.203125, y: 0.046875 }, + { x: 0.203125, y: 0.046875 }, + { x: 0.234375, y: 0.046875 }, + { x: 0.234375, y: 0.046875 }, + { x: 0.265625, y: 0.046875 }, + { x: 0.265625, y: 0.046875 }, + { x: 0.296875, y: 0.046875 }, + { x: 0.296875, y: 0.046875 }, + { x: 0.328125, y: 0.046875 }, + { x: 0.328125, y: 0.046875 }, + { x: 0.359375, y: 0.046875 }, + { x: 0.359375, y: 0.046875 }, + { x: 0.390625, y: 0.046875 }, + { x: 0.390625, y: 0.046875 }, + { x: 0.421875, y: 0.046875 }, + { x: 0.421875, y: 0.046875 }, + { x: 0.453125, y: 0.046875 }, + { x: 0.453125, y: 0.046875 }, + { x: 0.484375, y: 0.046875 }, + { x: 0.484375, y: 0.046875 }, + { x: 0.515625, y: 0.046875 }, + { x: 0.515625, y: 0.046875 }, + { x: 0.546875, y: 0.046875 }, + { x: 0.546875, y: 0.046875 }, + { x: 0.578125, y: 0.046875 }, + { x: 0.578125, y: 0.046875 }, + { x: 0.609375, y: 0.046875 }, + { x: 0.609375, y: 0.046875 }, + { x: 0.640625, y: 0.046875 }, + { x: 0.640625, y: 0.046875 }, + { x: 0.671875, y: 0.046875 }, + { x: 0.671875, y: 0.046875 }, + { x: 0.703125, y: 0.046875 }, + { x: 0.703125, y: 0.046875 }, + { x: 0.734375, y: 0.046875 }, + { x: 0.734375, y: 0.046875 }, + { x: 0.765625, y: 0.046875 }, + { x: 0.765625, y: 0.046875 }, + { x: 0.796875, y: 0.046875 }, + { x: 0.796875, y: 0.046875 }, + { x: 0.828125, y: 0.046875 }, + { x: 0.828125, y: 0.046875 }, + { x: 0.859375, y: 0.046875 }, + { x: 0.859375, y: 0.046875 }, + { x: 0.890625, y: 0.046875 }, + { x: 0.890625, y: 0.046875 }, + { x: 0.921875, y: 0.046875 }, + { x: 0.921875, y: 0.046875 }, + { x: 0.953125, y: 0.046875 }, + { x: 0.953125, y: 0.046875 }, + { x: 0.984375, y: 0.046875 }, + { x: 0.984375, y: 0.046875 }, + { x: 0.015625, y: 0.078125 }, + { x: 0.015625, y: 0.078125 }, + { x: 0.046875, y: 0.078125 }, + { x: 0.046875, y: 0.078125 }, + { x: 0.078125, y: 0.078125 }, + { x: 0.078125, y: 0.078125 }, + { x: 0.109375, y: 0.078125 }, + { x: 0.109375, y: 0.078125 }, + { x: 0.140625, y: 0.078125 }, + { x: 0.140625, y: 0.078125 }, + { x: 0.171875, y: 0.078125 }, + { x: 0.171875, y: 0.078125 }, + { x: 0.203125, y: 0.078125 }, + { x: 0.203125, y: 0.078125 }, + { x: 0.234375, y: 0.078125 }, + { x: 0.234375, y: 0.078125 }, + { x: 0.265625, y: 0.078125 }, + { x: 0.265625, y: 0.078125 }, + { x: 0.296875, y: 0.078125 }, + { x: 0.296875, y: 0.078125 }, + { x: 0.328125, y: 0.078125 }, + { x: 0.328125, y: 0.078125 }, + { x: 0.359375, y: 0.078125 }, + { x: 0.359375, y: 0.078125 }, + { x: 0.390625, y: 0.078125 }, + { x: 0.390625, y: 0.078125 }, + { x: 0.421875, y: 0.078125 }, + { x: 0.421875, y: 0.078125 }, + { x: 0.453125, y: 0.078125 }, + { x: 0.453125, y: 0.078125 }, + { x: 0.484375, y: 0.078125 }, + { x: 0.484375, y: 0.078125 }, + { x: 0.515625, y: 0.078125 }, + { x: 0.515625, y: 0.078125 }, + { x: 0.546875, y: 0.078125 }, + { x: 0.546875, y: 0.078125 }, + { x: 0.578125, y: 0.078125 }, + { x: 0.578125, y: 0.078125 }, + { x: 0.609375, y: 0.078125 }, + { x: 0.609375, y: 0.078125 }, + { x: 0.640625, y: 0.078125 }, + { x: 0.640625, y: 0.078125 }, + { x: 0.671875, y: 0.078125 }, + { x: 0.671875, y: 0.078125 }, + { x: 0.703125, y: 0.078125 }, + { x: 0.703125, y: 0.078125 }, + { x: 0.734375, y: 0.078125 }, + { x: 0.734375, y: 0.078125 }, + { x: 0.765625, y: 0.078125 }, + { x: 0.765625, y: 0.078125 }, + { x: 0.796875, y: 0.078125 }, + { x: 0.796875, y: 0.078125 }, + { x: 0.828125, y: 0.078125 }, + { x: 0.828125, y: 0.078125 }, + { x: 0.859375, y: 0.078125 }, + { x: 0.859375, y: 0.078125 }, + { x: 0.890625, y: 0.078125 }, + { x: 0.890625, y: 0.078125 }, + { x: 0.921875, y: 0.078125 }, + { x: 0.921875, y: 0.078125 }, + { x: 0.953125, y: 0.078125 }, + { x: 0.953125, y: 0.078125 }, + { x: 0.984375, y: 0.078125 }, + { x: 0.984375, y: 0.078125 }, + { x: 0.015625, y: 0.109375 }, + { x: 0.015625, y: 0.109375 }, + { x: 0.046875, y: 0.109375 }, + { x: 0.046875, y: 0.109375 }, + { x: 0.078125, y: 0.109375 }, + { x: 0.078125, y: 0.109375 }, + { x: 0.109375, y: 0.109375 }, + { x: 0.109375, y: 0.109375 }, + { x: 0.140625, y: 0.109375 }, + { x: 0.140625, y: 0.109375 }, + { x: 0.171875, y: 0.109375 }, + { x: 0.171875, y: 0.109375 }, + { x: 0.203125, y: 0.109375 }, + { x: 0.203125, y: 0.109375 }, + { x: 0.234375, y: 0.109375 }, + { x: 0.234375, y: 0.109375 }, + { x: 0.265625, y: 0.109375 }, + { x: 0.265625, y: 0.109375 }, + { x: 0.296875, y: 0.109375 }, + { x: 0.296875, y: 0.109375 }, + { x: 0.328125, y: 0.109375 }, + { x: 0.328125, y: 0.109375 }, + { x: 0.359375, y: 0.109375 }, + { x: 0.359375, y: 0.109375 }, + { x: 0.390625, y: 0.109375 }, + { x: 0.390625, y: 0.109375 }, + { x: 0.421875, y: 0.109375 }, + { x: 0.421875, y: 0.109375 }, + { x: 0.453125, y: 0.109375 }, + { x: 0.453125, y: 0.109375 }, + { x: 0.484375, y: 0.109375 }, + { x: 0.484375, y: 0.109375 }, + { x: 0.515625, y: 0.109375 }, + { x: 0.515625, y: 0.109375 }, + { x: 0.546875, y: 0.109375 }, + { x: 0.546875, y: 0.109375 }, + { x: 0.578125, y: 0.109375 }, + { x: 0.578125, y: 0.109375 }, + { x: 0.609375, y: 0.109375 }, + { x: 0.609375, y: 0.109375 }, + { x: 0.640625, y: 0.109375 }, + { x: 0.640625, y: 0.109375 }, + { x: 0.671875, y: 0.109375 }, + { x: 0.671875, y: 0.109375 }, + { x: 0.703125, y: 0.109375 }, + { x: 0.703125, y: 0.109375 }, + { x: 0.734375, y: 0.109375 }, + { x: 0.734375, y: 0.109375 }, + { x: 0.765625, y: 0.109375 }, + { x: 0.765625, y: 0.109375 }, + { x: 0.796875, y: 0.109375 }, + { x: 0.796875, y: 0.109375 }, + { x: 0.828125, y: 0.109375 }, + { x: 0.828125, y: 0.109375 }, + { x: 0.859375, y: 0.109375 }, + { x: 0.859375, y: 0.109375 }, + { x: 0.890625, y: 0.109375 }, + { x: 0.890625, y: 0.109375 }, + { x: 0.921875, y: 0.109375 }, + { x: 0.921875, y: 0.109375 }, + { x: 0.953125, y: 0.109375 }, + { x: 0.953125, y: 0.109375 }, + { x: 0.984375, y: 0.109375 }, + { x: 0.984375, y: 0.109375 }, + { x: 0.015625, y: 0.140625 }, + { x: 0.015625, y: 0.140625 }, + { x: 0.046875, y: 0.140625 }, + { x: 0.046875, y: 0.140625 }, + { x: 0.078125, y: 0.140625 }, + { x: 0.078125, y: 0.140625 }, + { x: 0.109375, y: 0.140625 }, + { x: 0.109375, y: 0.140625 }, + { x: 0.140625, y: 0.140625 }, + { x: 0.140625, y: 0.140625 }, + { x: 0.171875, y: 0.140625 }, + { x: 0.171875, y: 0.140625 }, + { x: 0.203125, y: 0.140625 }, + { x: 0.203125, y: 0.140625 }, + { x: 0.234375, y: 0.140625 }, + { x: 0.234375, y: 0.140625 }, + { x: 0.265625, y: 0.140625 }, + { x: 0.265625, y: 0.140625 }, + { x: 0.296875, y: 0.140625 }, + { x: 0.296875, y: 0.140625 }, + { x: 0.328125, y: 0.140625 }, + { x: 0.328125, y: 0.140625 }, + { x: 0.359375, y: 0.140625 }, + { x: 0.359375, y: 0.140625 }, + { x: 0.390625, y: 0.140625 }, + { x: 0.390625, y: 0.140625 }, + { x: 0.421875, y: 0.140625 }, + { x: 0.421875, y: 0.140625 }, + { x: 0.453125, y: 0.140625 }, + { x: 0.453125, y: 0.140625 }, + { x: 0.484375, y: 0.140625 }, + { x: 0.484375, y: 0.140625 }, + { x: 0.515625, y: 0.140625 }, + { x: 0.515625, y: 0.140625 }, + { x: 0.546875, y: 0.140625 }, + { x: 0.546875, y: 0.140625 }, + { x: 0.578125, y: 0.140625 }, + { x: 0.578125, y: 0.140625 }, + { x: 0.609375, y: 0.140625 }, + { x: 0.609375, y: 0.140625 }, + { x: 0.640625, y: 0.140625 }, + { x: 0.640625, y: 0.140625 }, + { x: 0.671875, y: 0.140625 }, + { x: 0.671875, y: 0.140625 }, + { x: 0.703125, y: 0.140625 }, + { x: 0.703125, y: 0.140625 }, + { x: 0.734375, y: 0.140625 }, + { x: 0.734375, y: 0.140625 }, + { x: 0.765625, y: 0.140625 }, + { x: 0.765625, y: 0.140625 }, + { x: 0.796875, y: 0.140625 }, + { x: 0.796875, y: 0.140625 }, + { x: 0.828125, y: 0.140625 }, + { x: 0.828125, y: 0.140625 }, + { x: 0.859375, y: 0.140625 }, + { x: 0.859375, y: 0.140625 }, + { x: 0.890625, y: 0.140625 }, + { x: 0.890625, y: 0.140625 }, + { x: 0.921875, y: 0.140625 }, + { x: 0.921875, y: 0.140625 }, + { x: 0.953125, y: 0.140625 }, + { x: 0.953125, y: 0.140625 }, + { x: 0.984375, y: 0.140625 }, + { x: 0.984375, y: 0.140625 }, + { x: 0.015625, y: 0.171875 }, + { x: 0.015625, y: 0.171875 }, + { x: 0.046875, y: 0.171875 }, + { x: 0.046875, y: 0.171875 }, + { x: 0.078125, y: 0.171875 }, + { x: 0.078125, y: 0.171875 }, + { x: 0.109375, y: 0.171875 }, + { x: 0.109375, y: 0.171875 }, + { x: 0.140625, y: 0.171875 }, + { x: 0.140625, y: 0.171875 }, + { x: 0.171875, y: 0.171875 }, + { x: 0.171875, y: 0.171875 }, + { x: 0.203125, y: 0.171875 }, + { x: 0.203125, y: 0.171875 }, + { x: 0.234375, y: 0.171875 }, + { x: 0.234375, y: 0.171875 }, + { x: 0.265625, y: 0.171875 }, + { x: 0.265625, y: 0.171875 }, + { x: 0.296875, y: 0.171875 }, + { x: 0.296875, y: 0.171875 }, + { x: 0.328125, y: 0.171875 }, + { x: 0.328125, y: 0.171875 }, + { x: 0.359375, y: 0.171875 }, + { x: 0.359375, y: 0.171875 }, + { x: 0.390625, y: 0.171875 }, + { x: 0.390625, y: 0.171875 }, + { x: 0.421875, y: 0.171875 }, + { x: 0.421875, y: 0.171875 }, + { x: 0.453125, y: 0.171875 }, + { x: 0.453125, y: 0.171875 }, + { x: 0.484375, y: 0.171875 }, + { x: 0.484375, y: 0.171875 }, + { x: 0.515625, y: 0.171875 }, + { x: 0.515625, y: 0.171875 }, + { x: 0.546875, y: 0.171875 }, + { x: 0.546875, y: 0.171875 }, + { x: 0.578125, y: 0.171875 }, + { x: 0.578125, y: 0.171875 }, + { x: 0.609375, y: 0.171875 }, + { x: 0.609375, y: 0.171875 }, + { x: 0.640625, y: 0.171875 }, + { x: 0.640625, y: 0.171875 }, + { x: 0.671875, y: 0.171875 }, + { x: 0.671875, y: 0.171875 }, + { x: 0.703125, y: 0.171875 }, + { x: 0.703125, y: 0.171875 }, + { x: 0.734375, y: 0.171875 }, + { x: 0.734375, y: 0.171875 }, + { x: 0.765625, y: 0.171875 }, + { x: 0.765625, y: 0.171875 }, + { x: 0.796875, y: 0.171875 }, + { x: 0.796875, y: 0.171875 }, + { x: 0.828125, y: 0.171875 }, + { x: 0.828125, y: 0.171875 }, + { x: 0.859375, y: 0.171875 }, + { x: 0.859375, y: 0.171875 }, + { x: 0.890625, y: 0.171875 }, + { x: 0.890625, y: 0.171875 }, + { x: 0.921875, y: 0.171875 }, + { x: 0.921875, y: 0.171875 }, + { x: 0.953125, y: 0.171875 }, + { x: 0.953125, y: 0.171875 }, + { x: 0.984375, y: 0.171875 }, + { x: 0.984375, y: 0.171875 }, + { x: 0.015625, y: 0.203125 }, + { x: 0.015625, y: 0.203125 }, + { x: 0.046875, y: 0.203125 }, + { x: 0.046875, y: 0.203125 }, + { x: 0.078125, y: 0.203125 }, + { x: 0.078125, y: 0.203125 }, + { x: 0.109375, y: 0.203125 }, + { x: 0.109375, y: 0.203125 }, + { x: 0.140625, y: 0.203125 }, + { x: 0.140625, y: 0.203125 }, + { x: 0.171875, y: 0.203125 }, + { x: 0.171875, y: 0.203125 }, + { x: 0.203125, y: 0.203125 }, + { x: 0.203125, y: 0.203125 }, + { x: 0.234375, y: 0.203125 }, + { x: 0.234375, y: 0.203125 }, + { x: 0.265625, y: 0.203125 }, + { x: 0.265625, y: 0.203125 }, + { x: 0.296875, y: 0.203125 }, + { x: 0.296875, y: 0.203125 }, + { x: 0.328125, y: 0.203125 }, + { x: 0.328125, y: 0.203125 }, + { x: 0.359375, y: 0.203125 }, + { x: 0.359375, y: 0.203125 }, + { x: 0.390625, y: 0.203125 }, + { x: 0.390625, y: 0.203125 }, + { x: 0.421875, y: 0.203125 }, + { x: 0.421875, y: 0.203125 }, + { x: 0.453125, y: 0.203125 }, + { x: 0.453125, y: 0.203125 }, + { x: 0.484375, y: 0.203125 }, + { x: 0.484375, y: 0.203125 }, + { x: 0.515625, y: 0.203125 }, + { x: 0.515625, y: 0.203125 }, + { x: 0.546875, y: 0.203125 }, + { x: 0.546875, y: 0.203125 }, + { x: 0.578125, y: 0.203125 }, + { x: 0.578125, y: 0.203125 }, + { x: 0.609375, y: 0.203125 }, + { x: 0.609375, y: 0.203125 }, + { x: 0.640625, y: 0.203125 }, + { x: 0.640625, y: 0.203125 }, + { x: 0.671875, y: 0.203125 }, + { x: 0.671875, y: 0.203125 }, + { x: 0.703125, y: 0.203125 }, + { x: 0.703125, y: 0.203125 }, + { x: 0.734375, y: 0.203125 }, + { x: 0.734375, y: 0.203125 }, + { x: 0.765625, y: 0.203125 }, + { x: 0.765625, y: 0.203125 }, + { x: 0.796875, y: 0.203125 }, + { x: 0.796875, y: 0.203125 }, + { x: 0.828125, y: 0.203125 }, + { x: 0.828125, y: 0.203125 }, + { x: 0.859375, y: 0.203125 }, + { x: 0.859375, y: 0.203125 }, + { x: 0.890625, y: 0.203125 }, + { x: 0.890625, y: 0.203125 }, + { x: 0.921875, y: 0.203125 }, + { x: 0.921875, y: 0.203125 }, + { x: 0.953125, y: 0.203125 }, + { x: 0.953125, y: 0.203125 }, + { x: 0.984375, y: 0.203125 }, + { x: 0.984375, y: 0.203125 }, + { x: 0.015625, y: 0.234375 }, + { x: 0.015625, y: 0.234375 }, + { x: 0.046875, y: 0.234375 }, + { x: 0.046875, y: 0.234375 }, + { x: 0.078125, y: 0.234375 }, + { x: 0.078125, y: 0.234375 }, + { x: 0.109375, y: 0.234375 }, + { x: 0.109375, y: 0.234375 }, + { x: 0.140625, y: 0.234375 }, + { x: 0.140625, y: 0.234375 }, + { x: 0.171875, y: 0.234375 }, + { x: 0.171875, y: 0.234375 }, + { x: 0.203125, y: 0.234375 }, + { x: 0.203125, y: 0.234375 }, + { x: 0.234375, y: 0.234375 }, + { x: 0.234375, y: 0.234375 }, + { x: 0.265625, y: 0.234375 }, + { x: 0.265625, y: 0.234375 }, + { x: 0.296875, y: 0.234375 }, + { x: 0.296875, y: 0.234375 }, + { x: 0.328125, y: 0.234375 }, + { x: 0.328125, y: 0.234375 }, + { x: 0.359375, y: 0.234375 }, + { x: 0.359375, y: 0.234375 }, + { x: 0.390625, y: 0.234375 }, + { x: 0.390625, y: 0.234375 }, + { x: 0.421875, y: 0.234375 }, + { x: 0.421875, y: 0.234375 }, + { x: 0.453125, y: 0.234375 }, + { x: 0.453125, y: 0.234375 }, + { x: 0.484375, y: 0.234375 }, + { x: 0.484375, y: 0.234375 }, + { x: 0.515625, y: 0.234375 }, + { x: 0.515625, y: 0.234375 }, + { x: 0.546875, y: 0.234375 }, + { x: 0.546875, y: 0.234375 }, + { x: 0.578125, y: 0.234375 }, + { x: 0.578125, y: 0.234375 }, + { x: 0.609375, y: 0.234375 }, + { x: 0.609375, y: 0.234375 }, + { x: 0.640625, y: 0.234375 }, + { x: 0.640625, y: 0.234375 }, + { x: 0.671875, y: 0.234375 }, + { x: 0.671875, y: 0.234375 }, + { x: 0.703125, y: 0.234375 }, + { x: 0.703125, y: 0.234375 }, + { x: 0.734375, y: 0.234375 }, + { x: 0.734375, y: 0.234375 }, + { x: 0.765625, y: 0.234375 }, + { x: 0.765625, y: 0.234375 }, + { x: 0.796875, y: 0.234375 }, + { x: 0.796875, y: 0.234375 }, + { x: 0.828125, y: 0.234375 }, + { x: 0.828125, y: 0.234375 }, + { x: 0.859375, y: 0.234375 }, + { x: 0.859375, y: 0.234375 }, + { x: 0.890625, y: 0.234375 }, + { x: 0.890625, y: 0.234375 }, + { x: 0.921875, y: 0.234375 }, + { x: 0.921875, y: 0.234375 }, + { x: 0.953125, y: 0.234375 }, + { x: 0.953125, y: 0.234375 }, + { x: 0.984375, y: 0.234375 }, + { x: 0.984375, y: 0.234375 }, + { x: 0.015625, y: 0.265625 }, + { x: 0.015625, y: 0.265625 }, + { x: 0.046875, y: 0.265625 }, + { x: 0.046875, y: 0.265625 }, + { x: 0.078125, y: 0.265625 }, + { x: 0.078125, y: 0.265625 }, + { x: 0.109375, y: 0.265625 }, + { x: 0.109375, y: 0.265625 }, + { x: 0.140625, y: 0.265625 }, + { x: 0.140625, y: 0.265625 }, + { x: 0.171875, y: 0.265625 }, + { x: 0.171875, y: 0.265625 }, + { x: 0.203125, y: 0.265625 }, + { x: 0.203125, y: 0.265625 }, + { x: 0.234375, y: 0.265625 }, + { x: 0.234375, y: 0.265625 }, + { x: 0.265625, y: 0.265625 }, + { x: 0.265625, y: 0.265625 }, + { x: 0.296875, y: 0.265625 }, + { x: 0.296875, y: 0.265625 }, + { x: 0.328125, y: 0.265625 }, + { x: 0.328125, y: 0.265625 }, + { x: 0.359375, y: 0.265625 }, + { x: 0.359375, y: 0.265625 }, + { x: 0.390625, y: 0.265625 }, + { x: 0.390625, y: 0.265625 }, + { x: 0.421875, y: 0.265625 }, + { x: 0.421875, y: 0.265625 }, + { x: 0.453125, y: 0.265625 }, + { x: 0.453125, y: 0.265625 }, + { x: 0.484375, y: 0.265625 }, + { x: 0.484375, y: 0.265625 }, + { x: 0.515625, y: 0.265625 }, + { x: 0.515625, y: 0.265625 }, + { x: 0.546875, y: 0.265625 }, + { x: 0.546875, y: 0.265625 }, + { x: 0.578125, y: 0.265625 }, + { x: 0.578125, y: 0.265625 }, + { x: 0.609375, y: 0.265625 }, + { x: 0.609375, y: 0.265625 }, + { x: 0.640625, y: 0.265625 }, + { x: 0.640625, y: 0.265625 }, + { x: 0.671875, y: 0.265625 }, + { x: 0.671875, y: 0.265625 }, + { x: 0.703125, y: 0.265625 }, + { x: 0.703125, y: 0.265625 }, + { x: 0.734375, y: 0.265625 }, + { x: 0.734375, y: 0.265625 }, + { x: 0.765625, y: 0.265625 }, + { x: 0.765625, y: 0.265625 }, + { x: 0.796875, y: 0.265625 }, + { x: 0.796875, y: 0.265625 }, + { x: 0.828125, y: 0.265625 }, + { x: 0.828125, y: 0.265625 }, + { x: 0.859375, y: 0.265625 }, + { x: 0.859375, y: 0.265625 }, + { x: 0.890625, y: 0.265625 }, + { x: 0.890625, y: 0.265625 }, + { x: 0.921875, y: 0.265625 }, + { x: 0.921875, y: 0.265625 }, + { x: 0.953125, y: 0.265625 }, + { x: 0.953125, y: 0.265625 }, + { x: 0.984375, y: 0.265625 }, + { x: 0.984375, y: 0.265625 }, + { x: 0.015625, y: 0.296875 }, + { x: 0.015625, y: 0.296875 }, + { x: 0.046875, y: 0.296875 }, + { x: 0.046875, y: 0.296875 }, + { x: 0.078125, y: 0.296875 }, + { x: 0.078125, y: 0.296875 }, + { x: 0.109375, y: 0.296875 }, + { x: 0.109375, y: 0.296875 }, + { x: 0.140625, y: 0.296875 }, + { x: 0.140625, y: 0.296875 }, + { x: 0.171875, y: 0.296875 }, + { x: 0.171875, y: 0.296875 }, + { x: 0.203125, y: 0.296875 }, + { x: 0.203125, y: 0.296875 }, + { x: 0.234375, y: 0.296875 }, + { x: 0.234375, y: 0.296875 }, + { x: 0.265625, y: 0.296875 }, + { x: 0.265625, y: 0.296875 }, + { x: 0.296875, y: 0.296875 }, + { x: 0.296875, y: 0.296875 }, + { x: 0.328125, y: 0.296875 }, + { x: 0.328125, y: 0.296875 }, + { x: 0.359375, y: 0.296875 }, + { x: 0.359375, y: 0.296875 }, + { x: 0.390625, y: 0.296875 }, + { x: 0.390625, y: 0.296875 }, + { x: 0.421875, y: 0.296875 }, + { x: 0.421875, y: 0.296875 }, + { x: 0.453125, y: 0.296875 }, + { x: 0.453125, y: 0.296875 }, + { x: 0.484375, y: 0.296875 }, + { x: 0.484375, y: 0.296875 }, + { x: 0.515625, y: 0.296875 }, + { x: 0.515625, y: 0.296875 }, + { x: 0.546875, y: 0.296875 }, + { x: 0.546875, y: 0.296875 }, + { x: 0.578125, y: 0.296875 }, + { x: 0.578125, y: 0.296875 }, + { x: 0.609375, y: 0.296875 }, + { x: 0.609375, y: 0.296875 }, + { x: 0.640625, y: 0.296875 }, + { x: 0.640625, y: 0.296875 }, + { x: 0.671875, y: 0.296875 }, + { x: 0.671875, y: 0.296875 }, + { x: 0.703125, y: 0.296875 }, + { x: 0.703125, y: 0.296875 }, + { x: 0.734375, y: 0.296875 }, + { x: 0.734375, y: 0.296875 }, + { x: 0.765625, y: 0.296875 }, + { x: 0.765625, y: 0.296875 }, + { x: 0.796875, y: 0.296875 }, + { x: 0.796875, y: 0.296875 }, + { x: 0.828125, y: 0.296875 }, + { x: 0.828125, y: 0.296875 }, + { x: 0.859375, y: 0.296875 }, + { x: 0.859375, y: 0.296875 }, + { x: 0.890625, y: 0.296875 }, + { x: 0.890625, y: 0.296875 }, + { x: 0.921875, y: 0.296875 }, + { x: 0.921875, y: 0.296875 }, + { x: 0.953125, y: 0.296875 }, + { x: 0.953125, y: 0.296875 }, + { x: 0.984375, y: 0.296875 }, + { x: 0.984375, y: 0.296875 }, + { x: 0.015625, y: 0.328125 }, + { x: 0.015625, y: 0.328125 }, + { x: 0.046875, y: 0.328125 }, + { x: 0.046875, y: 0.328125 }, + { x: 0.078125, y: 0.328125 }, + { x: 0.078125, y: 0.328125 }, + { x: 0.109375, y: 0.328125 }, + { x: 0.109375, y: 0.328125 }, + { x: 0.140625, y: 0.328125 }, + { x: 0.140625, y: 0.328125 }, + { x: 0.171875, y: 0.328125 }, + { x: 0.171875, y: 0.328125 }, + { x: 0.203125, y: 0.328125 }, + { x: 0.203125, y: 0.328125 }, + { x: 0.234375, y: 0.328125 }, + { x: 0.234375, y: 0.328125 }, + { x: 0.265625, y: 0.328125 }, + { x: 0.265625, y: 0.328125 }, + { x: 0.296875, y: 0.328125 }, + { x: 0.296875, y: 0.328125 }, + { x: 0.328125, y: 0.328125 }, + { x: 0.328125, y: 0.328125 }, + { x: 0.359375, y: 0.328125 }, + { x: 0.359375, y: 0.328125 }, + { x: 0.390625, y: 0.328125 }, + { x: 0.390625, y: 0.328125 }, + { x: 0.421875, y: 0.328125 }, + { x: 0.421875, y: 0.328125 }, + { x: 0.453125, y: 0.328125 }, + { x: 0.453125, y: 0.328125 }, + { x: 0.484375, y: 0.328125 }, + { x: 0.484375, y: 0.328125 }, + { x: 0.515625, y: 0.328125 }, + { x: 0.515625, y: 0.328125 }, + { x: 0.546875, y: 0.328125 }, + { x: 0.546875, y: 0.328125 }, + { x: 0.578125, y: 0.328125 }, + { x: 0.578125, y: 0.328125 }, + { x: 0.609375, y: 0.328125 }, + { x: 0.609375, y: 0.328125 }, + { x: 0.640625, y: 0.328125 }, + { x: 0.640625, y: 0.328125 }, + { x: 0.671875, y: 0.328125 }, + { x: 0.671875, y: 0.328125 }, + { x: 0.703125, y: 0.328125 }, + { x: 0.703125, y: 0.328125 }, + { x: 0.734375, y: 0.328125 }, + { x: 0.734375, y: 0.328125 }, + { x: 0.765625, y: 0.328125 }, + { x: 0.765625, y: 0.328125 }, + { x: 0.796875, y: 0.328125 }, + { x: 0.796875, y: 0.328125 }, + { x: 0.828125, y: 0.328125 }, + { x: 0.828125, y: 0.328125 }, + { x: 0.859375, y: 0.328125 }, + { x: 0.859375, y: 0.328125 }, + { x: 0.890625, y: 0.328125 }, + { x: 0.890625, y: 0.328125 }, + { x: 0.921875, y: 0.328125 }, + { x: 0.921875, y: 0.328125 }, + { x: 0.953125, y: 0.328125 }, + { x: 0.953125, y: 0.328125 }, + { x: 0.984375, y: 0.328125 }, + { x: 0.984375, y: 0.328125 }, + { x: 0.015625, y: 0.359375 }, + { x: 0.015625, y: 0.359375 }, + { x: 0.046875, y: 0.359375 }, + { x: 0.046875, y: 0.359375 }, + { x: 0.078125, y: 0.359375 }, + { x: 0.078125, y: 0.359375 }, + { x: 0.109375, y: 0.359375 }, + { x: 0.109375, y: 0.359375 }, + { x: 0.140625, y: 0.359375 }, + { x: 0.140625, y: 0.359375 }, + { x: 0.171875, y: 0.359375 }, + { x: 0.171875, y: 0.359375 }, + { x: 0.203125, y: 0.359375 }, + { x: 0.203125, y: 0.359375 }, + { x: 0.234375, y: 0.359375 }, + { x: 0.234375, y: 0.359375 }, + { x: 0.265625, y: 0.359375 }, + { x: 0.265625, y: 0.359375 }, + { x: 0.296875, y: 0.359375 }, + { x: 0.296875, y: 0.359375 }, + { x: 0.328125, y: 0.359375 }, + { x: 0.328125, y: 0.359375 }, + { x: 0.359375, y: 0.359375 }, + { x: 0.359375, y: 0.359375 }, + { x: 0.390625, y: 0.359375 }, + { x: 0.390625, y: 0.359375 }, + { x: 0.421875, y: 0.359375 }, + { x: 0.421875, y: 0.359375 }, + { x: 0.453125, y: 0.359375 }, + { x: 0.453125, y: 0.359375 }, + { x: 0.484375, y: 0.359375 }, + { x: 0.484375, y: 0.359375 }, + { x: 0.515625, y: 0.359375 }, + { x: 0.515625, y: 0.359375 }, + { x: 0.546875, y: 0.359375 }, + { x: 0.546875, y: 0.359375 }, + { x: 0.578125, y: 0.359375 }, + { x: 0.578125, y: 0.359375 }, + { x: 0.609375, y: 0.359375 }, + { x: 0.609375, y: 0.359375 }, + { x: 0.640625, y: 0.359375 }, + { x: 0.640625, y: 0.359375 }, + { x: 0.671875, y: 0.359375 }, + { x: 0.671875, y: 0.359375 }, + { x: 0.703125, y: 0.359375 }, + { x: 0.703125, y: 0.359375 }, + { x: 0.734375, y: 0.359375 }, + { x: 0.734375, y: 0.359375 }, + { x: 0.765625, y: 0.359375 }, + { x: 0.765625, y: 0.359375 }, + { x: 0.796875, y: 0.359375 }, + { x: 0.796875, y: 0.359375 }, + { x: 0.828125, y: 0.359375 }, + { x: 0.828125, y: 0.359375 }, + { x: 0.859375, y: 0.359375 }, + { x: 0.859375, y: 0.359375 }, + { x: 0.890625, y: 0.359375 }, + { x: 0.890625, y: 0.359375 }, + { x: 0.921875, y: 0.359375 }, + { x: 0.921875, y: 0.359375 }, + { x: 0.953125, y: 0.359375 }, + { x: 0.953125, y: 0.359375 }, + { x: 0.984375, y: 0.359375 }, + { x: 0.984375, y: 0.359375 }, + { x: 0.015625, y: 0.390625 }, + { x: 0.015625, y: 0.390625 }, + { x: 0.046875, y: 0.390625 }, + { x: 0.046875, y: 0.390625 }, + { x: 0.078125, y: 0.390625 }, + { x: 0.078125, y: 0.390625 }, + { x: 0.109375, y: 0.390625 }, + { x: 0.109375, y: 0.390625 }, + { x: 0.140625, y: 0.390625 }, + { x: 0.140625, y: 0.390625 }, + { x: 0.171875, y: 0.390625 }, + { x: 0.171875, y: 0.390625 }, + { x: 0.203125, y: 0.390625 }, + { x: 0.203125, y: 0.390625 }, + { x: 0.234375, y: 0.390625 }, + { x: 0.234375, y: 0.390625 }, + { x: 0.265625, y: 0.390625 }, + { x: 0.265625, y: 0.390625 }, + { x: 0.296875, y: 0.390625 }, + { x: 0.296875, y: 0.390625 }, + { x: 0.328125, y: 0.390625 }, + { x: 0.328125, y: 0.390625 }, + { x: 0.359375, y: 0.390625 }, + { x: 0.359375, y: 0.390625 }, + { x: 0.390625, y: 0.390625 }, + { x: 0.390625, y: 0.390625 }, + { x: 0.421875, y: 0.390625 }, + { x: 0.421875, y: 0.390625 }, + { x: 0.453125, y: 0.390625 }, + { x: 0.453125, y: 0.390625 }, + { x: 0.484375, y: 0.390625 }, + { x: 0.484375, y: 0.390625 }, + { x: 0.515625, y: 0.390625 }, + { x: 0.515625, y: 0.390625 }, + { x: 0.546875, y: 0.390625 }, + { x: 0.546875, y: 0.390625 }, + { x: 0.578125, y: 0.390625 }, + { x: 0.578125, y: 0.390625 }, + { x: 0.609375, y: 0.390625 }, + { x: 0.609375, y: 0.390625 }, + { x: 0.640625, y: 0.390625 }, + { x: 0.640625, y: 0.390625 }, + { x: 0.671875, y: 0.390625 }, + { x: 0.671875, y: 0.390625 }, + { x: 0.703125, y: 0.390625 }, + { x: 0.703125, y: 0.390625 }, + { x: 0.734375, y: 0.390625 }, + { x: 0.734375, y: 0.390625 }, + { x: 0.765625, y: 0.390625 }, + { x: 0.765625, y: 0.390625 }, + { x: 0.796875, y: 0.390625 }, + { x: 0.796875, y: 0.390625 }, + { x: 0.828125, y: 0.390625 }, + { x: 0.828125, y: 0.390625 }, + { x: 0.859375, y: 0.390625 }, + { x: 0.859375, y: 0.390625 }, + { x: 0.890625, y: 0.390625 }, + { x: 0.890625, y: 0.390625 }, + { x: 0.921875, y: 0.390625 }, + { x: 0.921875, y: 0.390625 }, + { x: 0.953125, y: 0.390625 }, + { x: 0.953125, y: 0.390625 }, + { x: 0.984375, y: 0.390625 }, + { x: 0.984375, y: 0.390625 }, + { x: 0.015625, y: 0.421875 }, + { x: 0.015625, y: 0.421875 }, + { x: 0.046875, y: 0.421875 }, + { x: 0.046875, y: 0.421875 }, + { x: 0.078125, y: 0.421875 }, + { x: 0.078125, y: 0.421875 }, + { x: 0.109375, y: 0.421875 }, + { x: 0.109375, y: 0.421875 }, + { x: 0.140625, y: 0.421875 }, + { x: 0.140625, y: 0.421875 }, + { x: 0.171875, y: 0.421875 }, + { x: 0.171875, y: 0.421875 }, + { x: 0.203125, y: 0.421875 }, + { x: 0.203125, y: 0.421875 }, + { x: 0.234375, y: 0.421875 }, + { x: 0.234375, y: 0.421875 }, + { x: 0.265625, y: 0.421875 }, + { x: 0.265625, y: 0.421875 }, + { x: 0.296875, y: 0.421875 }, + { x: 0.296875, y: 0.421875 }, + { x: 0.328125, y: 0.421875 }, + { x: 0.328125, y: 0.421875 }, + { x: 0.359375, y: 0.421875 }, + { x: 0.359375, y: 0.421875 }, + { x: 0.390625, y: 0.421875 }, + { x: 0.390625, y: 0.421875 }, + { x: 0.421875, y: 0.421875 }, + { x: 0.421875, y: 0.421875 }, + { x: 0.453125, y: 0.421875 }, + { x: 0.453125, y: 0.421875 }, + { x: 0.484375, y: 0.421875 }, + { x: 0.484375, y: 0.421875 }, + { x: 0.515625, y: 0.421875 }, + { x: 0.515625, y: 0.421875 }, + { x: 0.546875, y: 0.421875 }, + { x: 0.546875, y: 0.421875 }, + { x: 0.578125, y: 0.421875 }, + { x: 0.578125, y: 0.421875 }, + { x: 0.609375, y: 0.421875 }, + { x: 0.609375, y: 0.421875 }, + { x: 0.640625, y: 0.421875 }, + { x: 0.640625, y: 0.421875 }, + { x: 0.671875, y: 0.421875 }, + { x: 0.671875, y: 0.421875 }, + { x: 0.703125, y: 0.421875 }, + { x: 0.703125, y: 0.421875 }, + { x: 0.734375, y: 0.421875 }, + { x: 0.734375, y: 0.421875 }, + { x: 0.765625, y: 0.421875 }, + { x: 0.765625, y: 0.421875 }, + { x: 0.796875, y: 0.421875 }, + { x: 0.796875, y: 0.421875 }, + { x: 0.828125, y: 0.421875 }, + { x: 0.828125, y: 0.421875 }, + { x: 0.859375, y: 0.421875 }, + { x: 0.859375, y: 0.421875 }, + { x: 0.890625, y: 0.421875 }, + { x: 0.890625, y: 0.421875 }, + { x: 0.921875, y: 0.421875 }, + { x: 0.921875, y: 0.421875 }, + { x: 0.953125, y: 0.421875 }, + { x: 0.953125, y: 0.421875 }, + { x: 0.984375, y: 0.421875 }, + { x: 0.984375, y: 0.421875 }, + { x: 0.015625, y: 0.453125 }, + { x: 0.015625, y: 0.453125 }, + { x: 0.046875, y: 0.453125 }, + { x: 0.046875, y: 0.453125 }, + { x: 0.078125, y: 0.453125 }, + { x: 0.078125, y: 0.453125 }, + { x: 0.109375, y: 0.453125 }, + { x: 0.109375, y: 0.453125 }, + { x: 0.140625, y: 0.453125 }, + { x: 0.140625, y: 0.453125 }, + { x: 0.171875, y: 0.453125 }, + { x: 0.171875, y: 0.453125 }, + { x: 0.203125, y: 0.453125 }, + { x: 0.203125, y: 0.453125 }, + { x: 0.234375, y: 0.453125 }, + { x: 0.234375, y: 0.453125 }, + { x: 0.265625, y: 0.453125 }, + { x: 0.265625, y: 0.453125 }, + { x: 0.296875, y: 0.453125 }, + { x: 0.296875, y: 0.453125 }, + { x: 0.328125, y: 0.453125 }, + { x: 0.328125, y: 0.453125 }, + { x: 0.359375, y: 0.453125 }, + { x: 0.359375, y: 0.453125 }, + { x: 0.390625, y: 0.453125 }, + { x: 0.390625, y: 0.453125 }, + { x: 0.421875, y: 0.453125 }, + { x: 0.421875, y: 0.453125 }, + { x: 0.453125, y: 0.453125 }, + { x: 0.453125, y: 0.453125 }, + { x: 0.484375, y: 0.453125 }, + { x: 0.484375, y: 0.453125 }, + { x: 0.515625, y: 0.453125 }, + { x: 0.515625, y: 0.453125 }, + { x: 0.546875, y: 0.453125 }, + { x: 0.546875, y: 0.453125 }, + { x: 0.578125, y: 0.453125 }, + { x: 0.578125, y: 0.453125 }, + { x: 0.609375, y: 0.453125 }, + { x: 0.609375, y: 0.453125 }, + { x: 0.640625, y: 0.453125 }, + { x: 0.640625, y: 0.453125 }, + { x: 0.671875, y: 0.453125 }, + { x: 0.671875, y: 0.453125 }, + { x: 0.703125, y: 0.453125 }, + { x: 0.703125, y: 0.453125 }, + { x: 0.734375, y: 0.453125 }, + { x: 0.734375, y: 0.453125 }, + { x: 0.765625, y: 0.453125 }, + { x: 0.765625, y: 0.453125 }, + { x: 0.796875, y: 0.453125 }, + { x: 0.796875, y: 0.453125 }, + { x: 0.828125, y: 0.453125 }, + { x: 0.828125, y: 0.453125 }, + { x: 0.859375, y: 0.453125 }, + { x: 0.859375, y: 0.453125 }, + { x: 0.890625, y: 0.453125 }, + { x: 0.890625, y: 0.453125 }, + { x: 0.921875, y: 0.453125 }, + { x: 0.921875, y: 0.453125 }, + { x: 0.953125, y: 0.453125 }, + { x: 0.953125, y: 0.453125 }, + { x: 0.984375, y: 0.453125 }, + { x: 0.984375, y: 0.453125 }, + { x: 0.015625, y: 0.484375 }, + { x: 0.015625, y: 0.484375 }, + { x: 0.046875, y: 0.484375 }, + { x: 0.046875, y: 0.484375 }, + { x: 0.078125, y: 0.484375 }, + { x: 0.078125, y: 0.484375 }, + { x: 0.109375, y: 0.484375 }, + { x: 0.109375, y: 0.484375 }, + { x: 0.140625, y: 0.484375 }, + { x: 0.140625, y: 0.484375 }, + { x: 0.171875, y: 0.484375 }, + { x: 0.171875, y: 0.484375 }, + { x: 0.203125, y: 0.484375 }, + { x: 0.203125, y: 0.484375 }, + { x: 0.234375, y: 0.484375 }, + { x: 0.234375, y: 0.484375 }, + { x: 0.265625, y: 0.484375 }, + { x: 0.265625, y: 0.484375 }, + { x: 0.296875, y: 0.484375 }, + { x: 0.296875, y: 0.484375 }, + { x: 0.328125, y: 0.484375 }, + { x: 0.328125, y: 0.484375 }, + { x: 0.359375, y: 0.484375 }, + { x: 0.359375, y: 0.484375 }, + { x: 0.390625, y: 0.484375 }, + { x: 0.390625, y: 0.484375 }, + { x: 0.421875, y: 0.484375 }, + { x: 0.421875, y: 0.484375 }, + { x: 0.453125, y: 0.484375 }, + { x: 0.453125, y: 0.484375 }, + { x: 0.484375, y: 0.484375 }, + { x: 0.484375, y: 0.484375 }, + { x: 0.515625, y: 0.484375 }, + { x: 0.515625, y: 0.484375 }, + { x: 0.546875, y: 0.484375 }, + { x: 0.546875, y: 0.484375 }, + { x: 0.578125, y: 0.484375 }, + { x: 0.578125, y: 0.484375 }, + { x: 0.609375, y: 0.484375 }, + { x: 0.609375, y: 0.484375 }, + { x: 0.640625, y: 0.484375 }, + { x: 0.640625, y: 0.484375 }, + { x: 0.671875, y: 0.484375 }, + { x: 0.671875, y: 0.484375 }, + { x: 0.703125, y: 0.484375 }, + { x: 0.703125, y: 0.484375 }, + { x: 0.734375, y: 0.484375 }, + { x: 0.734375, y: 0.484375 }, + { x: 0.765625, y: 0.484375 }, + { x: 0.765625, y: 0.484375 }, + { x: 0.796875, y: 0.484375 }, + { x: 0.796875, y: 0.484375 }, + { x: 0.828125, y: 0.484375 }, + { x: 0.828125, y: 0.484375 }, + { x: 0.859375, y: 0.484375 }, + { x: 0.859375, y: 0.484375 }, + { x: 0.890625, y: 0.484375 }, + { x: 0.890625, y: 0.484375 }, + { x: 0.921875, y: 0.484375 }, + { x: 0.921875, y: 0.484375 }, + { x: 0.953125, y: 0.484375 }, + { x: 0.953125, y: 0.484375 }, + { x: 0.984375, y: 0.484375 }, + { x: 0.984375, y: 0.484375 }, + { x: 0.015625, y: 0.515625 }, + { x: 0.015625, y: 0.515625 }, + { x: 0.046875, y: 0.515625 }, + { x: 0.046875, y: 0.515625 }, + { x: 0.078125, y: 0.515625 }, + { x: 0.078125, y: 0.515625 }, + { x: 0.109375, y: 0.515625 }, + { x: 0.109375, y: 0.515625 }, + { x: 0.140625, y: 0.515625 }, + { x: 0.140625, y: 0.515625 }, + { x: 0.171875, y: 0.515625 }, + { x: 0.171875, y: 0.515625 }, + { x: 0.203125, y: 0.515625 }, + { x: 0.203125, y: 0.515625 }, + { x: 0.234375, y: 0.515625 }, + { x: 0.234375, y: 0.515625 }, + { x: 0.265625, y: 0.515625 }, + { x: 0.265625, y: 0.515625 }, + { x: 0.296875, y: 0.515625 }, + { x: 0.296875, y: 0.515625 }, + { x: 0.328125, y: 0.515625 }, + { x: 0.328125, y: 0.515625 }, + { x: 0.359375, y: 0.515625 }, + { x: 0.359375, y: 0.515625 }, + { x: 0.390625, y: 0.515625 }, + { x: 0.390625, y: 0.515625 }, + { x: 0.421875, y: 0.515625 }, + { x: 0.421875, y: 0.515625 }, + { x: 0.453125, y: 0.515625 }, + { x: 0.453125, y: 0.515625 }, + { x: 0.484375, y: 0.515625 }, + { x: 0.484375, y: 0.515625 }, + { x: 0.515625, y: 0.515625 }, + { x: 0.515625, y: 0.515625 }, + { x: 0.546875, y: 0.515625 }, + { x: 0.546875, y: 0.515625 }, + { x: 0.578125, y: 0.515625 }, + { x: 0.578125, y: 0.515625 }, + { x: 0.609375, y: 0.515625 }, + { x: 0.609375, y: 0.515625 }, + { x: 0.640625, y: 0.515625 }, + { x: 0.640625, y: 0.515625 }, + { x: 0.671875, y: 0.515625 }, + { x: 0.671875, y: 0.515625 }, + { x: 0.703125, y: 0.515625 }, + { x: 0.703125, y: 0.515625 }, + { x: 0.734375, y: 0.515625 }, + { x: 0.734375, y: 0.515625 }, + { x: 0.765625, y: 0.515625 }, + { x: 0.765625, y: 0.515625 }, + { x: 0.796875, y: 0.515625 }, + { x: 0.796875, y: 0.515625 }, + { x: 0.828125, y: 0.515625 }, + { x: 0.828125, y: 0.515625 }, + { x: 0.859375, y: 0.515625 }, + { x: 0.859375, y: 0.515625 }, + { x: 0.890625, y: 0.515625 }, + { x: 0.890625, y: 0.515625 }, + { x: 0.921875, y: 0.515625 }, + { x: 0.921875, y: 0.515625 }, + { x: 0.953125, y: 0.515625 }, + { x: 0.953125, y: 0.515625 }, + { x: 0.984375, y: 0.515625 }, + { x: 0.984375, y: 0.515625 }, + { x: 0.015625, y: 0.546875 }, + { x: 0.015625, y: 0.546875 }, + { x: 0.046875, y: 0.546875 }, + { x: 0.046875, y: 0.546875 }, + { x: 0.078125, y: 0.546875 }, + { x: 0.078125, y: 0.546875 }, + { x: 0.109375, y: 0.546875 }, + { x: 0.109375, y: 0.546875 }, + { x: 0.140625, y: 0.546875 }, + { x: 0.140625, y: 0.546875 }, + { x: 0.171875, y: 0.546875 }, + { x: 0.171875, y: 0.546875 }, + { x: 0.203125, y: 0.546875 }, + { x: 0.203125, y: 0.546875 }, + { x: 0.234375, y: 0.546875 }, + { x: 0.234375, y: 0.546875 }, + { x: 0.265625, y: 0.546875 }, + { x: 0.265625, y: 0.546875 }, + { x: 0.296875, y: 0.546875 }, + { x: 0.296875, y: 0.546875 }, + { x: 0.328125, y: 0.546875 }, + { x: 0.328125, y: 0.546875 }, + { x: 0.359375, y: 0.546875 }, + { x: 0.359375, y: 0.546875 }, + { x: 0.390625, y: 0.546875 }, + { x: 0.390625, y: 0.546875 }, + { x: 0.421875, y: 0.546875 }, + { x: 0.421875, y: 0.546875 }, + { x: 0.453125, y: 0.546875 }, + { x: 0.453125, y: 0.546875 }, + { x: 0.484375, y: 0.546875 }, + { x: 0.484375, y: 0.546875 }, + { x: 0.515625, y: 0.546875 }, + { x: 0.515625, y: 0.546875 }, + { x: 0.546875, y: 0.546875 }, + { x: 0.546875, y: 0.546875 }, + { x: 0.578125, y: 0.546875 }, + { x: 0.578125, y: 0.546875 }, + { x: 0.609375, y: 0.546875 }, + { x: 0.609375, y: 0.546875 }, + { x: 0.640625, y: 0.546875 }, + { x: 0.640625, y: 0.546875 }, + { x: 0.671875, y: 0.546875 }, + { x: 0.671875, y: 0.546875 }, + { x: 0.703125, y: 0.546875 }, + { x: 0.703125, y: 0.546875 }, + { x: 0.734375, y: 0.546875 }, + { x: 0.734375, y: 0.546875 }, + { x: 0.765625, y: 0.546875 }, + { x: 0.765625, y: 0.546875 }, + { x: 0.796875, y: 0.546875 }, + { x: 0.796875, y: 0.546875 }, + { x: 0.828125, y: 0.546875 }, + { x: 0.828125, y: 0.546875 }, + { x: 0.859375, y: 0.546875 }, + { x: 0.859375, y: 0.546875 }, + { x: 0.890625, y: 0.546875 }, + { x: 0.890625, y: 0.546875 }, + { x: 0.921875, y: 0.546875 }, + { x: 0.921875, y: 0.546875 }, + { x: 0.953125, y: 0.546875 }, + { x: 0.953125, y: 0.546875 }, + { x: 0.984375, y: 0.546875 }, + { x: 0.984375, y: 0.546875 }, + { x: 0.015625, y: 0.578125 }, + { x: 0.015625, y: 0.578125 }, + { x: 0.046875, y: 0.578125 }, + { x: 0.046875, y: 0.578125 }, + { x: 0.078125, y: 0.578125 }, + { x: 0.078125, y: 0.578125 }, + { x: 0.109375, y: 0.578125 }, + { x: 0.109375, y: 0.578125 }, + { x: 0.140625, y: 0.578125 }, + { x: 0.140625, y: 0.578125 }, + { x: 0.171875, y: 0.578125 }, + { x: 0.171875, y: 0.578125 }, + { x: 0.203125, y: 0.578125 }, + { x: 0.203125, y: 0.578125 }, + { x: 0.234375, y: 0.578125 }, + { x: 0.234375, y: 0.578125 }, + { x: 0.265625, y: 0.578125 }, + { x: 0.265625, y: 0.578125 }, + { x: 0.296875, y: 0.578125 }, + { x: 0.296875, y: 0.578125 }, + { x: 0.328125, y: 0.578125 }, + { x: 0.328125, y: 0.578125 }, + { x: 0.359375, y: 0.578125 }, + { x: 0.359375, y: 0.578125 }, + { x: 0.390625, y: 0.578125 }, + { x: 0.390625, y: 0.578125 }, + { x: 0.421875, y: 0.578125 }, + { x: 0.421875, y: 0.578125 }, + { x: 0.453125, y: 0.578125 }, + { x: 0.453125, y: 0.578125 }, + { x: 0.484375, y: 0.578125 }, + { x: 0.484375, y: 0.578125 }, + { x: 0.515625, y: 0.578125 }, + { x: 0.515625, y: 0.578125 }, + { x: 0.546875, y: 0.578125 }, + { x: 0.546875, y: 0.578125 }, + { x: 0.578125, y: 0.578125 }, + { x: 0.578125, y: 0.578125 }, + { x: 0.609375, y: 0.578125 }, + { x: 0.609375, y: 0.578125 }, + { x: 0.640625, y: 0.578125 }, + { x: 0.640625, y: 0.578125 }, + { x: 0.671875, y: 0.578125 }, + { x: 0.671875, y: 0.578125 }, + { x: 0.703125, y: 0.578125 }, + { x: 0.703125, y: 0.578125 }, + { x: 0.734375, y: 0.578125 }, + { x: 0.734375, y: 0.578125 }, + { x: 0.765625, y: 0.578125 }, + { x: 0.765625, y: 0.578125 }, + { x: 0.796875, y: 0.578125 }, + { x: 0.796875, y: 0.578125 }, + { x: 0.828125, y: 0.578125 }, + { x: 0.828125, y: 0.578125 }, + { x: 0.859375, y: 0.578125 }, + { x: 0.859375, y: 0.578125 }, + { x: 0.890625, y: 0.578125 }, + { x: 0.890625, y: 0.578125 }, + { x: 0.921875, y: 0.578125 }, + { x: 0.921875, y: 0.578125 }, + { x: 0.953125, y: 0.578125 }, + { x: 0.953125, y: 0.578125 }, + { x: 0.984375, y: 0.578125 }, + { x: 0.984375, y: 0.578125 }, + { x: 0.015625, y: 0.609375 }, + { x: 0.015625, y: 0.609375 }, + { x: 0.046875, y: 0.609375 }, + { x: 0.046875, y: 0.609375 }, + { x: 0.078125, y: 0.609375 }, + { x: 0.078125, y: 0.609375 }, + { x: 0.109375, y: 0.609375 }, + { x: 0.109375, y: 0.609375 }, + { x: 0.140625, y: 0.609375 }, + { x: 0.140625, y: 0.609375 }, + { x: 0.171875, y: 0.609375 }, + { x: 0.171875, y: 0.609375 }, + { x: 0.203125, y: 0.609375 }, + { x: 0.203125, y: 0.609375 }, + { x: 0.234375, y: 0.609375 }, + { x: 0.234375, y: 0.609375 }, + { x: 0.265625, y: 0.609375 }, + { x: 0.265625, y: 0.609375 }, + { x: 0.296875, y: 0.609375 }, + { x: 0.296875, y: 0.609375 }, + { x: 0.328125, y: 0.609375 }, + { x: 0.328125, y: 0.609375 }, + { x: 0.359375, y: 0.609375 }, + { x: 0.359375, y: 0.609375 }, + { x: 0.390625, y: 0.609375 }, + { x: 0.390625, y: 0.609375 }, + { x: 0.421875, y: 0.609375 }, + { x: 0.421875, y: 0.609375 }, + { x: 0.453125, y: 0.609375 }, + { x: 0.453125, y: 0.609375 }, + { x: 0.484375, y: 0.609375 }, + { x: 0.484375, y: 0.609375 }, + { x: 0.515625, y: 0.609375 }, + { x: 0.515625, y: 0.609375 }, + { x: 0.546875, y: 0.609375 }, + { x: 0.546875, y: 0.609375 }, + { x: 0.578125, y: 0.609375 }, + { x: 0.578125, y: 0.609375 }, + { x: 0.609375, y: 0.609375 }, + { x: 0.609375, y: 0.609375 }, + { x: 0.640625, y: 0.609375 }, + { x: 0.640625, y: 0.609375 }, + { x: 0.671875, y: 0.609375 }, + { x: 0.671875, y: 0.609375 }, + { x: 0.703125, y: 0.609375 }, + { x: 0.703125, y: 0.609375 }, + { x: 0.734375, y: 0.609375 }, + { x: 0.734375, y: 0.609375 }, + { x: 0.765625, y: 0.609375 }, + { x: 0.765625, y: 0.609375 }, + { x: 0.796875, y: 0.609375 }, + { x: 0.796875, y: 0.609375 }, + { x: 0.828125, y: 0.609375 }, + { x: 0.828125, y: 0.609375 }, + { x: 0.859375, y: 0.609375 }, + { x: 0.859375, y: 0.609375 }, + { x: 0.890625, y: 0.609375 }, + { x: 0.890625, y: 0.609375 }, + { x: 0.921875, y: 0.609375 }, + { x: 0.921875, y: 0.609375 }, + { x: 0.953125, y: 0.609375 }, + { x: 0.953125, y: 0.609375 }, + { x: 0.984375, y: 0.609375 }, + { x: 0.984375, y: 0.609375 }, + { x: 0.015625, y: 0.640625 }, + { x: 0.015625, y: 0.640625 }, + { x: 0.046875, y: 0.640625 }, + { x: 0.046875, y: 0.640625 }, + { x: 0.078125, y: 0.640625 }, + { x: 0.078125, y: 0.640625 }, + { x: 0.109375, y: 0.640625 }, + { x: 0.109375, y: 0.640625 }, + { x: 0.140625, y: 0.640625 }, + { x: 0.140625, y: 0.640625 }, + { x: 0.171875, y: 0.640625 }, + { x: 0.171875, y: 0.640625 }, + { x: 0.203125, y: 0.640625 }, + { x: 0.203125, y: 0.640625 }, + { x: 0.234375, y: 0.640625 }, + { x: 0.234375, y: 0.640625 }, + { x: 0.265625, y: 0.640625 }, + { x: 0.265625, y: 0.640625 }, + { x: 0.296875, y: 0.640625 }, + { x: 0.296875, y: 0.640625 }, + { x: 0.328125, y: 0.640625 }, + { x: 0.328125, y: 0.640625 }, + { x: 0.359375, y: 0.640625 }, + { x: 0.359375, y: 0.640625 }, + { x: 0.390625, y: 0.640625 }, + { x: 0.390625, y: 0.640625 }, + { x: 0.421875, y: 0.640625 }, + { x: 0.421875, y: 0.640625 }, + { x: 0.453125, y: 0.640625 }, + { x: 0.453125, y: 0.640625 }, + { x: 0.484375, y: 0.640625 }, + { x: 0.484375, y: 0.640625 }, + { x: 0.515625, y: 0.640625 }, + { x: 0.515625, y: 0.640625 }, + { x: 0.546875, y: 0.640625 }, + { x: 0.546875, y: 0.640625 }, + { x: 0.578125, y: 0.640625 }, + { x: 0.578125, y: 0.640625 }, + { x: 0.609375, y: 0.640625 }, + { x: 0.609375, y: 0.640625 }, + { x: 0.640625, y: 0.640625 }, + { x: 0.640625, y: 0.640625 }, + { x: 0.671875, y: 0.640625 }, + { x: 0.671875, y: 0.640625 }, + { x: 0.703125, y: 0.640625 }, + { x: 0.703125, y: 0.640625 }, + { x: 0.734375, y: 0.640625 }, + { x: 0.734375, y: 0.640625 }, + { x: 0.765625, y: 0.640625 }, + { x: 0.765625, y: 0.640625 }, + { x: 0.796875, y: 0.640625 }, + { x: 0.796875, y: 0.640625 }, + { x: 0.828125, y: 0.640625 }, + { x: 0.828125, y: 0.640625 }, + { x: 0.859375, y: 0.640625 }, + { x: 0.859375, y: 0.640625 }, + { x: 0.890625, y: 0.640625 }, + { x: 0.890625, y: 0.640625 }, + { x: 0.921875, y: 0.640625 }, + { x: 0.921875, y: 0.640625 }, + { x: 0.953125, y: 0.640625 }, + { x: 0.953125, y: 0.640625 }, + { x: 0.984375, y: 0.640625 }, + { x: 0.984375, y: 0.640625 }, + { x: 0.015625, y: 0.671875 }, + { x: 0.015625, y: 0.671875 }, + { x: 0.046875, y: 0.671875 }, + { x: 0.046875, y: 0.671875 }, + { x: 0.078125, y: 0.671875 }, + { x: 0.078125, y: 0.671875 }, + { x: 0.109375, y: 0.671875 }, + { x: 0.109375, y: 0.671875 }, + { x: 0.140625, y: 0.671875 }, + { x: 0.140625, y: 0.671875 }, + { x: 0.171875, y: 0.671875 }, + { x: 0.171875, y: 0.671875 }, + { x: 0.203125, y: 0.671875 }, + { x: 0.203125, y: 0.671875 }, + { x: 0.234375, y: 0.671875 }, + { x: 0.234375, y: 0.671875 }, + { x: 0.265625, y: 0.671875 }, + { x: 0.265625, y: 0.671875 }, + { x: 0.296875, y: 0.671875 }, + { x: 0.296875, y: 0.671875 }, + { x: 0.328125, y: 0.671875 }, + { x: 0.328125, y: 0.671875 }, + { x: 0.359375, y: 0.671875 }, + { x: 0.359375, y: 0.671875 }, + { x: 0.390625, y: 0.671875 }, + { x: 0.390625, y: 0.671875 }, + { x: 0.421875, y: 0.671875 }, + { x: 0.421875, y: 0.671875 }, + { x: 0.453125, y: 0.671875 }, + { x: 0.453125, y: 0.671875 }, + { x: 0.484375, y: 0.671875 }, + { x: 0.484375, y: 0.671875 }, + { x: 0.515625, y: 0.671875 }, + { x: 0.515625, y: 0.671875 }, + { x: 0.546875, y: 0.671875 }, + { x: 0.546875, y: 0.671875 }, + { x: 0.578125, y: 0.671875 }, + { x: 0.578125, y: 0.671875 }, + { x: 0.609375, y: 0.671875 }, + { x: 0.609375, y: 0.671875 }, + { x: 0.640625, y: 0.671875 }, + { x: 0.640625, y: 0.671875 }, + { x: 0.671875, y: 0.671875 }, + { x: 0.671875, y: 0.671875 }, + { x: 0.703125, y: 0.671875 }, + { x: 0.703125, y: 0.671875 }, + { x: 0.734375, y: 0.671875 }, + { x: 0.734375, y: 0.671875 }, + { x: 0.765625, y: 0.671875 }, + { x: 0.765625, y: 0.671875 }, + { x: 0.796875, y: 0.671875 }, + { x: 0.796875, y: 0.671875 }, + { x: 0.828125, y: 0.671875 }, + { x: 0.828125, y: 0.671875 }, + { x: 0.859375, y: 0.671875 }, + { x: 0.859375, y: 0.671875 }, + { x: 0.890625, y: 0.671875 }, + { x: 0.890625, y: 0.671875 }, + { x: 0.921875, y: 0.671875 }, + { x: 0.921875, y: 0.671875 }, + { x: 0.953125, y: 0.671875 }, + { x: 0.953125, y: 0.671875 }, + { x: 0.984375, y: 0.671875 }, + { x: 0.984375, y: 0.671875 }, + { x: 0.015625, y: 0.703125 }, + { x: 0.015625, y: 0.703125 }, + { x: 0.046875, y: 0.703125 }, + { x: 0.046875, y: 0.703125 }, + { x: 0.078125, y: 0.703125 }, + { x: 0.078125, y: 0.703125 }, + { x: 0.109375, y: 0.703125 }, + { x: 0.109375, y: 0.703125 }, + { x: 0.140625, y: 0.703125 }, + { x: 0.140625, y: 0.703125 }, + { x: 0.171875, y: 0.703125 }, + { x: 0.171875, y: 0.703125 }, + { x: 0.203125, y: 0.703125 }, + { x: 0.203125, y: 0.703125 }, + { x: 0.234375, y: 0.703125 }, + { x: 0.234375, y: 0.703125 }, + { x: 0.265625, y: 0.703125 }, + { x: 0.265625, y: 0.703125 }, + { x: 0.296875, y: 0.703125 }, + { x: 0.296875, y: 0.703125 }, + { x: 0.328125, y: 0.703125 }, + { x: 0.328125, y: 0.703125 }, + { x: 0.359375, y: 0.703125 }, + { x: 0.359375, y: 0.703125 }, + { x: 0.390625, y: 0.703125 }, + { x: 0.390625, y: 0.703125 }, + { x: 0.421875, y: 0.703125 }, + { x: 0.421875, y: 0.703125 }, + { x: 0.453125, y: 0.703125 }, + { x: 0.453125, y: 0.703125 }, + { x: 0.484375, y: 0.703125 }, + { x: 0.484375, y: 0.703125 }, + { x: 0.515625, y: 0.703125 }, + { x: 0.515625, y: 0.703125 }, + { x: 0.546875, y: 0.703125 }, + { x: 0.546875, y: 0.703125 }, + { x: 0.578125, y: 0.703125 }, + { x: 0.578125, y: 0.703125 }, + { x: 0.609375, y: 0.703125 }, + { x: 0.609375, y: 0.703125 }, + { x: 0.640625, y: 0.703125 }, + { x: 0.640625, y: 0.703125 }, + { x: 0.671875, y: 0.703125 }, + { x: 0.671875, y: 0.703125 }, + { x: 0.703125, y: 0.703125 }, + { x: 0.703125, y: 0.703125 }, + { x: 0.734375, y: 0.703125 }, + { x: 0.734375, y: 0.703125 }, + { x: 0.765625, y: 0.703125 }, + { x: 0.765625, y: 0.703125 }, + { x: 0.796875, y: 0.703125 }, + { x: 0.796875, y: 0.703125 }, + { x: 0.828125, y: 0.703125 }, + { x: 0.828125, y: 0.703125 }, + { x: 0.859375, y: 0.703125 }, + { x: 0.859375, y: 0.703125 }, + { x: 0.890625, y: 0.703125 }, + { x: 0.890625, y: 0.703125 }, + { x: 0.921875, y: 0.703125 }, + { x: 0.921875, y: 0.703125 }, + { x: 0.953125, y: 0.703125 }, + { x: 0.953125, y: 0.703125 }, + { x: 0.984375, y: 0.703125 }, + { x: 0.984375, y: 0.703125 }, + { x: 0.015625, y: 0.734375 }, + { x: 0.015625, y: 0.734375 }, + { x: 0.046875, y: 0.734375 }, + { x: 0.046875, y: 0.734375 }, + { x: 0.078125, y: 0.734375 }, + { x: 0.078125, y: 0.734375 }, + { x: 0.109375, y: 0.734375 }, + { x: 0.109375, y: 0.734375 }, + { x: 0.140625, y: 0.734375 }, + { x: 0.140625, y: 0.734375 }, + { x: 0.171875, y: 0.734375 }, + { x: 0.171875, y: 0.734375 }, + { x: 0.203125, y: 0.734375 }, + { x: 0.203125, y: 0.734375 }, + { x: 0.234375, y: 0.734375 }, + { x: 0.234375, y: 0.734375 }, + { x: 0.265625, y: 0.734375 }, + { x: 0.265625, y: 0.734375 }, + { x: 0.296875, y: 0.734375 }, + { x: 0.296875, y: 0.734375 }, + { x: 0.328125, y: 0.734375 }, + { x: 0.328125, y: 0.734375 }, + { x: 0.359375, y: 0.734375 }, + { x: 0.359375, y: 0.734375 }, + { x: 0.390625, y: 0.734375 }, + { x: 0.390625, y: 0.734375 }, + { x: 0.421875, y: 0.734375 }, + { x: 0.421875, y: 0.734375 }, + { x: 0.453125, y: 0.734375 }, + { x: 0.453125, y: 0.734375 }, + { x: 0.484375, y: 0.734375 }, + { x: 0.484375, y: 0.734375 }, + { x: 0.515625, y: 0.734375 }, + { x: 0.515625, y: 0.734375 }, + { x: 0.546875, y: 0.734375 }, + { x: 0.546875, y: 0.734375 }, + { x: 0.578125, y: 0.734375 }, + { x: 0.578125, y: 0.734375 }, + { x: 0.609375, y: 0.734375 }, + { x: 0.609375, y: 0.734375 }, + { x: 0.640625, y: 0.734375 }, + { x: 0.640625, y: 0.734375 }, + { x: 0.671875, y: 0.734375 }, + { x: 0.671875, y: 0.734375 }, + { x: 0.703125, y: 0.734375 }, + { x: 0.703125, y: 0.734375 }, + { x: 0.734375, y: 0.734375 }, + { x: 0.734375, y: 0.734375 }, + { x: 0.765625, y: 0.734375 }, + { x: 0.765625, y: 0.734375 }, + { x: 0.796875, y: 0.734375 }, + { x: 0.796875, y: 0.734375 }, + { x: 0.828125, y: 0.734375 }, + { x: 0.828125, y: 0.734375 }, + { x: 0.859375, y: 0.734375 }, + { x: 0.859375, y: 0.734375 }, + { x: 0.890625, y: 0.734375 }, + { x: 0.890625, y: 0.734375 }, + { x: 0.921875, y: 0.734375 }, + { x: 0.921875, y: 0.734375 }, + { x: 0.953125, y: 0.734375 }, + { x: 0.953125, y: 0.734375 }, + { x: 0.984375, y: 0.734375 }, + { x: 0.984375, y: 0.734375 }, + { x: 0.015625, y: 0.765625 }, + { x: 0.015625, y: 0.765625 }, + { x: 0.046875, y: 0.765625 }, + { x: 0.046875, y: 0.765625 }, + { x: 0.078125, y: 0.765625 }, + { x: 0.078125, y: 0.765625 }, + { x: 0.109375, y: 0.765625 }, + { x: 0.109375, y: 0.765625 }, + { x: 0.140625, y: 0.765625 }, + { x: 0.140625, y: 0.765625 }, + { x: 0.171875, y: 0.765625 }, + { x: 0.171875, y: 0.765625 }, + { x: 0.203125, y: 0.765625 }, + { x: 0.203125, y: 0.765625 }, + { x: 0.234375, y: 0.765625 }, + { x: 0.234375, y: 0.765625 }, + { x: 0.265625, y: 0.765625 }, + { x: 0.265625, y: 0.765625 }, + { x: 0.296875, y: 0.765625 }, + { x: 0.296875, y: 0.765625 }, + { x: 0.328125, y: 0.765625 }, + { x: 0.328125, y: 0.765625 }, + { x: 0.359375, y: 0.765625 }, + { x: 0.359375, y: 0.765625 }, + { x: 0.390625, y: 0.765625 }, + { x: 0.390625, y: 0.765625 }, + { x: 0.421875, y: 0.765625 }, + { x: 0.421875, y: 0.765625 }, + { x: 0.453125, y: 0.765625 }, + { x: 0.453125, y: 0.765625 }, + { x: 0.484375, y: 0.765625 }, + { x: 0.484375, y: 0.765625 }, + { x: 0.515625, y: 0.765625 }, + { x: 0.515625, y: 0.765625 }, + { x: 0.546875, y: 0.765625 }, + { x: 0.546875, y: 0.765625 }, + { x: 0.578125, y: 0.765625 }, + { x: 0.578125, y: 0.765625 }, + { x: 0.609375, y: 0.765625 }, + { x: 0.609375, y: 0.765625 }, + { x: 0.640625, y: 0.765625 }, + { x: 0.640625, y: 0.765625 }, + { x: 0.671875, y: 0.765625 }, + { x: 0.671875, y: 0.765625 }, + { x: 0.703125, y: 0.765625 }, + { x: 0.703125, y: 0.765625 }, + { x: 0.734375, y: 0.765625 }, + { x: 0.734375, y: 0.765625 }, + { x: 0.765625, y: 0.765625 }, + { x: 0.765625, y: 0.765625 }, + { x: 0.796875, y: 0.765625 }, + { x: 0.796875, y: 0.765625 }, + { x: 0.828125, y: 0.765625 }, + { x: 0.828125, y: 0.765625 }, + { x: 0.859375, y: 0.765625 }, + { x: 0.859375, y: 0.765625 }, + { x: 0.890625, y: 0.765625 }, + { x: 0.890625, y: 0.765625 }, + { x: 0.921875, y: 0.765625 }, + { x: 0.921875, y: 0.765625 }, + { x: 0.953125, y: 0.765625 }, + { x: 0.953125, y: 0.765625 }, + { x: 0.984375, y: 0.765625 }, + { x: 0.984375, y: 0.765625 }, + { x: 0.015625, y: 0.796875 }, + { x: 0.015625, y: 0.796875 }, + { x: 0.046875, y: 0.796875 }, + { x: 0.046875, y: 0.796875 }, + { x: 0.078125, y: 0.796875 }, + { x: 0.078125, y: 0.796875 }, + { x: 0.109375, y: 0.796875 }, + { x: 0.109375, y: 0.796875 }, + { x: 0.140625, y: 0.796875 }, + { x: 0.140625, y: 0.796875 }, + { x: 0.171875, y: 0.796875 }, + { x: 0.171875, y: 0.796875 }, + { x: 0.203125, y: 0.796875 }, + { x: 0.203125, y: 0.796875 }, + { x: 0.234375, y: 0.796875 }, + { x: 0.234375, y: 0.796875 }, + { x: 0.265625, y: 0.796875 }, + { x: 0.265625, y: 0.796875 }, + { x: 0.296875, y: 0.796875 }, + { x: 0.296875, y: 0.796875 }, + { x: 0.328125, y: 0.796875 }, + { x: 0.328125, y: 0.796875 }, + { x: 0.359375, y: 0.796875 }, + { x: 0.359375, y: 0.796875 }, + { x: 0.390625, y: 0.796875 }, + { x: 0.390625, y: 0.796875 }, + { x: 0.421875, y: 0.796875 }, + { x: 0.421875, y: 0.796875 }, + { x: 0.453125, y: 0.796875 }, + { x: 0.453125, y: 0.796875 }, + { x: 0.484375, y: 0.796875 }, + { x: 0.484375, y: 0.796875 }, + { x: 0.515625, y: 0.796875 }, + { x: 0.515625, y: 0.796875 }, + { x: 0.546875, y: 0.796875 }, + { x: 0.546875, y: 0.796875 }, + { x: 0.578125, y: 0.796875 }, + { x: 0.578125, y: 0.796875 }, + { x: 0.609375, y: 0.796875 }, + { x: 0.609375, y: 0.796875 }, + { x: 0.640625, y: 0.796875 }, + { x: 0.640625, y: 0.796875 }, + { x: 0.671875, y: 0.796875 }, + { x: 0.671875, y: 0.796875 }, + { x: 0.703125, y: 0.796875 }, + { x: 0.703125, y: 0.796875 }, + { x: 0.734375, y: 0.796875 }, + { x: 0.734375, y: 0.796875 }, + { x: 0.765625, y: 0.796875 }, + { x: 0.765625, y: 0.796875 }, + { x: 0.796875, y: 0.796875 }, + { x: 0.796875, y: 0.796875 }, + { x: 0.828125, y: 0.796875 }, + { x: 0.828125, y: 0.796875 }, + { x: 0.859375, y: 0.796875 }, + { x: 0.859375, y: 0.796875 }, + { x: 0.890625, y: 0.796875 }, + { x: 0.890625, y: 0.796875 }, + { x: 0.921875, y: 0.796875 }, + { x: 0.921875, y: 0.796875 }, + { x: 0.953125, y: 0.796875 }, + { x: 0.953125, y: 0.796875 }, + { x: 0.984375, y: 0.796875 }, + { x: 0.984375, y: 0.796875 }, + { x: 0.015625, y: 0.828125 }, + { x: 0.015625, y: 0.828125 }, + { x: 0.046875, y: 0.828125 }, + { x: 0.046875, y: 0.828125 }, + { x: 0.078125, y: 0.828125 }, + { x: 0.078125, y: 0.828125 }, + { x: 0.109375, y: 0.828125 }, + { x: 0.109375, y: 0.828125 }, + { x: 0.140625, y: 0.828125 }, + { x: 0.140625, y: 0.828125 }, + { x: 0.171875, y: 0.828125 }, + { x: 0.171875, y: 0.828125 }, + { x: 0.203125, y: 0.828125 }, + { x: 0.203125, y: 0.828125 }, + { x: 0.234375, y: 0.828125 }, + { x: 0.234375, y: 0.828125 }, + { x: 0.265625, y: 0.828125 }, + { x: 0.265625, y: 0.828125 }, + { x: 0.296875, y: 0.828125 }, + { x: 0.296875, y: 0.828125 }, + { x: 0.328125, y: 0.828125 }, + { x: 0.328125, y: 0.828125 }, + { x: 0.359375, y: 0.828125 }, + { x: 0.359375, y: 0.828125 }, + { x: 0.390625, y: 0.828125 }, + { x: 0.390625, y: 0.828125 }, + { x: 0.421875, y: 0.828125 }, + { x: 0.421875, y: 0.828125 }, + { x: 0.453125, y: 0.828125 }, + { x: 0.453125, y: 0.828125 }, + { x: 0.484375, y: 0.828125 }, + { x: 0.484375, y: 0.828125 }, + { x: 0.515625, y: 0.828125 }, + { x: 0.515625, y: 0.828125 }, + { x: 0.546875, y: 0.828125 }, + { x: 0.546875, y: 0.828125 }, + { x: 0.578125, y: 0.828125 }, + { x: 0.578125, y: 0.828125 }, + { x: 0.609375, y: 0.828125 }, + { x: 0.609375, y: 0.828125 }, + { x: 0.640625, y: 0.828125 }, + { x: 0.640625, y: 0.828125 }, + { x: 0.671875, y: 0.828125 }, + { x: 0.671875, y: 0.828125 }, + { x: 0.703125, y: 0.828125 }, + { x: 0.703125, y: 0.828125 }, + { x: 0.734375, y: 0.828125 }, + { x: 0.734375, y: 0.828125 }, + { x: 0.765625, y: 0.828125 }, + { x: 0.765625, y: 0.828125 }, + { x: 0.796875, y: 0.828125 }, + { x: 0.796875, y: 0.828125 }, + { x: 0.828125, y: 0.828125 }, + { x: 0.828125, y: 0.828125 }, + { x: 0.859375, y: 0.828125 }, + { x: 0.859375, y: 0.828125 }, + { x: 0.890625, y: 0.828125 }, + { x: 0.890625, y: 0.828125 }, + { x: 0.921875, y: 0.828125 }, + { x: 0.921875, y: 0.828125 }, + { x: 0.953125, y: 0.828125 }, + { x: 0.953125, y: 0.828125 }, + { x: 0.984375, y: 0.828125 }, + { x: 0.984375, y: 0.828125 }, + { x: 0.015625, y: 0.859375 }, + { x: 0.015625, y: 0.859375 }, + { x: 0.046875, y: 0.859375 }, + { x: 0.046875, y: 0.859375 }, + { x: 0.078125, y: 0.859375 }, + { x: 0.078125, y: 0.859375 }, + { x: 0.109375, y: 0.859375 }, + { x: 0.109375, y: 0.859375 }, + { x: 0.140625, y: 0.859375 }, + { x: 0.140625, y: 0.859375 }, + { x: 0.171875, y: 0.859375 }, + { x: 0.171875, y: 0.859375 }, + { x: 0.203125, y: 0.859375 }, + { x: 0.203125, y: 0.859375 }, + { x: 0.234375, y: 0.859375 }, + { x: 0.234375, y: 0.859375 }, + { x: 0.265625, y: 0.859375 }, + { x: 0.265625, y: 0.859375 }, + { x: 0.296875, y: 0.859375 }, + { x: 0.296875, y: 0.859375 }, + { x: 0.328125, y: 0.859375 }, + { x: 0.328125, y: 0.859375 }, + { x: 0.359375, y: 0.859375 }, + { x: 0.359375, y: 0.859375 }, + { x: 0.390625, y: 0.859375 }, + { x: 0.390625, y: 0.859375 }, + { x: 0.421875, y: 0.859375 }, + { x: 0.421875, y: 0.859375 }, + { x: 0.453125, y: 0.859375 }, + { x: 0.453125, y: 0.859375 }, + { x: 0.484375, y: 0.859375 }, + { x: 0.484375, y: 0.859375 }, + { x: 0.515625, y: 0.859375 }, + { x: 0.515625, y: 0.859375 }, + { x: 0.546875, y: 0.859375 }, + { x: 0.546875, y: 0.859375 }, + { x: 0.578125, y: 0.859375 }, + { x: 0.578125, y: 0.859375 }, + { x: 0.609375, y: 0.859375 }, + { x: 0.609375, y: 0.859375 }, + { x: 0.640625, y: 0.859375 }, + { x: 0.640625, y: 0.859375 }, + { x: 0.671875, y: 0.859375 }, + { x: 0.671875, y: 0.859375 }, + { x: 0.703125, y: 0.859375 }, + { x: 0.703125, y: 0.859375 }, + { x: 0.734375, y: 0.859375 }, + { x: 0.734375, y: 0.859375 }, + { x: 0.765625, y: 0.859375 }, + { x: 0.765625, y: 0.859375 }, + { x: 0.796875, y: 0.859375 }, + { x: 0.796875, y: 0.859375 }, + { x: 0.828125, y: 0.859375 }, + { x: 0.828125, y: 0.859375 }, + { x: 0.859375, y: 0.859375 }, + { x: 0.859375, y: 0.859375 }, + { x: 0.890625, y: 0.859375 }, + { x: 0.890625, y: 0.859375 }, + { x: 0.921875, y: 0.859375 }, + { x: 0.921875, y: 0.859375 }, + { x: 0.953125, y: 0.859375 }, + { x: 0.953125, y: 0.859375 }, + { x: 0.984375, y: 0.859375 }, + { x: 0.984375, y: 0.859375 }, + { x: 0.015625, y: 0.890625 }, + { x: 0.015625, y: 0.890625 }, + { x: 0.046875, y: 0.890625 }, + { x: 0.046875, y: 0.890625 }, + { x: 0.078125, y: 0.890625 }, + { x: 0.078125, y: 0.890625 }, + { x: 0.109375, y: 0.890625 }, + { x: 0.109375, y: 0.890625 }, + { x: 0.140625, y: 0.890625 }, + { x: 0.140625, y: 0.890625 }, + { x: 0.171875, y: 0.890625 }, + { x: 0.171875, y: 0.890625 }, + { x: 0.203125, y: 0.890625 }, + { x: 0.203125, y: 0.890625 }, + { x: 0.234375, y: 0.890625 }, + { x: 0.234375, y: 0.890625 }, + { x: 0.265625, y: 0.890625 }, + { x: 0.265625, y: 0.890625 }, + { x: 0.296875, y: 0.890625 }, + { x: 0.296875, y: 0.890625 }, + { x: 0.328125, y: 0.890625 }, + { x: 0.328125, y: 0.890625 }, + { x: 0.359375, y: 0.890625 }, + { x: 0.359375, y: 0.890625 }, + { x: 0.390625, y: 0.890625 }, + { x: 0.390625, y: 0.890625 }, + { x: 0.421875, y: 0.890625 }, + { x: 0.421875, y: 0.890625 }, + { x: 0.453125, y: 0.890625 }, + { x: 0.453125, y: 0.890625 }, + { x: 0.484375, y: 0.890625 }, + { x: 0.484375, y: 0.890625 }, + { x: 0.515625, y: 0.890625 }, + { x: 0.515625, y: 0.890625 }, + { x: 0.546875, y: 0.890625 }, + { x: 0.546875, y: 0.890625 }, + { x: 0.578125, y: 0.890625 }, + { x: 0.578125, y: 0.890625 }, + { x: 0.609375, y: 0.890625 }, + { x: 0.609375, y: 0.890625 }, + { x: 0.640625, y: 0.890625 }, + { x: 0.640625, y: 0.890625 }, + { x: 0.671875, y: 0.890625 }, + { x: 0.671875, y: 0.890625 }, + { x: 0.703125, y: 0.890625 }, + { x: 0.703125, y: 0.890625 }, + { x: 0.734375, y: 0.890625 }, + { x: 0.734375, y: 0.890625 }, + { x: 0.765625, y: 0.890625 }, + { x: 0.765625, y: 0.890625 }, + { x: 0.796875, y: 0.890625 }, + { x: 0.796875, y: 0.890625 }, + { x: 0.828125, y: 0.890625 }, + { x: 0.828125, y: 0.890625 }, + { x: 0.859375, y: 0.890625 }, + { x: 0.859375, y: 0.890625 }, + { x: 0.890625, y: 0.890625 }, + { x: 0.890625, y: 0.890625 }, + { x: 0.921875, y: 0.890625 }, + { x: 0.921875, y: 0.890625 }, + { x: 0.953125, y: 0.890625 }, + { x: 0.953125, y: 0.890625 }, + { x: 0.984375, y: 0.890625 }, + { x: 0.984375, y: 0.890625 }, + { x: 0.015625, y: 0.921875 }, + { x: 0.015625, y: 0.921875 }, + { x: 0.046875, y: 0.921875 }, + { x: 0.046875, y: 0.921875 }, + { x: 0.078125, y: 0.921875 }, + { x: 0.078125, y: 0.921875 }, + { x: 0.109375, y: 0.921875 }, + { x: 0.109375, y: 0.921875 }, + { x: 0.140625, y: 0.921875 }, + { x: 0.140625, y: 0.921875 }, + { x: 0.171875, y: 0.921875 }, + { x: 0.171875, y: 0.921875 }, + { x: 0.203125, y: 0.921875 }, + { x: 0.203125, y: 0.921875 }, + { x: 0.234375, y: 0.921875 }, + { x: 0.234375, y: 0.921875 }, + { x: 0.265625, y: 0.921875 }, + { x: 0.265625, y: 0.921875 }, + { x: 0.296875, y: 0.921875 }, + { x: 0.296875, y: 0.921875 }, + { x: 0.328125, y: 0.921875 }, + { x: 0.328125, y: 0.921875 }, + { x: 0.359375, y: 0.921875 }, + { x: 0.359375, y: 0.921875 }, + { x: 0.390625, y: 0.921875 }, + { x: 0.390625, y: 0.921875 }, + { x: 0.421875, y: 0.921875 }, + { x: 0.421875, y: 0.921875 }, + { x: 0.453125, y: 0.921875 }, + { x: 0.453125, y: 0.921875 }, + { x: 0.484375, y: 0.921875 }, + { x: 0.484375, y: 0.921875 }, + { x: 0.515625, y: 0.921875 }, + { x: 0.515625, y: 0.921875 }, + { x: 0.546875, y: 0.921875 }, + { x: 0.546875, y: 0.921875 }, + { x: 0.578125, y: 0.921875 }, + { x: 0.578125, y: 0.921875 }, + { x: 0.609375, y: 0.921875 }, + { x: 0.609375, y: 0.921875 }, + { x: 0.640625, y: 0.921875 }, + { x: 0.640625, y: 0.921875 }, + { x: 0.671875, y: 0.921875 }, + { x: 0.671875, y: 0.921875 }, + { x: 0.703125, y: 0.921875 }, + { x: 0.703125, y: 0.921875 }, + { x: 0.734375, y: 0.921875 }, + { x: 0.734375, y: 0.921875 }, + { x: 0.765625, y: 0.921875 }, + { x: 0.765625, y: 0.921875 }, + { x: 0.796875, y: 0.921875 }, + { x: 0.796875, y: 0.921875 }, + { x: 0.828125, y: 0.921875 }, + { x: 0.828125, y: 0.921875 }, + { x: 0.859375, y: 0.921875 }, + { x: 0.859375, y: 0.921875 }, + { x: 0.890625, y: 0.921875 }, + { x: 0.890625, y: 0.921875 }, + { x: 0.921875, y: 0.921875 }, + { x: 0.921875, y: 0.921875 }, + { x: 0.953125, y: 0.921875 }, + { x: 0.953125, y: 0.921875 }, + { x: 0.984375, y: 0.921875 }, + { x: 0.984375, y: 0.921875 }, + { x: 0.015625, y: 0.953125 }, + { x: 0.015625, y: 0.953125 }, + { x: 0.046875, y: 0.953125 }, + { x: 0.046875, y: 0.953125 }, + { x: 0.078125, y: 0.953125 }, + { x: 0.078125, y: 0.953125 }, + { x: 0.109375, y: 0.953125 }, + { x: 0.109375, y: 0.953125 }, + { x: 0.140625, y: 0.953125 }, + { x: 0.140625, y: 0.953125 }, + { x: 0.171875, y: 0.953125 }, + { x: 0.171875, y: 0.953125 }, + { x: 0.203125, y: 0.953125 }, + { x: 0.203125, y: 0.953125 }, + { x: 0.234375, y: 0.953125 }, + { x: 0.234375, y: 0.953125 }, + { x: 0.265625, y: 0.953125 }, + { x: 0.265625, y: 0.953125 }, + { x: 0.296875, y: 0.953125 }, + { x: 0.296875, y: 0.953125 }, + { x: 0.328125, y: 0.953125 }, + { x: 0.328125, y: 0.953125 }, + { x: 0.359375, y: 0.953125 }, + { x: 0.359375, y: 0.953125 }, + { x: 0.390625, y: 0.953125 }, + { x: 0.390625, y: 0.953125 }, + { x: 0.421875, y: 0.953125 }, + { x: 0.421875, y: 0.953125 }, + { x: 0.453125, y: 0.953125 }, + { x: 0.453125, y: 0.953125 }, + { x: 0.484375, y: 0.953125 }, + { x: 0.484375, y: 0.953125 }, + { x: 0.515625, y: 0.953125 }, + { x: 0.515625, y: 0.953125 }, + { x: 0.546875, y: 0.953125 }, + { x: 0.546875, y: 0.953125 }, + { x: 0.578125, y: 0.953125 }, + { x: 0.578125, y: 0.953125 }, + { x: 0.609375, y: 0.953125 }, + { x: 0.609375, y: 0.953125 }, + { x: 0.640625, y: 0.953125 }, + { x: 0.640625, y: 0.953125 }, + { x: 0.671875, y: 0.953125 }, + { x: 0.671875, y: 0.953125 }, + { x: 0.703125, y: 0.953125 }, + { x: 0.703125, y: 0.953125 }, + { x: 0.734375, y: 0.953125 }, + { x: 0.734375, y: 0.953125 }, + { x: 0.765625, y: 0.953125 }, + { x: 0.765625, y: 0.953125 }, + { x: 0.796875, y: 0.953125 }, + { x: 0.796875, y: 0.953125 }, + { x: 0.828125, y: 0.953125 }, + { x: 0.828125, y: 0.953125 }, + { x: 0.859375, y: 0.953125 }, + { x: 0.859375, y: 0.953125 }, + { x: 0.890625, y: 0.953125 }, + { x: 0.890625, y: 0.953125 }, + { x: 0.921875, y: 0.953125 }, + { x: 0.921875, y: 0.953125 }, + { x: 0.953125, y: 0.953125 }, + { x: 0.953125, y: 0.953125 }, + { x: 0.984375, y: 0.953125 }, + { x: 0.984375, y: 0.953125 }, + { x: 0.015625, y: 0.984375 }, + { x: 0.015625, y: 0.984375 }, + { x: 0.046875, y: 0.984375 }, + { x: 0.046875, y: 0.984375 }, + { x: 0.078125, y: 0.984375 }, + { x: 0.078125, y: 0.984375 }, + { x: 0.109375, y: 0.984375 }, + { x: 0.109375, y: 0.984375 }, + { x: 0.140625, y: 0.984375 }, + { x: 0.140625, y: 0.984375 }, + { x: 0.171875, y: 0.984375 }, + { x: 0.171875, y: 0.984375 }, + { x: 0.203125, y: 0.984375 }, + { x: 0.203125, y: 0.984375 }, + { x: 0.234375, y: 0.984375 }, + { x: 0.234375, y: 0.984375 }, + { x: 0.265625, y: 0.984375 }, + { x: 0.265625, y: 0.984375 }, + { x: 0.296875, y: 0.984375 }, + { x: 0.296875, y: 0.984375 }, + { x: 0.328125, y: 0.984375 }, + { x: 0.328125, y: 0.984375 }, + { x: 0.359375, y: 0.984375 }, + { x: 0.359375, y: 0.984375 }, + { x: 0.390625, y: 0.984375 }, + { x: 0.390625, y: 0.984375 }, + { x: 0.421875, y: 0.984375 }, + { x: 0.421875, y: 0.984375 }, + { x: 0.453125, y: 0.984375 }, + { x: 0.453125, y: 0.984375 }, + { x: 0.484375, y: 0.984375 }, + { x: 0.484375, y: 0.984375 }, + { x: 0.515625, y: 0.984375 }, + { x: 0.515625, y: 0.984375 }, + { x: 0.546875, y: 0.984375 }, + { x: 0.546875, y: 0.984375 }, + { x: 0.578125, y: 0.984375 }, + { x: 0.578125, y: 0.984375 }, + { x: 0.609375, y: 0.984375 }, + { x: 0.609375, y: 0.984375 }, + { x: 0.640625, y: 0.984375 }, + { x: 0.640625, y: 0.984375 }, + { x: 0.671875, y: 0.984375 }, + { x: 0.671875, y: 0.984375 }, + { x: 0.703125, y: 0.984375 }, + { x: 0.703125, y: 0.984375 }, + { x: 0.734375, y: 0.984375 }, + { x: 0.734375, y: 0.984375 }, + { x: 0.765625, y: 0.984375 }, + { x: 0.765625, y: 0.984375 }, + { x: 0.796875, y: 0.984375 }, + { x: 0.796875, y: 0.984375 }, + { x: 0.828125, y: 0.984375 }, + { x: 0.828125, y: 0.984375 }, + { x: 0.859375, y: 0.984375 }, + { x: 0.859375, y: 0.984375 }, + { x: 0.890625, y: 0.984375 }, + { x: 0.890625, y: 0.984375 }, + { x: 0.921875, y: 0.984375 }, + { x: 0.921875, y: 0.984375 }, + { x: 0.953125, y: 0.984375 }, + { x: 0.953125, y: 0.984375 }, + { x: 0.984375, y: 0.984375 }, + { x: 0.984375, y: 0.984375 }, + { x: 0.03125, y: 0.03125 }, + { x: 0.03125, y: 0.03125 }, + { x: 0.09375, y: 0.03125 }, + { x: 0.09375, y: 0.03125 }, + { x: 0.15625, y: 0.03125 }, + { x: 0.15625, y: 0.03125 }, + { x: 0.21875, y: 0.03125 }, + { x: 0.21875, y: 0.03125 }, + { x: 0.28125, y: 0.03125 }, + { x: 0.28125, y: 0.03125 }, + { x: 0.34375, y: 0.03125 }, + { x: 0.34375, y: 0.03125 }, + { x: 0.40625, y: 0.03125 }, + { x: 0.40625, y: 0.03125 }, + { x: 0.46875, y: 0.03125 }, + { x: 0.46875, y: 0.03125 }, + { x: 0.53125, y: 0.03125 }, + { x: 0.53125, y: 0.03125 }, + { x: 0.59375, y: 0.03125 }, + { x: 0.59375, y: 0.03125 }, + { x: 0.65625, y: 0.03125 }, + { x: 0.65625, y: 0.03125 }, + { x: 0.71875, y: 0.03125 }, + { x: 0.71875, y: 0.03125 }, + { x: 0.78125, y: 0.03125 }, + { x: 0.78125, y: 0.03125 }, + { x: 0.84375, y: 0.03125 }, + { x: 0.84375, y: 0.03125 }, + { x: 0.90625, y: 0.03125 }, + { x: 0.90625, y: 0.03125 }, + { x: 0.96875, y: 0.03125 }, + { x: 0.96875, y: 0.03125 }, + { x: 0.03125, y: 0.09375 }, + { x: 0.03125, y: 0.09375 }, + { x: 0.09375, y: 0.09375 }, + { x: 0.09375, y: 0.09375 }, + { x: 0.15625, y: 0.09375 }, + { x: 0.15625, y: 0.09375 }, + { x: 0.21875, y: 0.09375 }, + { x: 0.21875, y: 0.09375 }, + { x: 0.28125, y: 0.09375 }, + { x: 0.28125, y: 0.09375 }, + { x: 0.34375, y: 0.09375 }, + { x: 0.34375, y: 0.09375 }, + { x: 0.40625, y: 0.09375 }, + { x: 0.40625, y: 0.09375 }, + { x: 0.46875, y: 0.09375 }, + { x: 0.46875, y: 0.09375 }, + { x: 0.53125, y: 0.09375 }, + { x: 0.53125, y: 0.09375 }, + { x: 0.59375, y: 0.09375 }, + { x: 0.59375, y: 0.09375 }, + { x: 0.65625, y: 0.09375 }, + { x: 0.65625, y: 0.09375 }, + { x: 0.71875, y: 0.09375 }, + { x: 0.71875, y: 0.09375 }, + { x: 0.78125, y: 0.09375 }, + { x: 0.78125, y: 0.09375 }, + { x: 0.84375, y: 0.09375 }, + { x: 0.84375, y: 0.09375 }, + { x: 0.90625, y: 0.09375 }, + { x: 0.90625, y: 0.09375 }, + { x: 0.96875, y: 0.09375 }, + { x: 0.96875, y: 0.09375 }, + { x: 0.03125, y: 0.15625 }, + { x: 0.03125, y: 0.15625 }, + { x: 0.09375, y: 0.15625 }, + { x: 0.09375, y: 0.15625 }, + { x: 0.15625, y: 0.15625 }, + { x: 0.15625, y: 0.15625 }, + { x: 0.21875, y: 0.15625 }, + { x: 0.21875, y: 0.15625 }, + { x: 0.28125, y: 0.15625 }, + { x: 0.28125, y: 0.15625 }, + { x: 0.34375, y: 0.15625 }, + { x: 0.34375, y: 0.15625 }, + { x: 0.40625, y: 0.15625 }, + { x: 0.40625, y: 0.15625 }, + { x: 0.46875, y: 0.15625 }, + { x: 0.46875, y: 0.15625 }, + { x: 0.53125, y: 0.15625 }, + { x: 0.53125, y: 0.15625 }, + { x: 0.59375, y: 0.15625 }, + { x: 0.59375, y: 0.15625 }, + { x: 0.65625, y: 0.15625 }, + { x: 0.65625, y: 0.15625 }, + { x: 0.71875, y: 0.15625 }, + { x: 0.71875, y: 0.15625 }, + { x: 0.78125, y: 0.15625 }, + { x: 0.78125, y: 0.15625 }, + { x: 0.84375, y: 0.15625 }, + { x: 0.84375, y: 0.15625 }, + { x: 0.90625, y: 0.15625 }, + { x: 0.90625, y: 0.15625 }, + { x: 0.96875, y: 0.15625 }, + { x: 0.96875, y: 0.15625 }, + { x: 0.03125, y: 0.21875 }, + { x: 0.03125, y: 0.21875 }, + { x: 0.09375, y: 0.21875 }, + { x: 0.09375, y: 0.21875 }, + { x: 0.15625, y: 0.21875 }, + { x: 0.15625, y: 0.21875 }, + { x: 0.21875, y: 0.21875 }, + { x: 0.21875, y: 0.21875 }, + { x: 0.28125, y: 0.21875 }, + { x: 0.28125, y: 0.21875 }, + { x: 0.34375, y: 0.21875 }, + { x: 0.34375, y: 0.21875 }, + { x: 0.40625, y: 0.21875 }, + { x: 0.40625, y: 0.21875 }, + { x: 0.46875, y: 0.21875 }, + { x: 0.46875, y: 0.21875 }, + { x: 0.53125, y: 0.21875 }, + { x: 0.53125, y: 0.21875 }, + { x: 0.59375, y: 0.21875 }, + { x: 0.59375, y: 0.21875 }, + { x: 0.65625, y: 0.21875 }, + { x: 0.65625, y: 0.21875 }, + { x: 0.71875, y: 0.21875 }, + { x: 0.71875, y: 0.21875 }, + { x: 0.78125, y: 0.21875 }, + { x: 0.78125, y: 0.21875 }, + { x: 0.84375, y: 0.21875 }, + { x: 0.84375, y: 0.21875 }, + { x: 0.90625, y: 0.21875 }, + { x: 0.90625, y: 0.21875 }, + { x: 0.96875, y: 0.21875 }, + { x: 0.96875, y: 0.21875 }, + { x: 0.03125, y: 0.28125 }, + { x: 0.03125, y: 0.28125 }, + { x: 0.09375, y: 0.28125 }, + { x: 0.09375, y: 0.28125 }, + { x: 0.15625, y: 0.28125 }, + { x: 0.15625, y: 0.28125 }, + { x: 0.21875, y: 0.28125 }, + { x: 0.21875, y: 0.28125 }, + { x: 0.28125, y: 0.28125 }, + { x: 0.28125, y: 0.28125 }, + { x: 0.34375, y: 0.28125 }, + { x: 0.34375, y: 0.28125 }, + { x: 0.40625, y: 0.28125 }, + { x: 0.40625, y: 0.28125 }, + { x: 0.46875, y: 0.28125 }, + { x: 0.46875, y: 0.28125 }, + { x: 0.53125, y: 0.28125 }, + { x: 0.53125, y: 0.28125 }, + { x: 0.59375, y: 0.28125 }, + { x: 0.59375, y: 0.28125 }, + { x: 0.65625, y: 0.28125 }, + { x: 0.65625, y: 0.28125 }, + { x: 0.71875, y: 0.28125 }, + { x: 0.71875, y: 0.28125 }, + { x: 0.78125, y: 0.28125 }, + { x: 0.78125, y: 0.28125 }, + { x: 0.84375, y: 0.28125 }, + { x: 0.84375, y: 0.28125 }, + { x: 0.90625, y: 0.28125 }, + { x: 0.90625, y: 0.28125 }, + { x: 0.96875, y: 0.28125 }, + { x: 0.96875, y: 0.28125 }, + { x: 0.03125, y: 0.34375 }, + { x: 0.03125, y: 0.34375 }, + { x: 0.09375, y: 0.34375 }, + { x: 0.09375, y: 0.34375 }, + { x: 0.15625, y: 0.34375 }, + { x: 0.15625, y: 0.34375 }, + { x: 0.21875, y: 0.34375 }, + { x: 0.21875, y: 0.34375 }, + { x: 0.28125, y: 0.34375 }, + { x: 0.28125, y: 0.34375 }, + { x: 0.34375, y: 0.34375 }, + { x: 0.34375, y: 0.34375 }, + { x: 0.40625, y: 0.34375 }, + { x: 0.40625, y: 0.34375 }, + { x: 0.46875, y: 0.34375 }, + { x: 0.46875, y: 0.34375 }, + { x: 0.53125, y: 0.34375 }, + { x: 0.53125, y: 0.34375 }, + { x: 0.59375, y: 0.34375 }, + { x: 0.59375, y: 0.34375 }, + { x: 0.65625, y: 0.34375 }, + { x: 0.65625, y: 0.34375 }, + { x: 0.71875, y: 0.34375 }, + { x: 0.71875, y: 0.34375 }, + { x: 0.78125, y: 0.34375 }, + { x: 0.78125, y: 0.34375 }, + { x: 0.84375, y: 0.34375 }, + { x: 0.84375, y: 0.34375 }, + { x: 0.90625, y: 0.34375 }, + { x: 0.90625, y: 0.34375 }, + { x: 0.96875, y: 0.34375 }, + { x: 0.96875, y: 0.34375 }, + { x: 0.03125, y: 0.40625 }, + { x: 0.03125, y: 0.40625 }, + { x: 0.09375, y: 0.40625 }, + { x: 0.09375, y: 0.40625 }, + { x: 0.15625, y: 0.40625 }, + { x: 0.15625, y: 0.40625 }, + { x: 0.21875, y: 0.40625 }, + { x: 0.21875, y: 0.40625 }, + { x: 0.28125, y: 0.40625 }, + { x: 0.28125, y: 0.40625 }, + { x: 0.34375, y: 0.40625 }, + { x: 0.34375, y: 0.40625 }, + { x: 0.40625, y: 0.40625 }, + { x: 0.40625, y: 0.40625 }, + { x: 0.46875, y: 0.40625 }, + { x: 0.46875, y: 0.40625 }, + { x: 0.53125, y: 0.40625 }, + { x: 0.53125, y: 0.40625 }, + { x: 0.59375, y: 0.40625 }, + { x: 0.59375, y: 0.40625 }, + { x: 0.65625, y: 0.40625 }, + { x: 0.65625, y: 0.40625 }, + { x: 0.71875, y: 0.40625 }, + { x: 0.71875, y: 0.40625 }, + { x: 0.78125, y: 0.40625 }, + { x: 0.78125, y: 0.40625 }, + { x: 0.84375, y: 0.40625 }, + { x: 0.84375, y: 0.40625 }, + { x: 0.90625, y: 0.40625 }, + { x: 0.90625, y: 0.40625 }, + { x: 0.96875, y: 0.40625 }, + { x: 0.96875, y: 0.40625 }, + { x: 0.03125, y: 0.46875 }, + { x: 0.03125, y: 0.46875 }, + { x: 0.09375, y: 0.46875 }, + { x: 0.09375, y: 0.46875 }, + { x: 0.15625, y: 0.46875 }, + { x: 0.15625, y: 0.46875 }, + { x: 0.21875, y: 0.46875 }, + { x: 0.21875, y: 0.46875 }, + { x: 0.28125, y: 0.46875 }, + { x: 0.28125, y: 0.46875 }, + { x: 0.34375, y: 0.46875 }, + { x: 0.34375, y: 0.46875 }, + { x: 0.40625, y: 0.46875 }, + { x: 0.40625, y: 0.46875 }, + { x: 0.46875, y: 0.46875 }, + { x: 0.46875, y: 0.46875 }, + { x: 0.53125, y: 0.46875 }, + { x: 0.53125, y: 0.46875 }, + { x: 0.59375, y: 0.46875 }, + { x: 0.59375, y: 0.46875 }, + { x: 0.65625, y: 0.46875 }, + { x: 0.65625, y: 0.46875 }, + { x: 0.71875, y: 0.46875 }, + { x: 0.71875, y: 0.46875 }, + { x: 0.78125, y: 0.46875 }, + { x: 0.78125, y: 0.46875 }, + { x: 0.84375, y: 0.46875 }, + { x: 0.84375, y: 0.46875 }, + { x: 0.90625, y: 0.46875 }, + { x: 0.90625, y: 0.46875 }, + { x: 0.96875, y: 0.46875 }, + { x: 0.96875, y: 0.46875 }, + { x: 0.03125, y: 0.53125 }, + { x: 0.03125, y: 0.53125 }, + { x: 0.09375, y: 0.53125 }, + { x: 0.09375, y: 0.53125 }, + { x: 0.15625, y: 0.53125 }, + { x: 0.15625, y: 0.53125 }, + { x: 0.21875, y: 0.53125 }, + { x: 0.21875, y: 0.53125 }, + { x: 0.28125, y: 0.53125 }, + { x: 0.28125, y: 0.53125 }, + { x: 0.34375, y: 0.53125 }, + { x: 0.34375, y: 0.53125 }, + { x: 0.40625, y: 0.53125 }, + { x: 0.40625, y: 0.53125 }, + { x: 0.46875, y: 0.53125 }, + { x: 0.46875, y: 0.53125 }, + { x: 0.53125, y: 0.53125 }, + { x: 0.53125, y: 0.53125 }, + { x: 0.59375, y: 0.53125 }, + { x: 0.59375, y: 0.53125 }, + { x: 0.65625, y: 0.53125 }, + { x: 0.65625, y: 0.53125 }, + { x: 0.71875, y: 0.53125 }, + { x: 0.71875, y: 0.53125 }, + { x: 0.78125, y: 0.53125 }, + { x: 0.78125, y: 0.53125 }, + { x: 0.84375, y: 0.53125 }, + { x: 0.84375, y: 0.53125 }, + { x: 0.90625, y: 0.53125 }, + { x: 0.90625, y: 0.53125 }, + { x: 0.96875, y: 0.53125 }, + { x: 0.96875, y: 0.53125 }, + { x: 0.03125, y: 0.59375 }, + { x: 0.03125, y: 0.59375 }, + { x: 0.09375, y: 0.59375 }, + { x: 0.09375, y: 0.59375 }, + { x: 0.15625, y: 0.59375 }, + { x: 0.15625, y: 0.59375 }, + { x: 0.21875, y: 0.59375 }, + { x: 0.21875, y: 0.59375 }, + { x: 0.28125, y: 0.59375 }, + { x: 0.28125, y: 0.59375 }, + { x: 0.34375, y: 0.59375 }, + { x: 0.34375, y: 0.59375 }, + { x: 0.40625, y: 0.59375 }, + { x: 0.40625, y: 0.59375 }, + { x: 0.46875, y: 0.59375 }, + { x: 0.46875, y: 0.59375 }, + { x: 0.53125, y: 0.59375 }, + { x: 0.53125, y: 0.59375 }, + { x: 0.59375, y: 0.59375 }, + { x: 0.59375, y: 0.59375 }, + { x: 0.65625, y: 0.59375 }, + { x: 0.65625, y: 0.59375 }, + { x: 0.71875, y: 0.59375 }, + { x: 0.71875, y: 0.59375 }, + { x: 0.78125, y: 0.59375 }, + { x: 0.78125, y: 0.59375 }, + { x: 0.84375, y: 0.59375 }, + { x: 0.84375, y: 0.59375 }, + { x: 0.90625, y: 0.59375 }, + { x: 0.90625, y: 0.59375 }, + { x: 0.96875, y: 0.59375 }, + { x: 0.96875, y: 0.59375 }, + { x: 0.03125, y: 0.65625 }, + { x: 0.03125, y: 0.65625 }, + { x: 0.09375, y: 0.65625 }, + { x: 0.09375, y: 0.65625 }, + { x: 0.15625, y: 0.65625 }, + { x: 0.15625, y: 0.65625 }, + { x: 0.21875, y: 0.65625 }, + { x: 0.21875, y: 0.65625 }, + { x: 0.28125, y: 0.65625 }, + { x: 0.28125, y: 0.65625 }, + { x: 0.34375, y: 0.65625 }, + { x: 0.34375, y: 0.65625 }, + { x: 0.40625, y: 0.65625 }, + { x: 0.40625, y: 0.65625 }, + { x: 0.46875, y: 0.65625 }, + { x: 0.46875, y: 0.65625 }, + { x: 0.53125, y: 0.65625 }, + { x: 0.53125, y: 0.65625 }, + { x: 0.59375, y: 0.65625 }, + { x: 0.59375, y: 0.65625 }, + { x: 0.65625, y: 0.65625 }, + { x: 0.65625, y: 0.65625 }, + { x: 0.71875, y: 0.65625 }, + { x: 0.71875, y: 0.65625 }, + { x: 0.78125, y: 0.65625 }, + { x: 0.78125, y: 0.65625 }, + { x: 0.84375, y: 0.65625 }, + { x: 0.84375, y: 0.65625 }, + { x: 0.90625, y: 0.65625 }, + { x: 0.90625, y: 0.65625 }, + { x: 0.96875, y: 0.65625 }, + { x: 0.96875, y: 0.65625 }, + { x: 0.03125, y: 0.71875 }, + { x: 0.03125, y: 0.71875 }, + { x: 0.09375, y: 0.71875 }, + { x: 0.09375, y: 0.71875 }, + { x: 0.15625, y: 0.71875 }, + { x: 0.15625, y: 0.71875 }, + { x: 0.21875, y: 0.71875 }, + { x: 0.21875, y: 0.71875 }, + { x: 0.28125, y: 0.71875 }, + { x: 0.28125, y: 0.71875 }, + { x: 0.34375, y: 0.71875 }, + { x: 0.34375, y: 0.71875 }, + { x: 0.40625, y: 0.71875 }, + { x: 0.40625, y: 0.71875 }, + { x: 0.46875, y: 0.71875 }, + { x: 0.46875, y: 0.71875 }, + { x: 0.53125, y: 0.71875 }, + { x: 0.53125, y: 0.71875 }, + { x: 0.59375, y: 0.71875 }, + { x: 0.59375, y: 0.71875 }, + { x: 0.65625, y: 0.71875 }, + { x: 0.65625, y: 0.71875 }, + { x: 0.71875, y: 0.71875 }, + { x: 0.71875, y: 0.71875 }, + { x: 0.78125, y: 0.71875 }, + { x: 0.78125, y: 0.71875 }, + { x: 0.84375, y: 0.71875 }, + { x: 0.84375, y: 0.71875 }, + { x: 0.90625, y: 0.71875 }, + { x: 0.90625, y: 0.71875 }, + { x: 0.96875, y: 0.71875 }, + { x: 0.96875, y: 0.71875 }, + { x: 0.03125, y: 0.78125 }, + { x: 0.03125, y: 0.78125 }, + { x: 0.09375, y: 0.78125 }, + { x: 0.09375, y: 0.78125 }, + { x: 0.15625, y: 0.78125 }, + { x: 0.15625, y: 0.78125 }, + { x: 0.21875, y: 0.78125 }, + { x: 0.21875, y: 0.78125 }, + { x: 0.28125, y: 0.78125 }, + { x: 0.28125, y: 0.78125 }, + { x: 0.34375, y: 0.78125 }, + { x: 0.34375, y: 0.78125 }, + { x: 0.40625, y: 0.78125 }, + { x: 0.40625, y: 0.78125 }, + { x: 0.46875, y: 0.78125 }, + { x: 0.46875, y: 0.78125 }, + { x: 0.53125, y: 0.78125 }, + { x: 0.53125, y: 0.78125 }, + { x: 0.59375, y: 0.78125 }, + { x: 0.59375, y: 0.78125 }, + { x: 0.65625, y: 0.78125 }, + { x: 0.65625, y: 0.78125 }, + { x: 0.71875, y: 0.78125 }, + { x: 0.71875, y: 0.78125 }, + { x: 0.78125, y: 0.78125 }, + { x: 0.78125, y: 0.78125 }, + { x: 0.84375, y: 0.78125 }, + { x: 0.84375, y: 0.78125 }, + { x: 0.90625, y: 0.78125 }, + { x: 0.90625, y: 0.78125 }, + { x: 0.96875, y: 0.78125 }, + { x: 0.96875, y: 0.78125 }, + { x: 0.03125, y: 0.84375 }, + { x: 0.03125, y: 0.84375 }, + { x: 0.09375, y: 0.84375 }, + { x: 0.09375, y: 0.84375 }, + { x: 0.15625, y: 0.84375 }, + { x: 0.15625, y: 0.84375 }, + { x: 0.21875, y: 0.84375 }, + { x: 0.21875, y: 0.84375 }, + { x: 0.28125, y: 0.84375 }, + { x: 0.28125, y: 0.84375 }, + { x: 0.34375, y: 0.84375 }, + { x: 0.34375, y: 0.84375 }, + { x: 0.40625, y: 0.84375 }, + { x: 0.40625, y: 0.84375 }, + { x: 0.46875, y: 0.84375 }, + { x: 0.46875, y: 0.84375 }, + { x: 0.53125, y: 0.84375 }, + { x: 0.53125, y: 0.84375 }, + { x: 0.59375, y: 0.84375 }, + { x: 0.59375, y: 0.84375 }, + { x: 0.65625, y: 0.84375 }, + { x: 0.65625, y: 0.84375 }, + { x: 0.71875, y: 0.84375 }, + { x: 0.71875, y: 0.84375 }, + { x: 0.78125, y: 0.84375 }, + { x: 0.78125, y: 0.84375 }, + { x: 0.84375, y: 0.84375 }, + { x: 0.84375, y: 0.84375 }, + { x: 0.90625, y: 0.84375 }, + { x: 0.90625, y: 0.84375 }, + { x: 0.96875, y: 0.84375 }, + { x: 0.96875, y: 0.84375 }, + { x: 0.03125, y: 0.90625 }, + { x: 0.03125, y: 0.90625 }, + { x: 0.09375, y: 0.90625 }, + { x: 0.09375, y: 0.90625 }, + { x: 0.15625, y: 0.90625 }, + { x: 0.15625, y: 0.90625 }, + { x: 0.21875, y: 0.90625 }, + { x: 0.21875, y: 0.90625 }, + { x: 0.28125, y: 0.90625 }, + { x: 0.28125, y: 0.90625 }, + { x: 0.34375, y: 0.90625 }, + { x: 0.34375, y: 0.90625 }, + { x: 0.40625, y: 0.90625 }, + { x: 0.40625, y: 0.90625 }, + { x: 0.46875, y: 0.90625 }, + { x: 0.46875, y: 0.90625 }, + { x: 0.53125, y: 0.90625 }, + { x: 0.53125, y: 0.90625 }, + { x: 0.59375, y: 0.90625 }, + { x: 0.59375, y: 0.90625 }, + { x: 0.65625, y: 0.90625 }, + { x: 0.65625, y: 0.90625 }, + { x: 0.71875, y: 0.90625 }, + { x: 0.71875, y: 0.90625 }, + { x: 0.78125, y: 0.90625 }, + { x: 0.78125, y: 0.90625 }, + { x: 0.84375, y: 0.90625 }, + { x: 0.84375, y: 0.90625 }, + { x: 0.90625, y: 0.90625 }, + { x: 0.90625, y: 0.90625 }, + { x: 0.96875, y: 0.90625 }, + { x: 0.96875, y: 0.90625 }, + { x: 0.03125, y: 0.96875 }, + { x: 0.03125, y: 0.96875 }, + { x: 0.09375, y: 0.96875 }, + { x: 0.09375, y: 0.96875 }, + { x: 0.15625, y: 0.96875 }, + { x: 0.15625, y: 0.96875 }, + { x: 0.21875, y: 0.96875 }, + { x: 0.21875, y: 0.96875 }, + { x: 0.28125, y: 0.96875 }, + { x: 0.28125, y: 0.96875 }, + { x: 0.34375, y: 0.96875 }, + { x: 0.34375, y: 0.96875 }, + { x: 0.40625, y: 0.96875 }, + { x: 0.40625, y: 0.96875 }, + { x: 0.46875, y: 0.96875 }, + { x: 0.46875, y: 0.96875 }, + { x: 0.53125, y: 0.96875 }, + { x: 0.53125, y: 0.96875 }, + { x: 0.59375, y: 0.96875 }, + { x: 0.59375, y: 0.96875 }, + { x: 0.65625, y: 0.96875 }, + { x: 0.65625, y: 0.96875 }, + { x: 0.71875, y: 0.96875 }, + { x: 0.71875, y: 0.96875 }, + { x: 0.78125, y: 0.96875 }, + { x: 0.78125, y: 0.96875 }, + { x: 0.84375, y: 0.96875 }, + { x: 0.84375, y: 0.96875 }, + { x: 0.90625, y: 0.96875 }, + { x: 0.90625, y: 0.96875 }, + { x: 0.96875, y: 0.96875 }, + { x: 0.96875, y: 0.96875 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.0625, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.1875, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.3125, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.4375, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.5625, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.6875, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.8125, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.9375, y: 0.0625 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.0625, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.1875, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.3125, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.4375, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.5625, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.6875, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.8125, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.9375, y: 0.1875 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.0625, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.1875, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.3125, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.4375, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.5625, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.6875, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.8125, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.9375, y: 0.3125 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.0625, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.1875, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.3125, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.4375, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.5625, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.6875, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.8125, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.9375, y: 0.4375 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.0625, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.1875, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.3125, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.4375, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.5625, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.6875, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.8125, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.9375, y: 0.5625 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.0625, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.1875, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.3125, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.4375, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.5625, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.6875, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.8125, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.9375, y: 0.6875 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.0625, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.1875, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.3125, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.4375, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.5625, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.6875, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.8125, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.9375, y: 0.8125 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.0625, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.1875, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.3125, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.4375, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.5625, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.6875, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.8125, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 }, + { x: 0.9375, y: 0.9375 } +]; + +// src/handpose/handdetector.ts +var HandDetector = class { + constructor(model10) { + this.model = model10; + this.anchors = anchors.map((anchor) => [anchor.x, anchor.y]); + this.anchorsTensor = tfjs_esm_exports.tensor2d(this.anchors); + this.inputSize = this.model && this.model.inputs && this.model.inputs[0].shape ? this.model.inputs[0].shape[2] : 0; + this.inputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize, this.inputSize]); + this.doubleInputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize * 2, this.inputSize * 2]); + } + normalizeBoxes(boxes) { + return tfjs_esm_exports.tidy(() => { + const boxOffsets = tfjs_esm_exports.slice(boxes, [0, 0], [-1, 2]); + const boxSizes = tfjs_esm_exports.slice(boxes, [0, 2], [-1, 2]); + const boxCenterPoints = tfjs_esm_exports.add(tfjs_esm_exports.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor); + const halfBoxSizes = tfjs_esm_exports.div(boxSizes, this.doubleInputSizeTensor); + const startPoints = tfjs_esm_exports.mul(tfjs_esm_exports.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); + const endPoints = tfjs_esm_exports.mul(tfjs_esm_exports.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); + return tfjs_esm_exports.concat2d([startPoints, endPoints], 1); + }); + } + normalizeLandmarks(rawPalmLandmarks, index) { + return tfjs_esm_exports.tidy(() => { + const landmarks = tfjs_esm_exports.add(tfjs_esm_exports.div(tfjs_esm_exports.reshape(rawPalmLandmarks, [-1, 7, 2]), this.inputSizeTensor), this.anchors[index]); + return tfjs_esm_exports.mul(landmarks, this.inputSizeTensor); + }); + } + async getBoxes(input, config3) { + const t = {}; + t.batched = this.model.predict(input); + t.predictions = tfjs_esm_exports.squeeze(t.batched); + t.scores = tfjs_esm_exports.tidy(() => tfjs_esm_exports.squeeze(tfjs_esm_exports.sigmoid(tfjs_esm_exports.slice(t.predictions, [0, 0], [-1, 1])))); + const scores = await t.scores.data(); + t.boxes = tfjs_esm_exports.slice(t.predictions, [0, 1], [-1, 4]); + t.norm = this.normalizeBoxes(t.boxes); + t.nms = await tfjs_esm_exports.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); + const nms = await t.nms.array(); + const hands = []; + for (const index of nms) { + const palmBox = tfjs_esm_exports.slice(t.norm, [index, 0], [1, -1]); + const palmLandmarks = tfjs_esm_exports.tidy(() => tfjs_esm_exports.reshape(this.normalizeLandmarks(tfjs_esm_exports.slice(t.predictions, [index, 5], [1, 14]), index), [-1, 2])); + hands.push({ box: palmBox, palmLandmarks, confidence: scores[index] }); + } + for (const tensor2 of Object.keys(t)) + tfjs_esm_exports.dispose(t[tensor2]); + return hands; + } + async estimateHandBounds(input, config3) { + const inputHeight = input.shape[1]; + const inputWidth = input.shape[2]; + const image18 = tfjs_esm_exports.tidy(() => tfjs_esm_exports.sub(tfjs_esm_exports.div(tfjs_esm_exports.image.resizeBilinear(input, [this.inputSize, this.inputSize]), 127.5), 1)); + const predictions = await this.getBoxes(image18, config3); + tfjs_esm_exports.dispose(image18); + const hands = []; + if (!predictions || predictions.length === 0) + return hands; + for (const prediction of predictions) { + const boxes = await prediction.box.data(); + const startPoint = boxes.slice(0, 2); + const endPoint = boxes.slice(2, 4); + const palmLandmarks = await prediction.palmLandmarks.array(); + tfjs_esm_exports.dispose(prediction.box); + tfjs_esm_exports.dispose(prediction.palmLandmarks); + hands.push(scaleBoxCoordinates2({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize])); + } + return hands; + } +}; + +// src/handpose/util.ts +function normalizeRadians2(angle) { + return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); +} +function computeRotation2(point1, point2) { + const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); + return normalizeRadians2(radians); +} +var buildTranslationMatrix2 = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]]; +function dot2(v1, v2) { + let product = 0; + for (let i = 0; i < v1.length; i++) { + product += v1[i] * v2[i]; + } + return product; +} +function getColumnFrom2DArr2(arr, columnIndex) { + const column = []; + for (let i = 0; i < arr.length; i++) { + column.push(arr[i][columnIndex]); + } + return column; +} +function multiplyTransformMatrices2(mat1, mat2) { + const product = []; + const size = mat1.length; + for (let row = 0; row < size; row++) { + product.push([]); + for (let col = 0; col < size; col++) { + product[row].push(dot2(mat1[row], getColumnFrom2DArr2(mat2, col))); + } + } + return product; +} +function buildRotationMatrix2(rotation, center) { + const cosA = Math.cos(rotation); + const sinA = Math.sin(rotation); + const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; + const translationMatrix = buildTranslationMatrix2(center[0], center[1]); + const translationTimesRotation = multiplyTransformMatrices2(translationMatrix, rotationMatrix); + const negativeTranslationMatrix = buildTranslationMatrix2(-center[0], -center[1]); + return multiplyTransformMatrices2(translationTimesRotation, negativeTranslationMatrix); +} +function invertTransformMatrix2(matrix) { + const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; + const translationComponent = [matrix[0][2], matrix[1][2]]; + const invertedTranslation = [ + -dot2(rotationComponent[0], translationComponent), + -dot2(rotationComponent[1], translationComponent) + ]; + return [ + rotationComponent[0].concat(invertedTranslation[0]), + rotationComponent[1].concat(invertedTranslation[1]), + [0, 0, 1] + ]; +} +function rotatePoint2(homogeneousCoordinate, rotationMatrix) { + return [ + dot2(homogeneousCoordinate, rotationMatrix[0]), + dot2(homogeneousCoordinate, rotationMatrix[1]) + ]; +} + +// src/handpose/handpipeline.ts +var palmBoxEnlargeFactor = 5; +var handBoxEnlargeFactor = 1.65; +var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2]; +var palmLandmarksPalmBase = 0; +var palmLandmarksMiddleFingerBase = 2; +var HandPipeline = class { + constructor(handDetector, handPoseModel2) { + var _a; + this.handDetector = handDetector; + this.handPoseModel = handPoseModel2; + this.inputSize = (_a = this.handPoseModel) == null ? void 0 : _a.inputs[0].shape[2]; + this.storedBoxes = []; + this.skipped = 0; + this.detectedHands = 0; + } + calculateLandmarksBoundingBox(landmarks) { + const xs = landmarks.map((d) => d[0]); + const ys = landmarks.map((d) => d[1]); + const startPoint = [Math.min(...xs), Math.min(...ys)]; + const endPoint = [Math.max(...xs), Math.max(...ys)]; + return { startPoint, endPoint }; + } + getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) { + const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix)); + const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks); + return enlargeBox2(squarifyBox2(boxAroundPalm), palmBoxEnlargeFactor); + } + getBoxForHandLandmarks(landmarks) { + const boundingBox = this.calculateLandmarksBoundingBox(landmarks); + const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), handBoxEnlargeFactor); + boxAroundHand.palmLandmarks = []; + for (let i = 0; i < palmLandmarkIds.length; i++) { + boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2)); + } + return boxAroundHand; + } + transformRawCoords(rawCoords, box22, angle, rotationMatrix) { + const boxSize = getBoxSize2(box22); + const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2]; + const coordsScaled = rawCoords.map((coord) => [ + scaleFactor[0] * (coord[0] - this.inputSize / 2), + scaleFactor[1] * (coord[1] - this.inputSize / 2), + scaleFactor[2] * coord[2] + ]); + const coordsRotationMatrix = buildRotationMatrix2(angle, [0, 0]); + const coordsRotated = coordsScaled.map((coord) => { + const rotated = rotatePoint2(coord, coordsRotationMatrix); + return [...rotated, coord[2]]; + }); + const inverseRotationMatrix = invertTransformMatrix2(rotationMatrix); + const boxCenter = [...getBoxCenter2(box22), 1]; + const originalBoxCenter = [ + dot2(boxCenter, inverseRotationMatrix[0]), + dot2(boxCenter, inverseRotationMatrix[1]) + ]; + return coordsRotated.map((coord) => [ + Math.trunc(coord[0] + originalBoxCenter[0]), + Math.trunc(coord[1] + originalBoxCenter[1]), + Math.trunc(coord[2]) + ]); + } + async estimateHands(image18, config3) { + let useFreshBox = false; + let boxes; + if (this.skipped === 0 || this.skipped > config3.hand.skipFrames || !config3.hand.landmarks || !config3.skipFrame) { + boxes = await this.handDetector.estimateHandBounds(image18, config3); + this.skipped = 0; + } + if (config3.skipFrame) + this.skipped++; + if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) { + this.detectedHands = 0; + this.storedBoxes = [...boxes]; + if (this.storedBoxes.length > 0) + useFreshBox = true; + } + const hands = []; + for (let i = 0; i < this.storedBoxes.length; i++) { + const currentBox = this.storedBoxes[i]; + if (!currentBox) + continue; + if (config3.hand.landmarks) { + const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0; + const palmCenter = getBoxCenter2(currentBox); + const palmCenterNormalized = [palmCenter[0] / image18.shape[2], palmCenter[1] / image18.shape[1]]; + const rotatedImage = config3.hand.rotation && tfjs_esm_exports.ENV.flags.IS_BROWSER ? tfjs_esm_exports.image.rotateWithOffset(image18, angle, 0, palmCenterNormalized) : image18.clone(); + const rotationMatrix = buildRotationMatrix2(-angle, palmCenter); + const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox; + const croppedInput = cutBoxFromImageAndResize2(newBox, rotatedImage, [this.inputSize, this.inputSize]); + const handImage = tfjs_esm_exports.div(croppedInput, 255); + tfjs_esm_exports.dispose(croppedInput); + tfjs_esm_exports.dispose(rotatedImage); + const [confidenceT, keypoints3] = await this.handPoseModel.predict(handImage); + tfjs_esm_exports.dispose(handImage); + const confidence = (await confidenceT.data())[0]; + tfjs_esm_exports.dispose(confidenceT); + if (confidence >= config3.hand.minConfidence / 4) { + const keypointsReshaped = tfjs_esm_exports.reshape(keypoints3, [-1, 3]); + const rawCoords = await keypointsReshaped.array(); + tfjs_esm_exports.dispose(keypoints3); + tfjs_esm_exports.dispose(keypointsReshaped); + const coords3 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); + const nextBoundingBox = this.getBoxForHandLandmarks(coords3); + this.storedBoxes[i] = { ...nextBoundingBox, confidence }; + const result = { + landmarks: coords3, + confidence, + box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } + }; + hands.push(result); + } else { + this.storedBoxes[i] = null; + } + tfjs_esm_exports.dispose(keypoints3); + } else { + const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor); + const result = { + confidence: currentBox.confidence, + box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint } + }; + hands.push(result); + } + } + this.storedBoxes = this.storedBoxes.filter((a) => a !== null); + this.detectedHands = hands.length; + return hands; + } +}; + +// src/fingerpose/description.ts +var Finger = { + thumb: 0, + index: 1, + middle: 2, + ring: 3, + pinky: 4, + all: [0, 1, 2, 3, 4], + nameMapping: { 0: "thumb", 1: "index", 2: "middle", 3: "ring", 4: "pinky" }, + pointsMapping: { + 0: [[0, 1], [1, 2], [2, 3], [3, 4]], + 1: [[0, 5], [5, 6], [6, 7], [7, 8]], + 2: [[0, 9], [9, 10], [10, 11], [11, 12]], + 3: [[0, 13], [13, 14], [14, 15], [15, 16]], + 4: [[0, 17], [17, 18], [18, 19], [19, 20]] + }, + getName: (value) => Finger.nameMapping[value], + getPoints: (value) => Finger.pointsMapping[value] +}; +var FingerCurl = { + none: 0, + half: 1, + full: 2, + nameMapping: { 0: "none", 1: "half", 2: "full" }, + getName: (value) => FingerCurl.nameMapping[value] +}; +var FingerDirection = { + verticalUp: 0, + verticalDown: 1, + horizontalLeft: 2, + horizontalRight: 3, + diagonalUpRight: 4, + diagonalUpLeft: 5, + diagonalDownRight: 6, + diagonalDownLeft: 7, + nameMapping: { 0: "verticalUp", 1: "verticalDown", 2: "horizontalLeft", 3: "horizontalRight", 4: "diagonalUpRight", 5: "diagonalUpLeft", 6: "diagonalDownRight", 7: "diagonalDownLeft" }, + getName: (value) => FingerDirection.nameMapping[value] +}; + +// src/fingerpose/estimator.ts +var options = { + HALF_CURL_START_LIMIT: 60, + NO_CURL_START_LIMIT: 130, + DISTANCE_VOTE_POWER: 1.1, + SINGLE_ANGLE_VOTE_POWER: 0.9, + TOTAL_ANGLE_VOTE_POWER: 1.6 +}; +function calculateSlope(point1x, point1y, point2x, point2y) { + const value = (point1y - point2y) / (point1x - point2x); + let slope = Math.atan(value) * 180 / Math.PI; + if (slope <= 0) + slope = -slope; + else if (slope > 0) + slope = 180 - slope; + return slope; +} +function getSlopes(point1, point2) { + const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); + if (point1.length === 2) + return slopeXY; + const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]); + return [slopeXY, slopeYZ]; +} +function angleOrientationAt(angle, weightageAt = 1) { + let isVertical = 0; + let isDiagonal = 0; + let isHorizontal = 0; + if (angle >= 75 && angle <= 105) + isVertical = 1 * weightageAt; + else if (angle >= 25 && angle <= 155) + isDiagonal = 1 * weightageAt; + else + isHorizontal = 1 * weightageAt; + return [isVertical, isDiagonal, isHorizontal]; +} +function estimateFingerCurl(startPoint, midPoint, endPoint) { + const start_mid_x_dist = startPoint[0] - midPoint[0]; + const start_end_x_dist = startPoint[0] - endPoint[0]; + const mid_end_x_dist = midPoint[0] - endPoint[0]; + const start_mid_y_dist = startPoint[1] - midPoint[1]; + const start_end_y_dist = startPoint[1] - endPoint[1]; + const mid_end_y_dist = midPoint[1] - endPoint[1]; + const start_mid_z_dist = startPoint[2] - midPoint[2]; + const start_end_z_dist = startPoint[2] - endPoint[2]; + const mid_end_z_dist = midPoint[2] - endPoint[2]; + const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist); + const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist); + const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist); + let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist); + if (cos_in > 1) + cos_in = 1; + else if (cos_in < -1) + cos_in = -1; + let angleOfCurve = Math.acos(cos_in); + angleOfCurve = 57.2958 * angleOfCurve % 180; + let fingerCurl; + if (angleOfCurve > options.NO_CURL_START_LIMIT) + fingerCurl = FingerCurl.none; + else if (angleOfCurve > options.HALF_CURL_START_LIMIT) + fingerCurl = FingerCurl.half; + else + fingerCurl = FingerCurl.full; + return fingerCurl; +} +function estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) { + let estimatedDirection; + if (max_dist_x === Math.abs(start_end_x_dist)) { + if (start_end_x_dist > 0) + estimatedDirection = FingerDirection.horizontalLeft; + else + estimatedDirection = FingerDirection.horizontalRight; + } else if (max_dist_x === Math.abs(start_mid_x_dist)) { + if (start_mid_x_dist > 0) + estimatedDirection = FingerDirection.horizontalLeft; + else + estimatedDirection = FingerDirection.horizontalRight; + } else { + if (mid_end_x_dist > 0) + estimatedDirection = FingerDirection.horizontalLeft; + else + estimatedDirection = FingerDirection.horizontalRight; + } + return estimatedDirection; +} +function estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) { + let estimatedDirection; + if (max_dist_y === Math.abs(start_end_y_dist)) { + if (start_end_y_dist < 0) + estimatedDirection = FingerDirection.verticalDown; + else + estimatedDirection = FingerDirection.verticalUp; + } else if (max_dist_y === Math.abs(start_mid_y_dist)) { + if (start_mid_y_dist < 0) + estimatedDirection = FingerDirection.verticalDown; + else + estimatedDirection = FingerDirection.verticalUp; + } else { + if (mid_end_y_dist < 0) + estimatedDirection = FingerDirection.verticalDown; + else + estimatedDirection = FingerDirection.verticalUp; + } + return estimatedDirection; +} +function estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) { + let estimatedDirection; + const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y); + const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); + if (reqd_vertical_direction === FingerDirection.verticalUp) { + if (reqd_horizontal_direction === FingerDirection.horizontalLeft) + estimatedDirection = FingerDirection.diagonalUpLeft; + else + estimatedDirection = FingerDirection.diagonalUpRight; + } else { + if (reqd_horizontal_direction === FingerDirection.horizontalLeft) + estimatedDirection = FingerDirection.diagonalDownLeft; + else + estimatedDirection = FingerDirection.diagonalDownRight; + } + return estimatedDirection; +} +function calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) { + const start_mid_x_dist = startPoint[0] - midPoint[0]; + const start_end_x_dist = startPoint[0] - endPoint[0]; + const mid_end_x_dist = midPoint[0] - endPoint[0]; + const start_mid_y_dist = startPoint[1] - midPoint[1]; + const start_end_y_dist = startPoint[1] - endPoint[1]; + const mid_end_y_dist = midPoint[1] - endPoint[1]; + const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist)); + const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist)); + let voteVertical = 0; + let voteDiagonal = 0; + let voteHorizontal = 0; + const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 1e-5); + if (start_end_x_y_dist_ratio > 1.5) + voteVertical += options.DISTANCE_VOTE_POWER; + else if (start_end_x_y_dist_ratio > 0.66) + voteDiagonal += options.DISTANCE_VOTE_POWER; + else + voteHorizontal += options.DISTANCE_VOTE_POWER; + const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist); + const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist); + const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist); + const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist); + let calc_start_point_x = startPoint[0]; + let calc_start_point_y = startPoint[1]; + let calc_end_point_x = endPoint[0]; + let calc_end_point_y = endPoint[1]; + if (max_dist === start_mid_dist) { + calc_end_point_x = endPoint[0]; + calc_end_point_y = endPoint[1]; + } else if (max_dist === mid_end_dist) { + calc_start_point_x = midPoint[0]; + calc_start_point_y = midPoint[1]; + } + const calcStartPoint = [calc_start_point_x, calc_start_point_y]; + const calcEndPoint = [calc_end_point_x, calc_end_point_y]; + const totalAngle = getSlopes(calcStartPoint, calcEndPoint); + const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER); + voteVertical += votes[0]; + voteDiagonal += votes[1]; + voteHorizontal += votes[2]; + for (const fingerSlope of fingerSlopes) { + const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER); + voteVertical += fingerVotes[0]; + voteDiagonal += fingerVotes[1]; + voteHorizontal += fingerVotes[2]; + } + let estimatedDirection; + if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) { + estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y); + } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) { + estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); + } else { + estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); + } + return estimatedDirection; +} +function estimate(landmarks) { + const slopesXY = []; + const slopesYZ = []; + const fingerCurls = []; + const fingerDirections = []; + if (!landmarks) + return { curls: fingerCurls, directions: fingerDirections }; + for (const finger of Finger.all) { + const points = Finger.getPoints(finger); + const slopeAtXY = []; + const slopeAtYZ = []; + for (const point2 of points) { + const point1 = landmarks[point2[0]]; + const point22 = landmarks[point2[1]]; + const slopes = getSlopes(point1, point22); + const slopeXY = slopes[0]; + const slopeYZ = slopes[1]; + slopeAtXY.push(slopeXY); + slopeAtYZ.push(slopeYZ); + } + slopesXY.push(slopeAtXY); + slopesYZ.push(slopeAtYZ); + } + for (const finger of Finger.all) { + const pointIndexAt = finger === Finger.thumb ? 1 : 0; + const fingerPointsAt = Finger.getPoints(finger); + const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]]; + const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]]; + const endPoint = landmarks[fingerPointsAt[3][1]]; + const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint); + const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt)); + fingerCurls[finger] = fingerCurled; + fingerDirections[finger] = fingerPosition; + } + return { curls: fingerCurls, directions: fingerDirections }; +} + +// src/fingerpose/gesture.ts +var Gesture = class { + constructor(name) { + this.name = name; + this.curls = {}; + this.directions = {}; + this.weights = [1, 1, 1, 1, 1]; + this.weightsRelative = [1, 1, 1, 1, 1]; + } + addCurl(finger, curl, confidence) { + if (typeof this.curls[finger] === "undefined") + this.curls[finger] = []; + this.curls[finger].push([curl, confidence]); + } + addDirection(finger, position, confidence) { + if (!this.directions[finger]) + this.directions[finger] = []; + this.directions[finger].push([position, confidence]); + } + setWeight(finger, weight) { + this.weights[finger] = weight; + const total = this.weights.reduce((a, b) => a + b, 0); + this.weightsRelative = this.weights.map((el) => el * 5 / total); + } + matchAgainst(detectedCurls, detectedDirections) { + let confidence = 0; + for (const fingerIdx in detectedCurls) { + const detectedCurl = detectedCurls[fingerIdx]; + const expectedCurls = this.curls[fingerIdx]; + if (typeof expectedCurls === "undefined") { + confidence += this.weightsRelative[fingerIdx]; + continue; + } + for (const [expectedCurl, score3] of expectedCurls) { + if (detectedCurl === expectedCurl) { + confidence += score3 * this.weightsRelative[fingerIdx]; + break; + } + } + } + for (const fingerIdx in detectedDirections) { + const detectedDirection = detectedDirections[fingerIdx]; + const expectedDirections = this.directions[fingerIdx]; + if (typeof expectedDirections === "undefined") { + confidence += this.weightsRelative[fingerIdx]; + continue; + } + for (const [expectedDirection, score3] of expectedDirections) { + if (detectedDirection === expectedDirection) { + confidence += score3 * this.weightsRelative[fingerIdx]; + break; + } + } + } + return confidence / 10; + } +}; + +// src/fingerpose/gestures.ts +var ThumbsUp = new Gesture("thumbs up"); +ThumbsUp.addCurl(Finger.thumb, FingerCurl.none, 1); +ThumbsUp.addDirection(Finger.thumb, FingerDirection.verticalUp, 1); +ThumbsUp.addDirection(Finger.thumb, FingerDirection.diagonalUpLeft, 0.25); +ThumbsUp.addDirection(Finger.thumb, FingerDirection.diagonalUpRight, 0.25); +for (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) { + ThumbsUp.addCurl(finger, FingerCurl.full, 1); + ThumbsUp.addDirection(finger, FingerDirection.horizontalLeft, 1); + ThumbsUp.addDirection(finger, FingerDirection.horizontalRight, 1); +} +var Victory = new Gesture("victory"); +Victory.addCurl(Finger.thumb, FingerCurl.half, 0.5); +Victory.addCurl(Finger.thumb, FingerCurl.none, 0.5); +Victory.addDirection(Finger.thumb, FingerDirection.verticalUp, 1); +Victory.addDirection(Finger.thumb, FingerDirection.diagonalUpLeft, 1); +Victory.addCurl(Finger.index, FingerCurl.none, 1); +Victory.addDirection(Finger.index, FingerDirection.verticalUp, 0.75); +Victory.addDirection(Finger.index, FingerDirection.diagonalUpLeft, 1); +Victory.addCurl(Finger.middle, FingerCurl.none, 1); +Victory.addDirection(Finger.middle, FingerDirection.verticalUp, 1); +Victory.addDirection(Finger.middle, FingerDirection.diagonalUpLeft, 0.75); +Victory.addCurl(Finger.ring, FingerCurl.full, 1); +Victory.addDirection(Finger.ring, FingerDirection.verticalUp, 0.2); +Victory.addDirection(Finger.ring, FingerDirection.diagonalUpLeft, 1); +Victory.addDirection(Finger.ring, FingerDirection.horizontalLeft, 0.2); +Victory.addCurl(Finger.pinky, FingerCurl.full, 1); +Victory.addDirection(Finger.pinky, FingerDirection.verticalUp, 0.2); +Victory.addDirection(Finger.pinky, FingerDirection.diagonalUpLeft, 1); +Victory.addDirection(Finger.pinky, FingerDirection.horizontalLeft, 0.2); +Victory.setWeight(Finger.index, 2); +Victory.setWeight(Finger.middle, 2); +var gestures_default = [ThumbsUp, Victory]; + +// src/fingerpose/fingerpose.ts +var minConfidence = 0.7; +function analyze(keypoints3) { + const estimatorRes = estimate(keypoints3); + const landmarks = {}; + for (const fingerIdx of Finger.all) { + landmarks[Finger.getName(fingerIdx)] = { + curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]), + direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]) + }; + } + return landmarks; +} +function match2(keypoints3) { + const estimatorRes = estimate(keypoints3); + const poses2 = []; + for (const gesture3 of gestures_default) { + const confidence = gesture3.matchAgainst(estimatorRes.curls, estimatorRes.directions); + if (confidence >= minConfidence) + poses2.push({ name: gesture3.name, confidence }); + } + return poses2; +} + +// src/handpose/handpose.ts +var meshAnnotations = { + thumb: [1, 2, 3, 4], + index: [5, 6, 7, 8], + middle: [9, 10, 11, 12], + ring: [13, 14, 15, 16], + pinky: [17, 18, 19, 20], + palm: [0] +}; +var handDetectorModel; +var handPoseModel; +var handPipeline; +async function predict5(input, config3) { + const predictions = await handPipeline.estimateHands(input, config3); + if (!predictions) + return []; + const hands = []; + for (let i = 0; i < predictions.length; i++) { + const annotations3 = {}; + if (predictions[i].landmarks) { + for (const key of Object.keys(meshAnnotations)) { + annotations3[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]); + } + } + const keypoints3 = predictions[i].landmarks; + let box6 = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; + let boxRaw3 = [0, 0, 0, 0]; + if (keypoints3 && keypoints3.length > 0) { + for (const pt of keypoints3) { + if (pt[0] < box6[0]) + box6[0] = pt[0]; + if (pt[1] < box6[1]) + box6[1] = pt[1]; + if (pt[0] > box6[2]) + box6[2] = pt[0]; + if (pt[1] > box6[3]) + box6[3] = pt[1]; + } + box6[2] -= box6[0]; + box6[3] -= box6[1]; + boxRaw3 = [box6[0] / (input.shape[2] || 0), box6[1] / (input.shape[1] || 0), box6[2] / (input.shape[2] || 0), box6[3] / (input.shape[1] || 0)]; + } else { + box6 = predictions[i].box ? [ + Math.trunc(Math.max(0, predictions[i].box.topLeft[0])), + Math.trunc(Math.max(0, predictions[i].box.topLeft[1])), + Math.trunc(Math.min(input.shape[2] || 0, predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])), + Math.trunc(Math.min(input.shape[1] || 0, predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])) + ] : [0, 0, 0, 0]; + boxRaw3 = [ + predictions[i].box.topLeft[0] / (input.shape[2] || 0), + predictions[i].box.topLeft[1] / (input.shape[1] || 0), + (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0), + (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0) + ]; + } + const landmarks = analyze(keypoints3); + hands.push({ + id: i, + score: Math.round(100 * predictions[i].confidence) / 100, + box: box6, + boxRaw: boxRaw3, + keypoints: keypoints3, + annotations: annotations3, + landmarks + }); + } + return hands; +} +async function load6(config3) { + if (!handDetectorModel || !handPoseModel) { + [handDetectorModel, handPoseModel] = await Promise.all([ + config3.hand.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.hand.detector.modelPath), { fromTFHub: config3.hand.detector.modelPath.includes("tfhub.dev") }) : null, + config3.hand.landmarks ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.hand.skeleton.modelPath), { fromTFHub: config3.hand.skeleton.modelPath.includes("tfhub.dev") }) : null + ]); + if (config3.hand.enabled) { + if (!handDetectorModel || !handDetectorModel["modelUrl"]) + log("load model failed:", config3.hand.detector.modelPath); + else if (config3.debug) + log("load model:", handDetectorModel["modelUrl"]); + if (!handPoseModel || !handPoseModel["modelUrl"]) + log("load model failed:", config3.hand.skeleton.modelPath); + else if (config3.debug) + log("load model:", handPoseModel["modelUrl"]); + } + } else { + if (config3.debug) + log("cached model:", handDetectorModel["modelUrl"]); + if (config3.debug) + log("cached model:", handPoseModel["modelUrl"]); + } + const handDetector = new HandDetector(handDetectorModel); + handPipeline = new HandPipeline(handDetector, handPoseModel); + return [handDetectorModel, handPoseModel]; +} + +// src/blazepose/annotations.ts +var full = [ + "nose", + "leftEyeInside", + "leftEye", + "leftEyeOutside", + "rightEyeInside", + "rightEye", + "rightEyeOutside", + "leftEar", + "rightEar", + "leftMouth", + "rightMouth", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "leftWrist", + "rightWrist", + "leftPalm", + "rightPalm", + "leftIndex", + "rightIndex", + "leftPinky", + "rightPinky", + "leftHip", + "rightHip", + "leftKnee", + "rightKnee", + "leftAnkle", + "rightAnkle", + "leftHeel", + "rightHeel", + "leftFoot", + "rightFoot", + "midHip", + "forehead", + "leftThumb", + "leftHand", + "rightThumb", + "rightHand" +]; +var upper = [ + "nose", + "leftEyeInside", + "leftEye", + "leftEyeOutside", + "rightEyeInside", + "rightEye", + "rightEyeOutside", + "leftEar", + "rightEar", + "leftMouth", + "rightMouth", + "leftShoulder", + "rightShoulder", + "leftElbow", + "rightElbow", + "left:15", + "right:16", + "left:17", + "right:18", + "left:19", + "right:20", + "left:21", + "right:22", + "leftChest", + "rightChest", + "neck", + "forehead", + "left:27", + "right:28", + "left:29", + "right:30" +]; + +// src/blazepose/blazepose.ts +var model4; +async function load7(config3) { + if (!model4) { + model4 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + model4["width"] = parseInt(model4["signature"].inputs["input_1:0"].tensorShape.dim[2].size); + model4["height"] = parseInt(model4["signature"].inputs["input_1:0"].tensorShape.dim[1].size); + if (!model4 || !model4["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model4["modelUrl"]); + } else if (config3.debug) + log("cached model:", model4["modelUrl"]); + return model4; +} +async function predict6(image18, config3) { + if (!model4) + return []; + if (!config3.body.enabled) + return []; + const imgSize = { width: image18.shape[2] || 0, height: image18.shape[1] || 0 }; + const resize = tfjs_esm_exports.image.resizeBilinear(image18, [model4["width"], model4["height"]], false); + const normalize = tfjs_esm_exports.div(resize, [255]); + tfjs_esm_exports.dispose(resize); + const resT = await model4.predict(normalize); + const findT = resT.find((t) => t.size === 195 || t.size === 155); + const points = await (findT == null ? void 0 : findT.data()) || []; + resT.forEach((t) => tfjs_esm_exports.dispose(t)); + tfjs_esm_exports.dispose(normalize); + const keypoints3 = []; + const labels2 = (points == null ? void 0 : points.length) === 195 ? full : upper; + const depth = 5; + for (let i = 0; i < points.length / depth; i++) { + keypoints3.push({ + id: i, + part: labels2[i], + position: [ + Math.trunc(imgSize.width * points[depth * i + 0] / 255), + Math.trunc(imgSize.height * points[depth * i + 1] / 255), + Math.trunc(points[depth * i + 2]) + 0 + ], + positionRaw: [ + points[depth * i + 0] / 255, + points[depth * i + 1] / 255, + points[depth * i + 2] + 0 + ], + score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, + presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100 + }); + } + const x = keypoints3.map((a) => a.position[0]); + const y = keypoints3.map((a) => a.position[1]); + const box6 = [ + Math.min(...x), + Math.min(...y), + Math.max(...x) - Math.min(...x), + Math.max(...y) - Math.min(...x) + ]; + const boxRaw3 = [0, 0, 0, 0]; + const score3 = keypoints3.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + return [{ id: 0, score: score3, box: box6, boxRaw: boxRaw3, keypoints: keypoints3 }]; +} + +// src/efficientpose/efficientpose.ts +var model5; +var keypoints = []; +var box4 = [0, 0, 0, 0]; +var boxRaw = [0, 0, 0, 0]; +var score = 0; +var skipped3 = Number.MAX_SAFE_INTEGER; +var bodyParts = ["head", "neck", "rightShoulder", "rightElbow", "rightWrist", "chest", "leftShoulder", "leftElbow", "leftWrist", "pelvis", "rightHip", "rightKnee", "rightAnkle", "leftHip", "leftKnee", "leftAnkle"]; +async function load8(config3) { + if (!model5) { + model5 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + if (!model5 || !model5["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model5["modelUrl"]); + } else if (config3.debug) + log("cached model:", model5["modelUrl"]); + return model5; +} +function max2d(inputs, minScore) { + const [width, height] = inputs.shape; + return tfjs_esm_exports.tidy(() => { + const mod = (a, b) => tfjs_esm_exports.sub(a, tfjs_esm_exports.mul(tfjs_esm_exports.div(a, tfjs_esm_exports.scalar(b, "int32")), tfjs_esm_exports.scalar(b, "int32"))); + const reshaped = tfjs_esm_exports.reshape(inputs, [height * width]); + const newScore = tfjs_esm_exports.max(reshaped, 0).dataSync()[0]; + if (newScore > minScore) { + const coords3 = tfjs_esm_exports.argMax(reshaped, 0); + const x = mod(coords3, width).dataSync()[0]; + const y = tfjs_esm_exports.div(coords3, tfjs_esm_exports.scalar(width, "int32")).dataSync()[0]; + return [x, y, newScore]; + } + return [0, 0, newScore]; + }); +} +async function predict7(image18, config3) { + if (skipped3 < config3.body.skipFrames && config3.skipFrame && Object.keys(keypoints).length > 0) { + skipped3++; + return [{ id: 0, score, box: box4, boxRaw, keypoints }]; + } + skipped3 = 0; + return new Promise(async (resolve) => { + const tensor2 = tfjs_esm_exports.tidy(() => { + if (!model5.inputs[0].shape) + return null; + const resize = tfjs_esm_exports.image.resizeBilinear(image18, [model5.inputs[0].shape[2], model5.inputs[0].shape[1]], false); + const enhance2 = tfjs_esm_exports.mul(resize, 2); + const norm = enhance2.sub(1); + return norm; + }); + let resT; + if (config3.body.enabled) + resT = await model5.predict(tensor2); + tfjs_esm_exports.dispose(tensor2); + if (resT) { + keypoints.length = 0; + const squeeze7 = resT.squeeze(); + tfjs_esm_exports.dispose(resT); + const stack2 = squeeze7.unstack(2); + tfjs_esm_exports.dispose(squeeze7); + for (let id = 0; id < stack2.length; id++) { + const [x2, y2, partScore] = max2d(stack2[id], config3.body.minConfidence); + if (score > config3.body.minConfidence) { + keypoints.push({ + score: Math.round(100 * partScore) / 100, + part: bodyParts[id], + positionRaw: [ + x2 / model5.inputs[0].shape[2], + y2 / model5.inputs[0].shape[1] + ], + position: [ + Math.round(image18.shape[2] * x2 / model5.inputs[0].shape[2]), + Math.round(image18.shape[1] * y2 / model5.inputs[0].shape[1]) + ] + }); + } + } + stack2.forEach((s) => tfjs_esm_exports.dispose(s)); + } + score = keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + const x = keypoints.map((a) => a.position[0]); + const y = keypoints.map((a) => a.position[1]); + box4 = [ + Math.min(...x), + Math.min(...y), + Math.max(...x) - Math.min(...x), + Math.max(...y) - Math.min(...y) + ]; + const xRaw = keypoints.map((a) => a.positionRaw[0]); + const yRaw = keypoints.map((a) => a.positionRaw[1]); + boxRaw = [ + Math.min(...xRaw), + Math.min(...yRaw), + Math.max(...xRaw) - Math.min(...xRaw), + Math.max(...yRaw) - Math.min(...yRaw) + ]; + resolve([{ id: 0, score, box: box4, boxRaw, keypoints }]); + }); +} + +// src/movenet/movenet.ts +var model6; +var keypoints2 = []; +var box5 = [0, 0, 0, 0]; +var boxRaw2 = [0, 0, 0, 0]; +var score2 = 0; +var skipped4 = Number.MAX_SAFE_INTEGER; +var bodyParts2 = ["nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle"]; +async function load9(config3) { + if (!model6) { + model6 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); + if (!model6 || !model6["modelUrl"]) + log("load model failed:", config3.body.modelPath); + else if (config3.debug) + log("load model:", model6["modelUrl"]); + } else if (config3.debug) + log("cached model:", model6["modelUrl"]); + return model6; +} +async function parseSinglePose(res, config3, image18) { + keypoints2.length = 0; + const kpt3 = res[0][0]; + for (let id = 0; id < kpt3.length; id++) { + score2 = kpt3[id][2]; + if (score2 > config3.body.minConfidence) { + keypoints2.push({ + score: Math.round(100 * score2) / 100, + part: bodyParts2[id], + positionRaw: [ + kpt3[id][1], + kpt3[id][0] + ], + position: [ + Math.round((image18.shape[2] || 0) * kpt3[id][1]), + Math.round((image18.shape[1] || 0) * kpt3[id][0]) + ] + }); + } + } + score2 = keypoints2.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); + const x = keypoints2.map((a) => a.position[0]); + const y = keypoints2.map((a) => a.position[1]); + box5 = [ + Math.min(...x), + Math.min(...y), + Math.max(...x) - Math.min(...x), + Math.max(...y) - Math.min(...y) + ]; + const xRaw = keypoints2.map((a) => a.positionRaw[0]); + const yRaw = keypoints2.map((a) => a.positionRaw[1]); + boxRaw2 = [ + Math.min(...xRaw), + Math.min(...yRaw), + Math.max(...xRaw) - Math.min(...xRaw), + Math.max(...yRaw) - Math.min(...yRaw) + ]; + const persons2 = []; + persons2.push({ id: 0, score: score2, box: box5, boxRaw: boxRaw2, keypoints: keypoints2 }); + return persons2; +} +async function parseMultiPose(res, config3, image18) { + const persons2 = []; + for (let p = 0; p < res[0].length; p++) { + const kpt3 = res[0][p]; + score2 = Math.round(100 * kpt3[51 + 4]) / 100; + if (score2 < config3.body.minConfidence) + continue; + keypoints2.length = 0; + for (let i = 0; i < 17; i++) { + const partScore = Math.round(100 * kpt3[3 * i + 2]) / 100; + if (partScore > config3.body.minConfidence) { + keypoints2.push({ + part: bodyParts2[i], + score: partScore, + positionRaw: [ + kpt3[3 * i + 1], + kpt3[3 * i + 0] + ], + position: [ + Math.trunc(kpt3[3 * i + 1] * (image18.shape[2] || 0)), + Math.trunc(kpt3[3 * i + 0] * (image18.shape[1] || 0)) + ] + }); + } + } + boxRaw2 = [kpt3[51 + 1], kpt3[51 + 0], kpt3[51 + 3] - kpt3[51 + 1], kpt3[51 + 2] - kpt3[51 + 0]]; + persons2.push({ + id: p, + score: score2, + boxRaw: boxRaw2, + box: [ + Math.trunc(boxRaw2[0] * (image18.shape[2] || 0)), + Math.trunc(boxRaw2[1] * (image18.shape[1] || 0)), + Math.trunc(boxRaw2[2] * (image18.shape[2] || 0)), + Math.trunc(boxRaw2[3] * (image18.shape[1] || 0)) + ], + keypoints: keypoints2 + }); + } + return persons2; +} +async function predict8(image18, config3) { + if (skipped4 < config3.body.skipFrames && config3.skipFrame && Object.keys(keypoints2).length > 0) { + skipped4++; + return [{ id: 0, score: score2, box: box5, boxRaw: boxRaw2, keypoints: keypoints2 }]; + } + skipped4 = 0; + return new Promise(async (resolve) => { + const tensor2 = tfjs_esm_exports.tidy(() => { + if (!model6.inputs[0].shape) + return null; + let inputSize = model6.inputs[0].shape[2]; + if (inputSize === -1) + inputSize = 256; + const resize = tfjs_esm_exports.image.resizeBilinear(image18, [inputSize, inputSize], false); + const cast4 = tfjs_esm_exports.cast(resize, "int32"); + return cast4; + }); + let resT; + if (config3.body.enabled) + resT = await model6.predict(tensor2); + tfjs_esm_exports.dispose(tensor2); + if (!resT) + resolve([]); + const res = await resT.array(); + let persons2; + if (resT.shape[2] === 17) + persons2 = await parseSinglePose(res, config3, image18); + else if (resT.shape[2] === 56) + persons2 = await parseMultiPose(res, config3, image18); + tfjs_esm_exports.dispose(resT); + resolve(persons2); + }); +} + +// src/object/labels.ts +var labels = [ + { class: 1, label: "person" }, + { class: 2, label: "bicycle" }, + { class: 3, label: "car" }, + { class: 4, label: "motorcycle" }, + { class: 5, label: "airplane" }, + { class: 6, label: "bus" }, + { class: 7, label: "train" }, + { class: 8, label: "truck" }, + { class: 9, label: "boat" }, + { class: 10, label: "traffic light" }, + { class: 11, label: "fire hydrant" }, + { class: 12, label: "stop sign" }, + { class: 13, label: "parking meter" }, + { class: 14, label: "bench" }, + { class: 15, label: "bird" }, + { class: 16, label: "cat" }, + { class: 17, label: "dog" }, + { class: 18, label: "horse" }, + { class: 19, label: "sheep" }, + { class: 20, label: "cow" }, + { class: 21, label: "elephant" }, + { class: 22, label: "bear" }, + { class: 23, label: "zebra" }, + { class: 24, label: "giraffe" }, + { class: 25, label: "backpack" }, + { class: 26, label: "umbrella" }, + { class: 27, label: "handbag" }, + { class: 28, label: "tie" }, + { class: 29, label: "suitcase" }, + { class: 30, label: "frisbee" }, + { class: 31, label: "skis" }, + { class: 32, label: "snowboard" }, + { class: 33, label: "sports ball" }, + { class: 34, label: "kite" }, + { class: 35, label: "baseball bat" }, + { class: 36, label: "baseball glove" }, + { class: 37, label: "skateboard" }, + { class: 38, label: "surfboard" }, + { class: 39, label: "tennis racket" }, + { class: 40, label: "bottle" }, + { class: 41, label: "wine glass" }, + { class: 42, label: "cup" }, + { class: 43, label: "fork" }, + { class: 44, label: "knife" }, + { class: 45, label: "spoon" }, + { class: 46, label: "bowl" }, + { class: 47, label: "banana" }, + { class: 48, label: "apple" }, + { class: 49, label: "sandwich" }, + { class: 50, label: "orange" }, + { class: 51, label: "broccoli" }, + { class: 52, label: "carrot" }, + { class: 53, label: "hot dog" }, + { class: 54, label: "pizza" }, + { class: 55, label: "donut" }, + { class: 56, label: "cake" }, + { class: 57, label: "chair" }, + { class: 58, label: "couch" }, + { class: 59, label: "potted plant" }, + { class: 60, label: "bed" }, + { class: 61, label: "dining table" }, + { class: 62, label: "toilet" }, + { class: 63, label: "tv" }, + { class: 64, label: "laptop" }, + { class: 65, label: "mouse" }, + { class: 66, label: "remote" }, + { class: 67, label: "keyboard" }, + { class: 68, label: "cell phone" }, + { class: 69, label: "microwave" }, + { class: 70, label: "oven" }, + { class: 71, label: "toaster" }, + { class: 72, label: "sink" }, + { class: 73, label: "refrigerator" }, + { class: 74, label: "book" }, + { class: 75, label: "clock" }, + { class: 76, label: "vase" }, + { class: 77, label: "scissors" }, + { class: 78, label: "teddy bear" }, + { class: 79, label: "hair drier" }, + { class: 80, label: "toothbrush" } +]; + +// src/object/nanodet.ts +var model7; +var last3 = []; +var skipped5 = Number.MAX_SAFE_INTEGER; +var scaleBox = 2.5; +async function load10(config3) { + if (!model7) { + model7 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); + const inputs = Object.values(model7.modelSignature["inputs"]); + model7.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; + if (!model7.inputSize) + throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); + if (!model7 || !model7.modelUrl) + log("load model failed:", config3.object.modelPath); + else if (config3.debug) + log("load model:", model7.modelUrl); + } else if (config3.debug) + log("cached model:", model7.modelUrl); + return model7; +} +async function process2(res, inputSize, outputShape, config3) { + let id = 0; + let results = []; + for (const strideSize of [1, 2, 4]) { + tfjs_esm_exports.tidy(async () => { + var _a, _b; + const baseSize = strideSize * 13; + const scoresT = (_a = res.find((a) => a.shape[1] === baseSize ** 2 && a.shape[2] === labels.length)) == null ? void 0 : _a.squeeze(); + const featuresT = (_b = res.find((a) => a.shape[1] === baseSize ** 2 && a.shape[2] < labels.length)) == null ? void 0 : _b.squeeze(); + const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); + const boxIdx = await boxesMax.argMax(2).array(); + const scores = await scoresT.array(); + for (let i = 0; i < scoresT.shape[0]; i++) { + for (let j = 0; j < scoresT.shape[1]; j++) { + const score3 = scores[i][j]; + if (score3 > config3.object.minConfidence && j !== 61) { + const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; + const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; + const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); + const [x, y] = [ + cx - scaleBox / strideSize * boxOffset[0], + cy - scaleBox / strideSize * boxOffset[1] + ]; + const [w, h] = [ + cx + scaleBox / strideSize * boxOffset[2] - x, + cy + scaleBox / strideSize * boxOffset[3] - y + ]; + let boxRaw3 = [x, y, w, h]; + boxRaw3 = boxRaw3.map((a) => Math.max(0, Math.min(a, 1))); + const box6 = [ + boxRaw3[0] * outputShape[0], + boxRaw3[1] * outputShape[1], + boxRaw3[2] * outputShape[0], + boxRaw3[3] * outputShape[1] + ]; + const result = { + id: id++, + score: Math.round(100 * score3) / 100, + class: j + 1, + label: labels[j].label, + box: box6.map((a) => Math.trunc(a)), + boxRaw: boxRaw3 + }; + results.push(result); + } + } + } + }); + } + res.forEach((t) => tfjs_esm_exports.dispose(t)); + const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); + const nmsScores = results.map((a) => a.score); + let nmsIdx = []; + if (nmsBoxes && nmsBoxes.length > 0) { + const nms = await tfjs_esm_exports.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); + nmsIdx = await nms.data(); + tfjs_esm_exports.dispose(nms); + } + results = results.filter((_val, idx) => nmsIdx.includes(idx)).sort((a, b) => b.score - a.score); + return results; +} +async function predict9(image18, config3) { + if (skipped5 < config3.object.skipFrames && config3.skipFrame && last3.length > 0) { + skipped5++; + return last3; + } + skipped5 = 0; + return new Promise(async (resolve) => { + const outputSize = [image18.shape[2], image18.shape[1]]; + const resize = tfjs_esm_exports.image.resizeBilinear(image18, [model7.inputSize, model7.inputSize], false); + const norm = tfjs_esm_exports.div(resize, 255); + const transpose = norm.transpose([0, 3, 1, 2]); + tfjs_esm_exports.dispose(norm); + tfjs_esm_exports.dispose(resize); + let objectT; + if (config3.object.enabled) + objectT = await model7.predict(transpose); + tfjs_esm_exports.dispose(transpose); + const obj = await process2(objectT, model7.inputSize, outputSize, config3); + last3 = obj; + resolve(obj); + }); +} + +// src/object/centernet.ts +var model8; +var last4 = []; +var skipped6 = Number.MAX_SAFE_INTEGER; +async function load11(config3) { + if (!model8) { + model8 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); + const inputs = Object.values(model8.modelSignature["inputs"]); + model8.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; + if (!model8.inputSize) + throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); + if (!model8 || !model8.modelUrl) + log("load model failed:", config3.object.modelPath); + else if (config3.debug) + log("load model:", model8.modelUrl); + } else if (config3.debug) + log("cached model:", model8.modelUrl); + return model8; +} +async function process3(res, inputSize, outputShape, config3) { + if (!res) + return []; + const results = []; + const detections = await res.array(); + const squeezeT = tfjs_esm_exports.squeeze(res); + tfjs_esm_exports.dispose(res); + const arr = tfjs_esm_exports.split(squeezeT, 6, 1); + tfjs_esm_exports.dispose(squeezeT); + const stackT = tfjs_esm_exports.stack([arr[1], arr[0], arr[3], arr[2]], 1); + const boxesT = tfjs_esm_exports.squeeze(stackT); + const scoresT = tfjs_esm_exports.squeeze(arr[4]); + const classesT = tfjs_esm_exports.squeeze(arr[5]); + arr.forEach((t) => tfjs_esm_exports.dispose(t)); + const nmsT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxesT, scoresT, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); + tfjs_esm_exports.dispose(boxesT); + tfjs_esm_exports.dispose(scoresT); + tfjs_esm_exports.dispose(classesT); + const nms = await nmsT.data(); + tfjs_esm_exports.dispose(nmsT); + let i = 0; + for (const id of nms) { + const score3 = Math.trunc(100 * detections[0][id][4]) / 100; + const classVal = detections[0][id][5]; + const label = labels[classVal].label; + const [x, y] = [ + detections[0][id][0] / inputSize, + detections[0][id][1] / inputSize + ]; + const boxRaw3 = [ + x, + y, + detections[0][id][2] / inputSize - x, + detections[0][id][3] / inputSize - y + ]; + const box6 = [ + Math.trunc(boxRaw3[0] * outputShape[0]), + Math.trunc(boxRaw3[1] * outputShape[1]), + Math.trunc(boxRaw3[2] * outputShape[0]), + Math.trunc(boxRaw3[3] * outputShape[1]) + ]; + results.push({ id: i++, score: score3, class: classVal, label, box: box6, boxRaw: boxRaw3 }); + } + return results; +} +async function predict10(input, config3) { + if (skipped6 < config3.object.skipFrames && config3.skipFrame && last4.length > 0) { + skipped6++; + return last4; + } + skipped6 = 0; + return new Promise(async (resolve) => { + const outputSize = [input.shape[2], input.shape[1]]; + const resize = tfjs_esm_exports.image.resizeBilinear(input, [model8.inputSize, model8.inputSize]); + const objectT = config3.object.enabled ? model8.execute(resize, ["tower_0/detections"]) : null; + tfjs_esm_exports.dispose(resize); + const obj = await process3(objectT, model8.inputSize, outputSize, config3); + last4 = obj; + resolve(obj); + }); +} + +// src/image/imagefx.js +function GLProgram(gl, vertexSource, fragmentSource) { + const _collect = function(source, prefix, collection) { + const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); + source.replace(r, (match3, name) => { + collection[name] = 0; + return match3; + }); + }; + const _compile = function(source, type) { + const shader = gl.createShader(type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) + throw new Error("Filter: GL compile failed", gl.getShaderInfoLog(shader)); + return shader; + }; + this.uniform = {}; + this.attribute = {}; + const _vsh = _compile(vertexSource, gl.VERTEX_SHADER); + const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER); + this.id = gl.createProgram(); + gl.attachShader(this.id, _vsh); + gl.attachShader(this.id, _fsh); + gl.linkProgram(this.id); + if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) + throw new Error("Filter: GL link failed", gl.getProgramInfoLog(this.id)); + gl.useProgram(this.id); + _collect(vertexSource, "attribute", this.attribute); + for (const a in this.attribute) + this.attribute[a] = gl.getAttribLocation(this.id, a); + _collect(vertexSource, "uniform", this.uniform); + _collect(fragmentSource, "uniform", this.uniform); + for (const u in this.uniform) + this.uniform[u] = gl.getUniformLocation(this.id, u); +} +function GLImageFilter(params) { + if (!params) + params = {}; + let _drawCount = 0; + let _sourceTexture = null; + let _lastInChain = false; + let _currentFramebufferIndex = -1; + let _tempFramebuffers = [null, null]; + let _filterChain = []; + let _width = -1; + let _height = -1; + let _vertexBuffer = null; + let _currentProgram = null; + const _filter = {}; + const _canvas = params.canvas || document.createElement("canvas"); + const _shaderProgramCache = {}; + const DRAW = { INTERMEDIATE: 1 }; + const gl = _canvas.getContext("webgl"); + if (!gl) + throw new Error("Filter: getContext() failed"); + this.addFilter = function(name) { + const args = Array.prototype.slice.call(arguments, 1); + const filter = _filter[name]; + _filterChain.push({ func: filter, args }); + }; + this.reset = function() { + _filterChain = []; + }; + const _resize = function(width, height) { + if (width === _width && height === _height) { + return; + } + _canvas.width = width; + _width = width; + _canvas.height = height; + _height = height; + if (!_vertexBuffer) { + const vertices = new Float32Array([ + -1, + -1, + 0, + 1, + 1, + -1, + 1, + 1, + -1, + 1, + 0, + 0, + -1, + 1, + 0, + 0, + 1, + -1, + 1, + 1, + 1, + 1, + 1, + 0 + ]); + _vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + } + gl.viewport(0, 0, _width, _height); + _tempFramebuffers = [null, null]; + }; + const _createFramebufferTexture = function(width, height) { + const fbo = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); + const renderbuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + 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); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + return { fbo, texture }; + }; + const _getTempFramebuffer = function(index) { + _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height); + return _tempFramebuffers[index]; + }; + const _draw = function(flags = null) { + var _a, _b; + let source = null; + let target = null; + let flipY = false; + if (_drawCount === 0) { + source = _sourceTexture; + } else { + source = (_a = _getTempFramebuffer(_currentFramebufferIndex)) == null ? void 0 : _a.texture; + } + _drawCount++; + if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) { + target = null; + flipY = _drawCount % 2 === 0; + } else { + _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2; + target = (_b = _getTempFramebuffer(_currentFramebufferIndex)) == null ? void 0 : _b.fbo; + } + gl.bindTexture(gl.TEXTURE_2D, source); + gl.bindFramebuffer(gl.FRAMEBUFFER, target); + gl.uniform1f(_currentProgram.uniform.flipY, flipY ? -1 : 1); + gl.drawArrays(gl.TRIANGLES, 0, 6); + }; + this.apply = function(image18) { + _resize(image18.width, image18.height); + _drawCount = 0; + if (!_sourceTexture) + _sourceTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, _sourceTexture); + 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); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image18); + if (_filterChain.length === 0) { + _draw(); + return _canvas; + } + for (let i = 0; i < _filterChain.length; i++) { + _lastInChain = i === _filterChain.length - 1; + const f = _filterChain[i]; + f.func.apply(this, f.args || []); + } + return _canvas; + }; + const _compileShader = function(fragmentSource) { + if (_shaderProgramCache[fragmentSource]) { + _currentProgram = _shaderProgramCache[fragmentSource]; + gl.useProgram(_currentProgram.id); + return _currentProgram; + } + const SHADER = {}; + SHADER.VERTEX_IDENTITY = [ + "precision highp float;", + "attribute vec2 pos;", + "attribute vec2 uv;", + "varying vec2 vUv;", + "uniform float flipY;", + "void main(void) {", + "vUv = uv;", + "gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);", + "}" + ].join("\n"); + SHADER.FRAGMENT_IDENTITY = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "void main(void) {", + "gl_FragColor = texture2D(texture, vUv);", + "}" + ].join("\n"); + _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource); + const floatSize = Float32Array.BYTES_PER_ELEMENT; + const vertSize = 4 * floatSize; + gl.enableVertexAttribArray(_currentProgram.attribute.pos); + gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize); + gl.enableVertexAttribArray(_currentProgram.attribute.uv); + gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize); + _shaderProgramCache[fragmentSource] = _currentProgram; + return _currentProgram; + }; + _filter.colorMatrix = function(matrix) { + const m = new Float32Array(matrix); + m[4] /= 255; + m[9] /= 255; + m[14] /= 255; + m[19] /= 255; + const shader = m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0 ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA : _filter.colorMatrix.SHADER.WITH_ALPHA; + const program = _compileShader(shader); + gl.uniform1fv(program.uniform.m, m); + _draw(); + }; + _filter.colorMatrix.SHADER = {}; + _filter.colorMatrix.SHADER.WITH_ALPHA = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform float m[20];", + "void main(void) {", + "vec4 c = texture2D(texture, vUv);", + "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];", + "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];", + "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];", + "gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];", + "}" + ].join("\n"); + _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform float m[20];", + "void main(void) {", + "vec4 c = texture2D(texture, vUv);", + "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];", + "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];", + "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];", + "gl_FragColor.a = c.a;", + "}" + ].join("\n"); + _filter.brightness = function(brightness) { + const b = (brightness || 0) + 1; + _filter.colorMatrix([ + b, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + b, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.saturation = function(amount) { + const x = (amount || 0) * 2 / 3 + 1; + const y = (x - 1) * -0.5; + _filter.colorMatrix([ + x, + y, + y, + 0, + 0, + y, + x, + y, + 0, + 0, + y, + y, + x, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.desaturate = function() { + _filter.saturation(-1); + }; + _filter.contrast = function(amount) { + const v = (amount || 0) + 1; + const o = -128 * (v - 1); + _filter.colorMatrix([ + v, + 0, + 0, + 0, + o, + 0, + v, + 0, + 0, + o, + 0, + 0, + v, + 0, + o, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.negative = function() { + _filter.contrast(-2); + }; + _filter.hue = function(rotation) { + rotation = (rotation || 0) / 180 * Math.PI; + const cos = Math.cos(rotation); + const sin = Math.sin(rotation); + const lumR = 0.213; + const lumG = 0.715; + const lumB = 0.072; + _filter.colorMatrix([ + lumR + cos * (1 - lumR) + sin * -lumR, + lumG + cos * -lumG + sin * -lumG, + lumB + cos * -lumB + sin * (1 - lumB), + 0, + 0, + lumR + cos * -lumR + sin * 0.143, + lumG + cos * (1 - lumG) + sin * 0.14, + lumB + cos * -lumB + sin * -0.283, + 0, + 0, + lumR + cos * -lumR + sin * -(1 - lumR), + lumG + cos * -lumG + sin * lumG, + lumB + cos * (1 - lumB) + sin * lumB, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.desaturateLuminance = function() { + _filter.colorMatrix([ + 0.2764723, + 0.929708, + 0.0938197, + 0, + -37.1, + 0.2764723, + 0.929708, + 0.0938197, + 0, + -37.1, + 0.2764723, + 0.929708, + 0.0938197, + 0, + -37.1, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.sepia = function() { + _filter.colorMatrix([ + 0.393, + 0.7689999, + 0.18899999, + 0, + 0, + 0.349, + 0.6859999, + 0.16799999, + 0, + 0, + 0.272, + 0.5339999, + 0.13099999, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.brownie = function() { + _filter.colorMatrix([ + 0.5997023498159715, + 0.34553243048391263, + -0.2708298674538042, + 0, + 47.43192855600873, + -0.037703249837783157, + 0.8609577587992641, + 0.15059552388459913, + 0, + -36.96841498319127, + 0.24113635128153335, + -0.07441037908422492, + 0.44972182064877153, + 0, + -7.562075277591283, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.vintagePinhole = function() { + _filter.colorMatrix([ + 0.6279345635605994, + 0.3202183420819367, + -0.03965408211312453, + 0, + 9.651285835294123, + 0.02578397704808868, + 0.6441188644374771, + 0.03259127616149294, + 0, + 7.462829176470591, + 0.0466055556782719, + -0.0851232987247891, + 0.5241648018700465, + 0, + 5.159190588235296, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.kodachrome = function() { + _filter.colorMatrix([ + 1.1285582396593525, + -0.3967382283601348, + -0.03992559172921793, + 0, + 63.72958762196502, + -0.16404339962244616, + 1.0835251566291304, + -0.05498805115633132, + 0, + 24.732407896706203, + -0.16786010706155763, + -0.5603416277695248, + 1.6014850761964943, + 0, + 35.62982807460946, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.technicolor = function() { + _filter.colorMatrix([ + 1.9125277891456083, + -0.8545344976951645, + -0.09155508482755585, + 0, + 11.793603434377337, + -0.3087833385928097, + 1.7658908555458428, + -0.10601743074722245, + 0, + -70.35205161461398, + -0.231103377548616, + -0.7501899197440212, + 1.847597816108189, + 0, + 30.950940869491138, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.polaroid = function() { + _filter.colorMatrix([ + 1.438, + -0.062, + -0.062, + 0, + 0, + -0.122, + 1.378, + -0.122, + 0, + 0, + -0.016, + -0.016, + 1.483, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.shiftToBGR = function() { + _filter.colorMatrix([ + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + }; + _filter.convolution = function(matrix) { + const m = new Float32Array(matrix); + const pixelSizeX = 1 / _width; + const pixelSizeY = 1 / _height; + const program = _compileShader(_filter.convolution.SHADER); + gl.uniform1fv(program.uniform.m, m); + gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY); + _draw(); + }; + _filter.convolution.SHADER = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform vec2 px;", + "uniform float m[9];", + "void main(void) {", + "vec4 c11 = texture2D(texture, vUv - px);", + "vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));", + "vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));", + "vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );", + "vec4 c22 = texture2D(texture, vUv);", + "vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );", + "vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );", + "vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );", + "vec4 c33 = texture2D(texture, vUv + px );", + "gl_FragColor = ", + "c11 * m[0] + c12 * m[1] + c22 * m[2] +", + "c21 * m[3] + c22 * m[4] + c23 * m[5] +", + "c31 * m[6] + c32 * m[7] + c33 * m[8];", + "gl_FragColor.a = c22.a;", + "}" + ].join("\n"); + _filter.detectEdges = function() { + _filter.convolution.call(this, [ + 0, + 1, + 0, + 1, + -4, + 1, + 0, + 1, + 0 + ]); + }; + _filter.sobelX = function() { + _filter.convolution.call(this, [ + -1, + 0, + 1, + -2, + 0, + 2, + -1, + 0, + 1 + ]); + }; + _filter.sobelY = function() { + _filter.convolution.call(this, [ + -1, + -2, + -1, + 0, + 0, + 0, + 1, + 2, + 1 + ]); + }; + _filter.sharpen = function(amount) { + const a = amount || 1; + _filter.convolution.call(this, [ + 0, + -1 * a, + 0, + -1 * a, + 1 + 4 * a, + -1 * a, + 0, + -1 * a, + 0 + ]); + }; + _filter.emboss = function(size) { + const s = size || 1; + _filter.convolution.call(this, [ + -2 * s, + -1 * s, + 0, + -1 * s, + 1, + 1 * s, + 0, + 1 * s, + 2 * s + ]); + }; + _filter.blur = function(size) { + const blurSizeX = size / 7 / _width; + const blurSizeY = size / 7 / _height; + const program = _compileShader(_filter.blur.SHADER); + gl.uniform2f(program.uniform.px, 0, blurSizeY); + _draw(DRAW.INTERMEDIATE); + gl.uniform2f(program.uniform.px, blurSizeX, 0); + _draw(); + }; + _filter.blur.SHADER = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform sampler2D texture;", + "uniform vec2 px;", + "void main(void) {", + "gl_FragColor = vec4(0.0);", + "gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;", + "gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;", + "gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;", + "gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;", + "gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;", + "gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;", + "gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;", + "gl_FragColor += texture2D(texture, vUv )*0.159576912161;", + "gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;", + "gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;", + "gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;", + "gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;", + "gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;", + "gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;", + "gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;", + "}" + ].join("\n"); + _filter.pixelate = function(size) { + const blurSizeX = size / _width; + const blurSizeY = size / _height; + const program = _compileShader(_filter.pixelate.SHADER); + gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY); + _draw(); + }; + _filter.pixelate.SHADER = [ + "precision highp float;", + "varying vec2 vUv;", + "uniform vec2 size;", + "uniform sampler2D texture;", + "vec2 pixelate(vec2 coord, vec2 size) {", + "return floor( coord / size ) * size;", + "}", + "void main(void) {", + "gl_FragColor = vec4(0.0);", + "vec2 coord = pixelate(vUv, size);", + "gl_FragColor += texture2D(texture, coord);", + "}" + ].join("\n"); +} + +// src/image/image.ts +var maxSize = 2048; +var inCanvas; +var outCanvas; +var fx; +function process4(input, config3) { + let tensor2; + if (!input) + throw new Error("Human: Input is missing"); + if (!(input instanceof tfjs_esm_exports.Tensor) && !(typeof Image !== "undefined" && input instanceof Image) && !(typeof ImageData !== "undefined" && input instanceof ImageData) && !(typeof ImageBitmap !== "undefined" && input instanceof ImageBitmap) && !(typeof HTMLImageElement !== "undefined" && input instanceof HTMLImageElement) && !(typeof HTMLMediaElement !== "undefined" && input instanceof HTMLMediaElement) && !(typeof HTMLVideoElement !== "undefined" && input instanceof HTMLVideoElement) && !(typeof HTMLCanvasElement !== "undefined" && input instanceof HTMLCanvasElement) && !(typeof OffscreenCanvas !== "undefined" && input instanceof OffscreenCanvas)) { + throw new Error("Human: Input type is not recognized"); + } + if (input instanceof tfjs_esm_exports.Tensor) { + if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) + tensor2 = tfjs_esm_exports.clone(input); + else + throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`); + } else { + const originalWidth = input["naturalWidth"] || input["videoWidth"] || input["width"] || input["shape"] && input["shape"][1] > 0; + const originalHeight = input["naturalHeight"] || input["videoHeight"] || input["height"] || input["shape"] && input["shape"][2] > 0; + if (!originalWidth || !originalHeight) + return { tensor: null, canvas: inCanvas }; + let targetWidth = originalWidth; + let targetHeight = originalHeight; + if (targetWidth > maxSize) { + targetWidth = maxSize; + targetHeight = targetWidth * originalHeight / originalWidth; + } + if (targetHeight > maxSize) { + targetHeight = maxSize; + targetWidth = targetHeight * originalWidth / originalHeight; + } + if (config3.filter.width > 0) + targetWidth = config3.filter.width; + else if (config3.filter.height > 0) + targetWidth = originalWidth * (config3.filter.height / originalHeight); + if (config3.filter.height > 0) + targetHeight = config3.filter.height; + else if (config3.filter.width > 0) + targetHeight = originalHeight * (config3.filter.width / originalWidth); + if (!targetWidth || !targetHeight) + throw new Error("Human: Input cannot determine dimension"); + if (!inCanvas || (inCanvas == null ? void 0 : inCanvas.width) !== targetWidth || (inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) { + inCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); + if ((inCanvas == null ? void 0 : inCanvas.width) !== targetWidth) + inCanvas.width = targetWidth; + if ((inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) + inCanvas.height = targetHeight; + } + const ctx = inCanvas.getContext("2d"); + if (input instanceof ImageData) { + ctx.putImageData(input, 0, 0); + } else { + if (config3.filter.flip && typeof ctx.translate !== "undefined") { + ctx.translate(originalWidth, 0); + ctx.scale(-1, 1); + ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); + } + } + if (config3.filter.enabled) { + if (!fx || !outCanvas || inCanvas.width !== outCanvas.width || (inCanvas == null ? void 0 : inCanvas.height) !== (outCanvas == null ? void 0 : outCanvas.height)) { + outCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height) : document.createElement("canvas"); + if ((outCanvas == null ? void 0 : outCanvas.width) !== (inCanvas == null ? void 0 : inCanvas.width)) + outCanvas.width = inCanvas == null ? void 0 : inCanvas.width; + if ((outCanvas == null ? void 0 : outCanvas.height) !== (inCanvas == null ? void 0 : inCanvas.height)) + outCanvas.height = inCanvas == null ? void 0 : inCanvas.height; + fx = tfjs_esm_exports.ENV.flags.IS_BROWSER ? new GLImageFilter({ canvas: outCanvas }) : null; + } + if (!fx) + return { tensor: null, canvas: inCanvas }; + fx.reset(); + fx.addFilter("brightness", config3.filter.brightness); + if (config3.filter.contrast !== 0) + fx.addFilter("contrast", config3.filter.contrast); + if (config3.filter.sharpness !== 0) + fx.addFilter("sharpen", config3.filter.sharpness); + if (config3.filter.blur !== 0) + fx.addFilter("blur", config3.filter.blur); + if (config3.filter.saturation !== 0) + fx.addFilter("saturation", config3.filter.saturation); + if (config3.filter.hue !== 0) + fx.addFilter("hue", config3.filter.hue); + if (config3.filter.negative) + fx.addFilter("negative"); + if (config3.filter.sepia) + fx.addFilter("sepia"); + if (config3.filter.vintage) + fx.addFilter("brownie"); + if (config3.filter.sepia) + fx.addFilter("sepia"); + if (config3.filter.kodachrome) + fx.addFilter("kodachrome"); + if (config3.filter.technicolor) + fx.addFilter("technicolor"); + if (config3.filter.polaroid) + fx.addFilter("polaroid"); + if (config3.filter.pixelate !== 0) + fx.addFilter("pixelate", config3.filter.pixelate); + fx.apply(inCanvas); + } else { + outCanvas = inCanvas; + if (fx) + fx = null; + } + if (!tensor2) { + let pixels; + if (outCanvas.data) { + const shape = [outCanvas.height, outCanvas.width, 3]; + pixels = tfjs_esm_exports.tensor3d(outCanvas.data, shape, "int32"); + } else if (outCanvas instanceof ImageData) { + pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(outCanvas) : null; + } else if (config3.backend === "webgl" || config3.backend === "humangl") { + const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); + tempCanvas.width = targetWidth; + tempCanvas.height = targetHeight; + const tempCtx = tempCanvas.getContext("2d"); + tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); + pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(tempCanvas) : null; + } else { + const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); + tempCanvas.width = targetWidth; + tempCanvas.height = targetHeight; + const tempCtx = tempCanvas.getContext("2d"); + tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); + const data2 = tempCtx == null ? void 0 : tempCtx.getImageData(0, 0, targetWidth, targetHeight); + pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(data2) : null; + } + if (pixels) { + const casted = tfjs_esm_exports.cast(pixels, "float32"); + tensor2 = tfjs_esm_exports.expandDims(casted, 0); + tfjs_esm_exports.dispose(pixels); + tfjs_esm_exports.dispose(casted); + } + } + } + const canvas2 = config3.filter.return ? outCanvas : null; + return { tensor: tensor2, canvas: canvas2 }; +} + +// src/segmentation/segmentation.ts +var model9; +var busy = false; +async function load12(config3) { + if (!model9) { + model9 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.segmentation.modelPath)); + if (!model9 || !model9["modelUrl"]) + log("load model failed:", config3.segmentation.modelPath); + else if (config3.debug) + log("load model:", model9["modelUrl"]); + } else if (config3.debug) + log("cached model:", model9["modelUrl"]); + return model9; +} +async function predict11(input) { + var _a, _b; + const width = ((_a = input.tensor) == null ? void 0 : _a.shape[1]) || 0; + const height = ((_b = input.tensor) == null ? void 0 : _b.shape[2]) || 0; + if (!input.tensor) + return null; + if (!model9 || !model9.inputs[0].shape) + return null; + const resizeInput = tfjs_esm_exports.image.resizeBilinear(input.tensor, [model9.inputs[0].shape[1], model9.inputs[0].shape[2]], false); + const norm = tfjs_esm_exports.div(resizeInput, 255); + const res = model9.predict(norm); + tfjs_esm_exports.dispose(resizeInput); + tfjs_esm_exports.dispose(norm); + const squeeze7 = tfjs_esm_exports.squeeze(res, 0); + let resizeOutput; + if (squeeze7.shape[2] === 2) { + const softmax = squeeze7.softmax(); + const [bg, fg] = tfjs_esm_exports.unstack(softmax, 2); + const expand = tfjs_esm_exports.expandDims(fg, 2); + const pad = tfjs_esm_exports.expandDims(expand, 0); + tfjs_esm_exports.dispose(softmax); + tfjs_esm_exports.dispose(bg); + tfjs_esm_exports.dispose(fg); + const crop = tfjs_esm_exports.image.cropAndResize(pad, [[0, 0, 0.5, 0.5]], [0], [width, height]); + resizeOutput = tfjs_esm_exports.squeeze(crop, 0); + tfjs_esm_exports.dispose(crop); + tfjs_esm_exports.dispose(expand); + tfjs_esm_exports.dispose(pad); + } else { + resizeOutput = tfjs_esm_exports.image.resizeBilinear(squeeze7, [width, height]); + } + if (typeof document === "undefined") + return resizeOutput.data(); + const overlay = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(width, height) : document.createElement("canvas"); + overlay.width = width; + overlay.height = height; + if (tfjs_esm_exports.browser) + await tfjs_esm_exports.browser.toPixels(resizeOutput, overlay); + tfjs_esm_exports.dispose(resizeOutput); + tfjs_esm_exports.dispose(squeeze7); + tfjs_esm_exports.dispose(res); + const alphaCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(width, height) : document.createElement("canvas"); + alphaCanvas.width = width; + alphaCanvas.height = height; + const ctxAlpha = alphaCanvas.getContext("2d"); + ctxAlpha.filter = "blur(8px"; + await ctxAlpha.drawImage(overlay, 0, 0); + const alpha = ctxAlpha.getImageData(0, 0, width, height).data; + const original = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(width, height) : document.createElement("canvas"); + original.width = width; + original.height = height; + const ctx = original.getContext("2d"); + if (input.canvas) + await ctx.drawImage(input.canvas, 0, 0); + ctx.globalCompositeOperation = "darken"; + ctx.filter = "blur(8px)"; + await ctx.drawImage(overlay, 0, 0); + ctx.globalCompositeOperation = "source-over"; + ctx.filter = "none"; + input.canvas = original; + return alpha; +} +async function process5(input, background, config3) { + var _a; + if (busy) + return null; + busy = true; + if (!model9) + await load12(config3); + const img = process4(input, config3); + const alpha = await predict11(img); + tfjs_esm_exports.dispose(img.tensor); + if (background && alpha) { + const tmp = process4(background, config3); + const bg = tmp.canvas; + tfjs_esm_exports.dispose(tmp.tensor); + const fg = img.canvas; + const fgData = (_a = fg.getContext("2d")) == null ? void 0 : _a.getImageData(0, 0, fg.width, fg.height).data; + const c = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(fg.width, fg.height) : document.createElement("canvas"); + c.width = fg.width; + c.height = fg.height; + const ctx = c.getContext("2d"); + ctx.globalCompositeOperation = "copy"; + ctx.drawImage(bg, 0, 0, c.width, c.height); + const cData = ctx.getImageData(0, 0, c.width, c.height); + for (let i = 0; i < c.width * c.height; i++) { + cData.data[4 * i + 0] = (255 - alpha[4 * i + 0]) / 255 * cData.data[4 * i + 0] + alpha[4 * i + 0] / 255 * fgData[4 * i + 0]; + cData.data[4 * i + 1] = (255 - alpha[4 * i + 1]) / 255 * cData.data[4 * i + 1] + alpha[4 * i + 1] / 255 * fgData[4 * i + 1]; + cData.data[4 * i + 2] = (255 - alpha[4 * i + 2]) / 255 * cData.data[4 * i + 2] + alpha[4 * i + 2] / 255 * fgData[4 * i + 2]; + cData.data[4 * i + 3] = (255 - alpha[4 * i + 3]) / 255 * cData.data[4 * i + 3] + alpha[4 * i + 3] / 255 * fgData[4 * i + 3]; + } + ctx.putImageData(cData, 0, 0); + img.canvas = c; + } + busy = false; + return img.canvas; +} + +// src/models.ts +async function load13(instance) { + if (instance.config.async) { + [ + instance.models.face, + instance.models.emotion, + instance.models.handpose, + instance.models.posenet, + instance.models.blazepose, + instance.models.efficientpose, + instance.models.movenet, + instance.models.nanodet, + instance.models.centernet, + instance.models.faceres, + instance.models.segmentation + ] = await Promise.all([ + instance.models.face || (instance.config.face.enabled ? load2(instance.config) : null), + instance.models.emotion || (instance.config.face.enabled && instance.config.face.emotion.enabled ? load4(instance.config) : null), + instance.models.handpose || (instance.config.hand.enabled ? load6(instance.config) : null), + instance.models.posenet || (instance.config.body.enabled && instance.config.body.modelPath.includes("posenet") ? load5(instance.config) : null), + instance.models.blazepose || (instance.config.body.enabled && instance.config.body.modelPath.includes("blazepose") ? load7(instance.config) : null), + instance.models.efficientpose || (instance.config.body.enabled && instance.config.body.modelPath.includes("efficientpose") ? load8(instance.config) : null), + instance.models.movenet || (instance.config.body.enabled && instance.config.body.modelPath.includes("movenet") ? load9(instance.config) : null), + instance.models.nanodet || (instance.config.object.enabled && instance.config.object.modelPath.includes("nanodet") ? load10(instance.config) : null), + instance.models.centernet || (instance.config.object.enabled && instance.config.object.modelPath.includes("centernet") ? load11(instance.config) : null), + instance.models.faceres || (instance.config.face.enabled && instance.config.face.description.enabled ? load3(instance.config) : null), + instance.models.segmentation || (instance.config.segmentation.enabled ? load12(instance.config) : null) + ]); + } else { + if (instance.config.face.enabled && !instance.models.face) + instance.models.face = await load2(instance.config); + if (instance.config.face.enabled && instance.config.face.emotion.enabled && !instance.models.emotion) + instance.models.emotion = await load4(instance.config); + if (instance.config.hand.enabled && !instance.models.handpose) + instance.models.handpose = await load6(instance.config); + if (instance.config.body.enabled && !instance.models.posenet && instance.config.body.modelPath.includes("posenet")) + instance.models.posenet = await load5(instance.config); + if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body.modelPath.includes("blazepose")) + instance.models.blazepose = await load7(instance.config); + if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body.modelPath.includes("efficientpose")) + instance.models.efficientpose = await load7(instance.config); + if (instance.config.body.enabled && !instance.models.movenet && instance.config.body.modelPath.includes("movenet")) + instance.models.movenet = await load9(instance.config); + if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object.modelPath.includes("nanodet")) + instance.models.nanodet = await load10(instance.config); + if (instance.config.object.enabled && !instance.models.centernet && instance.config.object.modelPath.includes("centernet")) + instance.models.centernet = await load11(instance.config); + if (instance.config.face.enabled && instance.config.face.description.enabled && !instance.models.faceres) + instance.models.faceres = await load3(instance.config); + if (instance.config.segmentation.enabled && !instance.models.segmentation) + instance.models.segmentation = await load12(instance.config); + } +} + +// src/face.ts +var calculateGaze = (face5) => { + const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); + if (!face5.annotations["rightEyeIris"] || !face5.annotations["leftEyeIris"]) + return { bearing: 0, strength: 0 }; + const offsetIris = [0, -0.1]; + const eyeRatio = 1; + const left = face5.mesh[33][2] > face5.mesh[263][2]; + const irisCenter = left ? face5.mesh[473] : face5.mesh[468]; + const eyeCenter = left ? [(face5.mesh[133][0] + face5.mesh[33][0]) / 2, (face5.mesh[133][1] + face5.mesh[33][1]) / 2] : [(face5.mesh[263][0] + face5.mesh[362][0]) / 2, (face5.mesh[263][1] + face5.mesh[362][1]) / 2]; + const eyeSize = left ? [face5.mesh[133][0] - face5.mesh[33][0], face5.mesh[23][1] - face5.mesh[27][1]] : [face5.mesh[263][0] - face5.mesh[362][0], face5.mesh[253][1] - face5.mesh[257][1]]; + const eyeDiff = [ + (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0], + eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1] + ]; + let strength = Math.sqrt(eyeDiff[0] ** 2 + eyeDiff[1] ** 2); + strength = Math.min(strength, face5.boxRaw[2] / 2, face5.boxRaw[3] / 2); + const bearing = (radians([0, 0], eyeDiff) + Math.PI / 2) % Math.PI; + return { bearing, strength }; +}; +var calculateFaceAngle = (face5, imageSize) => { + const normalize = (v) => { + const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + v[0] /= length; + v[1] /= length; + v[2] /= length; + return v; + }; + const subVectors = (a, b) => { + const x = a[0] - b[0]; + const y = a[1] - b[1]; + const z = a[2] - b[2]; + return [x, y, z]; + }; + const crossVectors = (a, b) => { + const x = a[1] * b[2] - a[2] * b[1]; + const y = a[2] * b[0] - a[0] * b[2]; + const z = a[0] * b[1] - a[1] * b[0]; + return [x, y, z]; + }; + const rotationMatrixToEulerAngle = (r) => { + const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r; + let thetaX; + let thetaY; + let thetaZ; + if (r10 < 1) { + if (r10 > -1) { + thetaZ = Math.asin(r10); + thetaY = Math.atan2(-r20, r00); + thetaX = Math.atan2(-r12, r11); + } else { + thetaZ = -Math.PI / 2; + thetaY = -Math.atan2(r21, r22); + thetaX = 0; + } + } else { + thetaZ = Math.PI / 2; + thetaY = Math.atan2(r21, r22); + thetaX = 0; + } + if (isNaN(thetaX)) + thetaX = 0; + if (isNaN(thetaY)) + thetaY = 0; + if (isNaN(thetaZ)) + thetaZ = 0; + return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ }; + }; + const meshToEulerAngle = (mesh2) => { + const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1); + const angle2 = { + pitch: radians(mesh2[10][1], mesh2[10][2], mesh2[152][1], mesh2[152][2]), + yaw: radians(mesh2[33][0], mesh2[33][2], mesh2[263][0], mesh2[263][2]), + roll: radians(mesh2[33][0], mesh2[33][1], mesh2[263][0], mesh2[263][1]) + }; + return angle2; + }; + const mesh = face5.meshRaw; + if (!mesh || mesh.length < 300) + return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } }; + const size = Math.max(face5.boxRaw[2] * imageSize[0], face5.boxRaw[3] * imageSize[1]) / 1.5; + const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [ + pt[0] * imageSize[0] / size, + pt[1] * imageSize[1] / size, + pt[2] + ]); + const y_axis = normalize(subVectors(pts[1], pts[0])); + let x_axis = normalize(subVectors(pts[3], pts[2])); + const z_axis = normalize(crossVectors(x_axis, y_axis)); + x_axis = crossVectors(y_axis, z_axis); + const matrix = [ + x_axis[0], + x_axis[1], + x_axis[2], + y_axis[0], + y_axis[1], + y_axis[2], + z_axis[0], + z_axis[1], + z_axis[2] + ]; + const angle = rotationMatrixToEulerAngle(matrix); + const gaze = mesh.length === 478 ? calculateGaze(face5) : { bearing: 0, strength: 0 }; + return { angle, matrix, gaze }; +}; +var detectFace = async (parent, input) => { + var _a, _b, _c, _d, _e, _f; + let timeStamp; + let ageRes; + let gearRes; + let genderRes; + let emotionRes; + let embeddingRes; + let descRes; + const faceRes = []; + parent.state = "run:face"; + timeStamp = now(); + const faces = await predict(input, parent.config); + parent.performance.face = Math.trunc(now() - timeStamp); + if (!input.shape || input.shape.length !== 4) + return []; + if (!faces) + return []; + for (let i = 0; i < faces.length; i++) { + parent.analyze("Get Face"); + if (!faces[i].tensor || faces[i].tensor["isDisposedInternal"]) { + log("Face object is disposed:", faces[i].tensor); + continue; + } + const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]); + parent.analyze("Start Emotion:"); + if (parent.config.async) { + emotionRes = parent.config.face.emotion.enabled ? predict3(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {}; + } else { + parent.state = "run:emotion"; + timeStamp = now(); + emotionRes = parent.config.face.emotion.enabled ? await predict3(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : {}; + parent.performance.emotion = Math.trunc(now() - timeStamp); + } + parent.analyze("End Emotion:"); + parent.analyze("Start Description:"); + if (parent.config.async) { + descRes = parent.config.face.description.enabled ? predict2(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : []; + } else { + parent.state = "run:description"; + timeStamp = now(); + descRes = parent.config.face.description.enabled ? await predict2(faces[i].tensor || tfjs_esm_exports.tensor([]), parent.config, i, faces.length) : []; + parent.performance.embedding = Math.trunc(now() - timeStamp); + } + parent.analyze("End Description:"); + if (parent.config.async) { + [ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes]); + } + parent.analyze("Finish Face:"); + if (!parent.config.face.iris.enabled && ((_b = (_a = faces[i]) == null ? void 0 : _a.annotations) == null ? void 0 : _b.leftEyeIris) && ((_d = (_c = faces[i]) == null ? void 0 : _c.annotations) == null ? void 0 : _d.rightEyeIris)) { + delete faces[i].annotations.leftEyeIris; + delete faces[i].annotations.rightEyeIris; + } + const irisSize = ((_e = faces[i].annotations) == null ? void 0 : _e.leftEyeIris) && ((_f = faces[i].annotations) == null ? void 0 : _f.rightEyeIris) ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2] : 0; + const tensor2 = parent.config.face.detector.return ? tfjs_esm_exports.squeeze(faces[i].tensor) : null; + tfjs_esm_exports.dispose(faces[i].tensor); + if (faces[i].tensor) + delete faces[i].tensor; + faceRes.push({ + ...faces[i], + id: i, + age: descRes.age, + gender: descRes.gender, + genderScore: descRes.genderScore, + embedding: descRes.descriptor, + emotion: emotionRes, + iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0, + rotation, + tensor: tensor2 + }); + parent.analyze("End Face"); + } + parent.analyze("End FaceMesh:"); + if (parent.config.async) { + if (parent.performance.face) + delete parent.performance.face; + if (parent.performance.age) + delete parent.performance.age; + if (parent.performance.gender) + delete parent.performance.gender; + if (parent.performance.emotion) + delete parent.performance.emotion; + } + return faceRes; +}; + +// src/gesture/gesture.ts +var body = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + const leftWrist = res[i].keypoints.find((a) => a.part === "leftWrist"); + const rightWrist = res[i].keypoints.find((a) => a.part === "rightWrist"); + const nose = res[i].keypoints.find((a) => a.part === "nose"); + if (nose && leftWrist && rightWrist && leftWrist.position.y < nose.position.y && rightWrist.position.y < nose.position.y) + gestures.push({ body: i, gesture: "i give up" }); + else if (nose && leftWrist && leftWrist.position.y < nose.position.y) + gestures.push({ body: i, gesture: "raise left hand" }); + else if (nose && rightWrist && rightWrist.position.y < nose.position.y) + gestures.push({ body: i, gesture: "raise right hand" }); + const leftShoulder = res[i].keypoints.find((a) => a.part === "leftShoulder"); + const rightShoulder = res[i].keypoints.find((a) => a.part === "rightShoulder"); + if (leftShoulder && rightShoulder) + gestures.push({ body: i, gesture: `leaning ${leftShoulder.position.y > rightShoulder.position.y ? "left" : "right"}` }); + } + return gestures; +}; +var face = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + if (res[i].mesh && res[i].mesh.length > 0) { + const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2]; + if (Math.abs(eyeFacing) < 10) + gestures.push({ face: i, gesture: "facing center" }); + else + gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? "left" : "right"}` }); + const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); + if (openLeft < 0.2) + gestures.push({ face: i, gesture: "blink left eye" }); + const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); + if (openRight < 0.2) + gestures.push({ face: i, gesture: "blink right eye" }); + const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1])); + if (mouthOpen > 10) + gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` }); + const chinDepth = res[i].mesh[152][2]; + if (Math.abs(chinDepth) > 10) + gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); + } + } + return gestures; +}; +var iris = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) + continue; + const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0]; + const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1]; + const areaLeft = Math.abs(sizeXLeft * sizeYLeft); + const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0]; + const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1]; + const areaRight = Math.abs(sizeXRight * sizeYRight); + let center = false; + const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight); + if (difference < 0.25) { + center = true; + gestures.push({ iris: i, gesture: "facing center" }); + } + const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2]; + const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2]; + if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) + center = false; + if (leftIrisCenterX > 0.06) + gestures.push({ iris: i, gesture: "looking right" }); + if (rightIrisCenterX > 0.06) + gestures.push({ iris: i, gesture: "looking left" }); + const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3]; + const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3]; + if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) + center = false; + if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) + gestures.push({ iris: i, gesture: "looking down" }); + if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) + gestures.push({ iris: i, gesture: "looking up" }); + if (center) + gestures.push({ iris: i, gesture: "looking center" }); + } + return gestures; +}; +var hand = (res) => { + if (!res) + return []; + const gestures = []; + for (let i = 0; i < res.length; i++) { + const fingers = []; + for (const [finger, pos] of Object.entries(res[i]["annotations"])) { + if (finger !== "palmBase" && Array.isArray(pos)) + fingers.push({ name: finger.toLowerCase(), position: pos[0] }); + } + if (fingers && fingers.length > 0) { + const closest = fingers.reduce((best, a) => best.position[2] < a.position[2] ? best : a); + gestures.push({ hand: i, gesture: `${closest.name} forward` }); + const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); + gestures.push({ hand: i, gesture: `${highest.name} up` }); + } + const poses2 = match2(res[i]["keypoints"]); + for (const pose of poses2) + gestures.push({ hand: i, gesture: pose.name }); + } + return gestures; +}; + +// src/draw/draw.ts +var draw_exports = {}; +__export(draw_exports, { + all: () => all, + body: () => body2, + canvas: () => canvas, + face: () => face2, + gesture: () => gesture, + hand: () => hand2, + object: () => object, + options: () => options2, + person: () => person +}); +var options2 = { + color: "rgba(173, 216, 230, 0.6)", + labelColor: "rgba(173, 216, 230, 1)", + shadowColor: "black", + font: 'small-caps 14px "Segoe UI"', + lineHeight: 18, + lineWidth: 4, + pointSize: 2, + roundRect: 8, + drawPoints: false, + drawLabels: true, + drawBoxes: true, + drawPolygons: true, + drawGaze: true, + fillPolygons: false, + useDepth: true, + useCurves: false, + bufferedOutput: true +}; +var getCanvasContext = (input) => { + if (input && input.getContext) + return input.getContext("2d"); + throw new Error("Human: Invalid Canvas"); +}; +var rad2deg = (theta) => Math.round(theta * 180 / Math.PI); +function point(ctx, x, y, z = 0, localOptions) { + ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; + ctx.beginPath(); + ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI); + ctx.fill(); +} +function rect(ctx, x, y, width, height, localOptions) { + ctx.beginPath(); + if (localOptions.useCurves) { + const cx = (x + x + width) / 2; + const cy = (y + y + height) / 2; + ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI); + } else { + ctx.lineWidth = localOptions.lineWidth; + ctx.moveTo(x + localOptions.roundRect, y); + ctx.lineTo(x + width - localOptions.roundRect, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect); + ctx.lineTo(x + width, y + height - localOptions.roundRect); + ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height); + ctx.lineTo(x + localOptions.roundRect, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect); + ctx.lineTo(x, y + localOptions.roundRect); + ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y); + ctx.closePath(); + } + ctx.stroke(); +} +function lines(ctx, points = [], localOptions) { + if (points === void 0 || points.length === 0) + return; + ctx.beginPath(); + ctx.moveTo(points[0][0], points[0][1]); + for (const pt of points) { + const z = pt[2] || 0; + ctx.strokeStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; + ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; + ctx.lineTo(pt[0], Math.round(pt[1])); + } + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.closePath(); + ctx.fill(); + } +} +function curves(ctx, points = [], localOptions) { + if (points === void 0 || points.length === 0) + return; + if (!localOptions.useCurves || points.length <= 2) { + lines(ctx, points, localOptions); + return; + } + ctx.moveTo(points[0][0], points[0][1]); + for (let i = 0; i < points.length - 2; i++) { + const xc = (points[i][0] + points[i + 1][0]) / 2; + const yc = (points[i][1] + points[i + 1][1]) / 2; + ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc); + } + ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]); + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.closePath(); + ctx.fill(); + } +} +async function gesture(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + ctx.font = localOptions.font; + ctx.fillStyle = localOptions.color; + let i = 1; + for (let j = 0; j < result.length; j++) { + let where = []; + let what = []; + [where, what] = Object.entries(result[j]); + if (what.length > 1 && what[1].length > 0) { + const who = where[1] > 0 ? `#${where[1]}` : ""; + const label = `${where[0]} ${who}: ${what[1]}`; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(label, 8, 2 + i * localOptions.lineHeight); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(label, 6, 0 + i * localOptions.lineHeight); + i += 1; + } + } +} +async function face2(inCanvas2, result, drawOptions) { + var _a, _b, _c, _d; + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + for (const f of result) { + ctx.font = localOptions.font; + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + if (localOptions.drawBoxes) + rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions); + const labels2 = []; + labels2.push(`face: ${Math.trunc(100 * f.score)}%`); + if (f.genderScore) + labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderScore)}%`); + if (f.age) + labels2.push(`age: ${f.age || ""}`); + if (f.iris) + labels2.push(`distance: ${f.iris}`); + if (f.emotion && f.emotion.length > 0) { + const emotion3 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`); + if (emotion3.length > 3) + emotion3.length = 3; + labels2.push(emotion3.join(" ")); + } + if (f.rotation && f.rotation.angle && f.rotation.gaze) { + if (f.rotation.angle.roll) + labels2.push(`roll: ${rad2deg(f.rotation.angle.roll)}\xB0 yaw:${rad2deg(f.rotation.angle.yaw)}\xB0 pitch:${rad2deg(f.rotation.angle.pitch)}\xB0`); + if (f.rotation.gaze.bearing) + labels2.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\xB0`); + } + if (labels2.length === 0) + labels2.push("face"); + ctx.fillStyle = localOptions.color; + for (let i = labels2.length - 1; i >= 0; i--) { + const x = Math.max(f.box[0], 0); + const y = i * localOptions.lineHeight + f.box[1]; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(labels2[i], x + 5, y + 16); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(labels2[i], x + 4, y + 15); + } + ctx.lineWidth = 1; + if (f.mesh && f.mesh.length > 0) { + if (localOptions.drawPoints) { + for (const pt of f.mesh) + point(ctx, pt[0], pt[1], pt[2], localOptions); + } + if (localOptions.drawPolygons) { + ctx.lineWidth = 1; + for (let i = 0; i < TRI468.length / 3; i++) { + const points = [ + TRI468[i * 3 + 0], + TRI468[i * 3 + 1], + TRI468[i * 3 + 2] + ].map((index) => f.mesh[index]); + lines(ctx, points, localOptions); + } + if (f.annotations && f.annotations["leftEyeIris"]) { + ctx.strokeStyle = localOptions.useDepth ? "rgba(255, 200, 255, 0.3)" : localOptions.color; + ctx.beginPath(); + const sizeX = Math.abs(f.annotations["leftEyeIris"][3][0] - f.annotations["leftEyeIris"][1][0]) / 2; + const sizeY = Math.abs(f.annotations["leftEyeIris"][4][1] - f.annotations["leftEyeIris"][2][1]) / 2; + ctx.ellipse(f.annotations["leftEyeIris"][0][0], f.annotations["leftEyeIris"][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI); + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.fillStyle = localOptions.useDepth ? "rgba(255, 255, 200, 0.3)" : localOptions.color; + ctx.fill(); + } + } + if (f.annotations && f.annotations["rightEyeIris"]) { + ctx.strokeStyle = localOptions.useDepth ? "rgba(255, 200, 255, 0.3)" : localOptions.color; + ctx.beginPath(); + const sizeX = Math.abs(f.annotations["rightEyeIris"][3][0] - f.annotations["rightEyeIris"][1][0]) / 2; + const sizeY = Math.abs(f.annotations["rightEyeIris"][4][1] - f.annotations["rightEyeIris"][2][1]) / 2; + ctx.ellipse(f.annotations["rightEyeIris"][0][0], f.annotations["rightEyeIris"][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI); + ctx.stroke(); + if (localOptions.fillPolygons) { + ctx.fillStyle = localOptions.useDepth ? "rgba(255, 255, 200, 0.3)" : localOptions.color; + ctx.fill(); + } + } + if (localOptions.drawGaze && ((_b = (_a = f.rotation) == null ? void 0 : _a.gaze) == null ? void 0 : _b.strength) && ((_d = (_c = f.rotation) == null ? void 0 : _c.gaze) == null ? void 0 : _d.bearing) && f.annotations["leftEyeIris"] && f.annotations["rightEyeIris"] && f.annotations["leftEyeIris"][0] && f.annotations["rightEyeIris"][0]) { + ctx.strokeStyle = "pink"; + ctx.beginPath(); + const leftGaze = [ + f.annotations["leftEyeIris"][0][0] + Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3], + f.annotations["leftEyeIris"][0][1] + Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2] + ]; + ctx.moveTo(f.annotations["leftEyeIris"][0][0], f.annotations["leftEyeIris"][0][1]); + ctx.lineTo(leftGaze[0], leftGaze[1]); + const rightGaze = [ + f.annotations["rightEyeIris"][0][0] + Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3], + f.annotations["rightEyeIris"][0][1] + Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2] + ]; + ctx.moveTo(f.annotations["rightEyeIris"][0][0], f.annotations["rightEyeIris"][0][1]); + ctx.lineTo(rightGaze[0], rightGaze[1]); + ctx.stroke(); + } + } + } + } +} +async function body2(inCanvas2, result, drawOptions) { + var _a; + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + ctx.lineJoin = "round"; + for (let i = 0; i < result.length; i++) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + ctx.lineWidth = localOptions.lineWidth; + ctx.font = localOptions.font; + if (localOptions.drawBoxes && result[i].box && ((_a = result[i].box) == null ? void 0 : _a.length) === 4) { + rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions); + if (localOptions.drawLabels) { + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + } + if (localOptions.drawPoints) { + for (let pt = 0; pt < result[i].keypoints.length; pt++) { + ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + 2 * (result[i].keypoints[pt].position[2] || 0)}, ${127.5 - 2 * (result[i].keypoints[pt].position[2] || 0)}, 255, 0.5)` : localOptions.color; + point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); + } + } + if (localOptions.drawLabels) { + ctx.font = localOptions.font; + if (result[i].keypoints) { + for (const pt of result[i].keypoints) { + ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + 2 * pt.position[2]}, ${127.5 - 2 * pt.position[2]}, 255, 0.5)` : localOptions.color; + ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4); + } + } + } + if (localOptions.drawPolygons && result[i].keypoints) { + let part; + const points = []; + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + if (points.length === 4) + lines(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftKnee"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftAnkle"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftHeel"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftFoot"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightHip"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightKnee"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightAnkle"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightHeel"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightFoot"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "leftShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftElbow"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftWrist"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "leftPalm"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + points.length = 0; + part = result[i].keypoints.find((a) => a.part === "rightShoulder"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightElbow"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightWrist"); + if (part) + points.push([part.position[0], part.position[1]]); + part = result[i].keypoints.find((a) => a.part === "rightPalm"); + if (part) + points.push([part.position[0], part.position[1]]); + curves(ctx, points, localOptions); + } + } +} +async function hand2(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (const h of result) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions); + if (localOptions.drawLabels) { + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText("hand", h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText("hand", h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.stroke(); + } + if (localOptions.drawPoints) { + if (h.keypoints && h.keypoints.length > 0) { + for (const pt of h.keypoints) { + ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 255, 0.5)` : localOptions.color; + point(ctx, pt[0], pt[1], 0, localOptions); + } + } + } + if (localOptions.drawLabels) { + const addHandLabel = (part, title) => { + if (!part) + return; + ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * part[part.length - 1][2]}, ${127.5 - 2 * part[part.length - 1][2]}, 255, 0.5)` : localOptions.color; + ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4); + }; + ctx.font = localOptions.font; + addHandLabel(h.annotations["index"], "index"); + addHandLabel(h.annotations["middle"], "middle"); + addHandLabel(h.annotations["ring"], "ring"); + addHandLabel(h.annotations["pinky"], "pinky"); + addHandLabel(h.annotations["thumb"], "thumb"); + addHandLabel(h.annotations["palm"], "palm"); + } + if (localOptions.drawPolygons) { + const addHandLine = (part) => { + if (!part) + return; + for (let i = 0; i < part.length; i++) { + ctx.beginPath(); + ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * part[i][2]}, ${127.5 - 2 * part[i][2]}, 255, 0.5)` : localOptions.color; + ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]); + ctx.lineTo(part[i][0], part[i][1]); + ctx.stroke(); + } + }; + ctx.lineWidth = localOptions.lineWidth; + addHandLine(h.annotations["index"]); + addHandLine(h.annotations["middle"]); + addHandLine(h.annotations["ring"]); + addHandLine(h.annotations["pinky"]); + addHandLine(h.annotations["thumb"]); + } + } +} +async function object(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (const h of result) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions); + if (localOptions.drawLabels) { + const label = `${h.label} ${Math.round(100 * h.score)}%`; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); + } + ctx.stroke(); + } + } +} +async function person(inCanvas2, result, drawOptions) { + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return; + const ctx = getCanvasContext(inCanvas2); + ctx.lineJoin = "round"; + ctx.font = localOptions.font; + for (let i = 0; i < result.length; i++) { + if (localOptions.drawBoxes) { + ctx.strokeStyle = localOptions.color; + ctx.fillStyle = localOptions.color; + rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions); + if (localOptions.drawLabels) { + const label = `person #${i}`; + if (localOptions.shadowColor && localOptions.shadowColor !== "") { + ctx.fillStyle = localOptions.shadowColor; + ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + ctx.fillStyle = localOptions.labelColor; + ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); + } + ctx.stroke(); + } + } +} +async function canvas(inCanvas2, outCanvas2) { + if (!inCanvas2 || !outCanvas2) + return; + getCanvasContext(outCanvas2); + const ctx = getCanvasContext(inCanvas2); + ctx.drawImage(inCanvas2, 0, 0); +} +async function all(inCanvas2, result, drawOptions) { + const timestamp = now(); + const localOptions = mergeDeep(options2, drawOptions); + if (!result || !inCanvas2) + return null; + const promise = Promise.all([ + face2(inCanvas2, result.face, localOptions), + body2(inCanvas2, result.body, localOptions), + hand2(inCanvas2, result.hand, localOptions), + object(inCanvas2, result.object, localOptions), + gesture(inCanvas2, result.gesture, localOptions) + ]); + result.performance.draw = Math.trunc(now() - timestamp); + return promise; +} + +// src/persons.ts +function join2(faces, bodies, hands, gestures, shape) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p; + let id = 0; + const persons2 = []; + for (const face5 of faces) { + const person2 = { id: id++, face: face5, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] }; + for (const body4 of bodies) { + if (face5.box[0] > body4.box[0] && face5.box[0] < body4.box[0] + body4.box[2] && face5.box[1] + face5.box[3] > body4.box[1] && face5.box[1] + face5.box[3] < body4.box[1] + body4.box[3]) { + person2.body = body4; + } + } + if (person2.body) { + for (const hand3 of hands) { + if (hand3.box[0] + hand3.box[2] > person2.body.box[0] && hand3.box[0] + hand3.box[2] < person2.body.box[0] + person2.body.box[2] && hand3.box[1] + hand3.box[3] > person2.body.box[1] && hand3.box[1] + hand3.box[3] < person2.body.box[1] + person2.body.box[3]) { + if (person2.hands) + person2.hands.left = hand3; + } + if (hand3.box[0] < person2.body.box[0] + person2.body.box[2] && hand3.box[0] > person2.body.box[0] && hand3.box[1] + hand3.box[3] > person2.body.box[1] && hand3.box[1] + hand3.box[3] < person2.body.box[1] + person2.body.box[3]) { + if (person2.hands) + person2.hands.right = hand3; + } + } + } + for (const gesture3 of gestures) { + if (gesture3["face"] !== void 0 && gesture3["face"] === face5.id) + (_a = person2.gestures) == null ? void 0 : _a.push(gesture3); + else if (gesture3["iris"] !== void 0 && gesture3["iris"] === face5.id) + (_b = person2.gestures) == null ? void 0 : _b.push(gesture3); + else if (gesture3["body"] !== void 0 && gesture3["body"] === ((_c = person2.body) == null ? void 0 : _c.id)) + (_d = person2.gestures) == null ? void 0 : _d.push(gesture3); + else if (gesture3["hand"] !== void 0 && gesture3["hand"] === ((_f = (_e = person2.hands) == null ? void 0 : _e.left) == null ? void 0 : _f.id)) + (_g = person2.gestures) == null ? void 0 : _g.push(gesture3); + else if (gesture3["hand"] !== void 0 && gesture3["hand"] === ((_i = (_h = person2.hands) == null ? void 0 : _h.right) == null ? void 0 : _i.id)) + (_j = person2.gestures) == null ? void 0 : _j.push(gesture3); + } + const x = []; + const y = []; + const extractXY = (box6) => { + if (box6 && box6.length === 4) { + x.push(box6[0], box6[0] + box6[2]); + y.push(box6[1], box6[1] + box6[3]); + } + }; + extractXY((_k = person2.face) == null ? void 0 : _k.box); + extractXY((_l = person2.body) == null ? void 0 : _l.box); + extractXY((_n = (_m = person2.hands) == null ? void 0 : _m.left) == null ? void 0 : _n.box); + extractXY((_p = (_o = person2.hands) == null ? void 0 : _o.right) == null ? void 0 : _p.box); + const minX = Math.min(...x); + const minY = Math.min(...y); + person2.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; + if (shape && shape[1] && shape[2]) + person2.boxRaw = [person2.box[0] / shape[2], person2.box[1] / shape[1], person2.box[2] / shape[2], person2.box[3] / shape[1]]; + persons2.push(person2); + } + return persons2; +} + +// src/interpolate.ts +var bufferedResult = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 }; +function calc(newResult) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u; + if (!newResult) + return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 }; + const elapsed = Date.now() - newResult.timestamp; + const bufferedFactor = elapsed < 1e3 ? 8 - Math.log(elapsed + 1) : 1; + bufferedResult.canvas = newResult.canvas; + if (!bufferedResult.body || newResult.body.length !== bufferedResult.body.length) { + bufferedResult.body = JSON.parse(JSON.stringify(newResult.body)); + } else { + for (let i = 0; i < newResult.body.length; i++) { + const box6 = newResult.body[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.body[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor); + const keypoints3 = newResult.body[i].keypoints.map((keypoint, j) => ({ + score: keypoint.score, + part: keypoint.part, + position: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1] + ], + positionRaw: [ + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0], + bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1] + ] + })); + bufferedResult.body[i] = { ...newResult.body[i], box: box6, boxRaw: boxRaw3, keypoints: keypoints3 }; + } + } + if (!bufferedResult.hand || newResult.hand.length !== bufferedResult.hand.length) { + bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand)); + } else { + for (let i = 0; i < newResult.hand.length; i++) { + const box6 = newResult.hand[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.hand[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor); + const keypoints3 = newResult.hand[i].keypoints ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)) : []; + const keys = Object.keys(newResult.hand[i].annotations); + const annotations3 = {}; + for (const key of keys) { + annotations3[key] = newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)); + } + bufferedResult.hand[i] = { ...newResult.hand[i], box: box6, boxRaw: boxRaw3, keypoints: keypoints3, annotations: annotations3 }; + } + } + if (!bufferedResult.face || newResult.face.length !== bufferedResult.face.length) { + bufferedResult.face = JSON.parse(JSON.stringify(newResult.face)); + } else { + for (let i = 0; i < newResult.face.length; i++) { + const box6 = newResult.face[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.face[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor); + const rotation = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } }; + rotation.matrix = (_a = newResult.face[i].rotation) == null ? void 0 : _a.matrix; + rotation.angle = { + roll: ((bufferedFactor - 1) * (((_c = (_b = bufferedResult.face[i].rotation) == null ? void 0 : _b.angle) == null ? void 0 : _c.roll) || 0) + (((_e = (_d = newResult.face[i].rotation) == null ? void 0 : _d.angle) == null ? void 0 : _e.roll) || 0)) / bufferedFactor, + yaw: ((bufferedFactor - 1) * (((_g = (_f = bufferedResult.face[i].rotation) == null ? void 0 : _f.angle) == null ? void 0 : _g.yaw) || 0) + (((_i = (_h = newResult.face[i].rotation) == null ? void 0 : _h.angle) == null ? void 0 : _i.yaw) || 0)) / bufferedFactor, + pitch: ((bufferedFactor - 1) * (((_k = (_j = bufferedResult.face[i].rotation) == null ? void 0 : _j.angle) == null ? void 0 : _k.pitch) || 0) + (((_m = (_l = newResult.face[i].rotation) == null ? void 0 : _l.angle) == null ? void 0 : _m.pitch) || 0)) / bufferedFactor + }; + rotation.gaze = { + bearing: ((bufferedFactor - 1) * (((_o = (_n = bufferedResult.face[i].rotation) == null ? void 0 : _n.gaze) == null ? void 0 : _o.bearing) || 0) + (((_q = (_p = newResult.face[i].rotation) == null ? void 0 : _p.gaze) == null ? void 0 : _q.bearing) || 0)) / bufferedFactor, + strength: ((bufferedFactor - 1) * (((_s = (_r = bufferedResult.face[i].rotation) == null ? void 0 : _r.gaze) == null ? void 0 : _s.strength) || 0) + (((_u = (_t = newResult.face[i].rotation) == null ? void 0 : _t.gaze) == null ? void 0 : _u.strength) || 0)) / bufferedFactor + }; + bufferedResult.face[i] = { ...newResult.face[i], rotation, box: box6, boxRaw: boxRaw3 }; + } + } + if (!bufferedResult.object || newResult.object.length !== bufferedResult.object.length) { + bufferedResult.object = JSON.parse(JSON.stringify(newResult.object)); + } else { + for (let i = 0; i < newResult.object.length; i++) { + const box6 = newResult.object[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor); + const boxRaw3 = newResult.object[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor); + bufferedResult.object[i] = { ...newResult.object[i], box: box6, boxRaw: boxRaw3 }; + } + } + if (newResult.persons) { + const newPersons = newResult.persons; + if (!bufferedResult.persons || newPersons.length !== bufferedResult.persons.length) { + bufferedResult.persons = JSON.parse(JSON.stringify(newPersons)); + } else { + for (let i = 0; i < newPersons.length; i++) { + bufferedResult.persons[i].box = newPersons[i].box.map((box6, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box6) / bufferedFactor); + } + } + } + if (newResult.gesture) + bufferedResult.gesture = newResult.gesture; + if (newResult.performance) + bufferedResult.performance = newResult.performance; + return bufferedResult; +} + +// src/sample.ts +var face3 = ` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -162,7 +11148,8 @@ PQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l c6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1 8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3 ylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY -euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,r5=` +euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`; +var body3 = ` /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA @@ -730,5 +11717,486 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var he="2.1.5";var R0,Z0,F0,M0,T0,w0,s5,X0,a5,i5,x5,y5,l5=class{constructor(A){e0(this,R0,void 0);e0(this,Z0,void 0);e0(this,F0,void 0);e0(this,M0,void 0);e0(this,T0,void 0);e0(this,w0,void 0);this.analyze=(...A)=>{if(!G(this,Z0))return;let t=this.tf.engine().state.numTensors,r=G(this,R0);n0(this,R0,t);let o=t-r;o!==0&&M(...A,o)};e0(this,s5,A=>{if(!G(this,F0))return null;if(!A)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(A instanceof n.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(t){return"backend not loaded"}return null});e0(this,X0,async(A=!1)=>{var t;if(this.config.backend&&this.config.backend.length>0&&A||this.tf.getBackend()!==this.config.backend){let r=L();if(this.state="backend",this.config.backend&&this.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&this.config.debug&&M("running inside web worker"),this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(M("override: backend set to tensorflow while running in browser"),this.config.backend="humangl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="humangl")&&(M("override: backend set to webgl while running in nodejs"),this.config.backend="tensorflow"),this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")M("override: backend set to webgpu but browser does not support webgpu"),this.config.backend="humangl";else{let a=await navigator.gpu.requestAdapter();this.config.debug&&M("enumerated webgpu adapter:",a)}this.config.backend==="humangl"&&ge();let o=Object.keys(this.tf.engine().registryFactory);if(this.config.debug&&M("available backends:",o),o.includes(this.config.backend)||(M(`error: backend ${this.config.backend} not found in registry`),this.config.backend=this.tf.ENV.flags.IS_NODE?"tensorflow":"humangl",M(`override: using backend ${this.config.backend} instead`)),this.config.debug&&M("setting backend:",this.config.backend),this.config.backend==="wasm"){if(this.config.debug&&M("wasm path:",this.config.wasmPath),typeof((t=this.tf)==null?void 0:t.setWasmPaths)!="undefined")this.tf.setWasmPaths(this.config.wasmPath);else throw new Error("Human: WASM backend is not loaded");let a=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),i=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&M(`wasm execution: ${a?"SIMD":"no SIMD"} ${i?"multithreaded":"singlethreaded"}`),this.config.debug&&!a&&M("warning: wasm simd support is not enabled")}try{await this.tf.setBackend(this.config.backend)}catch(a){M("error: cannot set backend:",this.config.backend,a)}}if(this.tf.getBackend()==="webgl"||this.tf.getBackend()==="humangl"){this.tf.ENV.set("CHECK_COMPUTATION_FOR_ERRORS",!1),this.tf.ENV.set("WEBGL_CPU_FORWARD",!0),this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0),this.tf.ENV.set("WEBGL_USE_SHAPES_UNIFORMS",!0),typeof this.config.deallocate!="undefined"&&this.config.deallocate&&(M("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0));let o=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&M(`gl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`)}this.tf.enableProdMode(),await this.tf.ready(),this.performance.backend=Math.trunc(L()-r)}});this.next=A=>jA(A||this.result);e0(this,a5,async A=>{if(this.config.cacheSensitivity===0)return!1;let t=32;if(!A.shape[1]||!A.shape[2])return!1;let r=n.image.resizeBilinear(A,[Math.trunc(A.shape[1]/t),Math.trunc(A.shape[2]/t)]),o=await r.data(),a=0;for(let y=0;y10*this.config.cacheSensitivity?0:i),s});e0(this,i5,async()=>{let A=(o,a="application/octet-stream")=>fetch(`data:${a};base64,${o}`).then(i=>i.blob()),t,r;switch(this.config.warmup){case"face":t=await A(o5);break;case"full":t=await A(r5);break;default:t=null}if(t){let o=await createImageBitmap(t);r=await this.detect(o,this.config),o.close()}return r});e0(this,x5,async()=>new Promise(A=>{let t,r=0;switch(this.config.warmup){case"face":r=256,t="data:image/jpeg;base64,"+o5;break;case"full":case"body":r=1200,t="data:image/jpeg;base64,"+r5;break;default:t=null}let o=new Image;o.onload=async()=>{let a=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");a.width=o.naturalWidth,a.height=o.naturalHeight;let i=a.getContext("2d");i==null||i.drawImage(o,0,0);let s=await this.detect(a,this.config);A(s)},t?o.src=t:A(null)}));e0(this,y5,async()=>{let A=o=>Buffer.from(o,"base64"),t;if(this.config.warmup==="face"&&(t=A(o5)),(this.config.warmup==="body"||this.config.warmup==="full")&&(t=A(r5)),!t)return null;let r;if(typeof n.node!="undefined"){let o=n.node.decodeJpeg(t),a=o.expandDims(0);this.tf.dispose(o),r=await this.detect(a,this.config),this.tf.dispose(a)}else this.config.debug&&M("Warmup tfjs-node not loaded");return r});l5.version=he,Object.defineProperty(this,"version",{value:he}),m5.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n.version_core}/dist/`,this.config=U(m5,A||{}),this.tf=n,this.draw=me,this.state="idle",n0(this,R0,0),n0(this,Z0,!1),n0(this,F0,!1),n0(this,M0,!0),n0(this,w0,0),this.performance={backend:0,load:0,image:0,frames:0,cached:0,changed:0,total:0,draw:0},this.models={face:null,posenet:null,blazepose:null,efficientpose:null,movenet:null,handpose:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,centernet:null,faceres:null,segmentation:null},this.result={face:[],body:[],hand:[],gesture:[],object:[],performance:{},timestamp:0,persons:[]},this.image=t=>g0(t,this.config),this.faceTriangulation=Ne,this.faceUVMap=Oe,this.sysinfo=be(),n0(this,T0,1)}similarity(A,t){return E5(A,t)}segmentation(A,t){return uA(A,t,this.config)}enhance(A){return R5(A)}match(A,t,r=0){return He(A,t,r)}async load(A){this.state="load";let t=L();A&&(this.config=U(this.config,A)),G(this,M0)&&(this.config.debug&&M(`version: ${l5.version}`),this.config.debug&&M(`tfjs version: ${this.tf.version_core}`),this.config.debug&&M("platform:",this.sysinfo.platform),this.config.debug&&M("agent:",this.sysinfo.agent),await G(this,X0).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&M("configuration:",this.config),this.config.debug&&M("tf flags:",this.tf.ENV.flags))),await pA(this),G(this,M0)&&(this.config.debug&&M("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),n0(this,M0,!1));let r=Math.trunc(L()-t);r>(this.performance.load||0)&&(this.performance.load=r)}async detect(A,t){return new Promise(async r=>{this.state="config";let o,a;this.config=U(this.config,t),this.state="check";let i=G(this,s5).call(this,A);i&&(M(i,A),r({error:i}));let s=L();await G(this,X0).call(this),await this.load(),o=L();let y=g0(A,this.config);if(this.performance.image=Math.trunc(L()-o),this.analyze("Get Image:"),this.config.segmentation.enabled&&y&&y.tensor&&(this.analyze("Start Segmentation:"),this.state="run:segmentation",o=L(),await le(y),a=Math.trunc(L()-o),a>0&&(this.performance.segmentation=a),y.canvas&&(n.dispose(y.tensor),y=g0(y.canvas,this.config)),this.analyze("End Segmentation:")),!y||!y.tensor){M("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}o=L(),this.config.skipFrame=await G(this,a5).call(this,y.tensor),this.performance.frames||(this.performance.frames=0),this.performance.cached||(this.performance.cached=0),this.performance.frames++,this.config.skipFrame&&this.performance.cached++,this.performance.changed=Math.trunc(L()-o),this.analyze("Check Changed:");let x=[],l=[],c=[],d=[];this.config.async?(x=this.config.face.enabled?ce(this,y.tensor):[],this.performance.face&&delete this.performance.face):(this.state="run:face",o=L(),x=this.config.face.enabled?await ce(this,y.tensor):[],a=Math.trunc(L()-o),a>0&&(this.performance.face=a)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?V5(y.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")?l=this.config.body.enabled?D5(y.tensor,this.config):[]:this.config.body.modelPath.includes("efficientpose")?l=this.config.body.enabled?Q5(y.tensor,this.config):[]:this.config.body.modelPath.includes("movenet")&&(l=this.config.body.enabled?Ae(y.tensor,this.config):[]),this.performance.body&&delete this.performance.body):(this.state="run:body",o=L(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await V5(y.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")?l=this.config.body.enabled?await D5(y.tensor,this.config):[]:this.config.body.modelPath.includes("efficientpose")?l=this.config.body.enabled?await Q5(y.tensor,this.config):[]:this.config.body.modelPath.includes("movenet")&&(l=this.config.body.enabled?await Ae(y.tensor,this.config):[]),a=Math.trunc(L()-o),a>0&&(this.performance.body=a)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?U5(y.tensor,this.config):[],this.performance.hand&&delete this.performance.hand):(this.state="run:hand",o=L(),c=this.config.hand.enabled?await U5(y.tensor,this.config):[],a=Math.trunc(L()-o),a>0&&(this.performance.hand=a)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(this.config.object.modelPath.includes("nanodet")?d=this.config.object.enabled?re(y.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(d=this.config.object.enabled?xe(y.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(this.state="run:object",o=L(),this.config.object.modelPath.includes("nanodet")?d=this.config.object.enabled?await re(y.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(d=this.config.object.enabled?await xe(y.tensor,this.config):[]),a=Math.trunc(L()-o),a>0&&(this.performance.object=a)),this.analyze("End Object:"),this.config.async&&([x,l,c,d]=await Promise.all([x,l,c,d]));let m=[];this.config.gesture.enabled&&(o=L(),m=[...gA(x),...bA(l),...TA(c),...MA(x)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=Math.trunc(L()-o)),this.performance.total=Math.trunc(L()-s),this.state="idle",this.result={face:x,body:l,hand:c,gesture:m,object:d,performance:this.performance,canvas:y.canvas,timestamp:Date.now(),get persons(){var T;return wA(x,l,c,m,(T=y==null?void 0:y.tensor)==null?void 0:T.shape)}},n.dispose(y.tensor),r(this.result)})}async warmup(A){let t=L();if(A&&(this.config=U(this.config,A)),!this.config.warmup||this.config.warmup==="none")return{error:"null"};let r;typeof createImageBitmap=="function"?r=await G(this,i5).call(this):typeof Image!="undefined"?r=await G(this,x5).call(this):r=await G(this,y5).call(this);let o=L();return this.config.debug&&M("Warmup",this.config.warmup,Math.round(o-t),"ms",r),r}},St=l5;R0=new WeakMap,Z0=new WeakMap,F0=new WeakMap,M0=new WeakMap,T0=new WeakMap,w0=new WeakMap,s5=new WeakMap,X0=new WeakMap,a5=new WeakMap,i5=new WeakMap,x5=new WeakMap,y5=new WeakMap;export{St as Human,St as default}; +2Q==`; + +// package.json +var version2 = "2.1.5"; + +// src/human.ts +var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _lastInputSum, _lastCacheDiff, _sanity, _checkBackend, _skipFrame, _warmupBitmap, _warmupCanvas, _warmupNode; +var Human = class { + constructor(userConfig) { + __privateAdd(this, _numTensors, void 0); + __privateAdd(this, _analyzeMemoryLeaks, void 0); + __privateAdd(this, _checkSanity, void 0); + __privateAdd(this, _firstRun, void 0); + __privateAdd(this, _lastInputSum, void 0); + __privateAdd(this, _lastCacheDiff, void 0); + this.analyze = (...msg) => { + if (!__privateGet(this, _analyzeMemoryLeaks)) + return; + const currentTensors = this.tf.engine().state.numTensors; + const previousTensors = __privateGet(this, _numTensors); + __privateSet(this, _numTensors, currentTensors); + const leaked = currentTensors - previousTensors; + if (leaked !== 0) + log(...msg, leaked); + }; + __privateAdd(this, _sanity, (input) => { + if (!__privateGet(this, _checkSanity)) + return null; + if (!input) + return "input is not defined"; + if (this.tf.ENV.flags.IS_NODE && !(input instanceof tfjs_esm_exports.Tensor)) + return "input must be a tensor"; + try { + this.tf.getBackend(); + } catch (e) { + return "backend not loaded"; + } + return null; + }); + __privateAdd(this, _checkBackend, async (force = false) => { + var _a; + if (this.config.backend && this.config.backend.length > 0 && force || this.tf.getBackend() !== this.config.backend) { + const timeStamp = now(); + this.state = "backend"; + if (this.config.backend && this.config.backend.length > 0) { + if (typeof window === "undefined" && typeof WorkerGlobalScope !== "undefined" && this.config.debug) { + log("running inside web worker"); + } + if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === "tensorflow") { + log("override: backend set to tensorflow while running in browser"); + this.config.backend = "humangl"; + } + if (this.tf.ENV.flags.IS_NODE && (this.config.backend === "webgl" || this.config.backend === "humangl")) { + log("override: backend set to webgl while running in nodejs"); + this.config.backend = "tensorflow"; + } + if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === "webgpu") { + if (typeof navigator === "undefined" || typeof navigator["gpu"] === "undefined") { + log("override: backend set to webgpu but browser does not support webgpu"); + this.config.backend = "humangl"; + } else { + const adapter = await navigator["gpu"].requestAdapter(); + if (this.config.debug) + log("enumerated webgpu adapter:", adapter); + } + } + if (this.config.backend === "humangl") + register(); + const available = Object.keys(this.tf.engine().registryFactory); + if (this.config.debug) + log("available backends:", available); + if (!available.includes(this.config.backend)) { + log(`error: backend ${this.config.backend} not found in registry`); + this.config.backend = this.tf.ENV.flags.IS_NODE ? "tensorflow" : "humangl"; + log(`override: using backend ${this.config.backend} instead`); + } + if (this.config.debug) + log("setting backend:", this.config.backend); + if (this.config.backend === "wasm") { + if (this.config.debug) + log("wasm path:", this.config.wasmPath); + if (typeof ((_a = this.tf) == null ? void 0 : _a.setWasmPaths) !== "undefined") + this.tf.setWasmPaths(this.config.wasmPath); + else + throw new Error("Human: WASM backend is not loaded"); + const simd = await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"); + const mt = await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"); + if (this.config.debug) + log(`wasm execution: ${simd ? "SIMD" : "no SIMD"} ${mt ? "multithreaded" : "singlethreaded"}`); + if (this.config.debug && !simd) + log("warning: wasm simd support is not enabled"); + } + try { + await this.tf.setBackend(this.config.backend); + } catch (err) { + log("error: cannot set backend:", this.config.backend, err); + } + } + if (this.tf.getBackend() === "webgl" || this.tf.getBackend() === "humangl") { + this.tf.ENV.set("CHECK_COMPUTATION_FOR_ERRORS", false); + this.tf.ENV.set("WEBGL_CPU_FORWARD", true); + this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV", true); + this.tf.ENV.set("WEBGL_USE_SHAPES_UNIFORMS", true); + if (typeof this.config["deallocate"] !== "undefined" && this.config["deallocate"]) { + log("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:", true); + this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD", 0); + } + const gl = await this.tf.backend().getGPGPUContext().gl; + if (this.config.debug) + log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); + } + this.tf.enableProdMode(); + await this.tf.ready(); + this.performance.backend = Math.trunc(now() - timeStamp); + } + }); + this.next = (result) => calc(result || this.result); + __privateAdd(this, _skipFrame, async (input) => { + if (this.config.cacheSensitivity === 0) + return false; + const resizeFact = 32; + if (!input.shape[1] || !input.shape[2]) + return false; + const reduced = tfjs_esm_exports.image.resizeBilinear(input, [Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]); + const reducedData = await reduced.data(); + let sum = 0; + for (let i = 0; i < reducedData.length / 3; i++) + sum += reducedData[3 * i + 2]; + reduced.dispose(); + const diff = 100 * (Math.max(sum, __privateGet(this, _lastInputSum)) / Math.min(sum, __privateGet(this, _lastInputSum)) - 1); + __privateSet(this, _lastInputSum, sum); + const skipFrame = diff < Math.max(this.config.cacheSensitivity, __privateGet(this, _lastCacheDiff)); + __privateSet(this, _lastCacheDiff, diff > 10 * this.config.cacheSensitivity ? 0 : diff); + return skipFrame; + }); + __privateAdd(this, _warmupBitmap, async () => { + const b64toBlob = (base64, type = "application/octet-stream") => fetch(`data:${type};base64,${base64}`).then((res2) => res2.blob()); + let blob; + let res; + switch (this.config.warmup) { + case "face": + blob = await b64toBlob(face3); + break; + case "full": + blob = await b64toBlob(body3); + break; + default: + blob = null; + } + if (blob) { + const bitmap = await createImageBitmap(blob); + res = await this.detect(bitmap, this.config); + bitmap.close(); + } + return res; + }); + __privateAdd(this, _warmupCanvas, async () => new Promise((resolve) => { + let src; + let size = 0; + switch (this.config.warmup) { + case "face": + size = 256; + src = "data:image/jpeg;base64," + face3; + break; + case "full": + case "body": + size = 1200; + src = "data:image/jpeg;base64," + body3; + break; + default: + src = null; + } + const img = new Image(); + img.onload = async () => { + const canvas2 = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(size, size) : document.createElement("canvas"); + canvas2.width = img.naturalWidth; + canvas2.height = img.naturalHeight; + const ctx = canvas2.getContext("2d"); + ctx == null ? void 0 : ctx.drawImage(img, 0, 0); + const res = await this.detect(canvas2, this.config); + resolve(res); + }; + if (src) + img.src = src; + else + resolve(null); + })); + __privateAdd(this, _warmupNode, async () => { + const atob = (str) => Buffer.from(str, "base64"); + let img; + if (this.config.warmup === "face") + img = atob(face3); + if (this.config.warmup === "body" || this.config.warmup === "full") + img = atob(body3); + if (!img) + return null; + let res; + if (typeof tfjs_esm_exports["node"] !== "undefined") { + const data2 = tfjs_esm_exports["node"].decodeJpeg(img); + const expanded = data2.expandDims(0); + this.tf.dispose(data2); + res = await this.detect(expanded, this.config); + this.tf.dispose(expanded); + } else { + if (this.config.debug) + log("Warmup tfjs-node not loaded"); + } + return res; + }); + this.version = version2; + Object.defineProperty(this, "version", { value: version2 }); + config.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfjs_esm_exports.version_core}/dist/`; + this.config = mergeDeep(config, userConfig || {}); + this.tf = tfjs_esm_exports; + this.draw = draw_exports; + this.state = "idle"; + __privateSet(this, _numTensors, 0); + __privateSet(this, _analyzeMemoryLeaks, false); + __privateSet(this, _checkSanity, false); + __privateSet(this, _firstRun, true); + __privateSet(this, _lastCacheDiff, 0); + this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 }; + this.models = { + face: null, + posenet: null, + blazepose: null, + efficientpose: null, + movenet: null, + handpose: null, + age: null, + gender: null, + emotion: null, + embedding: null, + nanodet: null, + centernet: null, + faceres: null, + segmentation: null + }; + this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [] }; + this.image = (input) => process4(input, this.config); + this.faceTriangulation = triangulation; + this.faceUVMap = uvmap; + this.sysinfo = info(); + __privateSet(this, _lastInputSum, 1); + } + similarity(embedding1, embedding2) { + return similarity(embedding1, embedding2); + } + segmentation(input, background) { + return process5(input, background, this.config); + } + enhance(input) { + return enhance(input); + } + match(faceEmbedding, db, threshold = 0) { + return match(faceEmbedding, db, threshold); + } + async load(userConfig) { + this.state = "load"; + const timeStamp = now(); + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + if (__privateGet(this, _firstRun)) { + if (this.config.debug) + log(`version: ${this.version}`); + if (this.config.debug) + log(`tfjs version: ${this.tf.version_core}`); + if (this.config.debug) + log("platform:", this.sysinfo.platform); + if (this.config.debug) + log("agent:", this.sysinfo.agent); + await __privateGet(this, _checkBackend).call(this, true); + if (this.tf.ENV.flags.IS_BROWSER) { + if (this.config.debug) + log("configuration:", this.config); + if (this.config.debug) + log("tf flags:", this.tf.ENV.flags); + } + } + await load13(this); + if (__privateGet(this, _firstRun)) { + if (this.config.debug) + log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors"); + __privateSet(this, _firstRun, false); + } + const current = Math.trunc(now() - timeStamp); + if (current > (this.performance.load || 0)) + this.performance.load = current; + } + async detect(input, userConfig) { + return new Promise(async (resolve) => { + this.state = "config"; + let timeStamp; + let elapsedTime; + this.config = mergeDeep(this.config, userConfig); + this.state = "check"; + const error = __privateGet(this, _sanity).call(this, input); + if (error) { + log(error, input); + resolve({ error }); + } + const timeStart = now(); + await __privateGet(this, _checkBackend).call(this); + await this.load(); + timeStamp = now(); + let process6 = process4(input, this.config); + this.performance.image = Math.trunc(now() - timeStamp); + this.analyze("Get Image:"); + if (this.config.segmentation.enabled && process6 && process6.tensor) { + this.analyze("Start Segmentation:"); + this.state = "run:segmentation"; + timeStamp = now(); + await predict11(process6); + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.segmentation = elapsedTime; + if (process6.canvas) { + tfjs_esm_exports.dispose(process6.tensor); + process6 = process4(process6.canvas, this.config); + } + this.analyze("End Segmentation:"); + } + if (!process6 || !process6.tensor) { + log("could not convert input to tensor"); + resolve({ error: "could not convert input to tensor" }); + return; + } + timeStamp = now(); + this.config.skipFrame = await __privateGet(this, _skipFrame).call(this, process6.tensor); + if (!this.performance.frames) + this.performance.frames = 0; + if (!this.performance.cached) + this.performance.cached = 0; + this.performance.frames++; + if (this.config.skipFrame) + this.performance.cached++; + this.performance.changed = Math.trunc(now() - timeStamp); + this.analyze("Check Changed:"); + let faceRes = []; + let bodyRes = []; + let handRes = []; + let objectRes = []; + if (this.config.async) { + faceRes = this.config.face.enabled ? detectFace(this, process6.tensor) : []; + if (this.performance.face) + delete this.performance.face; + } else { + this.state = "run:face"; + timeStamp = now(); + faceRes = this.config.face.enabled ? await detectFace(this, process6.tensor) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.face = elapsedTime; + } + this.analyze("Start Body:"); + if (this.config.async) { + if (this.config.body.modelPath.includes("posenet")) + bodyRes = this.config.body.enabled ? predict4(process6.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("blazepose")) + bodyRes = this.config.body.enabled ? predict6(process6.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("efficientpose")) + bodyRes = this.config.body.enabled ? predict7(process6.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("movenet")) + bodyRes = this.config.body.enabled ? predict8(process6.tensor, this.config) : []; + if (this.performance.body) + delete this.performance.body; + } else { + this.state = "run:body"; + timeStamp = now(); + if (this.config.body.modelPath.includes("posenet")) + bodyRes = this.config.body.enabled ? await predict4(process6.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("blazepose")) + bodyRes = this.config.body.enabled ? await predict6(process6.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("efficientpose")) + bodyRes = this.config.body.enabled ? await predict7(process6.tensor, this.config) : []; + else if (this.config.body.modelPath.includes("movenet")) + bodyRes = this.config.body.enabled ? await predict8(process6.tensor, this.config) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.body = elapsedTime; + } + this.analyze("End Body:"); + this.analyze("Start Hand:"); + if (this.config.async) { + handRes = this.config.hand.enabled ? predict5(process6.tensor, this.config) : []; + if (this.performance.hand) + delete this.performance.hand; + } else { + this.state = "run:hand"; + timeStamp = now(); + handRes = this.config.hand.enabled ? await predict5(process6.tensor, this.config) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.hand = elapsedTime; + } + this.analyze("End Hand:"); + this.analyze("Start Object:"); + if (this.config.async) { + if (this.config.object.modelPath.includes("nanodet")) + objectRes = this.config.object.enabled ? predict9(process6.tensor, this.config) : []; + else if (this.config.object.modelPath.includes("centernet")) + objectRes = this.config.object.enabled ? predict10(process6.tensor, this.config) : []; + if (this.performance.object) + delete this.performance.object; + } else { + this.state = "run:object"; + timeStamp = now(); + if (this.config.object.modelPath.includes("nanodet")) + objectRes = this.config.object.enabled ? await predict9(process6.tensor, this.config) : []; + else if (this.config.object.modelPath.includes("centernet")) + objectRes = this.config.object.enabled ? await predict10(process6.tensor, this.config) : []; + elapsedTime = Math.trunc(now() - timeStamp); + if (elapsedTime > 0) + this.performance.object = elapsedTime; + } + this.analyze("End Object:"); + if (this.config.async) + [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]); + let gestureRes = []; + if (this.config.gesture.enabled) { + timeStamp = now(); + gestureRes = [...face(faceRes), ...body(bodyRes), ...hand(handRes), ...iris(faceRes)]; + if (!this.config.async) + this.performance.gesture = Math.trunc(now() - timeStamp); + else if (this.performance.gesture) + delete this.performance.gesture; + } + this.performance.total = Math.trunc(now() - timeStart); + this.state = "idle"; + this.result = { + face: faceRes, + body: bodyRes, + hand: handRes, + gesture: gestureRes, + object: objectRes, + performance: this.performance, + canvas: process6.canvas, + timestamp: Date.now(), + get persons() { + var _a; + return join2(faceRes, bodyRes, handRes, gestureRes, (_a = process6 == null ? void 0 : process6.tensor) == null ? void 0 : _a.shape); + } + }; + tfjs_esm_exports.dispose(process6.tensor); + resolve(this.result); + }); + } + async warmup(userConfig) { + const t0 = now(); + if (userConfig) + this.config = mergeDeep(this.config, userConfig); + if (!this.config.warmup || this.config.warmup === "none") + return { error: "null" }; + let res; + if (typeof createImageBitmap === "function") + res = await __privateGet(this, _warmupBitmap).call(this); + else if (typeof Image !== "undefined") + res = await __privateGet(this, _warmupCanvas).call(this); + else + res = await __privateGet(this, _warmupNode).call(this); + const t1 = now(); + if (this.config.debug) + log("Warmup", this.config.warmup, Math.round(t1 - t0), "ms", res); + return res; + } +}; +_numTensors = new WeakMap(); +_analyzeMemoryLeaks = new WeakMap(); +_checkSanity = new WeakMap(); +_firstRun = new WeakMap(); +_lastInputSum = new WeakMap(); +_lastCacheDiff = new WeakMap(); +_sanity = new WeakMap(); +_checkBackend = new WeakMap(); +_skipFrame = new WeakMap(); +_warmupBitmap = new WeakMap(); +_warmupCanvas = new WeakMap(); +_warmupNode = new WeakMap(); +export { + Human, + Human as default +}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm-nobundle.js.map b/dist/human.esm-nobundle.js.map index eca7833b..33792710 100644 --- a/dist/human.esm-nobundle.js.map +++ b/dist/human.esm-nobundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/helpers.ts", "../src/config.ts", "../src/sysinfo.ts", "../tfjs/tf-browser.ts", "../src/tfjs/backend.ts", "../src/blazeface/box.ts", "../src/blazeface/util.ts", "../src/blazeface/blazeface.ts", "../src/blazeface/coords.ts", "../src/blazeface/facepipeline.ts", "../src/blazeface/facemesh.ts", "../src/faceres/faceres.ts", "../src/emotion/emotion.ts", "../src/posenet/keypoints.ts", "../src/posenet/utils.ts", "../src/posenet/poses.ts", "../src/posenet/posenet.ts", "../src/handpose/box.ts", "../src/handpose/anchors.ts", "../src/handpose/handdetector.ts", "../src/handpose/util.ts", "../src/handpose/handpipeline.ts", "../src/fingerpose/description.ts", "../src/fingerpose/estimator.ts", "../src/fingerpose/gesture.ts", "../src/fingerpose/gestures.ts", "../src/fingerpose/fingerpose.ts", "../src/handpose/handpose.ts", "../src/blazepose/annotations.ts", "../src/blazepose/blazepose.ts", "../src/efficientpose/efficientpose.ts", "../src/movenet/movenet.ts", "../src/object/labels.ts", "../src/object/nanodet.ts", "../src/object/centernet.ts", "../src/image/imagefx.js", "../src/image/image.ts", "../src/segmentation/segmentation.ts", "../src/models.ts", "../src/face.ts", "../src/gesture/gesture.ts", "../src/draw/draw.ts", "../src/persons.ts", "../src/interpolate.ts", "../src/sample.ts", "../src/human.ts"], - "sourcesContent": ["/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`);\n return path;\n}\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n * @typedef Config\n */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm` */\n wasmPath: string,\n\n /** Print debug statements to console */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n warmup: 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n */\n modelBasePath: string,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n */\n cacheSensitivity: number;\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n */\n skipFrame: boolean;\n\n /** Run input through image filters before inference\n * - image filters run with near-zero latency as they are executed on the GPU\n */\n filter: {\n enabled: boolean,\n /** Resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** Resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** Return processed canvas imagedata in result */\n return: boolean,\n /** Flip input as mirror image */\n flip: boolean,\n /** Range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** Range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** Range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** Range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** Range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** Range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** Image negative */\n negative: boolean,\n /** Image sepia colors */\n sepia: boolean,\n /** Image vintage colors */\n vintage: boolean,\n /** Image kodachrome colors */\n kodachrome: boolean,\n /** Image technicolor colors */\n technicolor: boolean,\n /** Image polaroid camera effect */\n polaroid: boolean,\n /** Range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n },\n // type definition end\n\n /** Controlls gesture detection */\n gesture: {\n enabled: boolean,\n },\n\n /** Controlls and configures all face-specific options:\n * - face detection, face mesh detection, age, gender, emotion detection and face description\n * Parameters:\n * - enabled: true/false\n * - modelPath: path for each of face models\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n * - return: return extracted face as tensor for futher user processing, in which case user is reponsible for manually disposing the tensor\n */\n face: {\n enabled: boolean,\n detector: {\n modelPath: string,\n rotation: boolean,\n maxDetected: number,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n return: boolean,\n },\n mesh: {\n enabled: boolean,\n modelPath: string,\n },\n iris: {\n enabled: boolean,\n modelPath: string,\n },\n description: {\n enabled: boolean,\n modelPath: string,\n skipFrames: number,\n minConfidence: number,\n },\n emotion: {\n enabled: boolean,\n minConfidence: number,\n skipFrames: number,\n modelPath: string,\n },\n },\n\n /** Controlls and configures all body detection specific options\n * - enabled: true/false\n * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n */\n body: {\n enabled: boolean,\n modelPath: string,\n maxDetected: number,\n minConfidence: number,\n skipFrames: number,\n },\n\n /** Controlls and configures all hand detection specific options\n * - enabled: true/false\n * - landmarks: detect hand landmarks or just hand boundary box\n * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n */\n hand: {\n enabled: boolean,\n rotation: boolean,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n landmarks: boolean,\n detector: {\n modelPath: string,\n },\n skeleton: {\n modelPath: string,\n },\n },\n\n /** Controlls and configures all object detection specific options\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n * - minConfidence: minimum score that detection must have to return as valid object\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of detections to return\n */\n object: {\n enabled: boolean,\n modelPath: string,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n skipFrames: number,\n },\n\n /** Controlls and configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n *\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n */\n segmentation: {\n enabled: boolean,\n modelPath: string,\n },\n}\n\nconst config: Config = {\n backend: 'webgl', // select tfjs backend to use, leave empty to use default backend\n // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n modelBasePath: '../models/', // base path for all models\n wasmPath: '', // path for wasm binaries, only used for backend: wasm\n // default set to download from jsdeliv during Human class instantiation\n debug: true, // print additional status messages to console\n async: true, // execute enabled models in parallel\n warmup: 'full', // what to use for human.warmup(), can be 'none', 'face', 'full'\n // warmup pre-initializes all models for faster inference but can take\n // significant time on startup\n // only used for `webgl` and `humangl` backends\n cacheSensitivity: 0.75, // cache sensitivity\n // values 0..1 where 0.01 means reset cache if input changed more than 1%\n // set to 0 to disable caching\n skipFrame: false, // internal & dynamic\n filter: { // run input through image filters before inference\n // image filters run with near-zero latency as they are executed on the GPU\n enabled: true, // enable image pre-processing filters\n width: 0, // resize input width\n height: 0, // resize input height\n // if both width and height are set to 0, there is no resizing\n // if just one is set, second one is scaled automatically\n // if both are set, values are used as-is\n flip: false, // flip input as mirror image\n return: true, // return processed canvas imagedata in result\n brightness: 0, // range: -1 (darken) to 1 (lighten)\n contrast: 0, // range: -1 (reduce contrast) to 1 (increase contrast)\n sharpness: 0, // range: 0 (no sharpening) to 1 (maximum sharpening)\n blur: 0, // range: 0 (no blur) to N (blur radius in pixels)\n saturation: 0, // range: -1 (reduce saturation) to 1 (increase saturation)\n hue: 0, // range: 0 (no change) to 360 (hue rotation in degrees)\n negative: false, // image negative\n sepia: false, // image sepia colors\n vintage: false, // image vintage colors\n kodachrome: false, // image kodachrome colors\n technicolor: false, // image technicolor colors\n polaroid: false, // image polaroid camera effect\n pixelate: 0, // range: 0 (no pixelate) to N (number of pixels to pixelate)\n },\n\n gesture: {\n enabled: true, // enable gesture recognition based on model results\n },\n\n face: {\n enabled: true, // controls if specified modul is enabled\n // face.enabled is required for all face models:\n // detector, mesh, iris, age, gender, emotion\n // (note: module is not loaded until it is required)\n detector: {\n modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n rotation: true, // use best-guess rotated face image or just box with rotation as-is\n // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n // this parameter is not valid in nodejs\n maxDetected: 15, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 15, // how many max frames to go without re-running the face bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated face analysis as the head probably hasn't moved much\n // in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n return: false, // return extracted face as tensor\n // in which case user is reponsible for disposing the tensor\n },\n\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json', // facemesh model, can be absolute path or relative to modelBasePath\n },\n\n iris: {\n enabled: true,\n modelPath: 'iris.json', // face iris model\n // can be either absolute path or relative to modelBasePath\n },\n\n description: {\n enabled: true, // to improve accuracy of face description extraction it is\n // recommended to enable detector.rotation and mesh.enabled\n modelPath: 'faceres.json', // face description model\n // can be either absolute path or relative to modelBasePath\n skipFrames: 11, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n emotion: {\n enabled: true,\n minConfidence: 0.1, // threshold for discarding a prediction\n skipFrames: 17, // how max many frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath\n },\n },\n\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet', 'blazepose', 'efficientpose', 'movenet-lightning', 'movenet-thunder'\n maxDetected: 1, // maximum number of people detected in the input\n // should be set to the minimum number for performance\n // only valid for posenet as other models detects single pose\n minConfidence: 0.2, // threshold for discarding a prediction\n skipFrames: 1, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n},\n\n hand: {\n enabled: true,\n rotation: true, // use best-guess rotated hand image or just box with rotation as-is\n // false means higher performance, but incorrect finger mapping if hand is inverted\n skipFrames: 18, // how many max frames to go without re-running the hand bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated hand skeleton analysis as the hand probably\n // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.8, // threshold for discarding a prediction\n iouThreshold: 0.2, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 1, // maximum number of hands detected in the input\n // should be set to the minimum number for performance\n landmarks: true, // detect hand landmarks or just hand boundary box\n detector: {\n modelPath: 'handdetect.json', // hand detector model, can be absolute path or relative to modelBasePath\n },\n skeleton: {\n modelPath: 'handskeleton.json', // hand skeleton model, can be absolute path or relative to modelBasePath\n },\n },\n\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'mb3-centernet' or 'nanodet'\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 10, // maximum number of objects detected in the input\n skipFrames: 19, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n\n segmentation: {\n enabled: false, // controlls and configures all body segmentation module\n // removes background from input containing person\n // if segmentation is enabled it will run as preprocessing task before any other model\n // alternatively leave it disabled and use it on-demand using human.segmentation method which can\n // remove background or replace it with user-provided background\n modelPath: 'selfie.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'selfie' or 'meet'\n },\n};\nexport { config as defaults };\n", "/**\n * Helper function that returns basic system info\n */\nexport function info(): { platform: string, agent: string } {\n let platform = '';\n let agent = '';\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n platform = (platformMatch && platformMatch[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n agent = navigator.userAgent.replace(raw[0], '');\n if (platform[1]) agent = agent.replace(raw[1], '');\n agent = agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n platform = `${process.platform} ${process.arch}`;\n agent = `NodeJS ${process.version}`;\n }\n return { platform, agent };\n}\n", "/**\n * Creates tfjs bundle used by Human browser build target\n * @external\n */\n\n// get versions of all packages\nimport { version as tfjsVersion } from '@tensorflow/tfjs/package.json';\nimport { version as tfjsCoreVersion } from '@tensorflow/tfjs-core/package.json';\nimport { version as tfjsDataVersion } from '@tensorflow/tfjs-data/package.json';\nimport { version as tfjsLayersVersion } from '@tensorflow/tfjs-layers/package.json';\nimport { version as tfjsConverterVersion } from '@tensorflow/tfjs-converter/package.json';\nimport { version as tfjsBackendCPUVersion } from '@tensorflow/tfjs-backend-cpu/package.json';\nimport { version as tfjsBackendWebGLVersion } from '@tensorflow/tfjs-backend-webgl/package.json';\nimport { version as tfjsBackendWASMVersion } from '@tensorflow/tfjs-backend-wasm/package.json';\n\n// export all from sources\n// requires treeShaking:ignore-annotations due to tfjs misconfiguration\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export all from build\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-webgpu/dist/index.js'; // experimental\n\n// export versions\nexport const version = {\n tfjs: tfjsVersion,\n 'tfjs-core': tfjsCoreVersion,\n 'tfjs-data': tfjsDataVersion,\n 'tfjs-layers': tfjsLayersVersion,\n 'tfjs-converter': tfjsConverterVersion,\n 'tfjs-backend-cpu': tfjsBackendCPUVersion,\n 'tfjs-backend-webgl': tfjsBackendWebGLVersion,\n 'tfjs-backend-wasm': tfjsBackendWASMVersion,\n};\n", "/**\n * Custom TFJS backend for Human based on WebGL\n * Not used by default\n */\n\nimport { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n name: 'humangl',\n priority: 99,\n canvas: null,\n gl: null,\n width: 1024,\n height: 1024,\n extensions: [],\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions() as string[];\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport function register(): void {\n if (!tf.findBackend(config.name)) {\n // log('backend registration:', config.name);\n try {\n config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n } catch (err) {\n log('error: cannot get WebGL2 context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL2 context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n try {\n tf.ENV.set('WEBGL_VERSION', 2);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n log('backend registered:', config.name);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint };\n}\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint, landmarks };\n}\n\nexport const disposeBox = (t) => {\n tf.dispose(t.startPoint);\n tf.dispose(t.endPoint);\n};\n\nexport const createBox = (startEndTensor) => ({\n startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\n */\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport function radToDegrees(rad) {\n return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n\nexport function xyDistanceBetweenPoints(a, b) {\n return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\n\nexport function generateAnchors(inputSize) {\n const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) {\n anchors.push([anchorX, anchorY]);\n }\n }\n }\n }\n return anchors;\n}\n", "import { log, join, mergeDeep } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n const centers = tf.add(boxStarts, anchors);\n const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n const boxSizesNormalized = tf.div(boxSizes, inputSize);\n const centersNormalized = tf.div(centers, inputSize);\n const halfBoxSize = tf.div(boxSizesNormalized, 2);\n const starts = tf.sub(centersNormalized, halfBoxSize);\n const ends = tf.add(centersNormalized, halfBoxSize);\n const startNormalized = tf.mul(starts, inputSize);\n const endNormalized = tf.mul(ends, inputSize);\n const concatAxis = 1;\n return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n model: GraphModel;\n anchorsData: [number, number][];\n anchors: Tensor;\n inputSize: number;\n config: Config;\n\n constructor(model, config: Config) {\n this.model = model;\n this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n this.anchors = tf.tensor2d(this.anchorsData);\n this.inputSize = model.inputs[0].shape[2];\n this.config = config;\n }\n\n async getBoundingBoxes(inputImage: Tensor, userConfig: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n const [batch, boxes, scores] = tf.tidy(() => {\n const resizedImage = tf.image.resizeBilinear(inputImage, [this.inputSize, this.inputSize]);\n const normalizedImage = tf.sub(tf.div(resizedImage, 127.5), 0.5);\n const res = this.model.execute(normalizedImage);\n let batchOut;\n if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n const concat = tf.concat([concat512, concat384], 1);\n batchOut = tf.squeeze(concat, 0);\n } else {\n batchOut = tf.squeeze(res); // when using tfhub model\n }\n const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n const scoresOut = tf.squeeze(tf.sigmoid(logits)); // inside tf.tidy\n return [batchOut, boxesOut, scoresOut];\n });\n\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n const nms = await nmsTensor.array();\n tf.dispose(nmsTensor);\n const annotatedBoxes: Array<{ box: { startPoint: Tensor, endPoint: Tensor }, landmarks: Tensor, anchor: number[], confidence: number }> = [];\n const scoresData = await scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scoresData[nms[i]];\n if (confidence > this.config.face.detector.minConfidence) {\n const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n const localBox = box.createBox(boundingBox);\n tf.dispose(boundingBox);\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.reshape(tf.squeeze(tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1])), [keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n tf.dispose(batch);\n tf.dispose(boxes);\n tf.dispose(scores);\n return {\n boxes: annotatedBoxes,\n scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n };\n }\n}\n\nexport async function load(config: Config) {\n const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n const blazeFace = new BlazeFaceModel(model, config);\n if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n rightEyeIris: [473, 474, 475, 476, 477],\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468 = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468 = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68 = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33 = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7 = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { BlazeFaceModel } from './blazeface';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n const originalIndices = coords.MESH_ANNOTATIONS[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0], newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n storedBoxes: Array<{ startPoint: number[], endPoint: number[], landmarks: Array, confidence: number, faceConfidence?: number }>;\n boundingBoxDetector: BlazeFaceModel; // tf.GraphModel\n meshDetector: GraphModel; // tf.GraphModel\n irisModel: GraphModel; // tf.GraphModel\n boxSize: number;\n meshSize: number;\n irisSize: number;\n irisEnlarge: number;\n skipped: number;\n detectedFaces: number;\n\n constructor(boundingBoxDetector, meshDetector, irisModel) {\n // An array of facial bounding boxes.\n this.storedBoxes = [];\n this.boundingBoxDetector = boundingBoxDetector;\n this.meshDetector = meshDetector;\n this.irisModel = irisModel;\n this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n this.irisEnlarge = 2.3;\n this.skipped = 0;\n this.detectedFaces = 0;\n }\n\n transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n const coordsScaled = rawCoords.map((coord) => ([\n boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n coord[2],\n ]));\n const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n return coordsRotated.map((coord) => ([\n Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n Math.round(coord[2]),\n ]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n getLeftToRightEyeDepthDifference(rawCoords) {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n }\n\n // Returns a box describing a cropped region around the eye fit for passing to the iris model.\n getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n const boxSize = bounding.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / this.meshSize,\n box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n box.endPoint[0] / this.meshSize,\n ]], [0], [this.irisSize, this.irisSize]);\n if (flip && tf.ENV.flags.IS_BROWSER) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n }\n\n // Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\n getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n const eyeRawCoords: Array<[number, number, number]> = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / this.irisSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n }\n\n // The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n // eslint-disable-next-line class-methods-use-this\n getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n }\n\n correctFaceRotation(config, box, input) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n const angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n const rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n const cut = config.face.mesh.enabled\n ? bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize])\n : bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]);\n const face = tf.div(cut, 255);\n tf.dispose(cut);\n tf.dispose(rotatedImage);\n return [angle, rotationMatrix, face];\n }\n\n async augmentIris(rawCoords, face) {\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = this.irisModel.predict(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data(); // inside tf.tidy\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n // So we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n }\n\n async predict(input, config) {\n let useFreshBox = false;\n // run new detector every skipFrames unless we only want box to start with\n let detector;\n if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n detector = await this.boundingBoxDetector.getBoundingBoxes(input, config);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n for (const possible of detector.boxes) {\n const startPoint = await possible.box.startPoint.data();\n const endPoint = await possible.box.endPoint.data();\n const landmarks = await possible.landmarks.array();\n this.storedBoxes.push({ startPoint, endPoint, landmarks, confidence: possible.confidence });\n }\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n\n if (useFreshBox) {\n if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n return null;\n }\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n const enlargedBox = bounding.enlargeBox(scaledBox);\n const squarifiedBox = bounding.squarifyBox(enlargedBox);\n const landmarks = this.storedBoxes[i].landmarks;\n const confidence = this.storedBoxes[i].confidence;\n this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n }\n }\n if (detector && detector.boxes) {\n detector.boxes.forEach((prediction) => {\n tf.dispose(prediction.box.startPoint);\n tf.dispose(prediction.box.endPoint);\n tf.dispose(prediction.landmarks);\n });\n }\n\n const results: Array<{ mesh, box, faceConfidence, boxConfidence, confidence, image }> = [];\n // for (let i = 0; i < this.storedBoxes.length; i++) {\n const newBoxes: Array<{ startPoint: number[]; endPoint: number[]; landmarks: number[]; confidence: number; faceConfidence?: number | undefined; }> = [];\n for (let box of this.storedBoxes) {\n // let box = this.storedBoxes[i]; // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n let face;\n let angle = 0;\n let rotationMatrix;\n\n if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n [angle, rotationMatrix, face] = this.correctFaceRotation(config, box, input);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n const cut = config.face.mesh.enabled\n ? bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize])\n : bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]);\n face = tf.div(cut, 255);\n tf.dispose(cut);\n tf.dispose(clonedImage);\n }\n\n // if we're not going to produce mesh, don't spend time with further processing\n if (!config.face.mesh.enabled) {\n results.push({\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n });\n } else {\n const [contours, confidence, contourCoords] = this.meshDetector.execute(face) as Array; // The first returned tensor represents facial contours which are already included in the coordinates.\n tf.dispose(contours);\n const faceConfidence = (await confidence.data())[0] as number; // inside tf.tidy\n tf.dispose(confidence);\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose(contourCoords);\n tf.dispose(coordsReshaped);\n if (faceConfidence < config.face.detector.minConfidence) {\n // if (!this.storedBoxes[i]) console.log('2', i, this.storedBoxes.length, this.storedBoxes[i], box, this.storedBoxes);\n // this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n box.confidence = faceConfidence; // reset confidence of cached box\n tf.dispose(face);\n } else {\n if (config.face.iris.enabled) rawCoords = await this.augmentIris(rawCoords, face);\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n box = { ...bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5), confidence: box.confidence }; // redefine box with mesh calculated one\n\n // do rotation one more time with mesh keypoints if we want to return perfect image\n if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n [angle, rotationMatrix, face] = this.correctFaceRotation(config, box, input);\n }\n\n results.push({\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n confidence: faceConfidence,\n image: face,\n });\n\n // updated stored cache values\n // this.storedBoxes[i] = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n box = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n }\n }\n newBoxes.push(box);\n }\n\n // results = results.filter((a) => a !== null);\n // remove cache entries for detected boxes on low confidence\n if (config.face.mesh.enabled) this.storedBoxes = newBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "/**\n * FaceMesh & BlazeFace Module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Face } from '../result';\nimport { Config } from '../config';\n\nlet faceModels: [blazeface.BlazeFaceModel | null, GraphModel | null, GraphModel | null] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await facePipeline.predict(input, config);\n const results: Array = [];\n let id = 0;\n for (const prediction of (predictions || [])) {\n if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n const meshRaw = prediction.mesh.map((pt) => [\n pt[0] / (input.shape[2] || 0),\n pt[1] / (input.shape[1] || 0),\n pt[2] / facePipeline.meshSize,\n ]);\n const annotations = {};\n if (prediction.mesh && prediction.mesh.length > 0) {\n for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n }\n const clampedBox: [number, number, number, number] = prediction.box ? [\n Math.trunc(Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.max(0, prediction.box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = prediction.box ? [\n prediction.box.startPoint[0] / (input.shape[2] || 0),\n prediction.box.startPoint[1] / (input.shape[1] || 0),\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0),\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0),\n ] : [0, 0, 0, 0];\n results.push({\n id: id++,\n score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxScore: Math.round(100 * prediction.boxConfidence) / 100,\n faceScore: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n tensor: prediction.image,\n });\n if (prediction.coords) tf.dispose(prediction.coords);\n }\n return results;\n}\n\nexport async function load(config): Promise<[unknown, GraphModel | null, GraphModel | null]> {\n if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n faceModels = await Promise.all([\n (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n ]);\n if (config.face.mesh.enabled) {\n if (!faceModels[1] || !faceModels[1]['modelUrl']) log('load model failed:', config.face.mesh.modelPath);\n else if (config.debug) log('load model:', faceModels[1]['modelUrl']);\n }\n if (config.face.iris.enabled) {\n if (!faceModels[2] || !faceModels[2]['modelUrl']) log('load model failed:', config.face.iris.modelPath);\n else if (config.debug) log('load model:', faceModels[2]['modelUrl']);\n }\n } else if (config.debug) {\n if (faceModels[0]) log('cached model:', faceModels[0].model['modelUrl']);\n if (faceModels[1]) log('cached model:', faceModels[1]['modelUrl']);\n if (faceModels[2]) log('cached model:', faceModels[2]['modelUrl']);\n }\n facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * HSE-FaceRes Module\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst last: Array<{\n age: number,\n gender: string,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config: Config): Promise {\n const modelUrl = join(config.modelBasePath, config.face.description.modelPath);\n if (!model) {\n model = await tf.loadGraphModel(modelUrl) as unknown as GraphModel;\n if (!model) log('load model failed:', config.face.description.modelPath);\n else if (config.debug) log('load model:', modelUrl);\n } else if (config.debug) log('cached model:', modelUrl);\n return model;\n}\n\nexport function similarity(embedding1: Array, embedding2: Array, order = 2): number {\n if (!embedding1 || !embedding2) return 0;\n if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n if (embedding1?.length !== embedding2?.length) return 0;\n // general minkowski distance, euclidean distance is limited case where order is 2\n const distance = 5.0 * embedding1\n .map((_val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n .reduce((sum, now) => (sum + now), 0) // sum all distances\n ** (1 / order); // get root of\n const res = Math.max(0, 100 - distance) / 100.0;\n return res;\n}\n\nexport function match(embedding: Array, db: DB, threshold = 0) {\n let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n for (const f of db) {\n if (f.embedding && f.name) {\n const perc = similarity(embedding, f.embedding);\n if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n }\n }\n return best;\n}\n\nexport function enhance(input): Tensor {\n const image = tf.tidy(() => {\n // input received from detector is already normalized to 0..1\n // input is also assumed to be straightened\n const tensor = input.image || input.tensor || input;\n if (!(tensor instanceof tf.Tensor)) return null;\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n if (!model.inputs[0].shape) return null; // model has no shape so no point continuing\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n\n /*\n // just resize to fit the embedding model instead of cropping\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n */\n\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n\n /*\n // increase image pseudo-contrast 100%\n // (or do it per-channel so mean is done on each channel)\n // (or calculate histogram and do it based on histogram)\n const mean = merge.mean();\n const factor = 2;\n const contrast = merge.sub(mean).mul(factor).add(mean);\n */\n\n /*\n // normalize brightness from 0..1\n // silly way of creating pseudo-hdr of image\n const darken = crop.sub(crop.min());\n const lighten = darken.div(darken.max());\n */\n\n const norm = tf.mul(crop, 255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.description.skipFrames) && config.skipFrame && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const enhanced = enhance(image);\n\n let resT;\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n const gender = await resT.find((t) => t.shape[1] === 1).data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > config.face.description.minConfidence) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100), 1);\n const age = (await argmax.data())[0];\n const all = await resT.find((t) => t.shape[1] === 100).data(); // inside tf.tidy\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n\n const descriptor = await desc.data();\n obj.descriptor = [...descriptor];\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * Emotion Module\n */\n\nimport { log, join } from '../helpers';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.emotion.skipFrames) && config.skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const [red, green, blue] = tf.split(resize, 3, 3);\n tf.dispose(resize);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n tf.dispose(red);\n tf.dispose(green);\n tf.dispose(blue);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n tf.dispose(redNorm);\n tf.dispose(greenNorm);\n tf.dispose(blueNorm);\n const normalize = tf.tidy(() => tf.mul(tf.sub(grayscale, 0.5), 2));\n tf.dispose(grayscale);\n const obj: Array<{ score: number, emotion: string }> = [];\n if (config.face.emotion.enabled) {\n const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n const data = await emotionT.data();\n tf.dispose(emotionT);\n for (let i = 0; i < data.length; i++) {\n if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n }\n obj.sort((a, b) => b.score - a.score);\n }\n tf.dispose(normalize);\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "export const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n", "import * as kpt from './keypoints';\nimport { Body } from '../result';\n\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return kpt.connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i) => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score,\n part,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)],\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight],\n })),\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: Array; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + kpt.count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: kpt.partNames[root.part.id],\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints, box: [number, number, number, number], score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n", "/**\n * PoseNet module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize];\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]];\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = (this.model && this.model.inputs && this.model.inputs[0].shape) ? this.model.inputs[0].shape[2] : 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n return tf.tidy(() => {\n const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n return tf.concat2d([startPoints, endPoints], 1);\n });\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n return tf.tidy(() => {\n const landmarks = tf.add(tf.div(tf.reshape(rawPalmLandmarks, [-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n return tf.mul(landmarks, this.inputSizeTensor);\n });\n }\n\n async getBoxes(input, config) {\n const t: Record = {};\n t.batched = this.model.predict(input) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.scores = tf.tidy(() => tf.squeeze(tf.sigmoid(tf.slice(t.predictions, [0, 0], [-1, 1]))));\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as Array;\n const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];\n for (const index of nms) {\n const palmBox = tf.slice(t.norm, [index, 0], [1, -1]);\n const palmLandmarks = tf.tidy(() => tf.reshape(this.normalizeLandmarks(tf.slice(t.predictions, [index, 5], [1, 14]), index), [-1, 2]));\n hands.push({ box: palmBox, palmLandmarks, confidence: scores[index] });\n // console.log('handdetector:getBoxes', nms.length, index, scores[index], config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence, palmBox.dataSync());\n }\n for (const tensor of Object.keys(t)) tf.dispose(t[tensor]); // dispose all\n return hands;\n }\n\n async estimateHandBounds(input, config): Promise<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }[]> {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => tf.sub(tf.div(tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]), 127.5), 1));\n const predictions = await this.getBoxes(image, config);\n tf.dispose(image);\n const hands: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = await prediction.box.data();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = await prediction.palmLandmarks.array();\n tf.dispose(prediction.box);\n tf.dispose(prediction.palmLandmarks);\n hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n }\n return hands;\n }\n}\n", "export function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport * as detector from './handdetector';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n // @ts-ignore model is not undefined here\n this.inputSize = this.handPoseModel?.inputs[0].shape[2];\n this.storedBoxes = [];\n this.skipped = 0;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = box.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...box.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames unless we only want box to start with\n let boxes;\n\n // console.log('handpipeline:estimateHands:skip criteria', this.skipped, config.hand.skipFrames, !config.hand.landmarks, !config.skipFrame); // should skip hand detector?\n if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n boxes = await this.handDetector.estimateHandBounds(image, config);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{ landmarks?: number[], confidence: number, box: { topLeft: number[], bottomRight: number[] } }> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = box.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && tf.ENV.flags.IS_BROWSER ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, 255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage) as Array;\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n // console.log('handpipeline:estimateHands low', confidence);\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n return hands;\n }\n}\n", "const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nconst FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nconst FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport { Finger, FingerCurl, FingerDirection };\n", "import { Finger, FingerCurl, FingerDirection } from './description';\n\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nexport function estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: Array = [];\n const slopesYZ: Array = [];\n const fingerCurls: Array = [];\n const fingerDirections: Array = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: Array = [];\n const slopeAtYZ: Array = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n", "export default class Gesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n addCurl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n addDirection(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n setWeight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "import { Finger, FingerCurl, FingerDirection } from './description';\nimport Gesture from './gesture';\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new Gesture('thumbs up');\nThumbsUp.addCurl(Finger.thumb, FingerCurl.none, 1.0);\nThumbsUp.addDirection(Finger.thumb, FingerDirection.verticalUp, 1.0);\nThumbsUp.addDirection(Finger.thumb, FingerDirection.diagonalUpLeft, 0.25);\nThumbsUp.addDirection(Finger.thumb, FingerDirection.diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.addCurl(finger, FingerCurl.full, 1.0);\n ThumbsUp.addDirection(finger, FingerDirection.horizontalLeft, 1.0);\n ThumbsUp.addDirection(finger, FingerDirection.horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new Gesture('victory');\nVictory.addCurl(Finger.thumb, FingerCurl.half, 0.5);\nVictory.addCurl(Finger.thumb, FingerCurl.none, 0.5);\nVictory.addDirection(Finger.thumb, FingerDirection.verticalUp, 1.0);\nVictory.addDirection(Finger.thumb, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addCurl(Finger.index, FingerCurl.none, 1.0);\nVictory.addDirection(Finger.index, FingerDirection.verticalUp, 0.75);\nVictory.addDirection(Finger.index, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addCurl(Finger.middle, FingerCurl.none, 1.0);\nVictory.addDirection(Finger.middle, FingerDirection.verticalUp, 1.0);\nVictory.addDirection(Finger.middle, FingerDirection.diagonalUpLeft, 0.75);\nVictory.addCurl(Finger.ring, FingerCurl.full, 1.0);\nVictory.addDirection(Finger.ring, FingerDirection.verticalUp, 0.2);\nVictory.addDirection(Finger.ring, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addDirection(Finger.ring, FingerDirection.horizontalLeft, 0.2);\nVictory.addCurl(Finger.pinky, FingerCurl.full, 1.0);\nVictory.addDirection(Finger.pinky, FingerDirection.verticalUp, 0.2);\nVictory.addDirection(Finger.pinky, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addDirection(Finger.pinky, FingerDirection.horizontalLeft, 0.2);\nVictory.setWeight(Finger.index, 2);\nVictory.setWeight(Finger.middle, 2);\n\nexport default [ThumbsUp, Victory];\n", "// based on \n\nimport * as estimator from './estimator';\nimport { Finger, FingerCurl, FingerDirection } from './description';\nimport Gestures from './gestures';\n\nconst minConfidence = 0.7;\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n const estimatorRes = estimator.estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n // console.log('finger landmarks', landmarks);\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const estimatorRes = estimator.estimate(keypoints);\n const poses: Array<{ name: string, confidence: number }> = [];\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n // console.log('finger poses', poses);\n return poses;\n}\n", "/**\n * HandPose module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport * as fingerPose from '../fingerpose/fingerpose';\nimport { Hand } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n // @ts-ignore landmarks are not undefined\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n\n const keypoints = predictions[i].landmarks as unknown as Array<[number, number, number]>;\n\n let box: [number, number, number, number] = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: [number, number, number, number] = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n box,\n boxRaw,\n keypoints,\n annotations: annotations as Hand['annotations'],\n landmarks: landmarks as Hand['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n ]);\n if (config.hand.enabled) {\n if (!handDetectorModel || !handDetectorModel['modelUrl']) log('load model failed:', config.hand.detector.modelPath);\n else if (config.debug) log('load model:', handDetectorModel['modelUrl']);\n if (!handPoseModel || !handPoseModel['modelUrl']) log('load model failed:', config.hand.skeleton.modelPath);\n else if (config.debug) log('load model:', handPoseModel['modelUrl']);\n }\n } else {\n if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "export const full = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftPalm',\n 'rightPalm',\n 'leftIndex',\n 'rightIndex',\n 'leftPinky',\n 'rightPinky',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n 'leftHeel',\n 'rightHeel',\n 'leftFoot',\n 'rightFoot',\n 'midHip',\n 'forehead',\n 'leftThumb',\n 'leftHand',\n 'rightThumb',\n 'rightHand',\n];\n\nexport const upper = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'left:15',\n 'right:16',\n 'left:17',\n 'right:18',\n 'left:19',\n 'right:20',\n 'left:21',\n 'right:22',\n 'leftChest',\n 'rightChest',\n 'neck',\n 'forehead',\n 'left:27',\n 'right:28',\n 'left:29',\n 'right:30',\n];\n", "/**\n * BlazePose Module\n */\n\n// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Body } from '../result';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n model['width'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[2].size);\n model['height'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[1].size);\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if (!model) return [];\n if (!config.body.enabled) return [];\n const imgSize = { width: (image.shape[2] || 0), height: (image.shape[1] || 0) };\n const resize = tf.image.resizeBilinear(image, [model['width'], model['height']], false);\n const normalize = tf.div(resize, [255.0]);\n tf.dispose(resize);\n const resT = await model.predict(normalize) as Array;\n const findT = resT.find((t) => (t.size === 195 || t.size === 155));\n const points = await findT?.data() || []; // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => tf.dispose(t));\n tf.dispose(normalize);\n const keypoints: Array<{ id, part, position: [number, number, number], positionRaw: [number, number, number], score, presence }> = [];\n const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n keypoints.push({\n id: i,\n part: labels[i],\n position: [\n Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n ],\n positionRaw: [\n points[depth * i + 0] / 255, // return x value normalized to 0..1\n points[depth * i + 1] / 255, // return y value normalized to 0..1\n points[depth * i + 2] + 0, // fix negative zero\n ],\n score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n });\n }\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n const box: [number, number, number, number] = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...x),\n ];\n const boxRaw: [number, number, number, number] = [0, 0, 0, 0]; // not yet implemented\n const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ id: 0, score, box, boxRaw, keypoints }];\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['head', 'neck', 'rightShoulder', 'rightElbow', 'rightWrist', 'chest', 'leftShoulder', 'leftElbow', 'leftWrist', 'pelvis', 'rightHip', 'rightKnee', 'rightAnkle', 'leftHip', 'leftKnee', 'leftAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nfunction max2d(inputs, minScore) {\n const [width, height] = inputs.shape;\n return tf.tidy(() => {\n const mod = (a, b) => tf.sub(a, tf.mul(tf.div(a, tf.scalar(b, 'int32')), tf.scalar(b, 'int32'))); // modulus op implemented in tf\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const newScore = tf.max(reshaped, 0).dataSync()[0]; // get highest score // inside tf.tidy\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coords = tf.argMax(reshaped, 0);\n const x = mod(coords, width).dataSync()[0]; // inside tf.tidy\n const y = tf.div(coords, tf.scalar(width, 'int32')).dataSync()[0]; // inside tf.tidy\n return [x, y, newScore];\n }\n return [0, 0, newScore];\n });\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model.inputs[0].shape) return null;\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const enhance = tf.mul(resize, 2);\n const norm = enhance.sub(1);\n return norm;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tf.dispose(tensor);\n\n if (resT) {\n keypoints.length = 0;\n const squeeze = resT.squeeze();\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = squeeze.unstack(2);\n tf.dispose(squeeze);\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = max2d(stack[id], config.body.minConfidence);\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: bodyParts[id],\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n });\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\nconst keypoints: Array = [];\ntype Person = { id: number, score: number, box: [number, number, number, number], boxRaw: [number, number, number, number], keypoints: Array }\n\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function parseSinglePose(res, config, image) {\n keypoints.length = 0;\n const kpt = res[0][0];\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: bodyParts[id],\n positionRaw: [ // normalized to 0..1\n kpt[id][1],\n kpt[id][0],\n ],\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * kpt[id][1]),\n Math.round((image.shape[1] || 0) * kpt[id][0]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n const persons: Array = [];\n persons.push({ id: 0, score, box, boxRaw, keypoints });\n return persons;\n}\n\nasync function parseMultiPose(res, config, image) {\n const persons: Array = [];\n for (let p = 0; p < res[0].length; p++) {\n const kpt = res[0][p];\n score = Math.round(100 * kpt[51 + 4]) / 100;\n // eslint-disable-next-line no-continue\n if (score < config.body.minConfidence) continue;\n keypoints.length = 0;\n for (let i = 0; i < 17; i++) {\n const partScore = Math.round(100 * kpt[3 * i + 2]) / 100;\n if (partScore > config.body.minConfidence) {\n keypoints.push({\n part: bodyParts[i],\n score: partScore,\n positionRaw: [\n kpt[3 * i + 1],\n kpt[3 * i + 0],\n ],\n position: [\n Math.trunc(kpt[3 * i + 1] * (image.shape[2] || 0)),\n Math.trunc(kpt[3 * i + 0] * (image.shape[1] || 0)),\n ],\n });\n }\n }\n boxRaw = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n persons.push({\n id: p,\n score,\n boxRaw,\n box: [\n Math.trunc(boxRaw[0] * (image.shape[2] || 0)),\n Math.trunc(boxRaw[1] * (image.shape[1] || 0)),\n Math.trunc(boxRaw[2] * (image.shape[2] || 0)),\n Math.trunc(boxRaw[3] * (image.shape[1] || 0)),\n ],\n keypoints,\n });\n }\n return persons;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model.inputs[0].shape) return null;\n let inputSize = model.inputs[0].shape[2];\n if (inputSize === -1) inputSize = 256;\n const resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const cast = tf.cast(resize, 'int32');\n return cast;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tf.dispose(tensor);\n\n if (!resT) resolve([]);\n const res = await resT.array();\n let persons;\n if (resT.shape[2] === 17) persons = await parseSinglePose(res, config, image);\n else if (resT.shape[2] === 56) persons = await parseMultiPose(res, config, image);\n tf.dispose(resT);\n\n resolve(persons);\n });\n}\n", "/**\n * CoCo Labels used by object detection modules\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * NanoDet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n let id = 0;\n let results: Array = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n tf.tidy(async () => { // wrap in tidy to automatically deallocate temp tensors\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\n const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdx = await boxesMax.argMax(2).array(); // what we need is indexes of features with highest scores, not values itself\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > config.object.minConfidence && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n // strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: (box.map((a) => Math.trunc(a))) as [number, number, number, number],\n boxRaw: boxRaw as [number, number, number, number],\n };\n results.push(result);\n }\n }\n }\n });\n }\n // deallocate tensors\n res.forEach((t) => tf.dispose(t));\n\n // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n const nmsScores = results.map((a) => a.score);\n let nmsIdx: Array = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = await nms.data();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n const norm = tf.div(resize, 255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n tf.dispose(norm);\n tf.dispose(resize);\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n tf.dispose(transpose);\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * CenterNet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res: Tensor, inputSize, outputShape, config: Config) {\n if (!res) return [];\n const results: Array = [];\n const detections = await res.array();\n const squeezeT = tf.squeeze(res);\n tf.dispose(res);\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n tf.dispose(squeezeT);\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n const boxesT = tf.squeeze(stackT);\n const scoresT = tf.squeeze(arr[4]);\n const classesT = tf.squeeze(arr[5]);\n arr.forEach((t) => tf.dispose(t));\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n tf.dispose(boxesT);\n tf.dispose(scoresT);\n tf.dispose(classesT);\n const nms = await nmsT.data();\n tf.dispose(nmsT);\n let i = 0;\n for (const id of nms) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n const label = labels[classVal].label;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ] as [number, number, number, number];\n const box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ] as [number, number, number, number];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2], input.shape[1]];\n const resize = tf.image.resizeBilinear(input, [model.inputSize, model.inputSize]);\n const objectT = config.object.enabled ? model.execute(resize, ['tower_0/detections']) : null;\n tf.dispose(resize);\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/*\nWebGLImageFilter by Dominic Szablewski: \n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n const _collect = function (source, prefix, collection) {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n };\n\n const _compile = function (source, type) {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n return shader;\n };\n\n this.uniform = {};\n this.attribute = {};\n const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n this.id = gl.createProgram();\n gl.attachShader(this.id, _vsh);\n gl.attachShader(this.id, _fsh);\n gl.linkProgram(this.id);\n\n if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n gl.useProgram(this.id);\n // Collect attributes\n _collect(vertexSource, 'attribute', this.attribute);\n for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n // Collect uniforms\n _collect(vertexSource, 'uniform', this.uniform);\n _collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n if (!params) params = { };\n let _drawCount = 0;\n let _sourceTexture = null;\n let _lastInChain = false;\n let _currentFramebufferIndex = -1;\n let _tempFramebuffers = [null, null];\n let _filterChain = [];\n let _width = -1;\n let _height = -1;\n let _vertexBuffer = null;\n let _currentProgram = null;\n const _filter = {};\n const _canvas = params.canvas || document.createElement('canvas');\n // key is the shader program source, value is the compiled program\n const _shaderProgramCache = { };\n const DRAW = { INTERMEDIATE: 1 };\n const gl = _canvas.getContext('webgl');\n if (!gl) throw new Error('Filter: getContext() failed');\n\n this.addFilter = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const filter = _filter[name];\n _filterChain.push({ func: filter, args });\n };\n\n this.reset = function () {\n _filterChain = [];\n };\n\n const _resize = function (width, height) {\n // Same width/height? Nothing to do here\n if (width === _width && height === _height) { return; }\n _canvas.width = width;\n _width = width;\n _canvas.height = height;\n _height = height;\n // Create the context if we don't have it yet\n if (!_vertexBuffer) {\n // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n const vertices = new Float32Array([\n -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n ]);\n // eslint-disable-next-line no-unused-expressions\n (_vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer));\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, _width, _height);\n // Delete old temp framebuffers\n _tempFramebuffers = [null, null];\n };\n\n const _createFramebufferTexture = function (width, height) {\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n };\n\n const _getTempFramebuffer = function (index) {\n _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n return _tempFramebuffers[index];\n };\n\n const _draw = function (flags = null) {\n let source = null;\n let target = null;\n let flipY = false;\n // Set up the source\n if (_drawCount === 0) {\n // First draw call - use the source texture\n source = _sourceTexture;\n } else {\n // All following draw calls use the temp buffer last drawn to\n source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n }\n _drawCount++;\n // Set up the target\n if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n // Last filter in our chain - draw directly to the WebGL Canvas. We may\n // also have to flip the image vertically now\n target = null;\n flipY = _drawCount % 2 === 0;\n } else {\n // Intermediate draw call - get a temp buffer to draw to\n _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n }\n // Bind the source and target and draw the two triangles\n gl.bindTexture(gl.TEXTURE_2D, source);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(_currentProgram.uniform.flipY, (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n };\n\n this.apply = function (image) {\n _resize(image.width, image.height);\n _drawCount = 0;\n // Create the texture for the input image if we haven't yet\n if (!_sourceTexture) _sourceTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, _sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n // No filters? Just draw\n if (_filterChain.length === 0) {\n // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n _draw();\n return _canvas;\n }\n for (let i = 0; i < _filterChain.length; i++) {\n _lastInChain = (i === _filterChain.length - 1);\n const f = _filterChain[i];\n f.func.apply(this, f.args || []);\n }\n return _canvas;\n };\n\n const _compileShader = function (fragmentSource) {\n if (_shaderProgramCache[fragmentSource]) {\n _currentProgram = _shaderProgramCache[fragmentSource];\n gl.useProgram(_currentProgram.id);\n return _currentProgram;\n }\n // Compile shaders\n const SHADER = {};\n SHADER.VERTEX_IDENTITY = [\n 'precision highp float;',\n 'attribute vec2 pos;',\n 'attribute vec2 uv;',\n 'varying vec2 vUv;',\n 'uniform float flipY;',\n 'void main(void) {',\n 'vUv = uv;',\n 'gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);',\n '}',\n ].join('\\n');\n SHADER.FRAGMENT_IDENTITY = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'void main(void) {',\n 'gl_FragColor = texture2D(texture, vUv);',\n '}',\n ].join('\\n');\n _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(_currentProgram.attribute.pos);\n gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(_currentProgram.attribute.uv);\n gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n _shaderProgramCache[fragmentSource] = _currentProgram;\n return _currentProgram;\n };\n\n // -------------------------------------------------------------------------\n // Color Matrix Filter\n _filter.colorMatrix = function (matrix) {\n // Create a Float32 Array and normalize the offset component to 0-1\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n // Can we ignore the alpha value? Makes things a bit faster.\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0)\n ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n : _filter.colorMatrix.SHADER.WITH_ALPHA;\n const program = _compileShader(shader);\n gl.uniform1fv(program.uniform.m, m);\n _draw();\n };\n _filter.colorMatrix.SHADER = {};\n _filter.colorMatrix.SHADER.WITH_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];',\n 'gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];',\n '}',\n ].join('\\n');\n _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];',\n 'gl_FragColor.a = c.a;',\n '}',\n ].join('\\n');\n\n _filter.brightness = function (brightness) {\n const b = (brightness || 0) + 1;\n _filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.saturation = function (amount) {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n _filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturate = function () {\n _filter.saturation(-1);\n };\n\n _filter.contrast = function (amount) {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n\n _filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.negative = function () {\n _filter.contrast(-2);\n };\n\n _filter.hue = function (rotation) {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n\n _filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturateLuminance = function () {\n _filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.sepia = function () {\n _filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.brownie = function () {\n _filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.vintagePinhole = function () {\n _filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.kodachrome = function () {\n _filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.technicolor = function () {\n _filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.polaroid = function () {\n _filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.shiftToBGR = function () {\n _filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Convolution Filter\n _filter.convolution = function (matrix) {\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / _width;\n const pixelSizeY = 1 / _height;\n const program = _compileShader(_filter.convolution.SHADER);\n gl.uniform1fv(program.uniform.m, m);\n gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n _draw();\n };\n\n _filter.convolution.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'uniform float m[9];',\n 'void main(void) {',\n 'vec4 c11 = texture2D(texture, vUv - px);', // top left\n 'vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));', // top center\n 'vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));', // top right\n 'vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );', // mid left\n 'vec4 c22 = texture2D(texture, vUv);', // mid center\n 'vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );', // mid right\n 'vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );', // bottom left\n 'vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );', // bottom center\n 'vec4 c33 = texture2D(texture, vUv + px );', // bottom right\n 'gl_FragColor = ',\n 'c11 * m[0] + c12 * m[1] + c22 * m[2] +',\n 'c21 * m[3] + c22 * m[4] + c23 * m[5] +',\n 'c31 * m[6] + c32 * m[7] + c33 * m[8];',\n 'gl_FragColor.a = c22.a;',\n '}',\n ].join('\\n');\n\n _filter.detectEdges = function () {\n _filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n };\n\n _filter.sobelX = function () {\n _filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n };\n\n _filter.sobelY = function () {\n _filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n };\n\n _filter.sharpen = function (amount) {\n const a = amount || 1;\n _filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n };\n\n _filter.emboss = function (size) {\n const s = size || 1;\n _filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Blur Filter\n _filter.blur = function (size) {\n const blurSizeX = (size / 7) / _width;\n const blurSizeY = (size / 7) / _height;\n const program = _compileShader(_filter.blur.SHADER);\n // Vertical\n gl.uniform2f(program.uniform.px, 0, blurSizeY);\n _draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform.px, blurSizeX, 0);\n _draw();\n };\n\n _filter.blur.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv )*0.159576912161;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;',\n '}',\n ].join('\\n');\n\n // -------------------------------------------------------------------------\n // Pixelate Filter\n _filter.pixelate = function (size) {\n const blurSizeX = (size) / _width;\n const blurSizeY = (size) / _height;\n const program = _compileShader(_filter.pixelate.SHADER);\n // Horizontal\n gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n _draw();\n };\n\n _filter.pixelate.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform vec2 size;',\n 'uniform sampler2D texture;',\n 'vec2 pixelate(vec2 coord, vec2 size) {',\n 'return floor( coord / size ) * size;',\n '}',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'vec2 coord = pixelate(vUv, size);',\n 'gl_FragColor += texture2D(texture, coord);',\n '}',\n ].join('\\n');\n}\n", "/**\n * Image Processing module used by Human\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport { Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\ntype Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx: fxImage.GLImageFilter | null;\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport function process(input: Input, config: Config): { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n let tensor;\n if (!input) throw new Error('Human: Input is missing');\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('Human: Input type is not recognized');\n }\n if (input instanceof tf.Tensor) {\n // if input is tensor, use as-is\n if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n } else {\n // check if resizing will be needed\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = targetWidth * originalHeight / originalWidth;\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = targetHeight * originalWidth / originalHeight;\n }\n\n // create our canvas and resize it if needed\n if (config.filter.width > 0) targetWidth = config.filter.width;\n else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n if (config.filter.height > 0) targetHeight = config.filter.height;\n else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n }\n\n // draw input to our canvas\n const ctx = inCanvas.getContext('2d');\n if (input instanceof ImageData) {\n ctx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n ctx.translate(originalWidth, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n // imagefx transforms using gl\n if (config.filter.enabled) {\n if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n // log('created FX filter');\n fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n }\n if (!fx) return { tensor: null, canvas: inCanvas };\n fx.reset();\n fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n if (config.filter.negative) fx.addFilter('negative');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.vintage) fx.addFilter('brownie');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.kodachrome) fx.addFilter('kodachrome');\n if (config.filter.technicolor) fx.addFilter('technicolor');\n if (config.filter.polaroid) fx.addFilter('polaroid');\n if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n fx.apply(inCanvas);\n // read pixel data\n /*\n const gl = outCanvas.getContext('webgl');\n if (gl) {\n const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n // gl returns rbga while we only need rgb, so discarding alpha channel\n // gl returns starting point as lower left, so need to invert vertical\n let i = 0;\n for (let y = outCanvas.height - 1; y >= 0; y--) {\n for (let x = 0; x < outCanvas.width; x++) {\n const index = (x + y * outCanvas.width) * 4;\n pixBuffer[i++] = glBuffer[index + 0];\n pixBuffer[i++] = glBuffer[index + 1];\n pixBuffer[i++] = glBuffer[index + 2];\n }\n }\n outCanvas.data = pixBuffer;\n const shape = [outCanvas.height, outCanvas.width, 3];\n const pixels = tf.tensor3d(outCanvas.data, shape, 'float32');\n tensor = tf.expandDims(pixels, 0);\n tf.dispose(pixels);\n }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image if tensor is not already defined\n if (!tensor) {\n let pixels;\n if (outCanvas.data) { // if we have data, just convert to tensor\n const shape = [outCanvas.height, outCanvas.width, 3];\n pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null;\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we cant use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n pixels = tf.browser ? tf.browser.fromPixels(tempCanvas) : null;\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we cant use canvas as-is as it already has a context, so we do a silly one more canvas and do fromPixels on ImageData instead\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser ? tf.browser.fromPixels(data) : null;\n }\n if (pixels) {\n const casted = tf.cast(pixels, 'float32');\n tensor = tf.expandDims(casted, 0);\n tf.dispose(pixels);\n tf.dispose(casted);\n }\n }\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\ntype Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.segmentation.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.segmentation.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement }): Promise {\n const width = input.tensor?.shape[1] || 0;\n const height = input.tensor?.shape[2] || 0;\n if (!input.tensor) return null;\n if (!model || !model.inputs[0].shape) return null;\n const resizeInput = tf.image.resizeBilinear(input.tensor, [model.inputs[0].shape[1], model.inputs[0].shape[2]], false);\n const norm = tf.div(resizeInput, 255);\n const res = model.predict(norm) as Tensor;\n // meet output: 1,256,256,1\n // selfie output: 1,144,256,2\n tf.dispose(resizeInput);\n tf.dispose(norm);\n\n const squeeze = tf.squeeze(res, 0);\n let resizeOutput;\n if (squeeze.shape[2] === 2) {\n // model meet has two channels for fg and bg\n const softmax = squeeze.softmax();\n const [bg, fg] = tf.unstack(softmax, 2);\n const expand = tf.expandDims(fg, 2);\n const pad = tf.expandDims(expand, 0);\n tf.dispose(softmax);\n tf.dispose(bg);\n tf.dispose(fg);\n // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n const crop = tf.image.cropAndResize(pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n // otherwise run softmax after unstack and use standard resize\n // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n resizeOutput = tf.squeeze(crop, 0);\n tf.dispose(crop);\n tf.dispose(expand);\n tf.dispose(pad);\n } else { // model selfie has a single channel that we can use directly\n resizeOutput = tf.image.resizeBilinear(squeeze, [width, height]);\n }\n\n if (typeof document === 'undefined') return resizeOutput.data(); // we're running in nodejs so return alpha array as-is\n\n const overlay = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas');\n overlay.width = width;\n overlay.height = height;\n if (tf.browser) await tf.browser.toPixels(resizeOutput, overlay);\n tf.dispose(resizeOutput);\n tf.dispose(squeeze);\n tf.dispose(res);\n\n // get alpha channel data\n const alphaCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas'); // need one more copy since input may already have gl context so 2d context fails\n alphaCanvas.width = width;\n alphaCanvas.height = height;\n const ctxAlpha = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctxAlpha.filter = 'blur(8px';\n await ctxAlpha.drawImage(overlay, 0, 0);\n const alpha = ctxAlpha.getImageData(0, 0, width, height).data;\n\n // get original canvas merged with overlay\n const original = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas'); // need one more copy since input may already have gl context so 2d context fails\n original.width = width;\n original.height = height;\n const ctx = original.getContext('2d') as CanvasRenderingContext2D;\n if (input.canvas) await ctx.drawImage(input.canvas, 0, 0);\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n ctx.globalCompositeOperation = 'darken';\n ctx.filter = 'blur(8px)'; // use css filter for bluring, can be done with gaussian blur manually instead\n await ctx.drawImage(overlay, 0, 0);\n ctx.globalCompositeOperation = 'source-over'; // reset\n ctx.filter = 'none'; // reset\n\n input.canvas = original;\n\n return alpha;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config): Promise {\n if (busy) return null;\n busy = true;\n if (!model) await load(config);\n const img = image.process(input, config);\n const alpha = await predict(img);\n tf.dispose(img.tensor);\n\n if (background && alpha) {\n const tmp = image.process(background, config);\n const bg = tmp.canvas;\n tf.dispose(tmp.tensor);\n const fg = img.canvas;\n const fgData = fg.getContext('2d')?.getImageData(0, 0, fg.width, fg.height).data as Uint8ClampedArray;\n\n const c = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(fg.width, fg.height) : document.createElement('canvas');\n c.width = fg.width;\n c.height = fg.height;\n const ctx = c.getContext('2d') as CanvasRenderingContext2D;\n\n ctx.globalCompositeOperation = 'copy'; // reset\n ctx.drawImage(bg, 0, 0, c.width, c.height);\n const cData = ctx.getImageData(0, 0, c.width, c.height) as ImageData;\n for (let i = 0; i < c.width * c.height; i++) { // this should be done with globalCompositeOperation instead of looping through image data\n cData.data[4 * i + 0] = ((255 - alpha[4 * i + 0]) / 255.0 * cData.data[4 * i + 0]) + (alpha[4 * i + 0] / 255.0 * fgData[4 * i + 0]);\n cData.data[4 * i + 1] = ((255 - alpha[4 * i + 1]) / 255.0 * cData.data[4 * i + 1]) + (alpha[4 * i + 1] / 255.0 * fgData[4 * i + 1]);\n cData.data[4 * i + 2] = ((255 - alpha[4 * i + 2]) / 255.0 * cData.data[4 * i + 2]) + (alpha[4 * i + 2] / 255.0 * fgData[4 * i + 2]);\n cData.data[4 * i + 3] = ((255 - alpha[4 * i + 3]) / 255.0 * cData.data[4 * i + 3]) + (alpha[4 * i + 3] / 255.0 * fgData[4 * i + 3]);\n }\n ctx.putImageData(cData, 0, 0);\n img.canvas = c;\n }\n busy = false;\n return img.canvas;\n}\n", "import * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as segmentation from './segmentation/segmentation';\n// import * as agegenderrace from './gear/agegenderrace';\n\n/** Load method preloads all instance.configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n * @param userinstance.config?: {@link instance.config}\n*/\nexport async function load(instance) {\n if (instance.config.async) { // load models concurrently\n [\n instance.models.face,\n instance.models.emotion,\n instance.models.handpose,\n instance.models.posenet,\n instance.models.blazepose,\n instance.models.efficientpose,\n instance.models.movenet,\n instance.models.nanodet,\n instance.models.centernet,\n instance.models.faceres,\n instance.models.segmentation,\n // instance.models.agegenderrace,\n ] = await Promise.all([\n instance.models.face || (instance.config.face.enabled ? facemesh.load(instance.config) : null),\n instance.models.emotion || ((instance.config.face.enabled && instance.config.face.emotion.enabled) ? emotion.load(instance.config) : null),\n instance.models.handpose || (instance.config.hand.enabled ? handpose.load(instance.config) : null),\n instance.models.posenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('posenet') ? posenet.load(instance.config) : null),\n instance.models.blazepose || (instance.config.body.enabled && instance.config.body.modelPath.includes('blazepose') ? blazepose.load(instance.config) : null),\n instance.models.efficientpose || (instance.config.body.enabled && instance.config.body.modelPath.includes('efficientpose') ? efficientpose.load(instance.config) : null),\n instance.models.movenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('movenet') ? movenet.load(instance.config) : null),\n instance.models.nanodet || (instance.config.object.enabled && instance.config.object.modelPath.includes('nanodet') ? nanodet.load(instance.config) : null),\n instance.models.centernet || (instance.config.object.enabled && instance.config.object.modelPath.includes('centernet') ? centernet.load(instance.config) : null),\n instance.models.faceres || ((instance.config.face.enabled && instance.config.face.description.enabled) ? faceres.load(instance.config) : null),\n instance.models.segmentation || (instance.config.segmentation.enabled ? segmentation.load(instance.config) : null),\n // instance.models.agegenderrace || ((instance.config.face.enabled && instance.config.face.agegenderrace.enabled) ? agegenderrace.load(instance.config) : null),\n ]);\n } else { // load models sequentially\n if (instance.config.face.enabled && !instance.models.face) instance.models.face = await facemesh.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.emotion.enabled && !instance.models.emotion) instance.models.emotion = await emotion.load(instance.config);\n if (instance.config.hand.enabled && !instance.models.handpose) instance.models.handpose = await handpose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.posenet && instance.config.body.modelPath.includes('posenet')) instance.models.posenet = await posenet.load(instance.config);\n if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body.modelPath.includes('blazepose')) instance.models.blazepose = await blazepose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body.modelPath.includes('efficientpose')) instance.models.efficientpose = await blazepose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.movenet && instance.config.body.modelPath.includes('movenet')) instance.models.movenet = await movenet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object.modelPath.includes('nanodet')) instance.models.nanodet = await nanodet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.centernet && instance.config.object.modelPath.includes('centernet')) instance.models.centernet = await centernet.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.description.enabled && !instance.models.faceres) instance.models.faceres = await faceres.load(instance.config);\n if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = await segmentation.load(instance.config);\n // if (instance.config.face.enabled && instance.config.face.agegenderrace.enabled && !instance.models.agegenderrace) instance.models.agegenderrace = await agegenderrace.load(instance.config);\n }\n}\n", "/**\n * Module that analyzes person age\n * Obsolete\n */\n\nimport { log, now } from './helpers';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\nimport { Tensor } from './tfjs/types';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nconst calculateGaze = (face): { bearing: number, strength: number } => {\n const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = face.mesh[33][2] > face.mesh[263][2]; // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n\n const eyeDiff = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] ** 2) + (eyeDiff[1] ** 2)); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n\n return { bearing, strength };\n};\n\nconst calculateFaceAngle = (face, imageSize): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v) => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a, b) => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a, b) => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r) => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (isNaN(thetaX)) thetaX = 0;\n if (isNaN(thetaY)) thetaY = 0;\n if (isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n // simple Euler angle calculation based existing 3D mesh\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const meshToEulerAngle = (mesh) => {\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const angle = {\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n // pitch is face move up/down\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face\n // yaw is face turn left/right\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye\n // roll is face lean left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye\n };\n return angle;\n };\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n // make the xyz coordinates proportional, independent of the image/box size\n pt[0] * imageSize[0] / size,\n pt[1] * imageSize[1] / size,\n pt[2],\n ]);\n\n const y_axis = normalize(subVectors(pts[1], pts[0]));\n let x_axis = normalize(subVectors(pts[3], pts[2]));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n\nexport const detectFace = async (parent /* instance of human */, input: Tensor): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp;\n let ageRes;\n let gearRes;\n let genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.performance.face = Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n parent.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Emotion:');\n if (parent.config.async) {\n emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:emotion';\n timeStamp = now();\n emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n parent.performance.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\n\n // run gear, inherits face from blazeface\n /*\n parent.analyze('Start GEAR:');\n if (parent.config.async) {\n gearRes = parent.config.face.agegenderrace.enabled ? agegenderrace.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:gear';\n timeStamp = now();\n gearRes = parent.config.face.agegenderrace.enabled ? await agegenderrace.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n parent.performance.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End GEAR:');\n */\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Description:');\n if (parent.config.async) {\n descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];\n } else {\n parent.state = 'run:description';\n timeStamp = now();\n descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];\n parent.performance.embedding = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Description:');\n\n // if async wait for results\n if (parent.config.async) {\n [ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes]);\n }\n\n parent.analyze('Finish Face:');\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n delete faces[i].annotations.leftEyeIris;\n delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n /* note: average human iris size is 11.7mm */\n ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n : 0;\n\n // optionally return tensor\n const tensor = parent.config.face.detector.return ? tf.squeeze(faces[i].tensor) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n faceRes.push({\n ...faces[i],\n id: i,\n age: descRes.age,\n gender: descRes.gender,\n genderScore: descRes.genderScore,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,\n rotation,\n tensor,\n });\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.performance.face) delete parent.performance.face;\n if (parent.performance.age) delete parent.performance.age;\n if (parent.performance.gender) delete parent.performance.gender;\n if (parent.performance.emotion) delete parent.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * Gesture detection module\n */\n\nimport { Gesture } from '../result';\nimport * as fingerPose from '../fingerpose/fingerpose';\n\n/**\n * @typedef FaceGesture\n */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/**\n * @typedef IrisGesture\n */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/**\n * @typedef BodyGesture\n */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/**\n * @typedef BodyGesture\n */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n }\n return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 0) {\n const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2];\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking left' });\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: number }> = [];\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n const poses = fingerPose.match(res[i]['keypoints']);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n return gestures;\n};\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep, now } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n */\nexport interface DrawOptions {\n color: string,\n labelColor: string,\n shadowColor: string,\n font: string,\n lineHeight: number,\n lineWidth: number,\n pointSize: number,\n roundRect: number,\n drawPoints: boolean,\n drawLabels: boolean,\n drawBoxes: boolean,\n drawPolygons: boolean,\n drawGaze: boolean,\n fillPolygons: boolean,\n useDepth: boolean,\n useCurves: boolean,\n bufferedOutput: boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 14px \"Segoe UI\"',\n lineHeight: 18,\n lineWidth: 4,\n pointSize: 2,\n roundRect: 8,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: true,\n};\n\nconst getCanvasContext = (input) => {\n if (input && input.getContext) return input.getContext('2d');\n throw new Error('Human: Invalid Canvas');\n};\n\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n ctx.beginPath();\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.lineWidth = localOptions.lineWidth;\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n const z = pt[2] || 0;\n ctx.strokeStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport async function gesture(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where: unknown[] = []; // what&where is a record\n let what: unknown[] = []; // what&where is a record\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${who}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n}\n\nexport async function face(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n for (const f of result) {\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.drawBoxes) rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`distance: ${f.iris}`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n }\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = localOptions.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * localOptions.lineHeight + f.box[1];\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n ctx.lineWidth = 1;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n }\n if (localOptions.drawPolygons) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [\n triangulation[i * 3 + 0],\n triangulation[i * 3 + 1],\n triangulation[i * 3 + 2],\n ].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (localOptions.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = 'pink';\n ctx.beginPath();\n\n const leftGaze = [\n f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n ctx.moveTo(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]);\n ctx.lineTo(leftGaze[0], leftGaze[1]);\n\n const rightGaze = [\n f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n ctx.moveTo(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]);\n ctx.lineTo(rightGaze[0], rightGaze[1]);\n\n ctx.stroke();\n }\n }\n }\n }\n}\n\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels) {\n ctx.font = localOptions.font;\n if (result[i].keypoints) {\n for (const pt of result[i].keypoints) {\n ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: [number, number, number?][] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // torso main\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n // leg left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // leg right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // draw all\n }\n }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText('hand', h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n const addHandLabel = (part, title) => {\n if (!part) return;\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['index'], 'index');\n addHandLabel(h.annotations['middle'], 'middle');\n addHandLabel(h.annotations['ring'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palm'], 'palm');\n }\n if (localOptions.drawPolygons) {\n const addHandLine = (part) => {\n if (!part) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['index']);\n addHandLine(h.annotations['middle']);\n addHandLine(h.annotations['ring']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palm);\n }\n }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${h.label} ${Math.round(100 * h.score)}%`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\nexport async function person(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n getCanvasContext(outCanvas);\n const ctx = getCanvasContext(inCanvas);\n ctx.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const timestamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return null;\n\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n // person(inCanvas, result.persons, localOptions);\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n ]);\n /*\n if (!bufferedResult) bufferedResult = result; // first pass\n else if (localOptions.bufferedOutput) calcBuffered(result); // do results interpolation\n else bufferedResult = result; // or just use results as-is\n const promises: Promise[] = [];\n promises.push(face(inCanvas, bufferedResult.face, localOptions));\n promises.push(body(inCanvas, bufferedResult.body, localOptions));\n promises.push(hand(inCanvas, bufferedResult.hand, localOptions));\n promises.push(object(inCanvas, bufferedResult.object, localOptions));\n // promises.push(person(inCanvas, bufferedResult.persons, localOptions));\n promises.push(gesture(inCanvas, result.gesture, localOptions)); // gestures do not have buffering\n // await Promise.all(promises);\n */\n result.performance.draw = Math.trunc(now() - timestamp);\n return promise;\n}\n", "/**\n * Module that analyzes existing results and recombines them into a unified person object\n */\n\nimport { Face, Body, Hand, Gesture, Person } from './result';\n\nexport function join(faces: Array, bodies: Array, hands: Array, gestures: Array, shape: Array | undefined): Array {\n let id = 0;\n const persons: Array = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: Person = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n }\n\n // create new overarching box from all boxes beloning to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: [number, number, number, number] | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face?.box);\n extractXY(person.body?.box);\n extractXY(person.hands?.left?.box);\n extractXY(person.hands?.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape && shape[1] && shape[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Module that interpolates results for smoother animations\n */\n\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from './result';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n\nexport function calc(newResult: Result): Result {\n if (!newResult) return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n // curve fitted: buffer = 8 - ln(delay)\n // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n // - at 50ms delay buffer = ~4.1 => 28% towards live data\n // - at 250ms delay buffer = ~2.5 => 40% towards live data\n // - at 500ms delay buffer = ~1.8 => 55% towards live data\n // - at 750ms delay buffer = ~1.4 => 71% towards live data\n // - at 1sec delay buffer = 1 which means live data is used\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n bufferedResult.canvas = newResult.canvas;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as Body[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor) as [number, number, number, number];\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor) as [number, number, number, number];\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((keypoint, j) => ({\n score: keypoint.score,\n part: keypoint.part,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1],\n ],\n }))) as Array<{ score: number, part: string, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as Hand[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n const keypoints = newResult.hand[i].keypoints ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)) as [number, number, number])\n : [];\n const keys = Object.keys(newResult.hand[i].annotations); // update annotations\n const annotations = {};\n for (const key of keys) {\n annotations[key] = newResult.hand[i].annotations[key]\n .map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor));\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as Hand['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as Face[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as Item[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as Person[]));\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as [number, number, number, number];\n }\n }\n }\n\n // just copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture as Gesture[];\n if (newResult.performance) bufferedResult.performance = newResult.performance;\n\n return bufferedResult;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk\nJyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF\nRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA\nAhEBAxEB/8QAGwABAAIDAQEAAAAAAAAAAAAAAAEDAgQFBgf/xABDEAEAAgECBAMECQIDBgUFAQAA\nAQIDBBEFEiExE0FRBiJhcRQjMkJSgZGhsWLBJDNyFSVTY3OSNEPR4fAHFjWCokT/xAAYAQEAAwEA\nAAAAAAAAAAAAAAAAAQIDBP/EACARAQEBAQADAQEBAQEBAAAAAAABAhEDITFBEjJRIhP/2gAMAwEA\nAhEDEQA/APqYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAKNTq8OkxzfNkisQC8eb1XtRNbzXT4q7eU2nu0MntRq/D8StMccvW29ZmdvgjsTyvZjxOLj\n+s8WLxn8TFPXs6Oj9oct7c14rkxz22nrB2I49KOdTjelmszfmpMeUxv/AA28OqwZ4icWWtt/SUi4\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmdo3nsPNe0Pt\nFh09Z0+DNWL7+9O/7A3eJcZppsV5raI27esvH6jX5ddM25p79Ilo59VbUZOe2Tm/PeGvfPfT2iKR\nPLv1+DO678XmW/a97U6TtOyzTbTF538/T9WjTNecm9a7126tqk3rSYxY5ta1plRZqZNXGjyZcPXl\nmZmsx+qjBrsuO16xM7eXRt04JrdTltk5OWJnfaWf0a2lty5MdZnfzSn+WOHiOutFpjHa9e8bQ2fp\n+alYy462pk7zXbuxjPesbRS0f6ZZV1ET1tErzXFLHo+A+1ddZf6NrI8PJHa1vN6iJi0bxMTHwfOa\nzhzd61v1846utwniM6DUdb3nBaNrVmd9vjC/ZVePYirBqMWppz4rxaPgtEAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAItaK1m09ojcHnvarjM8P0vh49+a/eY8ng9D\nh1fGM1rxjtGPfvbzdbjuTJxHX48cTPNltM/KsS9Dw7S49Jp6UpHaGe2vjz1y9J7LYK13vHWe7bj2\nex1tvM80ekuxW3RnW3Vm6P5jRx8H0+OYmMcb+bapo8GKPdpC6bQwtdHU8JpWkdJ/JweL6e23iU67\nd4dubSqyVi9Zi0bwIs68XGp36TtEq7ZJmZmevzdbifCKWtbJinkt6eTgZPFw32t+sRurbWVzxs1y\nRv6T8V1NZNPtfq0seTm+Kevr+SZuxXjvaPiV8N4viycto9HseG6+uu08W6Rkj7UPmFck1tE1nlmP\nLd3eA8V8HVVi1pjq6Ma/pnqce/ERMTETHaUrKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAADW19+TQ5p/p2bLS4v04Zmt5VjeQeJ4bjnLqsupv+Ka1+ERLv4reTmcNxcuC\nvy3l0qdI2hlr66sT02ot0ZV7qqrInruzrVZLGSZ37JjqgYTG0K5lbaFVhDT1Ub456RPweY4hixWi\neSdpjvD1eWejz3FNHWYtkpvFo9EIseb3tS3SerOms22rfpPqZKzvvHSYUz70TExG6Gdbs2rljeJ/\nMx5L0vEzPaelnOi98c9J2bFNTFpit47+a+PVUvx9T9nOIfT+GV5p3yY/ds67wvsXqpxau+G09Lx+\nr3TqrEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV4ljnLw3U0jvO\nO0fs2lWqyUw6XLkyfYrWZkHldBEV09eveG3Fq1mI3jd4vPrOIaid8G9MP3Y38k6fNrt/rMk9Ou8s\ntfXXn49rGWInuy8SO/k5Gl1E3rG/fzbOe94wTy99mbRvTrMOOvNfJWsesywniukrG/jU6fF43WYN\nTmtEeJtEQ06aSmK2+bNtEd+qfSO17unF9Hmvy1y13XWyVmN4tExLxVK8PmNq5NrT58zawam+m/yc\n0Xj8NpRYSvQZ7xEOdqI3rPozxayNRXe0ct/ON03jmrKB5nV4q1yTO20Obmv4c+cx8HoeI6WZpNoj\nq83niYmYscU0r8aJ6T1n49zeJ+Meqm1drb9J+Kd5p136StGVem9l9TbHxLDFp7W7+sS+q1nesT6w\n+PcAzVjiGHftzQ+v4f8AJpv6On8jH9ZgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAABp8VrW/C9TW0ztOO3b5Nxp8VmI4bn37TWYB8f1HFtTfUfR9FWJmsdZ9I7MtJxDX5s\nd8ta1y0xzteaR2277rcuhycP12SceLxMeWNpjttHwlu8I0mfQ1y+D7k5YmJmY36T36Ka43z/AF1t\ncI1ds+qxVj7/AEej19PCw9HJ4NoK4OIU5Y35YmZdzVTGebVZabx5jJS+Tmns81rNLm1Wrzc9rVw4\nYibbem72mXTTS0w0M3BvEta1bWrM95ie5EanY87wXgNOL6XPfxraXLhra/W28bR/dzYzarBqJxRe\nbzE7Rt5vWU9n8mPHOGmS0Ypnea1naJb+k9ncNLR7u2y/WcxXO4TOoyUrN6zD0FaW5Y3hu49FiwUi\nKxCvLMR0hlW0jn6ukWw3iXjOJzbDlneOj3GaN6zDzfFOH+LE7SRGo83XNSZ2lbG2/WfdlvaT2cy6\nrNFInlrv1mfJ37cK4PwTTxOoidRm2+/2/KFuyMp47XB4LivXiunrH2b2iH2qn2K/J8x4fGDNxTSZ\n9Nh8OviRvTyfT6xtWI+DeXs9MNZubypASqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAOZx6/LoOWPvWiHTcf2hiZ0e8fc2mf1E5+vP/AEeuSd7RC2uKtI6QjHfeINTfwtPf\nJvty9WPfbt/lucP03gxfJf7d/wBoReYpm97zaNeLb4Ims9Nt94auDjem1Wo5PFi1onylS+1o7l8V\nbxvtupjDMdNkYtXS1+Stt+m63xImEJ4xjHER2ZxMUjeUTO3VRmydBbjLJqPi08mbeVOXJPq1sl5Q\nVbkz9+rRy35rxHqzmZlVEe/Ez5LRlW5iyfR6zffaIjq1OSNZps2a21rZInafSPJhxGMl9LStLRWM\nlorM/A4dkrWbYfLZC2W/7K6eubX6b4RzT+W76K8b7G6X62cu3Sten59nsm3j+OXz3/0ANGIAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0OIYfpOHPijvNNo+fdvtXJO18k/\n/OwPFYbz2ls3jx8VqW6xMdWPEdP9D4lkx/dt79flLLHbkxTPwY6nt2512ORTRzE2x4/dpE7cvkme\nE4IrW3hRMxO8THRtU1FKWtvtvK2upx22rzRCtXkqzh2jtF7ZbT122b01ndnpuWuP3Z3+Ky20qDVv\nfauzVy3mejZzNK8dVjqi87KLRLYtXruqvXzkQp7Qoid88R6rcl+WGlW0/Sa22mfhCZOq2x082ix6\njkm822pO8VrPdr4dNObVeDo8XW3uzMbzK+mvxT7szE27cvnu9j7PcNjSaXx8mOIzZevbrEeic5tN\n+SZnpt8J4fHD9HXHO3PPW0x/DeBtJxx29vaAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAKNRim9Z5e89Nl4DzXtVh5babURHrSf7f3ec1+qnDorWrvvt5Pccb0n0zhmWk\nRvevv1+cPE2rGTFNZU26PFfxwa5dVkjelI2772nZnX6bbrEUq3o0d678u8wmuDL2ittvVjXdneeK\ncGv4jpJ6U56+kS7+j118+GLXpakzHaWlp9NNY3tv+bbiYiNoQy1y30uyZJlrWmZnuym6q1iIJnop\nyW2Te8bdWnnypQqzZOadokiIpSZntWN5lrxki19vNRxrUeBwnNNd+fJEY6/OejXLn3Xe/wDp9wyn\nE8uo4lqqxblv7lJ26T6vpD5X7G8QycKzeBMbzMRM1/FH/wA/h9QwZ6ajDXLitvWzRgsAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeL45w+dDrZvWv1OWd4+E+j2jX\n12jx67TWw5Y6T2nzifU+rZ1y9eHwzDYxxEy18+DJodXfT5o96vafWPVbjyxDn1OOzHudbM0rt2UW\niI69mVtRXZq5tREb9VUoy2iIlRbJ0UX1VZ6btTLrI7V6yk62M2oisT1c7JmtkttVMUyZp6x0beDS\nRWOvdKijDimvWd3G9pNRMfRcNfvZOb9Hpb0itJeP47k/3hgjaZnbaP1XxWW3T0movbNS0W645nbf\n0nrMPpXs3xamoxdJiLbe/X1n8Uf3fKsOTw4jbaXo+EarJhtGTHMxeJ6xH7Sti9Zaj6x3HM4NxXFx\nDS1mtoi8dJrv2l011QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAGjxLhODieOIye7kr9m8d4eM4to9RwjPXFa0ZIvG9bR0fQXmPbDFvTTZPOJmEWS/V8bs9R43NxLL\nG8eFbePg1bajU5/s0l1ceKLx1hbjwRE9mOpx0y2uRTSZsm3PMw2aaKtIjo6kYo9EXpET0hVLXxYK\nxC6MZvyx1lFs0RHfaPiCnU12pLyHGNDbUajBekWma2npWN3p8+opa20e9LSyZLxExTlpM+vdOdcZ\na9tPS8MyUvFrzWlI6727u1pYxYrbVmb7x+TQx6au3Nqcl7/0rcmW9axGnwZJj1novmxnZXV0fFp4\nZxLBPgTGK8xzXr5fOH0bFlpmxVyY7Rato3iYfNuG2x56Wrqa8s2jz+7Lu8O12bS6jkwzN6THNNI6\ntvrN68Y4rxlx1vHa0bskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAA4XtTTm0OKfTJ/aXdcL2pyRGjwU362yb7fkJz9eTxxyZJjyltRXzUZK7TFtl9Lbwy06YzrHwa+\nfJFd/wCVt8m0bQ0eS2qzcm+1K/an+zNZFL5M1pjFXeI72ky48eGnPkvNp27+TPU6nHpMfLXaIjpE\nerk5dRMxOfN1mPeisfshW1ne1a1577Y6x5R3U0zze31FOWI6ze0byU098kRlzbxM9qrMlPDpyRMR\nMd5Vt/Ihp5898mWZm1pjftE91uCt7fCI7dWeHDEW3t723l6rslqxWZnasR+SYhFbzhnfxJ2jyeq9\nlcGXWZcmW0zWKxHLaI7794eJx5fpfEKabT8t8l5isddo3l9S4VjrwrRUwzSJt3tav3pdOL6Y6dXD\nj8HFWm+/KsU4NRXPvtWazHquWVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAa+fXYNP9u8b+kdZBsDkZOO135cWOZn4y5Wu4xqctbe9y19Kp4njt6vi+PDm8DFMWybbzPlV\n5PiGtz67UxbNbeKTtWIjaIXYpnwuaftT5tXJT3vmi1pMsrU5qIrG1V1a+5DCa7b9GFbRr5J6Wnbt\nCu+Wmk0m8956z8ZWZNorbfzcbX5rZslazPux3hUt41NTntktObJ13+zX1bek01r4/HzVm0bxPXy/\n+bNfDgjVa2uOY92kdfg6ufJOKvLXtttVVSqbcta2vM7zXtHpLQy5ZtMd+vWd+7Zy3mdJHXra3f0c\nvUarw7zFY5rT2hH1Lavnrgx81p3U49Pk4nE5L35MO/StfNRXR5tXnrS8W67WvfyiPSPi7uLHFK1p\njrtSsbR5Lc4RzsXBaYreP4l45esRD2HD9fnw6evvWvO3Tfr0aGk0U55ra0TFInv6uzgrXFXlx0i0\n77RPlC83Yj+JW7oddqr6vHzTTw9/f6dod+L1t9m0T8pcbFSmPHER3892W0zPuz+jSbVvidkcqmfP\nSel7bekrI4n4dZnPWIrHeYnZee2Wpy8dEaml4npNZblw5qzb8M9JbYgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAABEzFYmZnaI7yCXL1XGa0jJXT0571nbee27DiXEprp8nhbxG20W8\n5cbD0ikfnKO+urTPvjoZdXqctdsmTaPSvRpWmsdZ6yztfaGplvv3lWW1tyRlz1x0vkn7Vo5atTNe\nY0+1o79V2KsZsvX7Ne5mwxnyTNvsx2iGneM/rCdRSuOsTasTt5kRFtpjqmOH4t4nk7estiMNa97R\nHwhna0iuKTEdmGWa4672nZtRele1N59Zlq6vLOSsYorEc07qcW65euzRvtXvPZy52naZ7ujr6fXV\nrWdukREK8+njHgmZmPc67bq6ivVWhxxgxZLztNrT1mZ/SP4VZs0zaOvfp84WUtNsXLvtv3699+rU\nz7+Jtt5qURqMnPpctaR1rMSw4ZoK57eNk6xHaJRh97Ltt7lo5Z+L1HAPZvVauZ2nFTSzMTzeJEz8\nto6xPfvsZntPZ9rXxabmxzefdrv0j1dXh/BcmstW1qxTHHasR3+b0GPhGl+kWmd64dNEVjf73T7X\ny8vy+Ddx6O3iRakxTH5RXrMw1/lX+3Itw2MFIraN48qRHdZi0cUjmmPen9noox1iO0fNzdXEYrTt\nstcmd9aX0bJ+HePmiKTitO8TMLZ1cVjrMfqpz6ys4pjfrPRWZ9rXXptUit6zO+23VyaRHEc05L1/\nw9J9ys/en1ljqdVbwYw452tlnl3jyjzbmmiMeKtYjpEbLeTXPUU8ee/+qjJpsV5rbkrFqzE1tEbT\nDpYNbW21Mnu29fKWna0KbqTdjXXjld0cvQ63ltGHNPSfs2n+HUbS9c2s2UASqAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAOVxPWe99HpP8ArmP4b+r1EabT3yT3iOkesvMVtN7za07zad5l\nXV5GmM9vVfEstvDx0jtaVVMlq+UJ18b5cMRvPeSuK87bUt+i2Z3PtG7zXpjkzXt6R+TXyTMzvM7t\nydHqZ+zhv1+Cv/ZuqvPTHMfOYaTMil1a1K2vHSLTELq2v+KWzThGo84rH5rq8JzedqR+ZeI7WnOS\n34pYTafWXR/2Pln/AMyrKOCWnvmiPyR6O1y9585lhWJvl557Q6eo4T4dYiMvW3b3UanhldHpJtGX\ne09unmjsT7eb1l4trI2t0hsZfrdNO0bzy+nzU20/+NmkzO9esz+TZxWis9dttvPv+Tn21jjaW8zn\n26bTG3mp1M/Wzv3t0jyWXiKZJmsTERaZhXXDbNl8WaztWenxZLstPp5pau8frDtVrNMM5cfTfpMf\n3aunxxbes9d/R09Dp8ebJi09ptFr3jtt2WyrW9wy1Jx132mK+Xq9PotT0iIU19ntLtExa3T47T+q\n6nBaYvsZstZ+cT/LeMnUi0TXffo1s2m8Ws2/OIMWk5Jib5L328rS2t94Sh5TV4ppklpW6PT6rh+P\nNbebTHyas8E081mZy5P2W6OFhjxNTE/hr/LoRO0Kvo9dPqctKzMxEx1la5t3tdnjnMs4noievcrO\nyZjeFF1OSnNV0OG62cn1GWffj7Mz5w05joovzY7xes7TE7w0xrjPeex6Ua+j1UarBFu1o6Wj0lsN\n3JfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrU5o0+nvlt92P3BxuM6nxNRGCs+7Tv8\n2hToxm1r3m9utrTvMsonqyt7XTmcja0u3O6FMfi5t/u0/lzdJM81p9O3zdvHTwsUR5+bfPqOfX1h\ndqV+3O7bs1+T31oqmI3TEM4rvCdkDGIIhlFd2daboS0NXG2bD6bufxXU1vlmu/u4us/N0+L1tTSx\nkr9qk7w89j1FNZMV3jxLzvaJ8mer+LSOZqK2xZotbvljfr/89U453rXt9lse081xZtNjx7TGKu0t\nDHlrevSevaN5Y6+tJ8c7VRNMt63n3ub+6/R54rERMztDYy4a5omclYmfxKcenrjtHLvtPrCnVmdb\neFe3JXmjy6eS/DrMuLVYsta9Mdt++6qLxO+0dEc8UmInr18iUfReHcXrqccb9Z27Q61Lb13eJ9nc\n1Z35rTvE9avY4bTkpG8xEfB05vYxqybc07R281naGMREdoT5JQqy9mply7Q3bV3iXG1eXw7TWSka\nc258t7+tpT5/BjT7MfHqndz12Z+M4lMMKyziUJJiN1WSu9fku23RaOgKNJqbaTU1t9yelo+D0cTE\nxEx1iXmM1Nt3W4PqvFweDaffx9vjDbGvxz+TP66QDRiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAOJxzU73rp6z296zsZMkYsdr2naKxvLyObNOfNfJbvad1dXkaeOdpvsc2yuZVzfbfqybutwu\ns5s8R92J3dvJb3tnO4HSMegtmt3nfZvYp8SZl0z45NfSK7onH1bNcfRFqnUKJr0Y7dVtq7prjEsK\n0XVpEM6028mW20IHK41aPo3J6zs4ODhdcvPnvExFevNXpMOrxi/PlrTee7PLX6Pwa09uaNlKtHg9\ndM3z5d7ReOu02nu0JzZMfblrv5R5uvrcdImZ26T1mYhxs1Os7RH93PZ7axuafNfLitvbaYU3yZYt\nPXs9NwHhui1HBa5LVicsb81onrEuVqNNSuS8Y67dZ6xPZa59Il9uX41vEitImZme3q2Kxbxora0T\nMd/ROSa4Ztkj7c9OafL5LuGYubmyX3iu/TfbdSfVnpvZLT/XZK233+Mbbva1xRXyiPk8pwbH4N6T\nadq5a71n0tD1WDL4tPe6Xr0tDpz8YVnJHWEXYxbqlBedoef4tW0XraO09HdyztSZcbUz43C+ee9b\nSVMaeOfqq7+jGckQ1Yz7+7v2RN/WXPXZPjci2+2yyJaVMuy+uSJlA2d+pNoVRbeDcSxyTE+TDDlt\npdRXLTynrHrDOyiyZeVFnY9TjvXJjres71tG8MnJ4Nqt4tp7T1jrV1nRL1x2cvABKAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAHJ49qfD09cNZ97JPX5PPw2uI6j6Vrsl/ux7tfk1mWr7dOM8iLdm\nvfebREefRsWldw7SxqNbWbR7lPesrn3Vteo7dYjDpMGCvfbeXQ0uLlxRLRxROfUc34p6fCHYrXlr\nEejqrjY8uzCYW7MZjdVKqK9VlaxCYrsnYExBMRMJRPZA8/xPHtmpP9W2xx76vhWOInvt/C7ike7N\nvwzE9kcapGfhlevTaFbFo8RqJ5vy8/RoW09ek0msxHfp3dzNoLzp4zUmZpMbT8HJyYJi20X2n0lh\nZY1li/RaidBF4w2mK3jrHaFGp1lN+tptPp5IjBkid5mIp16TKu0abBPv33vPlM7z+iPdFNcWXU5I\ntkrNce/b1W5db1nTaf3ax9q0fxDW1ebNk2phty1mOu09VOm8W19orEz23j1TwfSeERFuEYMddptW\nd43dvBn21eKJ75KbW+cf/JcTgMxXTb3nbljz+TpcPmc2uyZO1KRtVtGVdi0bx07qJnllsRO6rNTe\nN4XVamsy8mnvPwc3R2jPwe8TPbdlxXNOPSZfhWWpwO85OFzv57qrODkzeHntSe8Sn6Rv0a3EZ218\n8nXekfr1a0ZLVnqx19dWb6demXybOO7lYMvNMdW9S/VVLo0us7tPHdtUtEwJiZU3jq2Jhham8CVG\nPNODNTJXvWd3qcWSubFXJWd4tG8PK3pPd1OB6veLaa89Y61/u2xfxh5c/rsgNHOAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAANLimq+i6O0xPv392rdeZ4rq/pOqnlnelOkIt5F8Z7Wj27I2I6sb25YY\nV1ImY3dbQ08LRc23vZp2j5OJG+XJWle9p2h6HHtbJXFT7OOIpX+7TxT31j5rycdTh+Dpz+XaG/sw\nw18PHWseULN2trBE9UcrJKBhFU7JAQi0dEomegNDUYovM7x3jb5tO1ZvpbaTLtzRExWfWPJ08kbT\nEx5NXWYYyV5omYtHWJieyeDzuizfRs19Jn6TM7Ru1uMcJxZqTkw+5f4ebqa7SV1MR4tdrx2vEfy1\naxqsNOTLjnLXytVXi3Xj8+nmsxTLM16d5npPyUzpekTtSK+U7vS6vQ/SYmK1vWPS1HOn2dvvvvE/\ntDO5XlcO+LbfHSd/W3o6/BdDOXPTnj3Kz38rS6Wm4FNrRyRzTH3p6RH/AKvR8L4dXSzE3jmtHn5I\nmbfqLV+m4dbLSsZInHjr3iI6zLpYaxS01rHuxHRHiT9mv6s67Vj1aqL6326MrWiYa+/Q54BxPaGe\nXRZpj8MquB4+Xg8zPnB7SX30to379GxpK1xcHiKz5IS8xr8PLPixH2bftLTy05o6dHYyVjLhy0t1\nizjZa3pMVv3iO/qz1G2L+NbSajbNyW7xLsY8kTDz+fJXFqKZN4iZnafi6WHL0iYlStI7OO+7axW2\ncrFl7dW9jvE9ULN+J3ZbdFGOy+AYWpEqN7afNXLj+1Wd23KrJVMvCzseh0+auow1yU7WhY4fCdV4\nOadPefcvPuz6S7jol649Tl4AJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV581NPhtkvO0R+4NPi2\nr8DB4dJ9+/7Q83Po2NTqLanNbLfvPaPSFDHV66sZ5ET0hRknyW2lTtMyouz0c8usx2n7s7vScKwx\nzc1vu/y85p+maJh6Th+SOWeveXR4/wDLm8v+nX5mUWa9bbrInolmu5jdTNkxYFk2Isr3TuCzeGMz\n+THdEyDDJO9Ja823rt2XWnya946pGvktDXta0ztWu/ybvLE9dkcoOf4GbJPWK1j49VmLh9JtE33v\nMevb9G7WsW8l1ccREISophiJ2jpDYpijbaOjOuOJ8ujOdqxsgVcsUjaETYvbaFFrgu5lVsm0yUtu\nryg43H5m+GIj1XcJzePoL4pnrWGtxmfchr8JvfHS1622if3QljzTTLes+qrNjrkiYtCzPMxnm095\nYZJ6boS5teB49Tqscza97VtvWvlv8V/FOF34RrIxTM2xXjelp/eHoeA6XnzReY3ivX/0dfivDcfE\n9HbDbaLx1pb0lOs+jO7K8Lis3cN+0NKcd9PmthzV5clJ2mF9J9GHHVL108dm1SznYr/Ft0tuhLb8\nmNohFbMhLWy0mJ3rPXvDvcO1karBG8/WV6Wj+7kWrvDDBlvpdRGSnbzj1hpjX4z8mOx6UYYstc2O\nuSk71tG7Ns5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ2jeXneJ62dVl5KT9VTt8Z9W9xbWclPo+O\nfft9qfSHEU1pv48ftYST23ZTDC/p0YtlVuvVjMbM5+LCZjYGWGdrTPxiHY4ffaf3cjTxz1v6xMS6\nOlty2iXVj/Dk8n+ndrkhnGRo1v8AFdW3RCrZ5uiYsqrboncSu508yjmZRYQt50TfowYTbYGVrKrT\nuTZjvukQnYhMIGVY2ZxPVWyrHVCWzXpVXkt3TE7Va+W4K7X3jv1auTNy3jdba0RZpamfroQN7Hk3\n6wr1GTaN2OOJiu6Mu98NvgDi8Wy74d/yZ8PiPAiO2zU4nb6qIn1bugjfFE/ASp1ke9u15mbbRDZ1\nMb823kx0Ontn1OOkedoJCvT8I03gaKsz9q/WW+isRWsVjtHRKyrhe0XCfpWL6Vgr9fjjrEfeh5fF\nfeH0V5Dj3DPoOo+k4a/U5J6xH3ZZ7z3228evytOk7NvFbo0cdols47bSybt7HbddHVqUs2aW3Qnq\nxVeu8LILR3SlZw3V/R8nhXn6u0/pLuPMXjeHT4Zruf6jLPvR9mZ8/g1xrvpz+TH7HUAaMAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAABRq9VXSYJyW79qx6yvmdo3l5viGs+maqYrO+OnSvx+KLeLZz2te1rZL2v\ned7WneZYWnZl5K72YV1xEyxmeqJljzIEWlVkszvbZp5soN3h2SJz3pP3odCnuWmPRxuERfJrZmtZ\nmtY96fR28kbX3dXj/wAuTyf6bmK+9YX1s0cNtm3Sd4LFY2K23W1s16StiUJW7bp22RW3RluBuruz\nmWEgrmCGWyNkoExKE1QlPmsqRDKeyBjaejWy2W3ttDUyz1QKslvehVqKTNosyyTvELabXptIJpaP\nB39Ia2mz+JGpr51jdZefDx2hzuHZObNq58poJaGtjxJ2+LoaKP8ADRPo5+T3skx5OhpOmC0fBNQ0\n5yTbn+bt8A0u9raiY6RHLVwY62mI6zMvaaHBGn0mPHt1iN5+aYVsACBXqMFNTgviyxvW0bSsAeE1\nmkvw7V2w5Ote9besJx2er4rw2nEdNNekZa9aW9JeQjnxZLYskTW9Z2mJY7zz26fHrrdpbZsY7NGt\nmxjvso1b9NmUwpx33XRO4K7VUTE1nmrvEx1bVo2VWiJE/XY4frY1WPlt0y17x6/FuPM0m+HJGTHO\n1qu9pNVXVYt46Xj7VfRtnXXL5MfzexsALsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHM4jxOMFJphmJv529Dq\nZLfjDjPEIx450+K3v2+1MeUOHSOWFc3nJkmZnf4yujpVlqunOeFpV2nctLCZUXRM7MJtsWlRkv3Q\nky5NmpWt9RnrixVm17TtEQnJabXisRMzPSIew9n+CRoccajURvqLx5/chfOest642OGcIpoOG2w7\nROW9d72+LQvXevyejcPUU5M+SvpLeOataraw2a0dLbLqTtK1G3Es4lVWWUSoldFtmcXUbpidgXzK\nGEW3TuCUSncnsDFMMLSms9EC6J6FpVzbZE5ALy0809ZbFr9GtfrEoFMzuuwz0Ueey3HbaBLDXe7i\ntMOfwWnP9I+NZbuttvhs1uBRtXPb4SDm3iIvf57N7Dbl0VrS5+XrltEd+Z1Jx7cNms9N4TURRw3T\n+PrcO3WszEvZOD7P6aYiMlvu16S7y1QAIAABxOPcLnUY/pWCv1tI96I+9DtgmXl68Biy7/NtUu3+\nO8HnFa2s0tfd75KR5fFyMWTdhrPHVnX9R0cd21S3Rzsdm1iuqs256wrmGcT0RYSx5d047X02SMmO\nesd49YRE9WcdSXhZ2O1p89NRji9J+cei1xMc3wXi+KZj1j1dTTaqmor06WjvWW+ddcu8XK8BZmAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAMMmWmKu952UZ9XFZmuP3revlDTtzWnmvO8q3XGmfHb9ZanV3yxtWeWn7y4es\nvPNtDqZJ6Ts5mppvdl/XXRMyfGvSNlu/RVvtOzLfoipLT1VTKbSpvfogRkvtDVyZOhkyvQcA4Dzz\nXV6yvTvTHMfvK+c9U3rkW+zvA/D21urr789cdZ8vi9KDb45rejl8Rry6iJ/FV1HP4vXbBTJEfYt1\n+UpiHM295bXsqrO9l8QkZ0lZEqqLeyBZHZLGvZkhIndADKJ3TMoqWQMZ6pjsxll2jsCLSrmU2lFY\n36gieyu0LJk3jbsga0wdqzK20QpyztQGprL/AFMrOE05NLkt6qdVWZxNrSe5o9vWBLiUjnzXn0vL\nq555dHt8HOwV928/1z/LpzXxbYccRvzTB+jucOwxh0dI22mY3ltIrHLWIjyjZKyoAAAAACJiJjaY\n3iXleM8InR5J1GniZw2n3oj7s/8Ao9Wi9a3rNbRE1mNpifNFnVs65XhcWTdt47bnFuF24dm8TFEz\np7T0/pn0a+HJux1OOrOux08d1ndqY7tillVkzExLOk7yd4YxGwluViJhE45raL0na0dtlWO0+bZr\n1TKi+2zptZGTamT3b/tLacvJjiY3XaTWdYxZZ6/dtPm1zrv1z78fPcbwC7EAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhkyV\nxUm152iAZWtFazNp2iGhm1Vss8uP3aevnKrNntqLdelI7VRHRnrX/HRjx/tZREVjZXeybW6KbWZt\npCZ6S08tN7Nmbb7zCrJtyoS5145bSx5mWafelr3tsKmS/o08uXyhlly7RPV2+AcBnPNdZrK+53pS\nfP4ytnPVda4y4BwHxOXV6uvu96Unz+MvVxG0bQRG0bR2G0nHLb2gCUDX12LxtFmpHeazt82wT1gH\nmMN4tWs+rcr2aEV8DU5sM/cvO3yb+O0csLUTSdrLphRE8tlkZI7Atr2ZMazDJVKTYSCawi7Ksq7z\n1QERvLK3ZGPrKbyCrbdnMcsbeaa18/RhvvM7oGEwTG0JmYYTIML22a2e28xELM19oURPNO4lOem+\nn3ZY5+prVnMc2GYU4/L4A0a15cNf6rz/AC6fC6+NxCPOuOu/5tHJTbHj+F5/l1+BYumXJMd9o3/d\nMRXYASgAAAAAAABhlxUz4rY8lYtS0bTEvH8R4ffhmo6bzhtPu29Pg9mq1Gnx6rDbFmrzVsizq2df\nzXkMWTeIbNL7tbXaHLwzUctvexWn3bmPL8WFnHVL326VZ91MfFVjvvVlz79kLrcf2m7j7bNHH3bl\nJ2SirLQoy4t1++7G0dBC/RanxI8PJPv18/WG241+alovSdrV6w6mDNGfFF4/OPSW2b1zeTPL1aAs\nzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAVZ9RXBTe3WZ7R6iZOpzZq4ac1p+UermZMl89+a/byj0Ra9815ted59PQ32hlrXXRjH\nDpCLX6ML5NlNsm/ZRqstfdXzbsZt06sLZNvNB1Za8RDWyZdo7q8udq5Mu/mIMt4md2lmy7JzZuWJ\ndHgfBL8RvGo1MTXTxPSPx/8AstJ1XWpIs4BwSdbeNVqq/URPu0n73/s9hEREbRG0QUpWlYrWIisR\ntER5JbSccur2gCUAAAAPM8Sry8Uyz67fwuxbzVPGsE49XGbvF42V4M0TEL33ERnktsxpk3sumK2j\nadmFdPFZ33VS2Mdui2J3UU6LYlFSsN2O5NkCyJ6K7T1TEsbAsxdpReerKkTFGMxvYEz0rsqtbbpC\nb2VT1QEzuwtbaGUxspuJU3neWdKoiu8rq12gCI92YatLcublnzbEz1aOptyZqTuDHLfxN6R0+t5X\nqdJhjBp6UiPLeXl9NSMnEKxHa1+bb8nrlvxUAAAAAAAAAAABTqtNj1eC2LLXeto/R43VabJw/VTh\nydY+7b1h7ho8V4dXiGlmvbJXrS3xRZ1fGv5rzeHN02bEW3cys3xZJx5ImtqztMS3MeTeGFjqlb2O\n8btql3NpbZtYsnSBLeiWfdTjtutid+ghherHS5p0+f3vsX6T8Fkw181d4lMvEWdnHaGnw/UeNh5L\nT7+PpPxbjdyWcvAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAo1Oprgr63ntAmTqdRqK4K9etp7Q5d7Wy2m953lNrWyWm953mVd77R0\nZa1104xxlN9lV8qnJl2a9s3xUXX2ybsJyRDWtl3YWydEC+2VRkzeW6q+T4tbJm+KRdfK1cmWZnlr\nvNp7RC/R6HU8SycmCk7ed57Q9ZwvgOn4fEXtHi5/O9o7fJaZ6z1uRyOEezVstq6jiEbV71xevzer\nrWtKxWsRFY6REeSRrJxz22gCUAAAAAANbX6aNVpL0npMRvWfSXlKamsRMVvXm+EvZXjmpaPWHzfL\noNRjzXicfWJ8phfPxFejx72x7xMzK+sXiNoiXlq+Pi6fWV/VfTNqfLJl/WTg9Pji8R70LqvMV1Gq\nj/zcv6yz+lanzzZP1lWpelTET6S81Gp1P/Gyf90s412rjtnyfqql6asREdWM9+jz9eJ6yP8Az7uh\nodZqMt458tpB1JvEViI3/RhzRt13/R1MNaziiZiJn5K9ZNceKZiIiQcu/WekT+iYrWI3lzdTrs+8\n8uW0fJzcur1Np/zsn6g79phVaIeetqNR/wAXJ/3SwnUaj/i5P+6UD0ldonum161h5mNRqP8Ai5P1\nlNtRqJjacuT9Qd22WN5aGeZyZd/KHJy59RHbLf8AVq31Gp/4uT9ZEvS8Lr/vSs2npzRtL1z53wK+\noza/HW2XJNd99pmX0Rb8VAAAAAAAAAAAAAAcHj/C5yV+l4I9+v24jzj1cLFk8nu5jeNpeW41wmdL\nknU6ev1Vp96sfdn/ANFdTrXG+eq1q5F2LLtbZoY8m8d11bbSydErsYsm+zZrO/zcnBm226uhiyRK\nEtrvCrJDOJTeu8A1MWX6Lqq5N/dnpb5O5ExMbx2cPNTeJb/DM/iYPDtPvY+nzhri/jDy5/W6AuwA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Human main module\n */\n\nimport { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result, Face, Hand, Body, Item, Gesture } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as models from './models';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as persons from './persons';\nimport * as interpolate from './interpolate';\nimport * as sample from './sample';\nimport * as app from '../package.json';\nimport { Tensor, GraphModel } from './tfjs/types';\n\n// export types\nexport { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture, Person } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection\n * @typedef Input Type\n */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message\n * @typedef Error Type\n */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS\n * @external\n */\nexport type TensorFlow = typeof tf;\n\n/**\n * **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig: {@link Config}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n static version: string;\n /** Current configuration\n * - Details: {@link Config}\n */\n config: Config;\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n /** @internal: Instance of current image being processed */\n image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n /** @internal: Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n */\n tf: TensorFlow;\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - options: {@link DrawOptions} global settings for all draw operations, can be overriden for each draw method\n * - face: draw detected faces\n * - body: draw detected people and body parts\n * - hand: draw detected hands and hand parts\n * - canvas: draw processed canvas which is a processed copy of the input\n * - all: meta-function that performs: canvas, face, body, hand\n */\n draw: {\n options: draw.DrawOptions,\n gesture: typeof draw.gesture,\n face: typeof draw.face,\n body: typeof draw.body,\n hand: typeof draw.hand,\n canvas: typeof draw.canvas,\n all: typeof draw.all,\n };\n /** Types used by Human */\n static Config: Config;\n static Result: Result;\n static Face: Face;\n static Hand: Hand;\n static Body: Body;\n static Item: Item;\n static Gesture: Gesture;\n static Person: Gesture\n static DrawOptions: draw.DrawOptions;\n /** @internal: Currently loaded models */\n models: {\n face: [unknown, GraphModel | null, GraphModel | null] | null,\n posenet: GraphModel | null,\n blazepose: GraphModel | null,\n efficientpose: GraphModel | null,\n movenet: GraphModel | null,\n handpose: [GraphModel | null, GraphModel | null] | null,\n age: GraphModel | null,\n gender: GraphModel | null,\n emotion: GraphModel | null,\n embedding: GraphModel | null,\n nanodet: GraphModel | null,\n centernet: GraphModel | null,\n faceres: GraphModel | null,\n segmentation: GraphModel | null,\n };\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: typeof facemesh.uvmap;\n /** Platform and agent information detected by Human */\n sysinfo: { platform: string, agent: string };\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n #firstRun: boolean;\n #lastInputSum: number;\n #lastCacheDiff: number;\n\n // definition end\n\n /**\n * Creates instance of Human library that is futher used for all operations\n * @param userConfig: {@link Config}\n */\n constructor(userConfig?: Config | Record) {\n Human.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n defaults.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n this.config = mergeDeep(defaults, userConfig || {});\n this.tf = tf;\n this.draw = draw;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.#firstRun = true;\n this.#lastCacheDiff = 0;\n this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 };\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n movenet: null,\n handpose: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n segmentation: null,\n };\n this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [] };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.image = (input: Input) => image.process(input, this.config);\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // include platform info\n this.sysinfo = sysinfo.info();\n this.#lastInputSum = 1;\n }\n\n // helper function: measure tensor leak\n /** @hidden */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n }\n\n // quick sanity check on inputs\n /** @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n }\n\n /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n * - Calculation is based on normalized Minkowski distance between\n *\n * @param embedding1: face descriptor as array of numbers\n * @param embedding2: face descriptor as array of numbers\n * @returns similarity: number\n */\n // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\n }\n\n /**\n * Segmentation method takes any input and returns processed canvas with body segmentation\n * Optional parameter background is used to fill the background with specific input\n * Segmentation is not triggered as part of detect process\n *\n * @param input: {@link Input}\n * @param background?: {@link Input}\n * @returns Canvas\n */\n segmentation(input: Input, background?: Input) {\n return segmentation.process(input, background, this.config);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n * @param input: Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /** Math method find best match between provided face descriptor and predefined database of known descriptors\n * @param faceEmbedding: face descriptor previsouly calculated on any face\n * @param db: array of mapping of face descriptors to known values\n * @param threshold: minimum score for matching to be considered in the result\n * @returns best match\n */\n // eslint-disable-next-line class-methods-use-this\n match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n return faceres.match(faceEmbedding, db, threshold);\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n * @param userConfig?: {@link Config}\n */\n async load(userConfig?: Config | Record) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.#firstRun) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${Human.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version_core}`);\n if (this.config.debug) log('platform:', this.sysinfo.platform);\n if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n await this.#checkBackend(true);\n if (this.tf.ENV.flags.IS_BROWSER) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n\n await models.load(this); // actually loads models\n\n if (this.#firstRun) { // print memory stats on first run\n if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n this.#firstRun = false;\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.load as number || 0)) this.performance.load = current;\n }\n\n // check if backend needs initialization if it changed\n /** @hidden */\n #checkBackend = async (force = false) => {\n if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n const timeStamp = now();\n this.state = 'backend';\n /* force backend reload\n if (this.config.backend in tf.engine().registry) {\n const backendFactory = tf.findBackendFactory(this.config.backend);\n tf.removeBackend(this.config.backend);\n tf.registerBackend(this.config.backend, backendFactory);\n } else {\n log('Backend not registred:', this.config.backend);\n }\n */\n\n if (this.config.backend && this.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) {\n log('running inside web worker');\n }\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') {\n log('override: backend set to tensorflow while running in browser');\n this.config.backend = 'humangl';\n }\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) {\n log('override: backend set to webgl while running in nodejs');\n this.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator['gpu'] === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n this.config.backend = 'humangl';\n } else {\n const adapter = await navigator['gpu'].requestAdapter();\n if (this.config.debug) log('enumerated webgpu adapter:', adapter);\n }\n }\n\n // check available backends\n if (this.config.backend === 'humangl') backend.register();\n const available = Object.keys(this.tf.engine().registryFactory);\n if (this.config.debug) log('available backends:', available);\n\n if (!available.includes(this.config.backend)) {\n log(`error: backend ${this.config.backend} not found in registry`);\n this.config.backend = this.tf.ENV.flags.IS_NODE ? 'tensorflow' : 'humangl';\n log(`override: using backend ${this.config.backend} instead`);\n }\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\n // handle wasm\n if (this.config.backend === 'wasm') {\n if (this.config.debug) log('wasm path:', this.config.wasmPath);\n if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n else throw new Error('Human: WASM backend is not loaded');\n const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n // handle humangl\n try {\n await this.tf.setBackend(this.config.backend);\n } catch (err) {\n log('error: cannot set backend:', this.config.backend, err);\n }\n }\n\n // handle webgl & humangl\n if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n this.tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);\n // if (!this.config.object.enabled) this.tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof this.config['deallocate'] !== 'undefined' && this.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n // @ts-ignore getGPGPUContext only exists on WebGL backend\n const gl = await this.tf.backend().getGPGPUContext().gl;\n if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n\n // wait for ready\n this.tf.enableProdMode();\n await this.tf.ready();\n this.performance.backend = Math.trunc(now() - timeStamp);\n }\n }\n\n /**\n * Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result?: {@link Result} optional use specific result set to run interpolation on\n * @returns result: {@link Result}\n */\n next = (result?: Result) => interpolate.calc(result || this.result) as Result;\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input: Tensor) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 32;\n if (!input.shape[1] || !input.shape[2]) return false;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n /*\n const sumT = this.tf.sum(reduced);\n const sum = await sumT.data()[0] as number;\n sumT.dispose();\n */\n // use js loop sum, faster than uploading tensor to gpu calculating and downloading back\n const reducedData = await reduced.data(); // raw image rgb array\n let sum = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum += reducedData[3 * i + 2]; // look only at green value of each pixel\n\n reduced.dispose();\n const diff = 100 * (Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1);\n this.#lastInputSum = sum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 10 * this.config.cacheSensitivity ? 0 : diff;\n // console.log('skipFrame', skipFrame, this.config.cacheSensitivity, diff);\n return skipFrame;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input: Input\n * @param userConfig?: {@link Config}\n * @returns result: {@link Result}\n */\n async detect(input: Input, userConfig?: Config | Record): Promise {\n // detection happens inside a promise\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n let elapsedTime;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n resolve({ error });\n }\n\n const timeStart = now();\n\n // configure backend\n await this.#checkBackend();\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n let process = image.process(input, this.config);\n this.performance.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n // run segmentation preprocessing\n if (this.config.segmentation.enabled && process && process.tensor) {\n this.analyze('Start Segmentation:');\n this.state = 'run:segmentation';\n timeStamp = now();\n await segmentation.predict(process);\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.segmentation = elapsedTime;\n if (process.canvas) {\n // replace input\n tf.dispose(process.tensor);\n process = image.process(process.canvas, this.config);\n }\n this.analyze('End Segmentation:');\n }\n\n if (!process || !process.tensor) {\n log('could not convert input to tensor');\n resolve({ error: 'could not convert input to tensor' });\n return;\n }\n\n timeStamp = now();\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.performance.frames) this.performance.frames = 0;\n if (!this.performance.cached) this.performance.cached = 0;\n (this.performance.frames as number)++;\n if (this.config.skipFrame) this.performance.cached++;\n this.performance.changed = Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: Face[] | Promise | never[] = [];\n let bodyRes: Body[] | Promise | never[] = [];\n let handRes: Hand[] | Promise | never[] = [];\n let objectRes: Item[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.face = elapsedTime;\n }\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n if (this.config.async) {\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(process.tensor, this.config) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n this.state = 'run:body';\n timeStamp = now();\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.body = elapsedTime;\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n if (this.config.async) {\n handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n this.state = 'run:hand';\n timeStamp = now();\n handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.hand = elapsedTime;\n }\n this.analyze('End Hand:');\n\n // run nanodet\n this.analyze('Start Object:');\n if (this.config.async) {\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n this.state = 'run:object';\n timeStamp = now();\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.object = elapsedTime;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n let gestureRes: Gesture[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n if (!this.config.async) this.performance.gesture = Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n this.result = {\n face: faceRes as Face[],\n body: bodyRes as Body[],\n hand: handRes as Hand[],\n gesture: gestureRes,\n object: objectRes as Item[],\n performance: this.performance,\n canvas: process.canvas,\n timestamp: Date.now(),\n get persons() { return persons.join(faceRes as Face[], bodyRes as Body[], handRes as Hand[], gestureRes, process?.tensor?.shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(process.tensor);\n\n // log('Result:', result);\n resolve(this.result);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (this.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await this.detect(bitmap, this.config);\n bitmap.close();\n }\n return res;\n }\n\n /** @hidden */\n #warmupCanvas = async () => new Promise((resolve) => {\n let src;\n let size = 0;\n switch (this.config.warmup) {\n case 'face':\n size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n const img = new Image();\n img.onload = async () => {\n const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const res = await this.detect(canvas, this.config);\n resolve(res);\n };\n if (src) img.src = src;\n else resolve(null);\n });\n\n /** @hidden */\n #warmupNode = async () => {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (this.config.warmup === 'face') img = atob(sample.face);\n if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n if (!img) return null;\n let res;\n if (typeof tf['node'] !== 'undefined') {\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n this.tf.dispose(data);\n // log('Input:', expanded);\n res = await this.detect(expanded, this.config);\n this.tf.dispose(expanded);\n } else {\n if (this.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await this.detect(input, this.config);\n */\n }\n return res;\n }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig?: Config\n */\n async warmup(userConfig?: Config | Record): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n let res;\n if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n else res = await this.#warmupNode();\n const t1 = now();\n if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n return res;\n }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"], - "mappings": "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pB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,iBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,iBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,cAAgB,kBACjB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,mBAGT,GAAS,CACpB,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,EACtJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GACrJ,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAC7I,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAClJ,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GACrJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GACpJ,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GACjJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAC/I,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GACtJ,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAClJ,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACnJ,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,IAClJ,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GACnJ,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAClJ,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAChJ,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IACpJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GACrJ,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GACpJ,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EACpJ,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAC9I,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAC9I,IAAK,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK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,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,C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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kEA0JP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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", + "sourcesContent": ["/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`);\n return path;\n}\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n * @typedef Config\n */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm` */\n wasmPath: string,\n\n /** Print debug statements to console */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n warmup: 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n */\n modelBasePath: string,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n */\n cacheSensitivity: number;\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n */\n skipFrame: boolean;\n\n /** Run input through image filters before inference\n * - image filters run with near-zero latency as they are executed on the GPU\n */\n filter: {\n enabled: boolean,\n /** Resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** Resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** Return processed canvas imagedata in result */\n return: boolean,\n /** Flip input as mirror image */\n flip: boolean,\n /** Range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** Range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** Range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** Range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** Range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** Range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** Image negative */\n negative: boolean,\n /** Image sepia colors */\n sepia: boolean,\n /** Image vintage colors */\n vintage: boolean,\n /** Image kodachrome colors */\n kodachrome: boolean,\n /** Image technicolor colors */\n technicolor: boolean,\n /** Image polaroid camera effect */\n polaroid: boolean,\n /** Range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n },\n // type definition end\n\n /** Controlls gesture detection */\n gesture: {\n enabled: boolean,\n },\n\n /** Controlls and configures all face-specific options:\n * - face detection, face mesh detection, age, gender, emotion detection and face description\n * Parameters:\n * - enabled: true/false\n * - modelPath: path for each of face models\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n * - return: return extracted face as tensor for futher user processing, in which case user is reponsible for manually disposing the tensor\n */\n face: {\n enabled: boolean,\n detector: {\n modelPath: string,\n rotation: boolean,\n maxDetected: number,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n return: boolean,\n },\n mesh: {\n enabled: boolean,\n modelPath: string,\n },\n iris: {\n enabled: boolean,\n modelPath: string,\n },\n description: {\n enabled: boolean,\n modelPath: string,\n skipFrames: number,\n minConfidence: number,\n },\n emotion: {\n enabled: boolean,\n minConfidence: number,\n skipFrames: number,\n modelPath: string,\n },\n },\n\n /** Controlls and configures all body detection specific options\n * - enabled: true/false\n * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n */\n body: {\n enabled: boolean,\n modelPath: string,\n maxDetected: number,\n minConfidence: number,\n skipFrames: number,\n },\n\n /** Controlls and configures all hand detection specific options\n * - enabled: true/false\n * - landmarks: detect hand landmarks or just hand boundary box\n * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n */\n hand: {\n enabled: boolean,\n rotation: boolean,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n landmarks: boolean,\n detector: {\n modelPath: string,\n },\n skeleton: {\n modelPath: string,\n },\n },\n\n /** Controlls and configures all object detection specific options\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n * - minConfidence: minimum score that detection must have to return as valid object\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of detections to return\n */\n object: {\n enabled: boolean,\n modelPath: string,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n skipFrames: number,\n },\n\n /** Controlls and configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n *\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n */\n segmentation: {\n enabled: boolean,\n modelPath: string,\n },\n}\n\nconst config: Config = {\n backend: 'webgl', // select tfjs backend to use, leave empty to use default backend\n // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n modelBasePath: '../models/', // base path for all models\n wasmPath: '', // path for wasm binaries, only used for backend: wasm\n // default set to download from jsdeliv during Human class instantiation\n debug: true, // print additional status messages to console\n async: true, // execute enabled models in parallel\n warmup: 'full', // what to use for human.warmup(), can be 'none', 'face', 'full'\n // warmup pre-initializes all models for faster inference but can take\n // significant time on startup\n // only used for `webgl` and `humangl` backends\n cacheSensitivity: 0.75, // cache sensitivity\n // values 0..1 where 0.01 means reset cache if input changed more than 1%\n // set to 0 to disable caching\n skipFrame: false, // internal & dynamic\n filter: { // run input through image filters before inference\n // image filters run with near-zero latency as they are executed on the GPU\n enabled: true, // enable image pre-processing filters\n width: 0, // resize input width\n height: 0, // resize input height\n // if both width and height are set to 0, there is no resizing\n // if just one is set, second one is scaled automatically\n // if both are set, values are used as-is\n flip: false, // flip input as mirror image\n return: true, // return processed canvas imagedata in result\n brightness: 0, // range: -1 (darken) to 1 (lighten)\n contrast: 0, // range: -1 (reduce contrast) to 1 (increase contrast)\n sharpness: 0, // range: 0 (no sharpening) to 1 (maximum sharpening)\n blur: 0, // range: 0 (no blur) to N (blur radius in pixels)\n saturation: 0, // range: -1 (reduce saturation) to 1 (increase saturation)\n hue: 0, // range: 0 (no change) to 360 (hue rotation in degrees)\n negative: false, // image negative\n sepia: false, // image sepia colors\n vintage: false, // image vintage colors\n kodachrome: false, // image kodachrome colors\n technicolor: false, // image technicolor colors\n polaroid: false, // image polaroid camera effect\n pixelate: 0, // range: 0 (no pixelate) to N (number of pixels to pixelate)\n },\n\n gesture: {\n enabled: true, // enable gesture recognition based on model results\n },\n\n face: {\n enabled: true, // controls if specified modul is enabled\n // face.enabled is required for all face models:\n // detector, mesh, iris, age, gender, emotion\n // (note: module is not loaded until it is required)\n detector: {\n modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n rotation: true, // use best-guess rotated face image or just box with rotation as-is\n // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n // this parameter is not valid in nodejs\n maxDetected: 15, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 15, // how many max frames to go without re-running the face bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated face analysis as the head probably hasn't moved much\n // in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n return: false, // return extracted face as tensor\n // in which case user is reponsible for disposing the tensor\n },\n\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json', // facemesh model, can be absolute path or relative to modelBasePath\n },\n\n iris: {\n enabled: true,\n modelPath: 'iris.json', // face iris model\n // can be either absolute path or relative to modelBasePath\n },\n\n description: {\n enabled: true, // to improve accuracy of face description extraction it is\n // recommended to enable detector.rotation and mesh.enabled\n modelPath: 'faceres.json', // face description model\n // can be either absolute path or relative to modelBasePath\n skipFrames: 11, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n emotion: {\n enabled: true,\n minConfidence: 0.1, // threshold for discarding a prediction\n skipFrames: 17, // how max many frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath\n },\n },\n\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet', 'blazepose', 'efficientpose', 'movenet-lightning', 'movenet-thunder'\n maxDetected: 1, // maximum number of people detected in the input\n // should be set to the minimum number for performance\n // only valid for posenet as other models detects single pose\n minConfidence: 0.2, // threshold for discarding a prediction\n skipFrames: 1, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n},\n\n hand: {\n enabled: true,\n rotation: true, // use best-guess rotated hand image or just box with rotation as-is\n // false means higher performance, but incorrect finger mapping if hand is inverted\n skipFrames: 18, // how many max frames to go without re-running the hand bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated hand skeleton analysis as the hand probably\n // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.8, // threshold for discarding a prediction\n iouThreshold: 0.2, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 1, // maximum number of hands detected in the input\n // should be set to the minimum number for performance\n landmarks: true, // detect hand landmarks or just hand boundary box\n detector: {\n modelPath: 'handdetect.json', // hand detector model, can be absolute path or relative to modelBasePath\n },\n skeleton: {\n modelPath: 'handskeleton.json', // hand skeleton model, can be absolute path or relative to modelBasePath\n },\n },\n\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'mb3-centernet' or 'nanodet'\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 10, // maximum number of objects detected in the input\n skipFrames: 19, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n\n segmentation: {\n enabled: false, // controlls and configures all body segmentation module\n // removes background from input containing person\n // if segmentation is enabled it will run as preprocessing task before any other model\n // alternatively leave it disabled and use it on-demand using human.segmentation method which can\n // remove background or replace it with user-provided background\n modelPath: 'selfie.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'selfie' or 'meet'\n },\n};\nexport { config as defaults };\n", "/**\n * Helper function that returns basic system info\n */\nexport function info(): { platform: string, agent: string } {\n let platform = '';\n let agent = '';\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n platform = (platformMatch && platformMatch[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n agent = navigator.userAgent.replace(raw[0], '');\n if (platform[1]) agent = agent.replace(raw[1], '');\n agent = agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n platform = `${process.platform} ${process.arch}`;\n agent = `NodeJS ${process.version}`;\n }\n return { platform, agent };\n}\n", "/**\n * Creates tfjs bundle used by Human browser build target\n * @external\n */\n\n// get versions of all packages\nimport { version as tfjsVersion } from '@tensorflow/tfjs/package.json';\nimport { version as tfjsCoreVersion } from '@tensorflow/tfjs-core/package.json';\nimport { version as tfjsDataVersion } from '@tensorflow/tfjs-data/package.json';\nimport { version as tfjsLayersVersion } from '@tensorflow/tfjs-layers/package.json';\nimport { version as tfjsConverterVersion } from '@tensorflow/tfjs-converter/package.json';\nimport { version as tfjsBackendCPUVersion } from '@tensorflow/tfjs-backend-cpu/package.json';\nimport { version as tfjsBackendWebGLVersion } from '@tensorflow/tfjs-backend-webgl/package.json';\nimport { version as tfjsBackendWASMVersion } from '@tensorflow/tfjs-backend-wasm/package.json';\n\n// export all from sources\n// requires treeShaking:ignore-annotations due to tfjs misconfiguration\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export all from build\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-webgpu/dist/index.js'; // experimental\n\n// export versions\nexport const version = {\n tfjs: tfjsVersion,\n 'tfjs-core': tfjsCoreVersion,\n 'tfjs-data': tfjsDataVersion,\n 'tfjs-layers': tfjsLayersVersion,\n 'tfjs-converter': tfjsConverterVersion,\n 'tfjs-backend-cpu': tfjsBackendCPUVersion,\n 'tfjs-backend-webgl': tfjsBackendWebGLVersion,\n 'tfjs-backend-wasm': tfjsBackendWASMVersion,\n};\n", "/**\n * Custom TFJS backend for Human based on WebGL\n * Not used by default\n */\n\nimport { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n name: 'humangl',\n priority: 99,\n canvas: null,\n gl: null,\n width: 1024,\n height: 1024,\n extensions: [],\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions() as string[];\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport function register(): void {\n if (!tf.findBackend(config.name)) {\n // log('backend registration:', config.name);\n try {\n config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n } catch (err) {\n log('error: cannot get WebGL2 context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL2 context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n try {\n tf.ENV.set('WEBGL_VERSION', 2);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n log('backend registered:', config.name);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint };\n}\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint, landmarks };\n}\n\nexport const disposeBox = (t) => {\n tf.dispose(t.startPoint);\n tf.dispose(t.endPoint);\n};\n\nexport const createBox = (startEndTensor) => ({\n startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\n */\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport function radToDegrees(rad) {\n return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n\nexport function xyDistanceBetweenPoints(a, b) {\n return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\n\nexport function generateAnchors(inputSize) {\n const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) {\n anchors.push([anchorX, anchorY]);\n }\n }\n }\n }\n return anchors;\n}\n", "import { log, join, mergeDeep } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n const centers = tf.add(boxStarts, anchors);\n const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n const boxSizesNormalized = tf.div(boxSizes, inputSize);\n const centersNormalized = tf.div(centers, inputSize);\n const halfBoxSize = tf.div(boxSizesNormalized, 2);\n const starts = tf.sub(centersNormalized, halfBoxSize);\n const ends = tf.add(centersNormalized, halfBoxSize);\n const startNormalized = tf.mul(starts, inputSize);\n const endNormalized = tf.mul(ends, inputSize);\n const concatAxis = 1;\n return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n model: GraphModel;\n anchorsData: [number, number][];\n anchors: Tensor;\n inputSize: number;\n config: Config;\n\n constructor(model, config: Config) {\n this.model = model;\n this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n this.anchors = tf.tensor2d(this.anchorsData);\n this.inputSize = model.inputs[0].shape[2];\n this.config = config;\n }\n\n async getBoundingBoxes(inputImage: Tensor, userConfig: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n const [batch, boxes, scores] = tf.tidy(() => {\n const resizedImage = tf.image.resizeBilinear(inputImage, [this.inputSize, this.inputSize]);\n const normalizedImage = tf.sub(tf.div(resizedImage, 127.5), 0.5);\n const res = this.model.execute(normalizedImage);\n let batchOut;\n if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n const concat = tf.concat([concat512, concat384], 1);\n batchOut = tf.squeeze(concat, 0);\n } else {\n batchOut = tf.squeeze(res); // when using tfhub model\n }\n const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n const scoresOut = tf.squeeze(tf.sigmoid(logits)); // inside tf.tidy\n return [batchOut, boxesOut, scoresOut];\n });\n\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n const nms = await nmsTensor.array();\n tf.dispose(nmsTensor);\n const annotatedBoxes: Array<{ box: { startPoint: Tensor, endPoint: Tensor }, landmarks: Tensor, anchor: number[], confidence: number }> = [];\n const scoresData = await scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scoresData[nms[i]];\n if (confidence > this.config.face.detector.minConfidence) {\n const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n const localBox = box.createBox(boundingBox);\n tf.dispose(boundingBox);\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.reshape(tf.squeeze(tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1])), [keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n tf.dispose(batch);\n tf.dispose(boxes);\n tf.dispose(scores);\n return {\n boxes: annotatedBoxes,\n scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n };\n }\n}\n\nexport async function load(config: Config) {\n const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n const blazeFace = new BlazeFaceModel(model, config);\n if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n rightEyeIris: [473, 474, 475, 476, 477],\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468 = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468 = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68 = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33 = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7 = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { BlazeFaceModel } from './blazeface';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n const originalIndices = coords.MESH_ANNOTATIONS[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0], newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n storedBoxes: Array<{ startPoint: number[], endPoint: number[], landmarks: Array, confidence: number, faceConfidence?: number }>;\n boundingBoxDetector: BlazeFaceModel; // tf.GraphModel\n meshDetector: GraphModel; // tf.GraphModel\n irisModel: GraphModel; // tf.GraphModel\n boxSize: number;\n meshSize: number;\n irisSize: number;\n irisEnlarge: number;\n skipped: number;\n detectedFaces: number;\n\n constructor(boundingBoxDetector, meshDetector, irisModel) {\n // An array of facial bounding boxes.\n this.storedBoxes = [];\n this.boundingBoxDetector = boundingBoxDetector;\n this.meshDetector = meshDetector;\n this.irisModel = irisModel;\n this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n this.irisEnlarge = 2.3;\n this.skipped = 0;\n this.detectedFaces = 0;\n }\n\n transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n const coordsScaled = rawCoords.map((coord) => ([\n boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n coord[2],\n ]));\n const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n return coordsRotated.map((coord) => ([\n Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n Math.round(coord[2]),\n ]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n getLeftToRightEyeDepthDifference(rawCoords) {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n }\n\n // Returns a box describing a cropped region around the eye fit for passing to the iris model.\n getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n const boxSize = bounding.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / this.meshSize,\n box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n box.endPoint[0] / this.meshSize,\n ]], [0], [this.irisSize, this.irisSize]);\n if (flip && tf.ENV.flags.IS_BROWSER) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n }\n\n // Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\n getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n const eyeRawCoords: Array<[number, number, number]> = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / this.irisSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n }\n\n // The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n // eslint-disable-next-line class-methods-use-this\n getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n }\n\n correctFaceRotation(config, box, input) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n const angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n const rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n const cut = config.face.mesh.enabled\n ? bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize])\n : bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]);\n const face = tf.div(cut, 255);\n tf.dispose(cut);\n tf.dispose(rotatedImage);\n return [angle, rotationMatrix, face];\n }\n\n async augmentIris(rawCoords, face) {\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = this.irisModel.predict(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data(); // inside tf.tidy\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n // So we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n }\n\n async predict(input, config) {\n let useFreshBox = false;\n // run new detector every skipFrames unless we only want box to start with\n let detector;\n if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n detector = await this.boundingBoxDetector.getBoundingBoxes(input, config);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n for (const possible of detector.boxes) {\n const startPoint = await possible.box.startPoint.data();\n const endPoint = await possible.box.endPoint.data();\n const landmarks = await possible.landmarks.array();\n this.storedBoxes.push({ startPoint, endPoint, landmarks, confidence: possible.confidence });\n }\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n\n if (useFreshBox) {\n if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n return null;\n }\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n const enlargedBox = bounding.enlargeBox(scaledBox);\n const squarifiedBox = bounding.squarifyBox(enlargedBox);\n const landmarks = this.storedBoxes[i].landmarks;\n const confidence = this.storedBoxes[i].confidence;\n this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n }\n }\n if (detector && detector.boxes) {\n detector.boxes.forEach((prediction) => {\n tf.dispose(prediction.box.startPoint);\n tf.dispose(prediction.box.endPoint);\n tf.dispose(prediction.landmarks);\n });\n }\n\n const results: Array<{ mesh, box, faceConfidence, boxConfidence, confidence, image }> = [];\n // for (let i = 0; i < this.storedBoxes.length; i++) {\n const newBoxes: Array<{ startPoint: number[]; endPoint: number[]; landmarks: number[]; confidence: number; faceConfidence?: number | undefined; }> = [];\n for (let box of this.storedBoxes) {\n // let box = this.storedBoxes[i]; // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n let face;\n let angle = 0;\n let rotationMatrix;\n\n if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n [angle, rotationMatrix, face] = this.correctFaceRotation(config, box, input);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n const cut = config.face.mesh.enabled\n ? bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize])\n : bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]);\n face = tf.div(cut, 255);\n tf.dispose(cut);\n tf.dispose(clonedImage);\n }\n\n // if we're not going to produce mesh, don't spend time with further processing\n if (!config.face.mesh.enabled) {\n results.push({\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n });\n } else {\n const [contours, confidence, contourCoords] = this.meshDetector.execute(face) as Array; // The first returned tensor represents facial contours which are already included in the coordinates.\n tf.dispose(contours);\n const faceConfidence = (await confidence.data())[0] as number; // inside tf.tidy\n tf.dispose(confidence);\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose(contourCoords);\n tf.dispose(coordsReshaped);\n if (faceConfidence < config.face.detector.minConfidence) {\n // if (!this.storedBoxes[i]) console.log('2', i, this.storedBoxes.length, this.storedBoxes[i], box, this.storedBoxes);\n // this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n box.confidence = faceConfidence; // reset confidence of cached box\n tf.dispose(face);\n } else {\n if (config.face.iris.enabled) rawCoords = await this.augmentIris(rawCoords, face);\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n box = { ...bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5), confidence: box.confidence }; // redefine box with mesh calculated one\n\n // do rotation one more time with mesh keypoints if we want to return perfect image\n if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n [angle, rotationMatrix, face] = this.correctFaceRotation(config, box, input);\n }\n\n results.push({\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n confidence: faceConfidence,\n image: face,\n });\n\n // updated stored cache values\n // this.storedBoxes[i] = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n box = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n }\n }\n newBoxes.push(box);\n }\n\n // results = results.filter((a) => a !== null);\n // remove cache entries for detected boxes on low confidence\n if (config.face.mesh.enabled) this.storedBoxes = newBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "/**\n * FaceMesh & BlazeFace Module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Face } from '../result';\nimport { Config } from '../config';\n\nlet faceModels: [blazeface.BlazeFaceModel | null, GraphModel | null, GraphModel | null] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await facePipeline.predict(input, config);\n const results: Array = [];\n let id = 0;\n for (const prediction of (predictions || [])) {\n if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n const meshRaw = prediction.mesh.map((pt) => [\n pt[0] / (input.shape[2] || 0),\n pt[1] / (input.shape[1] || 0),\n pt[2] / facePipeline.meshSize,\n ]);\n const annotations = {};\n if (prediction.mesh && prediction.mesh.length > 0) {\n for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n }\n const clampedBox: [number, number, number, number] = prediction.box ? [\n Math.trunc(Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.max(0, prediction.box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = prediction.box ? [\n prediction.box.startPoint[0] / (input.shape[2] || 0),\n prediction.box.startPoint[1] / (input.shape[1] || 0),\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0),\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0),\n ] : [0, 0, 0, 0];\n results.push({\n id: id++,\n score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxScore: Math.round(100 * prediction.boxConfidence) / 100,\n faceScore: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n tensor: prediction.image,\n });\n if (prediction.coords) tf.dispose(prediction.coords);\n }\n return results;\n}\n\nexport async function load(config): Promise<[unknown, GraphModel | null, GraphModel | null]> {\n if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n faceModels = await Promise.all([\n (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n ]);\n if (config.face.mesh.enabled) {\n if (!faceModels[1] || !faceModels[1]['modelUrl']) log('load model failed:', config.face.mesh.modelPath);\n else if (config.debug) log('load model:', faceModels[1]['modelUrl']);\n }\n if (config.face.iris.enabled) {\n if (!faceModels[2] || !faceModels[2]['modelUrl']) log('load model failed:', config.face.iris.modelPath);\n else if (config.debug) log('load model:', faceModels[2]['modelUrl']);\n }\n } else if (config.debug) {\n if (faceModels[0]) log('cached model:', faceModels[0].model['modelUrl']);\n if (faceModels[1]) log('cached model:', faceModels[1]['modelUrl']);\n if (faceModels[2]) log('cached model:', faceModels[2]['modelUrl']);\n }\n facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * HSE-FaceRes Module\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst last: Array<{\n age: number,\n gender: string,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config: Config): Promise {\n const modelUrl = join(config.modelBasePath, config.face.description.modelPath);\n if (!model) {\n model = await tf.loadGraphModel(modelUrl) as unknown as GraphModel;\n if (!model) log('load model failed:', config.face.description.modelPath);\n else if (config.debug) log('load model:', modelUrl);\n } else if (config.debug) log('cached model:', modelUrl);\n return model;\n}\n\nexport function similarity(embedding1: Array, embedding2: Array, order = 2): number {\n if (!embedding1 || !embedding2) return 0;\n if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n if (embedding1?.length !== embedding2?.length) return 0;\n // general minkowski distance, euclidean distance is limited case where order is 2\n const distance = 5.0 * embedding1\n .map((_val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n .reduce((sum, now) => (sum + now), 0) // sum all distances\n ** (1 / order); // get root of\n const res = Math.max(0, 100 - distance) / 100.0;\n return res;\n}\n\nexport function match(embedding: Array, db: DB, threshold = 0) {\n let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n for (const f of db) {\n if (f.embedding && f.name) {\n const perc = similarity(embedding, f.embedding);\n if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n }\n }\n return best;\n}\n\nexport function enhance(input): Tensor {\n const image = tf.tidy(() => {\n // input received from detector is already normalized to 0..1\n // input is also assumed to be straightened\n const tensor = input.image || input.tensor || input;\n if (!(tensor instanceof tf.Tensor)) return null;\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n if (!model.inputs[0].shape) return null; // model has no shape so no point continuing\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n\n /*\n // just resize to fit the embedding model instead of cropping\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n */\n\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n\n /*\n // increase image pseudo-contrast 100%\n // (or do it per-channel so mean is done on each channel)\n // (or calculate histogram and do it based on histogram)\n const mean = merge.mean();\n const factor = 2;\n const contrast = merge.sub(mean).mul(factor).add(mean);\n */\n\n /*\n // normalize brightness from 0..1\n // silly way of creating pseudo-hdr of image\n const darken = crop.sub(crop.min());\n const lighten = darken.div(darken.max());\n */\n\n const norm = tf.mul(crop, 255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.description.skipFrames) && config.skipFrame && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const enhanced = enhance(image);\n\n let resT;\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n const gender = await resT.find((t) => t.shape[1] === 1).data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > config.face.description.minConfidence) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100), 1);\n const age = (await argmax.data())[0];\n const all = await resT.find((t) => t.shape[1] === 100).data(); // inside tf.tidy\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n\n const descriptor = await desc.data();\n obj.descriptor = [...descriptor];\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * Emotion Module\n */\n\nimport { log, join } from '../helpers';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.emotion.skipFrames) && config.skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const [red, green, blue] = tf.split(resize, 3, 3);\n tf.dispose(resize);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n tf.dispose(red);\n tf.dispose(green);\n tf.dispose(blue);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n tf.dispose(redNorm);\n tf.dispose(greenNorm);\n tf.dispose(blueNorm);\n const normalize = tf.tidy(() => tf.mul(tf.sub(grayscale, 0.5), 2));\n tf.dispose(grayscale);\n const obj: Array<{ score: number, emotion: string }> = [];\n if (config.face.emotion.enabled) {\n const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n const data = await emotionT.data();\n tf.dispose(emotionT);\n for (let i = 0; i < data.length; i++) {\n if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n }\n obj.sort((a, b) => b.score - a.score);\n }\n tf.dispose(normalize);\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "export const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n", "import * as kpt from './keypoints';\nimport { Body } from '../result';\n\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return kpt.connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i) => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score,\n part,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)],\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight],\n })),\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: Array; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + kpt.count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: kpt.partNames[root.part.id],\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints, box: [number, number, number, number], score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n", "/**\n * PoseNet module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize];\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]];\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = (this.model && this.model.inputs && this.model.inputs[0].shape) ? this.model.inputs[0].shape[2] : 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n return tf.tidy(() => {\n const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n return tf.concat2d([startPoints, endPoints], 1);\n });\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n return tf.tidy(() => {\n const landmarks = tf.add(tf.div(tf.reshape(rawPalmLandmarks, [-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n return tf.mul(landmarks, this.inputSizeTensor);\n });\n }\n\n async getBoxes(input, config) {\n const t: Record = {};\n t.batched = this.model.predict(input) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.scores = tf.tidy(() => tf.squeeze(tf.sigmoid(tf.slice(t.predictions, [0, 0], [-1, 1]))));\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n t.nms = await tf.image.nonMaxSuppressionAsync(t.norm, t.scores, 10 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as Array;\n const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];\n for (const index of nms) {\n const palmBox = tf.slice(t.norm, [index, 0], [1, -1]);\n const palmLandmarks = tf.tidy(() => tf.reshape(this.normalizeLandmarks(tf.slice(t.predictions, [index, 5], [1, 14]), index), [-1, 2]));\n hands.push({ box: palmBox, palmLandmarks, confidence: scores[index] });\n // console.log('handdetector:getBoxes', nms.length, index, scores[index], config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence, palmBox.dataSync());\n }\n for (const tensor of Object.keys(t)) tf.dispose(t[tensor]); // dispose all\n return hands;\n }\n\n async estimateHandBounds(input, config): Promise<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }[]> {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => tf.sub(tf.div(tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]), 127.5), 1));\n const predictions = await this.getBoxes(image, config);\n tf.dispose(image);\n const hands: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = await prediction.box.data();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = await prediction.palmLandmarks.array();\n tf.dispose(prediction.box);\n tf.dispose(prediction.palmLandmarks);\n hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n }\n return hands;\n }\n}\n", "export function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport * as detector from './handdetector';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n // @ts-ignore model is not undefined here\n this.inputSize = this.handPoseModel?.inputs[0].shape[2];\n this.storedBoxes = [];\n this.skipped = 0;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = box.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...box.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames unless we only want box to start with\n let boxes;\n\n // console.log('handpipeline:estimateHands:skip criteria', this.skipped, config.hand.skipFrames, !config.hand.landmarks, !config.skipFrame); // should skip hand detector?\n if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n boxes = await this.handDetector.estimateHandBounds(image, config);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{ landmarks?: number[], confidence: number, box: { topLeft: number[], bottomRight: number[] } }> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = box.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && tf.ENV.flags.IS_BROWSER ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, 255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage) as Array;\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n // console.log('handpipeline:estimateHands low', confidence);\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n return hands;\n }\n}\n", "const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nconst FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nconst FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport { Finger, FingerCurl, FingerDirection };\n", "import { Finger, FingerCurl, FingerDirection } from './description';\n\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nexport function estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: Array = [];\n const slopesYZ: Array = [];\n const fingerCurls: Array = [];\n const fingerDirections: Array = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: Array = [];\n const slopeAtYZ: Array = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n", "export default class Gesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n addCurl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n addDirection(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n setWeight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "import { Finger, FingerCurl, FingerDirection } from './description';\nimport Gesture from './gesture';\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new Gesture('thumbs up');\nThumbsUp.addCurl(Finger.thumb, FingerCurl.none, 1.0);\nThumbsUp.addDirection(Finger.thumb, FingerDirection.verticalUp, 1.0);\nThumbsUp.addDirection(Finger.thumb, FingerDirection.diagonalUpLeft, 0.25);\nThumbsUp.addDirection(Finger.thumb, FingerDirection.diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.addCurl(finger, FingerCurl.full, 1.0);\n ThumbsUp.addDirection(finger, FingerDirection.horizontalLeft, 1.0);\n ThumbsUp.addDirection(finger, FingerDirection.horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new Gesture('victory');\nVictory.addCurl(Finger.thumb, FingerCurl.half, 0.5);\nVictory.addCurl(Finger.thumb, FingerCurl.none, 0.5);\nVictory.addDirection(Finger.thumb, FingerDirection.verticalUp, 1.0);\nVictory.addDirection(Finger.thumb, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addCurl(Finger.index, FingerCurl.none, 1.0);\nVictory.addDirection(Finger.index, FingerDirection.verticalUp, 0.75);\nVictory.addDirection(Finger.index, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addCurl(Finger.middle, FingerCurl.none, 1.0);\nVictory.addDirection(Finger.middle, FingerDirection.verticalUp, 1.0);\nVictory.addDirection(Finger.middle, FingerDirection.diagonalUpLeft, 0.75);\nVictory.addCurl(Finger.ring, FingerCurl.full, 1.0);\nVictory.addDirection(Finger.ring, FingerDirection.verticalUp, 0.2);\nVictory.addDirection(Finger.ring, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addDirection(Finger.ring, FingerDirection.horizontalLeft, 0.2);\nVictory.addCurl(Finger.pinky, FingerCurl.full, 1.0);\nVictory.addDirection(Finger.pinky, FingerDirection.verticalUp, 0.2);\nVictory.addDirection(Finger.pinky, FingerDirection.diagonalUpLeft, 1.0);\nVictory.addDirection(Finger.pinky, FingerDirection.horizontalLeft, 0.2);\nVictory.setWeight(Finger.index, 2);\nVictory.setWeight(Finger.middle, 2);\n\nexport default [ThumbsUp, Victory];\n", "// based on \n\nimport * as estimator from './estimator';\nimport { Finger, FingerCurl, FingerDirection } from './description';\nimport Gestures from './gestures';\n\nconst minConfidence = 0.7;\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n const estimatorRes = estimator.estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n // console.log('finger landmarks', landmarks);\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const estimatorRes = estimator.estimate(keypoints);\n const poses: Array<{ name: string, confidence: number }> = [];\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n // console.log('finger poses', poses);\n return poses;\n}\n", "/**\n * HandPose module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport * as fingerPose from '../fingerpose/fingerpose';\nimport { Hand } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n // @ts-ignore landmarks are not undefined\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n\n const keypoints = predictions[i].landmarks as unknown as Array<[number, number, number]>;\n\n let box: [number, number, number, number] = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: [number, number, number, number] = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n box,\n boxRaw,\n keypoints,\n annotations: annotations as Hand['annotations'],\n landmarks: landmarks as Hand['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) as unknown as GraphModel : null,\n ]);\n if (config.hand.enabled) {\n if (!handDetectorModel || !handDetectorModel['modelUrl']) log('load model failed:', config.hand.detector.modelPath);\n else if (config.debug) log('load model:', handDetectorModel['modelUrl']);\n if (!handPoseModel || !handPoseModel['modelUrl']) log('load model failed:', config.hand.skeleton.modelPath);\n else if (config.debug) log('load model:', handPoseModel['modelUrl']);\n }\n } else {\n if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "export const full = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftPalm',\n 'rightPalm',\n 'leftIndex',\n 'rightIndex',\n 'leftPinky',\n 'rightPinky',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n 'leftHeel',\n 'rightHeel',\n 'leftFoot',\n 'rightFoot',\n 'midHip',\n 'forehead',\n 'leftThumb',\n 'leftHand',\n 'rightThumb',\n 'rightHand',\n];\n\nexport const upper = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'left:15',\n 'right:16',\n 'left:17',\n 'right:18',\n 'left:19',\n 'right:20',\n 'left:21',\n 'right:22',\n 'leftChest',\n 'rightChest',\n 'neck',\n 'forehead',\n 'left:27',\n 'right:28',\n 'left:29',\n 'right:30',\n];\n", "/**\n * BlazePose Module\n */\n\n// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Body } from '../result';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n model['width'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[2].size);\n model['height'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[1].size);\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if (!model) return [];\n if (!config.body.enabled) return [];\n const imgSize = { width: (image.shape[2] || 0), height: (image.shape[1] || 0) };\n const resize = tf.image.resizeBilinear(image, [model['width'], model['height']], false);\n const normalize = tf.div(resize, [255.0]);\n tf.dispose(resize);\n const resT = await model.predict(normalize) as Array;\n const findT = resT.find((t) => (t.size === 195 || t.size === 155));\n const points = await findT?.data() || []; // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => tf.dispose(t));\n tf.dispose(normalize);\n const keypoints: Array<{ id, part, position: [number, number, number], positionRaw: [number, number, number], score, presence }> = [];\n const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n keypoints.push({\n id: i,\n part: labels[i],\n position: [\n Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n ],\n positionRaw: [\n points[depth * i + 0] / 255, // return x value normalized to 0..1\n points[depth * i + 1] / 255, // return y value normalized to 0..1\n points[depth * i + 2] + 0, // fix negative zero\n ],\n score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n });\n }\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n const box: [number, number, number, number] = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...x),\n ];\n const boxRaw: [number, number, number, number] = [0, 0, 0, 0]; // not yet implemented\n const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ id: 0, score, box, boxRaw, keypoints }];\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['head', 'neck', 'rightShoulder', 'rightElbow', 'rightWrist', 'chest', 'leftShoulder', 'leftElbow', 'leftWrist', 'pelvis', 'rightHip', 'rightKnee', 'rightAnkle', 'leftHip', 'leftKnee', 'leftAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nfunction max2d(inputs, minScore) {\n const [width, height] = inputs.shape;\n return tf.tidy(() => {\n const mod = (a, b) => tf.sub(a, tf.mul(tf.div(a, tf.scalar(b, 'int32')), tf.scalar(b, 'int32'))); // modulus op implemented in tf\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const newScore = tf.max(reshaped, 0).dataSync()[0]; // get highest score // inside tf.tidy\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coords = tf.argMax(reshaped, 0);\n const x = mod(coords, width).dataSync()[0]; // inside tf.tidy\n const y = tf.div(coords, tf.scalar(width, 'int32')).dataSync()[0]; // inside tf.tidy\n return [x, y, newScore];\n }\n return [0, 0, newScore];\n });\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model.inputs[0].shape) return null;\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const enhance = tf.mul(resize, 2);\n const norm = enhance.sub(1);\n return norm;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tf.dispose(tensor);\n\n if (resT) {\n keypoints.length = 0;\n const squeeze = resT.squeeze();\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = squeeze.unstack(2);\n tf.dispose(squeeze);\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = max2d(stack[id], config.body.minConfidence);\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: bodyParts[id],\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n });\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\nconst keypoints: Array = [];\ntype Person = { id: number, score: number, box: [number, number, number, number], boxRaw: [number, number, number, number], keypoints: Array }\n\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle'];\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function parseSinglePose(res, config, image) {\n keypoints.length = 0;\n const kpt = res[0][0];\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: bodyParts[id],\n positionRaw: [ // normalized to 0..1\n kpt[id][1],\n kpt[id][0],\n ],\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * kpt[id][1]),\n Math.round((image.shape[1] || 0) * kpt[id][0]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = keypoints.map((a) => a.position[0]);\n const y = keypoints.map((a) => a.position[1]);\n box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = keypoints.map((a) => a.positionRaw[0]);\n const yRaw = keypoints.map((a) => a.positionRaw[1]);\n boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n const persons: Array = [];\n persons.push({ id: 0, score, box, boxRaw, keypoints });\n return persons;\n}\n\nasync function parseMultiPose(res, config, image) {\n const persons: Array = [];\n for (let p = 0; p < res[0].length; p++) {\n const kpt = res[0][p];\n score = Math.round(100 * kpt[51 + 4]) / 100;\n // eslint-disable-next-line no-continue\n if (score < config.body.minConfidence) continue;\n keypoints.length = 0;\n for (let i = 0; i < 17; i++) {\n const partScore = Math.round(100 * kpt[3 * i + 2]) / 100;\n if (partScore > config.body.minConfidence) {\n keypoints.push({\n part: bodyParts[i],\n score: partScore,\n positionRaw: [\n kpt[3 * i + 1],\n kpt[3 * i + 0],\n ],\n position: [\n Math.trunc(kpt[3 * i + 1] * (image.shape[2] || 0)),\n Math.trunc(kpt[3 * i + 0] * (image.shape[1] || 0)),\n ],\n });\n }\n }\n boxRaw = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n persons.push({\n id: p,\n score,\n boxRaw,\n box: [\n Math.trunc(boxRaw[0] * (image.shape[2] || 0)),\n Math.trunc(boxRaw[1] * (image.shape[1] || 0)),\n Math.trunc(boxRaw[2] * (image.shape[2] || 0)),\n Math.trunc(boxRaw[3] * (image.shape[1] || 0)),\n ],\n keypoints,\n });\n }\n return persons;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n skipped++;\n return [{ id: 0, score, box, boxRaw, keypoints }];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model.inputs[0].shape) return null;\n let inputSize = model.inputs[0].shape[2];\n if (inputSize === -1) inputSize = 256;\n const resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const cast = tf.cast(resize, 'int32');\n return cast;\n });\n\n let resT;\n if (config.body.enabled) resT = await model.predict(tensor);\n tf.dispose(tensor);\n\n if (!resT) resolve([]);\n const res = await resT.array();\n let persons;\n if (resT.shape[2] === 17) persons = await parseSinglePose(res, config, image);\n else if (resT.shape[2] === 56) persons = await parseMultiPose(res, config, image);\n tf.dispose(resT);\n\n resolve(persons);\n });\n}\n", "/**\n * CoCo Labels used by object detection modules\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * NanoDet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n let id = 0;\n let results: Array = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n tf.tidy(async () => { // wrap in tidy to automatically deallocate temp tensors\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\n const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdx = await boxesMax.argMax(2).array(); // what we need is indexes of features with highest scores, not values itself\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > config.object.minConfidence && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n // strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: (box.map((a) => Math.trunc(a))) as [number, number, number, number],\n boxRaw: boxRaw as [number, number, number, number],\n };\n results.push(result);\n }\n }\n }\n });\n }\n // deallocate tensors\n res.forEach((t) => tf.dispose(t));\n\n // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n const nmsScores = results.map((a) => a.score);\n let nmsIdx: Array = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = await nms.data();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n const norm = tf.div(resize, 255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n tf.dispose(norm);\n tf.dispose(resize);\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n tf.dispose(transpose);\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/**\n * CenterNet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res: Tensor, inputSize, outputShape, config: Config) {\n if (!res) return [];\n const results: Array = [];\n const detections = await res.array();\n const squeezeT = tf.squeeze(res);\n tf.dispose(res);\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n tf.dispose(squeezeT);\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n const boxesT = tf.squeeze(stackT);\n const scoresT = tf.squeeze(arr[4]);\n const classesT = tf.squeeze(arr[5]);\n arr.forEach((t) => tf.dispose(t));\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n tf.dispose(boxesT);\n tf.dispose(scoresT);\n tf.dispose(classesT);\n const nms = await nmsT.data();\n tf.dispose(nmsT);\n let i = 0;\n for (const id of nms) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n const label = labels[classVal].label;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ] as [number, number, number, number];\n const box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ] as [number, number, number, number];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2], input.shape[1]];\n const resize = tf.image.resizeBilinear(input, [model.inputSize, model.inputSize]);\n const objectT = config.object.enabled ? model.execute(resize, ['tower_0/detections']) : null;\n tf.dispose(resize);\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "/*\nWebGLImageFilter by Dominic Szablewski: \n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n const _collect = function (source, prefix, collection) {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n };\n\n const _compile = function (source, type) {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n return shader;\n };\n\n this.uniform = {};\n this.attribute = {};\n const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n this.id = gl.createProgram();\n gl.attachShader(this.id, _vsh);\n gl.attachShader(this.id, _fsh);\n gl.linkProgram(this.id);\n\n if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n gl.useProgram(this.id);\n // Collect attributes\n _collect(vertexSource, 'attribute', this.attribute);\n for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n // Collect uniforms\n _collect(vertexSource, 'uniform', this.uniform);\n _collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n if (!params) params = { };\n let _drawCount = 0;\n let _sourceTexture = null;\n let _lastInChain = false;\n let _currentFramebufferIndex = -1;\n let _tempFramebuffers = [null, null];\n let _filterChain = [];\n let _width = -1;\n let _height = -1;\n let _vertexBuffer = null;\n let _currentProgram = null;\n const _filter = {};\n const _canvas = params.canvas || document.createElement('canvas');\n // key is the shader program source, value is the compiled program\n const _shaderProgramCache = { };\n const DRAW = { INTERMEDIATE: 1 };\n const gl = _canvas.getContext('webgl');\n if (!gl) throw new Error('Filter: getContext() failed');\n\n this.addFilter = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const filter = _filter[name];\n _filterChain.push({ func: filter, args });\n };\n\n this.reset = function () {\n _filterChain = [];\n };\n\n const _resize = function (width, height) {\n // Same width/height? Nothing to do here\n if (width === _width && height === _height) { return; }\n _canvas.width = width;\n _width = width;\n _canvas.height = height;\n _height = height;\n // Create the context if we don't have it yet\n if (!_vertexBuffer) {\n // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n const vertices = new Float32Array([\n -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n ]);\n // eslint-disable-next-line no-unused-expressions\n (_vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer));\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, _width, _height);\n // Delete old temp framebuffers\n _tempFramebuffers = [null, null];\n };\n\n const _createFramebufferTexture = function (width, height) {\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n };\n\n const _getTempFramebuffer = function (index) {\n _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n return _tempFramebuffers[index];\n };\n\n const _draw = function (flags = null) {\n let source = null;\n let target = null;\n let flipY = false;\n // Set up the source\n if (_drawCount === 0) {\n // First draw call - use the source texture\n source = _sourceTexture;\n } else {\n // All following draw calls use the temp buffer last drawn to\n source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n }\n _drawCount++;\n // Set up the target\n if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n // Last filter in our chain - draw directly to the WebGL Canvas. We may\n // also have to flip the image vertically now\n target = null;\n flipY = _drawCount % 2 === 0;\n } else {\n // Intermediate draw call - get a temp buffer to draw to\n _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n }\n // Bind the source and target and draw the two triangles\n gl.bindTexture(gl.TEXTURE_2D, source);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(_currentProgram.uniform.flipY, (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n };\n\n this.apply = function (image) {\n _resize(image.width, image.height);\n _drawCount = 0;\n // Create the texture for the input image if we haven't yet\n if (!_sourceTexture) _sourceTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, _sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n // No filters? Just draw\n if (_filterChain.length === 0) {\n // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n _draw();\n return _canvas;\n }\n for (let i = 0; i < _filterChain.length; i++) {\n _lastInChain = (i === _filterChain.length - 1);\n const f = _filterChain[i];\n f.func.apply(this, f.args || []);\n }\n return _canvas;\n };\n\n const _compileShader = function (fragmentSource) {\n if (_shaderProgramCache[fragmentSource]) {\n _currentProgram = _shaderProgramCache[fragmentSource];\n gl.useProgram(_currentProgram.id);\n return _currentProgram;\n }\n // Compile shaders\n const SHADER = {};\n SHADER.VERTEX_IDENTITY = [\n 'precision highp float;',\n 'attribute vec2 pos;',\n 'attribute vec2 uv;',\n 'varying vec2 vUv;',\n 'uniform float flipY;',\n 'void main(void) {',\n 'vUv = uv;',\n 'gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);',\n '}',\n ].join('\\n');\n SHADER.FRAGMENT_IDENTITY = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'void main(void) {',\n 'gl_FragColor = texture2D(texture, vUv);',\n '}',\n ].join('\\n');\n _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(_currentProgram.attribute.pos);\n gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(_currentProgram.attribute.uv);\n gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n _shaderProgramCache[fragmentSource] = _currentProgram;\n return _currentProgram;\n };\n\n // -------------------------------------------------------------------------\n // Color Matrix Filter\n _filter.colorMatrix = function (matrix) {\n // Create a Float32 Array and normalize the offset component to 0-1\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n // Can we ignore the alpha value? Makes things a bit faster.\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0)\n ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n : _filter.colorMatrix.SHADER.WITH_ALPHA;\n const program = _compileShader(shader);\n gl.uniform1fv(program.uniform.m, m);\n _draw();\n };\n _filter.colorMatrix.SHADER = {};\n _filter.colorMatrix.SHADER.WITH_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];',\n 'gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];',\n '}',\n ].join('\\n');\n _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];',\n 'gl_FragColor.a = c.a;',\n '}',\n ].join('\\n');\n\n _filter.brightness = function (brightness) {\n const b = (brightness || 0) + 1;\n _filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.saturation = function (amount) {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n _filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturate = function () {\n _filter.saturation(-1);\n };\n\n _filter.contrast = function (amount) {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n\n _filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.negative = function () {\n _filter.contrast(-2);\n };\n\n _filter.hue = function (rotation) {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n\n _filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturateLuminance = function () {\n _filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.sepia = function () {\n _filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.brownie = function () {\n _filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.vintagePinhole = function () {\n _filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.kodachrome = function () {\n _filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.technicolor = function () {\n _filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.polaroid = function () {\n _filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.shiftToBGR = function () {\n _filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Convolution Filter\n _filter.convolution = function (matrix) {\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / _width;\n const pixelSizeY = 1 / _height;\n const program = _compileShader(_filter.convolution.SHADER);\n gl.uniform1fv(program.uniform.m, m);\n gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n _draw();\n };\n\n _filter.convolution.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'uniform float m[9];',\n 'void main(void) {',\n 'vec4 c11 = texture2D(texture, vUv - px);', // top left\n 'vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));', // top center\n 'vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));', // top right\n 'vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );', // mid left\n 'vec4 c22 = texture2D(texture, vUv);', // mid center\n 'vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );', // mid right\n 'vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );', // bottom left\n 'vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );', // bottom center\n 'vec4 c33 = texture2D(texture, vUv + px );', // bottom right\n 'gl_FragColor = ',\n 'c11 * m[0] + c12 * m[1] + c22 * m[2] +',\n 'c21 * m[3] + c22 * m[4] + c23 * m[5] +',\n 'c31 * m[6] + c32 * m[7] + c33 * m[8];',\n 'gl_FragColor.a = c22.a;',\n '}',\n ].join('\\n');\n\n _filter.detectEdges = function () {\n _filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n };\n\n _filter.sobelX = function () {\n _filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n };\n\n _filter.sobelY = function () {\n _filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n };\n\n _filter.sharpen = function (amount) {\n const a = amount || 1;\n _filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n };\n\n _filter.emboss = function (size) {\n const s = size || 1;\n _filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Blur Filter\n _filter.blur = function (size) {\n const blurSizeX = (size / 7) / _width;\n const blurSizeY = (size / 7) / _height;\n const program = _compileShader(_filter.blur.SHADER);\n // Vertical\n gl.uniform2f(program.uniform.px, 0, blurSizeY);\n _draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform.px, blurSizeX, 0);\n _draw();\n };\n\n _filter.blur.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv )*0.159576912161;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;',\n '}',\n ].join('\\n');\n\n // -------------------------------------------------------------------------\n // Pixelate Filter\n _filter.pixelate = function (size) {\n const blurSizeX = (size) / _width;\n const blurSizeY = (size) / _height;\n const program = _compileShader(_filter.pixelate.SHADER);\n // Horizontal\n gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n _draw();\n };\n\n _filter.pixelate.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform vec2 size;',\n 'uniform sampler2D texture;',\n 'vec2 pixelate(vec2 coord, vec2 size) {',\n 'return floor( coord / size ) * size;',\n '}',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'vec2 coord = pixelate(vUv, size);',\n 'gl_FragColor += texture2D(texture, coord);',\n '}',\n ].join('\\n');\n}\n", "/**\n * Image Processing module used by Human\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport { Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\ntype Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx: fxImage.GLImageFilter | null;\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport function process(input: Input, config: Config): { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n let tensor;\n if (!input) throw new Error('Human: Input is missing');\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('Human: Input type is not recognized');\n }\n if (input instanceof tf.Tensor) {\n // if input is tensor, use as-is\n if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n } else {\n // check if resizing will be needed\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = targetWidth * originalHeight / originalWidth;\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = targetHeight * originalWidth / originalHeight;\n }\n\n // create our canvas and resize it if needed\n if (config.filter.width > 0) targetWidth = config.filter.width;\n else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n if (config.filter.height > 0) targetHeight = config.filter.height;\n else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n }\n\n // draw input to our canvas\n const ctx = inCanvas.getContext('2d');\n if (input instanceof ImageData) {\n ctx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n ctx.translate(originalWidth, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n // imagefx transforms using gl\n if (config.filter.enabled) {\n if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n // log('created FX filter');\n fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n }\n if (!fx) return { tensor: null, canvas: inCanvas };\n fx.reset();\n fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n if (config.filter.negative) fx.addFilter('negative');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.vintage) fx.addFilter('brownie');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.kodachrome) fx.addFilter('kodachrome');\n if (config.filter.technicolor) fx.addFilter('technicolor');\n if (config.filter.polaroid) fx.addFilter('polaroid');\n if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n fx.apply(inCanvas);\n // read pixel data\n /*\n const gl = outCanvas.getContext('webgl');\n if (gl) {\n const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n // gl returns rbga while we only need rgb, so discarding alpha channel\n // gl returns starting point as lower left, so need to invert vertical\n let i = 0;\n for (let y = outCanvas.height - 1; y >= 0; y--) {\n for (let x = 0; x < outCanvas.width; x++) {\n const index = (x + y * outCanvas.width) * 4;\n pixBuffer[i++] = glBuffer[index + 0];\n pixBuffer[i++] = glBuffer[index + 1];\n pixBuffer[i++] = glBuffer[index + 2];\n }\n }\n outCanvas.data = pixBuffer;\n const shape = [outCanvas.height, outCanvas.width, 3];\n const pixels = tf.tensor3d(outCanvas.data, shape, 'float32');\n tensor = tf.expandDims(pixels, 0);\n tf.dispose(pixels);\n }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image if tensor is not already defined\n if (!tensor) {\n let pixels;\n if (outCanvas.data) { // if we have data, just convert to tensor\n const shape = [outCanvas.height, outCanvas.width, 3];\n pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null;\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we cant use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n pixels = tf.browser ? tf.browser.fromPixels(tempCanvas) : null;\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we cant use canvas as-is as it already has a context, so we do a silly one more canvas and do fromPixels on ImageData instead\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser ? tf.browser.fromPixels(data) : null;\n }\n if (pixels) {\n const casted = tf.cast(pixels, 'float32');\n tensor = tf.expandDims(casted, 0);\n tf.dispose(pixels);\n tf.dispose(casted);\n }\n }\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\ntype Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.segmentation.modelPath)) as unknown as GraphModel;\n if (!model || !model['modelUrl']) log('load model failed:', config.segmentation.modelPath);\n else if (config.debug) log('load model:', model['modelUrl']);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement }): Promise {\n const width = input.tensor?.shape[1] || 0;\n const height = input.tensor?.shape[2] || 0;\n if (!input.tensor) return null;\n if (!model || !model.inputs[0].shape) return null;\n const resizeInput = tf.image.resizeBilinear(input.tensor, [model.inputs[0].shape[1], model.inputs[0].shape[2]], false);\n const norm = tf.div(resizeInput, 255);\n const res = model.predict(norm) as Tensor;\n // meet output: 1,256,256,1\n // selfie output: 1,144,256,2\n tf.dispose(resizeInput);\n tf.dispose(norm);\n\n const squeeze = tf.squeeze(res, 0);\n let resizeOutput;\n if (squeeze.shape[2] === 2) {\n // model meet has two channels for fg and bg\n const softmax = squeeze.softmax();\n const [bg, fg] = tf.unstack(softmax, 2);\n const expand = tf.expandDims(fg, 2);\n const pad = tf.expandDims(expand, 0);\n tf.dispose(softmax);\n tf.dispose(bg);\n tf.dispose(fg);\n // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n const crop = tf.image.cropAndResize(pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n // otherwise run softmax after unstack and use standard resize\n // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n resizeOutput = tf.squeeze(crop, 0);\n tf.dispose(crop);\n tf.dispose(expand);\n tf.dispose(pad);\n } else { // model selfie has a single channel that we can use directly\n resizeOutput = tf.image.resizeBilinear(squeeze, [width, height]);\n }\n\n if (typeof document === 'undefined') return resizeOutput.data(); // we're running in nodejs so return alpha array as-is\n\n const overlay = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas');\n overlay.width = width;\n overlay.height = height;\n if (tf.browser) await tf.browser.toPixels(resizeOutput, overlay);\n tf.dispose(resizeOutput);\n tf.dispose(squeeze);\n tf.dispose(res);\n\n // get alpha channel data\n const alphaCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas'); // need one more copy since input may already have gl context so 2d context fails\n alphaCanvas.width = width;\n alphaCanvas.height = height;\n const ctxAlpha = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctxAlpha.filter = 'blur(8px';\n await ctxAlpha.drawImage(overlay, 0, 0);\n const alpha = ctxAlpha.getImageData(0, 0, width, height).data;\n\n // get original canvas merged with overlay\n const original = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas'); // need one more copy since input may already have gl context so 2d context fails\n original.width = width;\n original.height = height;\n const ctx = original.getContext('2d') as CanvasRenderingContext2D;\n if (input.canvas) await ctx.drawImage(input.canvas, 0, 0);\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n ctx.globalCompositeOperation = 'darken';\n ctx.filter = 'blur(8px)'; // use css filter for bluring, can be done with gaussian blur manually instead\n await ctx.drawImage(overlay, 0, 0);\n ctx.globalCompositeOperation = 'source-over'; // reset\n ctx.filter = 'none'; // reset\n\n input.canvas = original;\n\n return alpha;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config): Promise {\n if (busy) return null;\n busy = true;\n if (!model) await load(config);\n const img = image.process(input, config);\n const alpha = await predict(img);\n tf.dispose(img.tensor);\n\n if (background && alpha) {\n const tmp = image.process(background, config);\n const bg = tmp.canvas;\n tf.dispose(tmp.tensor);\n const fg = img.canvas;\n const fgData = fg.getContext('2d')?.getImageData(0, 0, fg.width, fg.height).data as Uint8ClampedArray;\n\n const c = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(fg.width, fg.height) : document.createElement('canvas');\n c.width = fg.width;\n c.height = fg.height;\n const ctx = c.getContext('2d') as CanvasRenderingContext2D;\n\n ctx.globalCompositeOperation = 'copy'; // reset\n ctx.drawImage(bg, 0, 0, c.width, c.height);\n const cData = ctx.getImageData(0, 0, c.width, c.height) as ImageData;\n for (let i = 0; i < c.width * c.height; i++) { // this should be done with globalCompositeOperation instead of looping through image data\n cData.data[4 * i + 0] = ((255 - alpha[4 * i + 0]) / 255.0 * cData.data[4 * i + 0]) + (alpha[4 * i + 0] / 255.0 * fgData[4 * i + 0]);\n cData.data[4 * i + 1] = ((255 - alpha[4 * i + 1]) / 255.0 * cData.data[4 * i + 1]) + (alpha[4 * i + 1] / 255.0 * fgData[4 * i + 1]);\n cData.data[4 * i + 2] = ((255 - alpha[4 * i + 2]) / 255.0 * cData.data[4 * i + 2]) + (alpha[4 * i + 2] / 255.0 * fgData[4 * i + 2]);\n cData.data[4 * i + 3] = ((255 - alpha[4 * i + 3]) / 255.0 * cData.data[4 * i + 3]) + (alpha[4 * i + 3] / 255.0 * fgData[4 * i + 3]);\n }\n ctx.putImageData(cData, 0, 0);\n img.canvas = c;\n }\n busy = false;\n return img.canvas;\n}\n", "import * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as segmentation from './segmentation/segmentation';\n// import * as agegenderrace from './gear/agegenderrace';\n\n/** Load method preloads all instance.configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n * @param userinstance.config?: {@link instance.config}\n*/\nexport async function load(instance) {\n if (instance.config.async) { // load models concurrently\n [\n instance.models.face,\n instance.models.emotion,\n instance.models.handpose,\n instance.models.posenet,\n instance.models.blazepose,\n instance.models.efficientpose,\n instance.models.movenet,\n instance.models.nanodet,\n instance.models.centernet,\n instance.models.faceres,\n instance.models.segmentation,\n // instance.models.agegenderrace,\n ] = await Promise.all([\n instance.models.face || (instance.config.face.enabled ? facemesh.load(instance.config) : null),\n instance.models.emotion || ((instance.config.face.enabled && instance.config.face.emotion.enabled) ? emotion.load(instance.config) : null),\n instance.models.handpose || (instance.config.hand.enabled ? handpose.load(instance.config) : null),\n instance.models.posenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('posenet') ? posenet.load(instance.config) : null),\n instance.models.blazepose || (instance.config.body.enabled && instance.config.body.modelPath.includes('blazepose') ? blazepose.load(instance.config) : null),\n instance.models.efficientpose || (instance.config.body.enabled && instance.config.body.modelPath.includes('efficientpose') ? efficientpose.load(instance.config) : null),\n instance.models.movenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('movenet') ? movenet.load(instance.config) : null),\n instance.models.nanodet || (instance.config.object.enabled && instance.config.object.modelPath.includes('nanodet') ? nanodet.load(instance.config) : null),\n instance.models.centernet || (instance.config.object.enabled && instance.config.object.modelPath.includes('centernet') ? centernet.load(instance.config) : null),\n instance.models.faceres || ((instance.config.face.enabled && instance.config.face.description.enabled) ? faceres.load(instance.config) : null),\n instance.models.segmentation || (instance.config.segmentation.enabled ? segmentation.load(instance.config) : null),\n // instance.models.agegenderrace || ((instance.config.face.enabled && instance.config.face.agegenderrace.enabled) ? agegenderrace.load(instance.config) : null),\n ]);\n } else { // load models sequentially\n if (instance.config.face.enabled && !instance.models.face) instance.models.face = await facemesh.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.emotion.enabled && !instance.models.emotion) instance.models.emotion = await emotion.load(instance.config);\n if (instance.config.hand.enabled && !instance.models.handpose) instance.models.handpose = await handpose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.posenet && instance.config.body.modelPath.includes('posenet')) instance.models.posenet = await posenet.load(instance.config);\n if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body.modelPath.includes('blazepose')) instance.models.blazepose = await blazepose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body.modelPath.includes('efficientpose')) instance.models.efficientpose = await blazepose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.movenet && instance.config.body.modelPath.includes('movenet')) instance.models.movenet = await movenet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object.modelPath.includes('nanodet')) instance.models.nanodet = await nanodet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.centernet && instance.config.object.modelPath.includes('centernet')) instance.models.centernet = await centernet.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.description.enabled && !instance.models.faceres) instance.models.faceres = await faceres.load(instance.config);\n if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = await segmentation.load(instance.config);\n // if (instance.config.face.enabled && instance.config.face.agegenderrace.enabled && !instance.models.agegenderrace) instance.models.agegenderrace = await agegenderrace.load(instance.config);\n }\n}\n", "/**\n * Module that analyzes person age\n * Obsolete\n */\n\nimport { log, now } from './helpers';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\nimport { Tensor } from './tfjs/types';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nconst calculateGaze = (face): { bearing: number, strength: number } => {\n const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = face.mesh[33][2] > face.mesh[263][2]; // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n\n const eyeDiff = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] ** 2) + (eyeDiff[1] ** 2)); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n\n return { bearing, strength };\n};\n\nconst calculateFaceAngle = (face, imageSize): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v) => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a, b) => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a, b) => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r) => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (isNaN(thetaX)) thetaX = 0;\n if (isNaN(thetaY)) thetaY = 0;\n if (isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n // simple Euler angle calculation based existing 3D mesh\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const meshToEulerAngle = (mesh) => {\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const angle = {\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n // pitch is face move up/down\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face\n // yaw is face turn left/right\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye\n // roll is face lean left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye\n };\n return angle;\n };\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n // make the xyz coordinates proportional, independent of the image/box size\n pt[0] * imageSize[0] / size,\n pt[1] * imageSize[1] / size,\n pt[2],\n ]);\n\n const y_axis = normalize(subVectors(pts[1], pts[0]));\n let x_axis = normalize(subVectors(pts[3], pts[2]));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n\nexport const detectFace = async (parent /* instance of human */, input: Tensor): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp;\n let ageRes;\n let gearRes;\n let genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.performance.face = Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n parent.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Emotion:');\n if (parent.config.async) {\n emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:emotion';\n timeStamp = now();\n emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n parent.performance.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\n\n // run gear, inherits face from blazeface\n /*\n parent.analyze('Start GEAR:');\n if (parent.config.async) {\n gearRes = parent.config.face.agegenderrace.enabled ? agegenderrace.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:gear';\n timeStamp = now();\n gearRes = parent.config.face.agegenderrace.enabled ? await agegenderrace.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n parent.performance.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End GEAR:');\n */\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Description:');\n if (parent.config.async) {\n descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];\n } else {\n parent.state = 'run:description';\n timeStamp = now();\n descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];\n parent.performance.embedding = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Description:');\n\n // if async wait for results\n if (parent.config.async) {\n [ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes]);\n }\n\n parent.analyze('Finish Face:');\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n delete faces[i].annotations.leftEyeIris;\n delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n /* note: average human iris size is 11.7mm */\n ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n : 0;\n\n // optionally return tensor\n const tensor = parent.config.face.detector.return ? tf.squeeze(faces[i].tensor) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n faceRes.push({\n ...faces[i],\n id: i,\n age: descRes.age,\n gender: descRes.gender,\n genderScore: descRes.genderScore,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,\n rotation,\n tensor,\n });\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.performance.face) delete parent.performance.face;\n if (parent.performance.age) delete parent.performance.age;\n if (parent.performance.gender) delete parent.performance.gender;\n if (parent.performance.emotion) delete parent.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * Gesture detection module\n */\n\nimport { Gesture } from '../result';\nimport * as fingerPose from '../fingerpose/fingerpose';\n\n/**\n * @typedef FaceGesture\n */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/**\n * @typedef IrisGesture\n */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/**\n * @typedef BodyGesture\n */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/**\n * @typedef BodyGesture\n */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n }\n return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 0) {\n const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2];\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking left' });\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: number }> = [];\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n const poses = fingerPose.match(res[i]['keypoints']);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n return gestures;\n};\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep, now } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n */\nexport interface DrawOptions {\n color: string,\n labelColor: string,\n shadowColor: string,\n font: string,\n lineHeight: number,\n lineWidth: number,\n pointSize: number,\n roundRect: number,\n drawPoints: boolean,\n drawLabels: boolean,\n drawBoxes: boolean,\n drawPolygons: boolean,\n drawGaze: boolean,\n fillPolygons: boolean,\n useDepth: boolean,\n useCurves: boolean,\n bufferedOutput: boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 14px \"Segoe UI\"',\n lineHeight: 18,\n lineWidth: 4,\n pointSize: 2,\n roundRect: 8,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: true,\n};\n\nconst getCanvasContext = (input) => {\n if (input && input.getContext) return input.getContext('2d');\n throw new Error('Human: Invalid Canvas');\n};\n\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n ctx.beginPath();\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.lineWidth = localOptions.lineWidth;\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n const z = pt[2] || 0;\n ctx.strokeStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: [number, number, number?][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport async function gesture(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where: unknown[] = []; // what&where is a record\n let what: unknown[] = []; // what&where is a record\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${who}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n}\n\nexport async function face(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n for (const f of result) {\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.drawBoxes) rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`distance: ${f.iris}`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n }\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = localOptions.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * localOptions.lineHeight + f.box[1];\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n ctx.lineWidth = 1;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n }\n if (localOptions.drawPolygons) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [\n triangulation[i * 3 + 0],\n triangulation[i * 3 + 1],\n triangulation[i * 3 + 2],\n ].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (localOptions.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = 'pink';\n ctx.beginPath();\n\n const leftGaze = [\n f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n ctx.moveTo(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]);\n ctx.lineTo(leftGaze[0], leftGaze[1]);\n\n const rightGaze = [\n f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n ctx.moveTo(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]);\n ctx.lineTo(rightGaze[0], rightGaze[1]);\n\n ctx.stroke();\n }\n }\n }\n }\n}\n\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels) {\n ctx.font = localOptions.font;\n if (result[i].keypoints) {\n for (const pt of result[i].keypoints) {\n ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: [number, number, number?][] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // torso main\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n // leg left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // leg right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // arm right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position[0], part.position[1]]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position[0], part.position[1]]);\n curves(ctx, points, localOptions);\n // draw all\n }\n }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText('hand', h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n const addHandLabel = (part, title) => {\n if (!part) return;\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['index'], 'index');\n addHandLabel(h.annotations['middle'], 'middle');\n addHandLabel(h.annotations['ring'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palm'], 'palm');\n }\n if (localOptions.drawPolygons) {\n const addHandLine = (part) => {\n if (!part) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['index']);\n addHandLine(h.annotations['middle']);\n addHandLine(h.annotations['ring']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palm);\n }\n }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${h.label} ${Math.round(100 * h.score)}%`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\nexport async function person(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n getCanvasContext(outCanvas);\n const ctx = getCanvasContext(inCanvas);\n ctx.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const timestamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return null;\n\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n // person(inCanvas, result.persons, localOptions);\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n ]);\n /*\n if (!bufferedResult) bufferedResult = result; // first pass\n else if (localOptions.bufferedOutput) calcBuffered(result); // do results interpolation\n else bufferedResult = result; // or just use results as-is\n const promises: Promise[] = [];\n promises.push(face(inCanvas, bufferedResult.face, localOptions));\n promises.push(body(inCanvas, bufferedResult.body, localOptions));\n promises.push(hand(inCanvas, bufferedResult.hand, localOptions));\n promises.push(object(inCanvas, bufferedResult.object, localOptions));\n // promises.push(person(inCanvas, bufferedResult.persons, localOptions));\n promises.push(gesture(inCanvas, result.gesture, localOptions)); // gestures do not have buffering\n // await Promise.all(promises);\n */\n result.performance.draw = Math.trunc(now() - timestamp);\n return promise;\n}\n", "/**\n * Module that analyzes existing results and recombines them into a unified person object\n */\n\nimport { Face, Body, Hand, Gesture, Person } from './result';\n\nexport function join(faces: Array, bodies: Array, hands: Array, gestures: Array, shape: Array | undefined): Array {\n let id = 0;\n const persons: Array = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: Person = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n }\n\n // create new overarching box from all boxes beloning to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: [number, number, number, number] | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face?.box);\n extractXY(person.body?.box);\n extractXY(person.hands?.left?.box);\n extractXY(person.hands?.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape && shape[1] && shape[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Module that interpolates results for smoother animations\n */\n\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from './result';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n\nexport function calc(newResult: Result): Result {\n if (!newResult) return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n // curve fitted: buffer = 8 - ln(delay)\n // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n // - at 50ms delay buffer = ~4.1 => 28% towards live data\n // - at 250ms delay buffer = ~2.5 => 40% towards live data\n // - at 500ms delay buffer = ~1.8 => 55% towards live data\n // - at 750ms delay buffer = ~1.4 => 71% towards live data\n // - at 1sec delay buffer = 1 which means live data is used\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n bufferedResult.canvas = newResult.canvas;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as Body[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor) as [number, number, number, number];\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor) as [number, number, number, number];\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((keypoint, j) => ({\n score: keypoint.score,\n part: keypoint.part,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1],\n ],\n }))) as Array<{ score: number, part: string, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as Hand[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n const keypoints = newResult.hand[i].keypoints ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)) as [number, number, number])\n : [];\n const keys = Object.keys(newResult.hand[i].annotations); // update annotations\n const annotations = {};\n for (const key of keys) {\n annotations[key] = newResult.hand[i].annotations[key]\n .map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor));\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as Hand['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as Face[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as Item[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as Person[]));\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as [number, number, number, number];\n }\n }\n }\n\n // just copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture as Gesture[];\n if (newResult.performance) bufferedResult.performance = newResult.performance;\n\n return bufferedResult;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Human main module\n */\n\nimport { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result, Face, Hand, Body, Item, Gesture } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as models from './models';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as persons from './persons';\nimport * as interpolate from './interpolate';\nimport * as sample from './sample';\nimport * as app from '../package.json';\nimport { Tensor, GraphModel } from './tfjs/types';\n\n// export types\nexport { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture, Person } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection\n * @typedef Input Type\n */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message\n * @typedef Error Type\n */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS\n * @external\n */\nexport type TensorFlow = typeof tf;\n\n/**\n * **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig: {@link Config}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n /** Current configuration\n * - Details: {@link Config}\n */\n config: Config;\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n /** @internal: Instance of current image being processed */\n image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n /** @internal: Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n */\n tf: TensorFlow;\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - options: {@link DrawOptions} global settings for all draw operations, can be overriden for each draw method\n * - face: draw detected faces\n * - body: draw detected people and body parts\n * - hand: draw detected hands and hand parts\n * - canvas: draw processed canvas which is a processed copy of the input\n * - all: meta-function that performs: canvas, face, body, hand\n */\n draw: {\n options: draw.DrawOptions,\n gesture: typeof draw.gesture,\n face: typeof draw.face,\n body: typeof draw.body,\n hand: typeof draw.hand,\n canvas: typeof draw.canvas,\n all: typeof draw.all,\n };\n /** Types used by Human */\n static Config: Config;\n static Result: Result;\n static Face: Face;\n static Hand: Hand;\n static Body: Body;\n static Item: Item;\n static Gesture: Gesture;\n static Person: Gesture\n static DrawOptions: draw.DrawOptions;\n /** @internal: Currently loaded models */\n models: {\n face: [unknown, GraphModel | null, GraphModel | null] | null,\n posenet: GraphModel | null,\n blazepose: GraphModel | null,\n efficientpose: GraphModel | null,\n movenet: GraphModel | null,\n handpose: [GraphModel | null, GraphModel | null] | null,\n age: GraphModel | null,\n gender: GraphModel | null,\n emotion: GraphModel | null,\n embedding: GraphModel | null,\n nanodet: GraphModel | null,\n centernet: GraphModel | null,\n faceres: GraphModel | null,\n segmentation: GraphModel | null,\n };\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: typeof facemesh.uvmap;\n /** Platform and agent information detected by Human */\n sysinfo: { platform: string, agent: string };\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n #firstRun: boolean;\n #lastInputSum: number;\n #lastCacheDiff: number;\n\n // definition end\n\n /**\n * Creates instance of Human library that is futher used for all operations\n * @param userConfig: {@link Config}\n */\n constructor(userConfig?: Config | Record) {\n this.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n defaults.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n this.config = mergeDeep(defaults, userConfig || {});\n this.tf = tf;\n this.draw = draw;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.#firstRun = true;\n this.#lastCacheDiff = 0;\n this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 };\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n movenet: null,\n handpose: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n segmentation: null,\n };\n this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [] };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.image = (input: Input) => image.process(input, this.config);\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // include platform info\n this.sysinfo = sysinfo.info();\n this.#lastInputSum = 1;\n }\n\n // helper function: measure tensor leak\n /** @hidden */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n }\n\n // quick sanity check on inputs\n /** @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n }\n\n /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n * - Calculation is based on normalized Minkowski distance between\n *\n * @param embedding1: face descriptor as array of numbers\n * @param embedding2: face descriptor as array of numbers\n * @returns similarity: number\n */\n // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\n }\n\n /**\n * Segmentation method takes any input and returns processed canvas with body segmentation\n * Optional parameter background is used to fill the background with specific input\n * Segmentation is not triggered as part of detect process\n *\n * @param input: {@link Input}\n * @param background?: {@link Input}\n * @returns Canvas\n */\n segmentation(input: Input, background?: Input) {\n return segmentation.process(input, background, this.config);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n * @param input: Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /** Math method find best match between provided face descriptor and predefined database of known descriptors\n * @param faceEmbedding: face descriptor previsouly calculated on any face\n * @param db: array of mapping of face descriptors to known values\n * @param threshold: minimum score for matching to be considered in the result\n * @returns best match\n */\n // eslint-disable-next-line class-methods-use-this\n match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n return faceres.match(faceEmbedding, db, threshold);\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n * @param userConfig?: {@link Config}\n */\n async load(userConfig?: Config | Record) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.#firstRun) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version_core}`);\n if (this.config.debug) log('platform:', this.sysinfo.platform);\n if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n await this.#checkBackend(true);\n if (this.tf.ENV.flags.IS_BROWSER) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n\n await models.load(this); // actually loads models\n\n if (this.#firstRun) { // print memory stats on first run\n if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n this.#firstRun = false;\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.load as number || 0)) this.performance.load = current;\n }\n\n // check if backend needs initialization if it changed\n /** @hidden */\n #checkBackend = async (force = false) => {\n if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n const timeStamp = now();\n this.state = 'backend';\n /* force backend reload\n if (this.config.backend in tf.engine().registry) {\n const backendFactory = tf.findBackendFactory(this.config.backend);\n tf.removeBackend(this.config.backend);\n tf.registerBackend(this.config.backend, backendFactory);\n } else {\n log('Backend not registred:', this.config.backend);\n }\n */\n\n if (this.config.backend && this.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) {\n log('running inside web worker');\n }\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') {\n log('override: backend set to tensorflow while running in browser');\n this.config.backend = 'humangl';\n }\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) {\n log('override: backend set to webgl while running in nodejs');\n this.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator['gpu'] === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n this.config.backend = 'humangl';\n } else {\n const adapter = await navigator['gpu'].requestAdapter();\n if (this.config.debug) log('enumerated webgpu adapter:', adapter);\n }\n }\n\n // check available backends\n if (this.config.backend === 'humangl') backend.register();\n const available = Object.keys(this.tf.engine().registryFactory);\n if (this.config.debug) log('available backends:', available);\n\n if (!available.includes(this.config.backend)) {\n log(`error: backend ${this.config.backend} not found in registry`);\n this.config.backend = this.tf.ENV.flags.IS_NODE ? 'tensorflow' : 'humangl';\n log(`override: using backend ${this.config.backend} instead`);\n }\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\n // handle wasm\n if (this.config.backend === 'wasm') {\n if (this.config.debug) log('wasm path:', this.config.wasmPath);\n if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n else throw new Error('Human: WASM backend is not loaded');\n const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n // handle humangl\n try {\n await this.tf.setBackend(this.config.backend);\n } catch (err) {\n log('error: cannot set backend:', this.config.backend, err);\n }\n }\n\n // handle webgl & humangl\n if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n this.tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);\n // if (!this.config.object.enabled) this.tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof this.config['deallocate'] !== 'undefined' && this.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n // @ts-ignore getGPGPUContext only exists on WebGL backend\n const gl = await this.tf.backend().getGPGPUContext().gl;\n if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n\n // wait for ready\n this.tf.enableProdMode();\n await this.tf.ready();\n this.performance.backend = Math.trunc(now() - timeStamp);\n }\n }\n\n /**\n * Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result?: {@link Result} optional use specific result set to run interpolation on\n * @returns result: {@link Result}\n */\n next = (result?: Result) => interpolate.calc(result || this.result) as Result;\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input: Tensor) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 32;\n if (!input.shape[1] || !input.shape[2]) return false;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n /*\n const sumT = this.tf.sum(reduced);\n const sum = await sumT.data()[0] as number;\n sumT.dispose();\n */\n // use js loop sum, faster than uploading tensor to gpu calculating and downloading back\n const reducedData = await reduced.data(); // raw image rgb array\n let sum = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum += reducedData[3 * i + 2]; // look only at green value of each pixel\n\n reduced.dispose();\n const diff = 100 * (Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1);\n this.#lastInputSum = sum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 10 * this.config.cacheSensitivity ? 0 : diff;\n // console.log('skipFrame', skipFrame, this.config.cacheSensitivity, diff);\n return skipFrame;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input: Input\n * @param userConfig?: {@link Config}\n * @returns result: {@link Result}\n */\n async detect(input: Input, userConfig?: Config | Record): Promise {\n // detection happens inside a promise\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n let elapsedTime;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n resolve({ error });\n }\n\n const timeStart = now();\n\n // configure backend\n await this.#checkBackend();\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n let process = image.process(input, this.config);\n this.performance.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n // run segmentation preprocessing\n if (this.config.segmentation.enabled && process && process.tensor) {\n this.analyze('Start Segmentation:');\n this.state = 'run:segmentation';\n timeStamp = now();\n await segmentation.predict(process);\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.segmentation = elapsedTime;\n if (process.canvas) {\n // replace input\n tf.dispose(process.tensor);\n process = image.process(process.canvas, this.config);\n }\n this.analyze('End Segmentation:');\n }\n\n if (!process || !process.tensor) {\n log('could not convert input to tensor');\n resolve({ error: 'could not convert input to tensor' });\n return;\n }\n\n timeStamp = now();\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.performance.frames) this.performance.frames = 0;\n if (!this.performance.cached) this.performance.cached = 0;\n (this.performance.frames as number)++;\n if (this.config.skipFrame) this.performance.cached++;\n this.performance.changed = Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: Face[] | Promise | never[] = [];\n let bodyRes: Body[] | Promise | never[] = [];\n let handRes: Hand[] | Promise | never[] = [];\n let objectRes: Item[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.face = elapsedTime;\n }\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n if (this.config.async) {\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(process.tensor, this.config) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n this.state = 'run:body';\n timeStamp = now();\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.body = elapsedTime;\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n if (this.config.async) {\n handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n this.state = 'run:hand';\n timeStamp = now();\n handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.hand = elapsedTime;\n }\n this.analyze('End Hand:');\n\n // run nanodet\n this.analyze('Start Object:');\n if (this.config.async) {\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n this.state = 'run:object';\n timeStamp = now();\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n elapsedTime = Math.trunc(now() - timeStamp);\n if (elapsedTime > 0) this.performance.object = elapsedTime;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n let gestureRes: Gesture[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n if (!this.config.async) this.performance.gesture = Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n this.result = {\n face: faceRes as Face[],\n body: bodyRes as Body[],\n hand: handRes as Hand[],\n gesture: gestureRes,\n object: objectRes as Item[],\n performance: this.performance,\n canvas: process.canvas,\n timestamp: Date.now(),\n get persons() { return persons.join(faceRes as Face[], bodyRes as Body[], handRes as Hand[], gestureRes, process?.tensor?.shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(process.tensor);\n\n // log('Result:', result);\n resolve(this.result);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (this.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await this.detect(bitmap, this.config);\n bitmap.close();\n }\n return res;\n }\n\n /** @hidden */\n #warmupCanvas = async () => new Promise((resolve) => {\n let src;\n let size = 0;\n switch (this.config.warmup) {\n case 'face':\n size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n const img = new Image();\n img.onload = async () => {\n const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const res = await this.detect(canvas, this.config);\n resolve(res);\n };\n if (src) img.src = src;\n else resolve(null);\n });\n\n /** @hidden */\n #warmupNode = async () => {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (this.config.warmup === 'face') img = atob(sample.face);\n if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n if (!img) return null;\n let res;\n if (typeof tf['node'] !== 'undefined') {\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n this.tf.dispose(data);\n // log('Input:', expanded);\n res = await this.detect(expanded, this.config);\n this.tf.dispose(expanded);\n } else {\n if (this.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await this.detect(input, this.config);\n */\n }\n return res;\n }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig?: Config\n */\n async warmup(userConfig?: Config | Record): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n let res;\n if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n else res = await this.#warmupNode();\n const t1 = now();\n if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n return res;\n }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"], + "mappings": "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AA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,gBAAgB;AAAA,EACjB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA;AAGf,IAAM,SAAS;AAAA,EACpB;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACtJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACtJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACnJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;A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,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,UAAU,GAAG;AAAA,EAClB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,SAAS,GAAG;AAAA,EACjB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,GAAG;AAAA,EAChB,EAAE,GAAG,QAAQ,G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AAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Jb,IAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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", "names": [] } diff --git a/dist/human.esm.js b/dist/human.esm.js index 585ec15e..45424ace 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -4,61 +4,43754 @@ homepage: author: ' */ -var d5=Object.defineProperty;var WI=e=>d5(e,"__esModule",{value:!0});var $m=e=>{if(typeof require!="undefined")return require(e);throw new Error('Dynamic require of "'+e+'" is not supported')};var h5=(e,t)=>{WI(e);for(var n in t)d5(e,n,{get:t[n],enumerable:!0})};var p5=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var mn=(e,t,n)=>(p5(e,t,"read from private field"),n?n.call(e):t.get(e)),as=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},Ds=(e,t,n,s)=>(p5(e,t,"write to private field"),s?s.call(e,n):t.set(e,n),n);function gt(e,t){let n=e.endsWith("/")?"":"/",r=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${n}${t}`;if(!r.toLocaleLowerCase().includes(".json"))throw new Error(`Human: ModelPath Error: ${r} Expecting JSON file`);return r}function ue(...e){let t=new Date,n=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(n,"Human:",...e)}var Ye=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function gn(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,s)=>(Object.keys(s||{}).forEach(r=>{let a=n[r],o=s[r];Array.isArray(a)&&Array.isArray(o)?n[r]=a.concat(...o):t(a)&&t(o)?n[r]=gn(a,o):n[r]=o}),n),{})}var Fm={backend:"webgl",modelBasePath:"../models/",wasmPath:"",debug:!0,async:!0,warmup:"full",cacheSensitivity:.75,skipFrame:!1,filter:{enabled:!0,width:0,height:0,flip:!1,return:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:15,skipFrames:15,minConfidence:.2,iouThreshold:.1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:11,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:17,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:1,minConfidence:.2,skipFrames:1},hand:{enabled:!0,rotation:!0,skipFrames:18,minConfidence:.8,iouThreshold:.2,maxDetected:1,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:19},segmentation:{enabled:!1,modelPath:"selfie.json"}};function f5(){let e="",t="";if(typeof navigator!="undefined"){let n=navigator.userAgent.match(/\(([^()]+)\)/g);if(n&&n[0]){let s=n[0].match(/\(([^()]+)\)/g);e=s&&s[0]?s[0].replace(/\(|\)/g,""):"",t=navigator.userAgent.replace(n[0],""),e[1]&&(t=t.replace(n[1],"")),t=t.replace(/ /g," ")}}else typeof process!="undefined"&&(e=`${process.platform} ${process.arch}`,t=`NodeJS ${process.version}`);return{platform:e,agent:t}}var id={};h5(id,{Abs:()=>Ii,Acos:()=>Si,Acosh:()=>Ci,AdadeltaOptimizer:()=>gp,AdagradOptimizer:()=>Ap,AdamOptimizer:()=>yp,AdamaxOptimizer:()=>xp,Add:()=>Vr,AddN:()=>Na,All:()=>Ti,Any:()=>Ni,ArgMax:()=>Ea,ArgMin:()=>Pu,Asin:()=>Ei,Asinh:()=>Ri,Atan:()=>_i,Atan2:()=>$i,Atanh:()=>Di,AvgPool:()=>Ra,AvgPool3D:()=>Mu,AvgPool3DGrad:()=>Zd,AvgPoolGrad:()=>Kd,BackendWasm:()=>Wk,BatchMatMul:()=>_a,BatchToSpaceND:()=>Fi,Bincount:()=>Yd,BroadcastArgs:()=>Wm,BroadcastTo:()=>$5,Callback:()=>Lv,CallbackList:()=>_3,Cast:()=>Da,Ceil:()=>$a,ClipByValue:()=>Ur,Complex:()=>Jd,ComplexAbs:()=>zu,Concat:()=>Oi,Conv2D:()=>Fa,Conv2DBackpropFilter:()=>Qd,Conv2DBackpropInput:()=>Oa,Conv3D:()=>Lu,Conv3DBackpropFilterV2:()=>eh,Conv3DBackpropInputV2:()=>th,Cos:()=>Pa,Cosh:()=>Ma,CropAndResize:()=>Pi,Cumsum:()=>za,CustomCallback:()=>$3,DataStorage:()=>Hd,DenseBincount:()=>nh,DepthToSpace:()=>Mi,DepthwiseConv2dNative:()=>La,DepthwiseConv2dNativeBackpropFilter:()=>sh,DepthwiseConv2dNativeBackpropInput:()=>rh,Diag:()=>ah,Dilation2D:()=>Bu,Dilation2DBackpropFilter:()=>ih,Dilation2DBackpropInput:()=>oh,ENV:()=>os,EarlyStopping:()=>Wv,Einsum:()=>lh,Elu:()=>Wa,EluGrad:()=>uh,Environment:()=>_5,Equal:()=>Li,Erf:()=>zi,Exp:()=>Va,ExpandDims:()=>Bi,Expm1:()=>Wi,FFT:()=>ch,Fill:()=>Wu,FlipLeftRight:()=>Vi,Floor:()=>Ua,FloorDiv:()=>Ha,FromPixels:()=>_h,FusedBatchNorm:()=>Ga,FusedConv2D:()=>Co,FusedDepthwiseConv2D:()=>To,GPGPUContext:()=>wf,GatherNd:()=>Hi,GatherV2:()=>Ui,GraphModel:()=>x7,Greater:()=>Gi,GreaterEqual:()=>ja,History:()=>D3,IFFT:()=>dh,Identity:()=>qa,Imag:()=>hh,InputSpec:()=>zt,IsFinite:()=>ji,IsInf:()=>qi,IsNan:()=>Xi,KernelBackend:()=>$u,LRN:()=>Hu,LRNGrad:()=>fh,LayerVariable:()=>C3,LayersModel:()=>Nr,LeakyRelu:()=>Xa,Less:()=>Ki,LessEqual:()=>Zi,LinSpace:()=>ph,Log:()=>Ka,Log1p:()=>Yi,LogSoftmax:()=>F5,LogicalAnd:()=>Ji,LogicalNot:()=>Vu,LogicalOr:()=>Uu,MathBackendCPU:()=>of,MathBackendWebGL:()=>uu,Max:()=>Za,MaxPool:()=>Ja,MaxPool3D:()=>Gu,MaxPool3DGrad:()=>gh,MaxPoolGrad:()=>mh,MaxPoolWithArgmax:()=>Ah,Maximum:()=>Ya,Mean:()=>Qa,Min:()=>eo,Minimum:()=>to,MirrorPad:()=>no,Mod:()=>Qi,MomentumOptimizer:()=>bp,Multinomial:()=>yh,Multiply:()=>so,Neg:()=>el,NonMaxSuppressionV3:()=>nl,NonMaxSuppressionV4:()=>sl,NonMaxSuppressionV5:()=>rl,NotEqual:()=>tl,OP_SCOPE_SUFFIX:()=>K5,OneHot:()=>ro,OnesLike:()=>al,Optimizer:()=>Sr,Pack:()=>ol,PadV2:()=>ao,Pool:()=>GS,Pow:()=>oo,Prelu:()=>io,Prod:()=>il,RMSPropOptimizer:()=>vp,RNN:()=>ur,Range:()=>ju,Rank:()=>jm,Real:()=>xh,RealDiv:()=>Ba,Reciprocal:()=>ll,Reduction:()=>vn,Relu:()=>lo,Relu6:()=>co,Reshape:()=>ul,ResizeBilinear:()=>uo,ResizeBilinearGrad:()=>vh,ResizeNearestNeighbor:()=>qu,ResizeNearestNeighborGrad:()=>bh,Reverse:()=>ho,RotateWithOffset:()=>Il,Round:()=>po,Rsqrt:()=>fo,SGDOptimizer:()=>bc,ScatterNd:()=>cl,Select:()=>dl,Selu:()=>hl,Sequential:()=>Kl,Sigmoid:()=>go,Sign:()=>ml,Sin:()=>mo,Sinh:()=>fl,Slice:()=>pl,Softmax:()=>xo,Softplus:()=>gl,SpaceToBatchND:()=>Al,SparseFillEmptyRows:()=>wh,SparseReshape:()=>kh,SparseSegmentMean:()=>Ih,SparseSegmentSum:()=>Sh,SparseToDense:()=>Ch,SplitV:()=>yl,Sqrt:()=>Ao,Square:()=>Xu,SquaredDifference:()=>bo,Step:()=>Gr,StridedSlice:()=>xl,StringNGrams:()=>Th,StringSplit:()=>Nh,StringToHashBucketFast:()=>Eh,Sub:()=>vo,Sum:()=>yo,SymbolicTensor:()=>Vs,Tan:()=>wo,Tanh:()=>ko,Tensor:()=>Ge,TensorBuffer:()=>Ut,Tile:()=>Hr,TopK:()=>bl,Transform:()=>vl,Transpose:()=>Io,Unique:()=>Rh,Unpack:()=>wl,UnsortedSegmentSum:()=>Ku,Variable:()=>sc,ZerosLike:()=>kl,_FusedMatMul:()=>So,abs:()=>Ht,acos:()=>Fx,acosh:()=>Ox,add:()=>ae,addN:()=>Uh,all:()=>vg,any:()=>Hh,argMax:()=>er,argMin:()=>Px,asin:()=>Mx,asinh:()=>zx,atan:()=>Lx,atan2:()=>Bx,atanh:()=>Wx,avgPool:()=>jh,avgPool3d:()=>Ig,backend:()=>$x,backend_util:()=>D,basicLSTMCell:()=>ET,batchNorm:()=>Ol,batchNorm2d:()=>Gx,batchNorm3d:()=>jx,batchNorm4d:()=>qx,batchToSpaceND:()=>qh,bincount:()=>Sg,booleanMaskAsync:()=>VR,broadcastArgs:()=>Xx,broadcastTo:()=>cc,browser:()=>ls,buffer:()=>We,callbacks:()=>rL,cast:()=>ce,ceil:()=>Kx,clipByValue:()=>Gn,clone:()=>Os,complex:()=>qr,concat:()=>ft,concat1d:()=>Zx,concat2d:()=>Pl,concat3d:()=>Yx,concat4d:()=>Jx,constraints:()=>a3,conv1d:()=>Cg,conv2d:()=>Jr,conv2dTranspose:()=>Ng,conv3d:()=>Eg,conv3dTranspose:()=>eb,copyRegisteredKernels:()=>XS,cos:()=>Xh,cosh:()=>Rg,cosineWindow:()=>tA,cumsum:()=>_g,customGrad:()=>nr,data:()=>b7,denseBincount:()=>tb,deprecationWarn:()=>yg,depthToSpace:()=>nb,depthwiseConv2d:()=>dc,deregisterOp:()=>oL,device_util:()=>ac,diag:()=>aN,dilation2d:()=>sb,disableDeprecationWarnings:()=>VC,dispose:()=>Z,disposeVariables:()=>UC,div:()=>de,divNoNan:()=>rb,dot:()=>pN,dropout:()=>Fb,einsum:()=>ab,elu:()=>hc,enableDebugMode:()=>WC,enableProdMode:()=>BC,enclosingPowerOfTwo:()=>Ob,engine:()=>wr,env:()=>Q,equal:()=>us,erf:()=>ob,exp:()=>cs,expandDims:()=>Ot,expm1:()=>ib,eye:()=>Dg,fft:()=>lp,fill:()=>Ml,findBackend:()=>xg,findBackendFactory:()=>ZC,floor:()=>pc,floorDiv:()=>bg,forceHalfFloat:()=>j6,fused:()=>ta,gather:()=>zl,gatherND:()=>$b,gather_util:()=>dg,getBackend:()=>XC,getGradient:()=>Vm,getKernel:()=>Dh,getKernelsForBackend:()=>Cl,gpgpu_util:()=>b6,grad:()=>zN,grads:()=>LN,greater:()=>jn,greaterEqual:()=>Po,ifft:()=>Ac,imag:()=>Kh,image:()=>_e,inTopKAsync:()=>QR,initializers:()=>h3,input:()=>nv,io:()=>_n,irfft:()=>Kg,isFinite:()=>NN,isInf:()=>RN,isNaN:()=>lb,keep:()=>Jt,kernel_impls:()=>rr,layers:()=>k3,leakyRelu:()=>Zh,less:()=>$g,lessEqual:()=>Mo,linalg:()=>Gb,linspace:()=>ub,loadGraphModel:()=>mt,loadLayersModel:()=>fM,localResponseNormalization:()=>cb,log:()=>ds,log1p:()=>Yh,logSigmoid:()=>GN,logSoftmax:()=>Fg,logSumExp:()=>mb,logicalAnd:()=>Ps,logicalNot:()=>Qh,logicalOr:()=>Mg,logicalXor:()=>sE,losses:()=>MD,matMul:()=>Ve,math:()=>px,max:()=>hs,maxPool:()=>ep,maxPool3d:()=>zg,maxPoolWithArgmax:()=>gb,maximum:()=>kr,mean:()=>_t,memory:()=>Vh,meshgrid:()=>uE,metrics:()=>Pv,min:()=>tp,minimum:()=>fc,mirrorPad:()=>Ab,mod:()=>yb,model:()=>hM,models:()=>Mv,moments:()=>np,movingAverage:()=>GR,mul:()=>L,multiRNNCell:()=>AE,multinomial:()=>xb,neg:()=>Tt,nextFrame:()=>wp,norm:()=>Qg,notEqual:()=>Bl,oneHot:()=>lc,ones:()=>qn,onesLike:()=>ps,op:()=>W,outerProduct:()=>wE,pad:()=>Qr,pad1d:()=>SE,pad2d:()=>TE,pad3d:()=>EE,pad4d:()=>_E,pool:()=>PE,pow:()=>ea,prelu:()=>rp,print:()=>ix,prod:()=>Lg,profile:()=>HC,rand:()=>WE,randomGamma:()=>GE,randomNormal:()=>bb,randomUniform:()=>Wl,range:()=>Vl,ready:()=>qC,real:()=>mc,reciprocal:()=>vb,registerBackend:()=>Dl,registerCallbackConstructor:()=>mM,registerGradient:()=>O5,registerKernel:()=>No,registerOp:()=>aL,regularizers:()=>zv,relu:()=>sr,relu6:()=>Vg,removeBackend:()=>KC,reshape:()=>U,reverse:()=>fs,reverse1d:()=>eR,reverse2d:()=>nR,reverse3d:()=>rR,reverse4d:()=>oR,rfft:()=>up,round:()=>Ug,rsqrt:()=>Hg,scalar:()=>Ie,scatterND:()=>Db,scatter_util:()=>hg,selu:()=>Gg,separableConv2d:()=>wb,sequential:()=>pM,serialization:()=>oe,setBackend:()=>jC,setPlatform:()=>YC,setWasmPath:()=>Lie,setWasmPaths:()=>Bie,setWebGLContext:()=>pf,setdiff1dAsync:()=>kb,shared:()=>d2,sigmoid:()=>Hn,sign:()=>Ib,signal:()=>PD,sin:()=>jg,sinh:()=>qg,slice:()=>Re,slice1d:()=>ap,slice2d:()=>Xg,slice3d:()=>op,slice4d:()=>gc,slice_util:()=>xn,softmax:()=>ip,softplus:()=>Ll,spaceToBatchND:()=>sp,sparse:()=>xc,sparseToDense:()=>eA,spectral:()=>OD,split:()=>an,sqrt:()=>hn,square:()=>ct,squaredDifference:()=>Zg,squeeze:()=>lt,stack:()=>Dn,step:()=>yc,stridedSlice:()=>Sb,string:()=>mp,sub:()=>ge,sum:()=>ve,sumOutType:()=>Mh,tan:()=>Cb,tanh:()=>Fl,tensor:()=>dn,tensor1d:()=>Mt,tensor2d:()=>Ms,tensor3d:()=>Bh,tensor4d:()=>DR,tensor5d:()=>$R,tensor6d:()=>FR,tensor_util:()=>$s,test_util:()=>Ex,tidy:()=>H,tile:()=>Ts,time:()=>GC,topk:()=>Tb,train:()=>Bo,transpose:()=>Xe,truncatedNormal:()=>cp,unique:()=>Yg,unregisterGradient:()=>qS,unregisterKernel:()=>jS,unsortedSegmentSum:()=>Nb,unstack:()=>ms,upcastType:()=>Cs,util:()=>w,valueAndGrad:()=>BN,valueAndGrads:()=>WN,variable:()=>Eb,variableGrads:()=>db,version:()=>Uie,version_converter:()=>uB,version_core:()=>Dx,version_cpu:()=>KW,version_layers:()=>PA,version_wasm:()=>Wie,version_webgl:()=>wK,webgl:()=>kK,webgl_util:()=>Hw,where:()=>bn,whereAsync:()=>Jg,zeros:()=>Pt,zerosLike:()=>Ke});var VI=Object.create,Ud=Object.defineProperty,UI=Object.getOwnPropertyDescriptor,HI=Object.getOwnPropertyNames,GI=Object.getPrototypeOf,jI=Object.prototype.hasOwnProperty,m5=e=>Ud(e,"__esModule",{value:!0}),vi=e=>{if(typeof $m!="undefined")return $m(e);throw new Error('Dynamic require of "'+e+'" is not supported')},vt=(e,t)=>function(){return t||(0,e[Object.keys(e)[0]])((t={exports:{}}).exports,t),t.exports},Pe=(e,t)=>{m5(e);for(var n in t)Ud(e,n,{get:t[n],enumerable:!0})},qI=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of HI(t))!jI.call(e,s)&&s!=="default"&&Ud(e,s,{get:()=>t[s],enumerable:!(n=UI(t,s))||n.enumerable});return e},Sa=e=>qI(m5(Ud(e!=null?VI(GI(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),XI=vt({"node_modules/.pnpm/long@4.0.0/node_modules/long/src/long.js"(e,t){t.exports=s;var n=null;try{n=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(R){}function s(R,T,P){this.low=R|0,this.high=T|0,this.unsigned=!!P}s.prototype.__isLong__,Object.defineProperty(s.prototype,"__isLong__",{value:!0});function r(R){return(R&&R.__isLong__)===!0}s.isLong=r;var a={},o={};function i(R,T){var P,V,j;return T?(R>>>=0,(j=0<=R&&R<256)&&(V=o[R],V)?V:(P=u(R,(R|0)<0?-1:0,!0),j&&(o[R]=P),P)):(R|=0,(j=-128<=R&&R<128)&&(V=a[R],V)?V:(P=u(R,R<0?-1:0,!1),j&&(a[R]=P),P))}s.fromInt=i;function l(R,T){if(isNaN(R))return T?b:x;if(T){if(R<0)return b;if(R>=g)return _}else{if(R<=-A)return O;if(R+1>=A)return C}return R<0?l(-R,T).neg():u(R%m|0,R/m|0,T)}s.fromNumber=l;function u(R,T,P){return new s(R,T,P)}s.fromBits=u;var c=Math.pow;function d(R,T,P){if(R.length===0)throw Error("empty string");if(R==="NaN"||R==="Infinity"||R==="+Infinity"||R==="-Infinity")return x;if(typeof T=="number"?(P=T,T=!1):T=!!T,P=P||10,P<2||360)throw Error("interior hyphen");if(V===0)return d(R.substring(1),T,P).neg();for(var j=l(c(P,8)),q=x,X=0;X>>0:this.low},E.toNumber=function(){return this.unsigned?(this.high>>>0)*m+(this.low>>>0):this.high*m+(this.low>>>0)},E.toString=function(T){if(T=T||10,T<2||36>>0,se=ne.toString(T);if(X=te,X.isZero())return se+ee;for(;se.length<6;)se="0"+se;ee=""+se+ee}},E.getHighBits=function(){return this.high},E.getHighBitsUnsigned=function(){return this.high>>>0},E.getLowBits=function(){return this.low},E.getLowBitsUnsigned=function(){return this.low>>>0},E.getNumBitsAbs=function(){if(this.isNegative())return this.eq(O)?64:this.neg().getNumBitsAbs();for(var T=this.high!=0?this.high:this.low,P=31;P>0&&(T&1<=0},E.isOdd=function(){return(this.low&1)==1},E.isEven=function(){return(this.low&1)==0},E.equals=function(T){return r(T)||(T=h(T)),this.unsigned!==T.unsigned&&this.high>>>31==1&&T.high>>>31==1?!1:this.high===T.high&&this.low===T.low},E.eq=E.equals,E.notEquals=function(T){return!this.eq(T)},E.neq=E.notEquals,E.ne=E.notEquals,E.lessThan=function(T){return this.comp(T)<0},E.lt=E.lessThan,E.lessThanOrEqual=function(T){return this.comp(T)<=0},E.lte=E.lessThanOrEqual,E.le=E.lessThanOrEqual,E.greaterThan=function(T){return this.comp(T)>0},E.gt=E.greaterThan,E.greaterThanOrEqual=function(T){return this.comp(T)>=0},E.gte=E.greaterThanOrEqual,E.ge=E.greaterThanOrEqual,E.compare=function(T){if(r(T)||(T=h(T)),this.eq(T))return 0;var P=this.isNegative(),V=T.isNegative();return P&&!V?-1:!P&&V?1:this.unsigned?T.high>>>0>this.high>>>0||T.high===this.high&&T.low>>>0>this.low>>>0?-1:1:this.sub(T).isNegative()?-1:1},E.comp=E.compare,E.negate=function(){return!this.unsigned&&this.eq(O)?O:this.not().add(v)},E.neg=E.negate,E.add=function(T){r(T)||(T=h(T));var P=this.high>>>16,V=this.high&65535,j=this.low>>>16,q=this.low&65535,X=T.high>>>16,ee=T.high&65535,te=T.low>>>16,ne=T.low&65535,se=0,J=0,ie=0,le=0;return le+=q+ne,ie+=le>>>16,le&=65535,ie+=j+te,J+=ie>>>16,ie&=65535,J+=V+ee,se+=J>>>16,J&=65535,se+=P+X,se&=65535,u(ie<<16|le,se<<16|J,this.unsigned)},E.subtract=function(T){return r(T)||(T=h(T)),this.add(T.neg())},E.sub=E.subtract,E.multiply=function(T){if(this.isZero())return x;if(r(T)||(T=h(T)),n){var P=n.mul(this.low,this.high,T.low,T.high);return u(P,n.get_high(),this.unsigned)}if(T.isZero())return x;if(this.eq(O))return T.isOdd()?O:x;if(T.eq(O))return this.isOdd()?O:x;if(this.isNegative())return T.isNegative()?this.neg().mul(T.neg()):this.neg().mul(T).neg();if(T.isNegative())return this.mul(T.neg()).neg();if(this.lt(y)&&T.lt(y))return l(this.toNumber()*T.toNumber(),this.unsigned);var V=this.high>>>16,j=this.high&65535,q=this.low>>>16,X=this.low&65535,ee=T.high>>>16,te=T.high&65535,ne=T.low>>>16,se=T.low&65535,J=0,ie=0,le=0,he=0;return he+=X*se,le+=he>>>16,he&=65535,le+=q*se,ie+=le>>>16,le&=65535,le+=X*ne,ie+=le>>>16,le&=65535,ie+=j*se,J+=ie>>>16,ie&=65535,ie+=q*ne,J+=ie>>>16,ie&=65535,ie+=X*te,J+=ie>>>16,ie&=65535,J+=V*se+j*ne+q*te+X*ee,J&=65535,u(le<<16|he,J<<16|ie,this.unsigned)},E.mul=E.multiply,E.divide=function(T){if(r(T)||(T=h(T)),T.isZero())throw Error("division by zero");if(n){if(!this.unsigned&&this.high===-2147483648&&T.low===-1&&T.high===-1)return this;var P=(this.unsigned?n.div_u:n.div_s)(this.low,this.high,T.low,T.high);return u(P,n.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?b:x;var V,j,q;if(this.unsigned){if(T.unsigned||(T=T.toUnsigned()),T.gt(this))return b;if(T.gt(this.shru(1)))return k;q=b}else{if(this.eq(O)){if(T.eq(v)||T.eq(S))return O;if(T.eq(O))return v;var X=this.shr(1);return V=X.div(T).shl(1),V.eq(x)?T.isNegative()?v:S:(j=this.sub(T.mul(V)),q=V.add(j.div(T)),q)}else if(T.eq(O))return this.unsigned?b:x;if(this.isNegative())return T.isNegative()?this.neg().div(T.neg()):this.neg().div(T).neg();if(T.isNegative())return this.div(T.neg()).neg();q=x}for(j=this;j.gte(T);){V=Math.max(1,Math.floor(j.toNumber()/T.toNumber()));for(var ee=Math.ceil(Math.log(V)/Math.LN2),te=ee<=48?1:c(2,ee-48),ne=l(V),se=ne.mul(T);se.isNegative()||se.gt(j);)V-=te,ne=l(V,this.unsigned),se=ne.mul(T);ne.isZero()&&(ne=v),q=q.add(ne),j=j.sub(se)}return q},E.div=E.divide,E.modulo=function(T){if(r(T)||(T=h(T)),n){var P=(this.unsigned?n.rem_u:n.rem_s)(this.low,this.high,T.low,T.high);return u(P,n.get_high(),this.unsigned)}return this.sub(this.div(T).mul(T))},E.mod=E.modulo,E.rem=E.modulo,E.not=function(){return u(~this.low,~this.high,this.unsigned)},E.and=function(T){return r(T)||(T=h(T)),u(this.low&T.low,this.high&T.high,this.unsigned)},E.or=function(T){return r(T)||(T=h(T)),u(this.low|T.low,this.high|T.high,this.unsigned)},E.xor=function(T){return r(T)||(T=h(T)),u(this.low^T.low,this.high^T.high,this.unsigned)},E.shiftLeft=function(T){return r(T)&&(T=T.toInt()),(T&=63)===0?this:T<32?u(this.low<>>32-T,this.unsigned):u(0,this.low<>>T|this.high<<32-T,this.high>>T,this.unsigned):u(this.high>>T-32,this.high>=0?0:-1,this.unsigned)},E.shr=E.shiftRight,E.shiftRightUnsigned=function(T){if(r(T)&&(T=T.toInt()),T&=63,T===0)return this;var P=this.high;if(T<32){var V=this.low;return u(V>>>T|P<<32-T,P>>>T,this.unsigned)}else return T===32?u(P,0,this.unsigned):u(P>>>T-32,0,this.unsigned)},E.shru=E.shiftRightUnsigned,E.shr_u=E.shiftRightUnsigned,E.toSigned=function(){return this.unsigned?u(this.low,this.high,!1):this},E.toUnsigned=function(){return this.unsigned?this:u(this.low,this.high,!0)},E.toBytes=function(T){return T?this.toBytesLE():this.toBytesBE()},E.toBytesLE=function(){var T=this.high,P=this.low;return[P&255,P>>>8&255,P>>>16&255,P>>>24,T&255,T>>>8&255,T>>>16&255,T>>>24]},E.toBytesBE=function(){var T=this.high,P=this.low;return[T>>>24,T>>>16&255,T>>>8&255,T&255,P>>>24,P>>>16&255,P>>>8&255,P&255]},s.fromBytes=function(T,P,V){return V?s.fromBytesLE(T,P):s.fromBytesBE(T,P)},s.fromBytesLE=function(T,P){return new s(T[0]|T[1]<<8|T[2]<<16|T[3]<<24,T[4]|T[5]<<8|T[6]<<16|T[7]<<24,P)},s.fromBytesBE=function(T,P){return new s(T[4]<<24|T[5]<<16|T[6]<<8|T[7],T[0]<<24|T[1]<<16|T[2]<<8|T[3],P)}}}),KI=vt({"(disabled):node_modules/.pnpm/node-fetch@2.6.1/node_modules/node-fetch/browser.js"(){}}),ZI=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/alea.js"(e,t){(function(n,s,r){function a(u){var c=this,d=l();c.next=function(){var h=2091639*c.s0+c.c*23283064365386963e-26;return c.s0=c.s1,c.s1=c.s2,c.s2=h-(c.c=h|0)},c.c=1,c.s0=d(" "),c.s1=d(" "),c.s2=d(" "),c.s0-=d(u),c.s0<0&&(c.s0+=1),c.s1-=d(u),c.s1<0&&(c.s1+=1),c.s2-=d(u),c.s2<0&&(c.s2+=1),d=null}function o(u,c){return c.c=u.c,c.s0=u.s0,c.s1=u.s1,c.s2=u.s2,c}function i(u,c){var d=new a(u),h=c&&c.state,p=d.next;return p.int32=function(){return d.next()*4294967296|0},p.double=function(){return p()+(p()*2097152|0)*11102230246251565e-32},p.quick=p,h&&(typeof h=="object"&&o(h,d),p.state=function(){return o(d,{})}),p}function l(){var u=4022871197,c=function(d){d=d.toString();for(var h=0;h>>0,p-=u,p*=u,u=p>>>0,p-=u,u+=p*4294967296}return(u>>>0)*23283064365386963e-26};return c}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.alea=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),YI=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor128.js"(e,t){(function(n,s,r){function a(l){var u=this,c="";u.x=0,u.y=0,u.z=0,u.w=0,u.next=function(){var h=u.x^u.x<<11;return u.x=u.y,u.y=u.z,u.z=u.w,u.w^=u.w>>>19^h^h>>>8},l===(l|0)?u.x=l:c+=l;for(var d=0;d>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(typeof d=="object"&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xor128=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),JI=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorwow.js"(e,t){(function(n,s,r){function a(l){var u=this,c="";u.next=function(){var h=u.x^u.x>>>2;return u.x=u.y,u.y=u.z,u.z=u.w,u.w=u.v,(u.d=u.d+362437|0)+(u.v=u.v^u.v<<4^(h^h<<1))|0},u.x=0,u.y=0,u.z=0,u.w=0,u.v=0,l===(l|0)?u.x=l:c+=l;for(var d=0;d>>4),u.next()}function o(l,u){return u.x=l.x,u.y=l.y,u.z=l.z,u.w=l.w,u.v=l.v,u.d=l.d,u}function i(l,u){var c=new a(l),d=u&&u.state,h=function(){return(c.next()>>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(typeof d=="object"&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xorwow=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),QI=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorshift7.js"(e,t){(function(n,s,r){function a(l){var u=this;u.next=function(){var d=u.x,h=u.i,p,f,m;return p=d[h],p^=p>>>7,f=p^p<<24,p=d[h+1&7],f^=p^p>>>10,p=d[h+3&7],f^=p^p>>>3,p=d[h+4&7],f^=p^p<<7,p=d[h+7&7],p=p^p<<13,f^=p^p<<9,d[h]=f,u.i=h+1&7,f};function c(d,h){var p,f,m=[];if(h===(h|0))f=m[0]=h;else for(h=""+h,p=0;p0;--p)d.next()}c(u,l)}function o(l,u){return u.x=l.x.slice(),u.i=l.i,u}function i(l,u){l==null&&(l=+new Date);var c=new a(l),d=u&&u.state,h=function(){return(c.next()>>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(d.x&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xorshift7=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),eS=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor4096.js"(e,t){(function(n,s,r){function a(l){var u=this;u.next=function(){var d=u.w,h=u.X,p=u.i,f,m;return u.w=d=d+1640531527|0,m=h[p+34&127],f=h[p=p+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=h[p]=m^f,u.i=p,m+(d^d>>>16)|0};function c(d,h){var p,f,m,g,A,y=[],x=128;for(h===(h|0)?(f=h,h=null):(h=h+"\0",f=0,x=Math.max(x,h.length)),m=0,g=-32;g>>15,f^=f<<4,f^=f>>>13,g>=0&&(A=A+1640531527|0,p=y[g&127]^=f+A,m=p==0?m+1:0);for(m>=128&&(y[(h&&h.length||0)&127]=-1),m=127,g=4*128;g>0;--g)f=y[m+34&127],p=y[m=m+1&127],f^=f<<13,p^=p<<17,f^=f>>>15,p^=p>>>12,y[m]=f^p;d.w=A,d.X=y,d.i=m}c(u,l)}function o(l,u){return u.i=l.i,u.w=l.w,u.X=l.X.slice(),u}function i(l,u){l==null&&(l=+new Date);var c=new a(l),d=u&&u.state,h=function(){return(c.next()>>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(d.X&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xor4096=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),tS=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/tychei.js"(e,t){(function(n,s,r){function a(l){var u=this,c="";u.next=function(){var h=u.b,p=u.c,f=u.d,m=u.a;return h=h<<25^h>>>7^p,p=p-f|0,f=f<<24^f>>>8^m,m=m-h|0,u.b=h=h<<20^h>>>12^p,u.c=p=p-f|0,u.d=f<<16^p>>>16^m,u.a=m-h|0},u.a=0,u.b=0,u.c=2654435769|0,u.d=1367130551,l===Math.floor(l)?(u.a=l/4294967296|0,u.b=l|0):c+=l;for(var d=0;d>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(typeof d=="object"&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.tychei=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),g5=vt({"(disabled):crypto"(){}}),nS=vt({"node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/seedrandom.js"(e,t){(function(n,s){var r=this,a=256,o=6,i=52,l="random",u=s.pow(a,o),c=s.pow(2,i),d=c*2,h=a-1,p;function f(v,k,S){var C=[];k=k==!0?{entropy:!0}:k||{};var _=y(A(k.entropy?[v,b(n)]:v==null?x():v,3),C),O=new m(C),E=function(){for(var R=O.g(o),T=u,P=0;R=d;)R/=2,T/=2,P>>>=1;return(R+P)/T};return E.int32=function(){return O.g(4)|0},E.quick=function(){return O.g(4)/4294967296},E.double=E,y(b(O.S),n),(k.pass||S||function(R,T,P,V){return V&&(V.S&&g(V,O),R.state=function(){return g(O,{})}),P?(s[l]=R,T):R})(E,_,"global"in k?k.global:this==s,k.state)}s["seed"+l]=f;function m(v){var k,S=v.length,C=this,_=0,O=C.i=C.j=0,E=C.S=[];for(S||(v=[S++]);_>>0,p-=u,p*=u,u=p>>>0,p-=u,u+=p*4294967296}return(u>>>0)*23283064365386963e-26};return c}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.alea=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),rS=vt({"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js"(e,t){(function(n,s,r){function a(l){var u=this,c="";u.x=0,u.y=0,u.z=0,u.w=0,u.next=function(){var h=u.x^u.x<<11;return u.x=u.y,u.y=u.z,u.z=u.w,u.w^=u.w>>>19^h^h>>>8},l===(l|0)?u.x=l:c+=l;for(var d=0;d>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(typeof d=="object"&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xor128=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),aS=vt({"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js"(e,t){(function(n,s,r){function a(l){var u=this,c="";u.next=function(){var h=u.x^u.x>>>2;return u.x=u.y,u.y=u.z,u.z=u.w,u.w=u.v,(u.d=u.d+362437|0)+(u.v=u.v^u.v<<4^(h^h<<1))|0},u.x=0,u.y=0,u.z=0,u.w=0,u.v=0,l===(l|0)?u.x=l:c+=l;for(var d=0;d>>4),u.next()}function o(l,u){return u.x=l.x,u.y=l.y,u.z=l.z,u.w=l.w,u.v=l.v,u.d=l.d,u}function i(l,u){var c=new a(l),d=u&&u.state,h=function(){return(c.next()>>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(typeof d=="object"&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xorwow=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),oS=vt({"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js"(e,t){(function(n,s,r){function a(l){var u=this;u.next=function(){var d=u.x,h=u.i,p,f,m;return p=d[h],p^=p>>>7,f=p^p<<24,p=d[h+1&7],f^=p^p>>>10,p=d[h+3&7],f^=p^p>>>3,p=d[h+4&7],f^=p^p<<7,p=d[h+7&7],p=p^p<<13,f^=p^p<<9,d[h]=f,u.i=h+1&7,f};function c(d,h){var p,f,m=[];if(h===(h|0))f=m[0]=h;else for(h=""+h,p=0;p0;--p)d.next()}c(u,l)}function o(l,u){return u.x=l.x.slice(),u.i=l.i,u}function i(l,u){l==null&&(l=+new Date);var c=new a(l),d=u&&u.state,h=function(){return(c.next()>>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(d.x&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xorshift7=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),iS=vt({"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js"(e,t){(function(n,s,r){function a(l){var u=this;u.next=function(){var d=u.w,h=u.X,p=u.i,f,m;return u.w=d=d+1640531527|0,m=h[p+34&127],f=h[p=p+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=h[p]=m^f,u.i=p,m+(d^d>>>16)|0};function c(d,h){var p,f,m,g,A,y=[],x=128;for(h===(h|0)?(f=h,h=null):(h=h+"\0",f=0,x=Math.max(x,h.length)),m=0,g=-32;g>>15,f^=f<<4,f^=f>>>13,g>=0&&(A=A+1640531527|0,p=y[g&127]^=f+A,m=p==0?m+1:0);for(m>=128&&(y[(h&&h.length||0)&127]=-1),m=127,g=4*128;g>0;--g)f=y[m+34&127],p=y[m=m+1&127],f^=f<<13,p^=p<<17,f^=f>>>15,p^=p>>>12,y[m]=f^p;d.w=A,d.X=y,d.i=m}c(u,l)}function o(l,u){return u.i=l.i,u.w=l.w,u.X=l.X.slice(),u}function i(l,u){l==null&&(l=+new Date);var c=new a(l),d=u&&u.state,h=function(){return(c.next()>>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(d.X&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.xor4096=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),lS=vt({"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js"(e,t){(function(n,s,r){function a(l){var u=this,c="";u.next=function(){var h=u.b,p=u.c,f=u.d,m=u.a;return h=h<<25^h>>>7^p,p=p-f|0,f=f<<24^f>>>8^m,m=m-h|0,u.b=h=h<<20^h>>>12^p,u.c=p=p-f|0,u.d=f<<16^p>>>16^m,u.a=m-h|0},u.a=0,u.b=0,u.c=2654435769|0,u.d=1367130551,l===Math.floor(l)?(u.a=l/4294967296|0,u.b=l|0):c+=l;for(var d=0;d>>0)/4294967296};return h.double=function(){do var p=c.next()>>>11,f=(c.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},h.int32=c.next,h.quick=h,d&&(typeof d=="object"&&o(d,c),h.state=function(){return o(c,{})}),h}s&&s.exports?s.exports=i:r&&r.amd?r(function(){return i}):this.tychei=i})(e,typeof t=="object"&&t,typeof define=="function"&&define)}}),uS=vt({"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js"(e,t){(function(n,s,r){var a=256,o=6,i=52,l="random",u=r.pow(a,o),c=r.pow(2,i),d=c*2,h=a-1,p;function f(v,k,S){var C=[];k=k==!0?{entropy:!0}:k||{};var _=y(A(k.entropy?[v,b(s)]:v==null?x():v,3),C),O=new m(C),E=function(){for(var R=O.g(o),T=u,P=0;R=d;)R/=2,T/=2,P>>>=1;return(R+P)/T};return E.int32=function(){return O.g(4)|0},E.quick=function(){return O.g(4)/4294967296},E.double=E,y(b(O.S),s),(k.pass||S||function(R,T,P,V){return V&&(V.S&&g(V,O),R.state=function(){return g(O,{})}),P?(r[l]=R,T):R})(E,_,"global"in k?k.global:this==r,k.state)}function m(v){var k,S=v.length,C=this,_=0,O=C.i=C.j=0,E=C.S=[];for(S||(v=[S++]);_1&&(g=process.argv[1].replace(/\\/g,"/")),m=process.argv.slice(2),process.on("uncaughtException",function(N){if(!(N instanceof _u))throw N}),process.on("unhandledRejection",Ar),A=function(N){process.exit(N)},c.inspect=function(){return"[Emscripten Module object]"};var V;try{V=cS()}catch(N){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),N}global.Worker=V.Worker}else v?(typeof read!="undefined"&&(_=function(F){return read(F)}),E=function(F){var B;return typeof readbuffer=="function"?new Uint8Array(readbuffer(F)):(B=read(F,"binary"),Ae(typeof B=="object"),B)},typeof scriptArgs!="undefined"?m=scriptArgs:typeof arguments!="undefined"&&(m=arguments),typeof quit=="function"&&(A=function(N){quit(N)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(y||x)&&(x?S=self.location.href:typeof document!="undefined"&&document.currentScript&&(S=document.currentScript.src),typeof s!="undefined"&&s&&(S=s),S.indexOf("blob:")!==0?S=S.substr(0,S.lastIndexOf("/")+1):S="",b?(_=function(F,B){return T||(T=vi("fs")),P||(P=Du()),F=P.normalize(F),T.readFileSync(F,B?null:"utf8")},E=function(F){var B=_(F,!0);return B.buffer||(B=new Uint8Array(B)),Ae(B.buffer),B}):(_=function(N){var F=new XMLHttpRequest;return F.open("GET",N,!1),F.send(null),F.responseText},x&&(E=function(N){var F=new XMLHttpRequest;return F.open("GET",N,!1),F.responseType="arraybuffer",F.send(null),new Uint8Array(F.response)}),O=function(N,F,B){var K=new XMLHttpRequest;K.open("GET",N,!0),K.responseType="arraybuffer",K.onload=function(){if(K.status==200||K.status==0&&K.response){F(K.response);return}B()},K.onerror=B,K.send(null)}),R=function(N){document.title=N});b&&typeof performance=="undefined"&&(global.performance=dS().performance);var j=c.print||console.log.bind(console),q=c.printErr||console.warn.bind(console);for(f in p)p.hasOwnProperty(f)&&(c[f]=p[f]);p=null,c.arguments&&(m=c.arguments),c.thisProgram&&(g=c.thisProgram),c.quit&&(A=c.quit);var X=Atomics.load,ee=Atomics.store,te=Atomics.compareExchange,ne;c.wasmBinary&&(ne=c.wasmBinary);var se=c.noExitRuntime||!0;typeof WebAssembly!="object"&&Ar("no native wasm support detected");var J,ie,le=!1,he;function Ae(N,F){N||Ar("Assertion failed: "+F)}function Ce(N){var F=c["_"+N];return Ae(F,"Cannot call unknown function "+N+", make sure it is exported"),F}function Te(N,F,B,K,me){var pe={string:function(fn){var bi=0;if(fn!=null&&fn!==0){var c5=(fn.length<<2)+1;bi=Ai(c5),nt(fn,bi,c5)}return bi},array:function(fn){var bi=Ai(fn.length);return et(fn,bi),bi}};function fe(fn){return F==="string"?Fe(fn):F==="boolean"?Boolean(fn):fn}var we=Ce(N),rt=[],Kt=0;if(K)for(var Vt=0;Vt=K);){var pe=N[F++];if(!pe)return me;if(!(pe&128)){me+=String.fromCharCode(pe);continue}var fe=N[F++]&63;if((pe&224)==192){me+=String.fromCharCode((pe&31)<<6|fe);continue}var we=N[F++]&63;if((pe&240)==224?pe=(pe&15)<<12|fe<<6|we:pe=(pe&7)<<18|fe<<12|we<<6|N[F++]&63,pe<65536)me+=String.fromCharCode(pe);else{var rt=pe-65536;me+=String.fromCharCode(55296|rt>>10,56320|rt&1023)}}return me}function Fe(N,F){return N?Me(o(),N,F):""}function ut(N,F,B,K){if(!(K>0))return 0;for(var me=B,pe=B+K-1,fe=0;fe=55296&&we<=57343){var rt=N.charCodeAt(++fe);we=65536+((we&1023)<<10)|rt&1023}if(we<=127){if(B>=pe)break;F[B++]=we}else if(we<=2047){if(B+1>=pe)break;F[B++]=192|we>>6,F[B++]=128|we&63}else if(we<=65535){if(B+2>=pe)break;F[B++]=224|we>>12,F[B++]=128|we>>6&63,F[B++]=128|we&63}else{if(B+3>=pe)break;F[B++]=240|we>>18,F[B++]=128|we>>12&63,F[B++]=128|we>>6&63,F[B++]=128|we&63}}return F[B]=0,B-me}function nt(N,F,B){return ut(N,o(),F,B)}function st(N){for(var F=0,B=0;B=55296&&K<=57343&&(K=65536+((K&1023)<<10)|N.charCodeAt(++B)&1023),K<=127?++F:K<=2047?F+=2:K<=65535?F+=3:F+=4}return F}function et(N,F){a().set(N,F)}function it(N,F){return N%F>0&&(N+=F-N%F),N}var He,Nn,St,Wn,nn,ks,pn,ts,ns;function sn(N){He=N,c.HEAP8=Nn=new Int8Array(N),c.HEAP16=Wn=new Int16Array(N),c.HEAP32=ks=new Int32Array(N),c.HEAPU8=St=new Uint8Array(N),c.HEAPU16=nn=new Uint16Array(N),c.HEAPU32=pn=new Uint32Array(N),c.HEAPF32=ts=new Float32Array(N),c.HEAPF64=ns=new Float64Array(N)}var ss=c.INITIAL_MEMORY||16777216;if(k)J=c.wasmMemory,He=c.buffer;else if(c.wasmMemory)J=c.wasmMemory;else if(J=new WebAssembly.Memory({initial:ss/65536,maximum:2147483648/65536,shared:!0}),!(J.buffer instanceof SharedArrayBuffer))throw q("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),b&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");J&&(He=J.buffer),ss=He.byteLength,sn(He);var rs,Vn=[],Ks=[],mr=[],Fr=[],ci=[],Zs=!1,vd=!1;k||Ks.push({func:function(){Pd()}});function i0(){if(!k){if(c.preRun)for(typeof c.preRun=="function"&&(c.preRun=[c.preRun]);c.preRun.length;)kd(c.preRun.shift());hi(Vn)}}function vu(){Zs=!0,!k&&hi(Ks)}function l0(){k||hi(mr)}function wd(){k||(vd=!0)}function En(){if(!k){if(c.postRun)for(typeof c.postRun=="function"&&(c.postRun=[c.postRun]);c.postRun.length;)u0(c.postRun.shift());hi(ci)}}function kd(N){Vn.unshift(N)}function u0(N){ci.unshift(N)}var gr=0,Or=null,wa=null;function c0(N){Ae(!k,"addRunDependency cannot be used in a pthread worker"),gr++,c.monitorRunDependencies&&c.monitorRunDependencies(gr)}function d0(N){if(gr--,c.monitorRunDependencies&&c.monitorRunDependencies(gr),gr==0&&(Or!==null&&(clearInterval(Or),Or=null),wa)){var F=wa;wa=null,F()}}c.preloadedImages={},c.preloadedAudios={};function Ar(N){c.onAbort&&c.onAbort(N),k&&console.error("Pthread aborting at "+new Error().stack),N+="",q(N),le=!0,he=1,N="abort("+N+"). Build with -s ASSERTIONS=1 for more info.";var F=new WebAssembly.RuntimeError(N);throw h(F),F}function Id(N,F){return String.prototype.startsWith?N.startsWith(F):N.indexOf(F)===0}var di="data:application/octet-stream;base64,";function Sd(N){return Id(N,di)}var h0="file://";function Cd(N){return Id(N,h0)}var Rn="tfjs-backend-wasm-threaded-simd.wasm";Sd(Rn)||(Rn=C(Rn));function Td(N){try{if(N==Rn&&ne)return new Uint8Array(ne);if(E)return E(N);throw"both async and sync fetching of the wasm failed"}catch(F){Ar(F)}}function p0(){if(!ne&&(y||x)){if(typeof fetch=="function"&&!Cd(Rn))return fetch(Rn,{credentials:"same-origin"}).then(function(N){if(!N.ok)throw"failed to load wasm binary file at '"+Rn+"'";return N.arrayBuffer()}).catch(function(){return Td(Rn)});if(O)return new Promise(function(N,F){O(Rn,function(B){N(new Uint8Array(B))},F)})}return Promise.resolve().then(function(){return Td(Rn)})}function f0(){var N={a:rm};function F(fe,we){var rt=fe.exports;if(c.asm=rt,rs=c.asm.F,ie=we,!k){var Kt=Se.unusedWorkers.length;Se.unusedWorkers.forEach(function(Vt){Se.loadWasmModuleToWorker(Vt,function(){--Kt||d0("wasm-instantiate")})})}}k||c0("wasm-instantiate");function B(fe){F(fe.instance,fe.module)}function K(fe){return p0().then(function(we){return WebAssembly.instantiate(we,N)}).then(fe,function(we){q("failed to asynchronously prepare wasm: "+we),Ar(we)})}function me(){return!ne&&typeof WebAssembly.instantiateStreaming=="function"&&!Sd(Rn)&&!Cd(Rn)&&typeof fetch=="function"?fetch(Rn,{credentials:"same-origin"}).then(function(fe){var we=WebAssembly.instantiateStreaming(fe,N);return we.then(B,function(rt){return q("wasm streaming compile failed: "+rt),q("falling back to ArrayBuffer instantiation"),K(B)})}):K(B)}if(c.instantiateWasm)try{var pe=c.instantiateWasm(N,F);return pe}catch(fe){return q("Module.instantiateWasm callback failed with error: "+fe),!1}return me().catch(h),{}}var m0={10024:function(){throw"Canceled!"},10042:function(N,F){setTimeout(function(){r5(N,F)},0)}};function Nd(){Se.initRuntime()}function hi(N){for(;N.length>0;){var F=N.shift();if(typeof F=="function"){F(c);continue}var B=F.func;typeof B=="number"?F.arg===void 0?rs.get(B)():rs.get(B)(F.arg):B(F.arg===void 0?null:F.arg)}}function wu(N,F){if(N<=0||N>a().length||N&!0||F<0)return-28;if(F==0)return 0;F>=2147483647&&(F=1/0);var B=Atomics.load(i(),yi>>2),K=0;if(B==N){var me=Atomics.compareExchange(i(),yi>>2,B,0);if(me==B&&(--F,K=1,F<=0))return 1}var pe=Atomics.notify(i(),N>>2,F);if(pe>=0)return pe+K;throw"Atomics.notify returned an unexpected value "+pe}c._emscripten_futex_wake=wu;function g0(N){if(k)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!N)throw"Internal Error! Null pthread_ptr in killThread!";i()[N+12>>2]=0;var F=Se.pthreads[N];F.worker.terminate(),Se.freeThreadData(F),Se.runningWorkers.splice(Se.runningWorkers.indexOf(F.worker),1),F.worker.pthread=void 0}function A0(N){if(k)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!N)throw"Internal Error! Null pthread_ptr in cancelThread!";var F=Se.pthreads[N];F.worker.postMessage({cmd:"cancel"})}function y0(N){if(k)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!N)throw"Internal Error! Null pthread_ptr in cleanupThread!";var F=Se.pthreads[N];if(F){i()[N+12>>2]=0;var B=F.worker;Se.returnWorkerToPool(B)}}var Se={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var N=Math.min(4,Math.max(1,(navigator.hardwareConcurrency||1)/2)),F=0;F>2]=N;var B=N+152;i()[B>>2]=B;for(var K=Ia(512),F=0;F<128;++F)l()[K/4+F]=0;Atomics.store(l(),N+100>>2,K),Atomics.store(l(),N+40>>2,N),_m(N,!x,1),s5(N)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Se.threadExitHandlers.length>0;)Se.threadExitHandlers.pop()();k&&mi()&&n5()},runExitHandlersAndDeinitThread:function(N,F){Atomics.store(l(),N+56>>2,1),Atomics.store(l(),N+60>>2,0),Se.runExitHandlers(),Atomics.store(l(),N+4>>2,F),Atomics.store(l(),N+0>>2,1),wu(N+0,2147483647),_m(0,0,0)},threadExit:function(N){var F=mi();F&&(Se.runExitHandlersAndDeinitThread(F,N),k&&postMessage({cmd:"exit"}))},threadCancel:function(){Se.runExitHandlersAndDeinitThread(mi(),-1),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var N in Se.pthreads){var F=Se.pthreads[N];F&&F.worker&&Se.returnWorkerToPool(F.worker)}Se.pthreads={};for(var B=0;B>2];i()[N.threadInfoStruct+100>>2]=0,Eu(F),Eu(N.threadInfoStruct)}N.threadInfoStruct=0,N.allocatedOwnStack&&N.stackBase&&Eu(N.stackBase),N.stackBase=0,N.worker&&(N.worker.pthread=null)}},returnWorkerToPool:function(N){Se.runWithoutMainThreadQueuedCalls(function(){delete Se.pthreads[N.pthread.threadInfoStruct],Se.unusedWorkers.push(N),Se.runningWorkers.splice(Se.runningWorkers.indexOf(N),1),Se.freeThreadData(N.pthread),N.pthread=void 0})},runWithoutMainThreadQueuedCalls:function(N){i()[u5>>2]=0;try{N()}finally{i()[u5>>2]=1}},receiveObjectTransfer:function(N){},loadWasmModuleToWorker:function(N,F){N.onmessage=function(B){var K=B.data,me=K.cmd;if(N.pthread&&(Se.currentProxiedOperationCallerThread=N.pthread.threadInfoStruct),K.targetThread&&K.targetThread!=mi()){var pe=Se.pthreads[K.targetThread];pe?pe.worker.postMessage(B.data,K.transferList):console.error('Internal error! Worker sent a message "'+me+'" to target pthread '+K.targetThread+", but that thread no longer exists!"),Se.currentProxiedOperationCallerThread=void 0;return}if(me==="processQueuedMainThreadWork")Em();else if(me==="spawnThread")Fd(B.data);else if(me==="cleanupThread")y0(K.thread);else if(me==="killThread")g0(K.thread);else if(me==="cancelThread")A0(K.thread);else if(me==="loaded")N.loaded=!0,F&&F(N),N.runPthread&&(N.runPthread(),delete N.runPthread);else if(me==="print")j("Thread "+K.threadId+": "+K.text);else if(me==="printErr")q("Thread "+K.threadId+": "+K.text);else if(me==="alert")alert("Thread "+K.threadId+": "+K.text);else if(me==="exit"){var fe=N.pthread&&Atomics.load(l(),N.pthread.threadInfoStruct+64>>2);fe&&Se.returnWorkerToPool(N)}else if(me==="exitProcess")try{BI(K.returnCode)}catch(we){if(we instanceof _u)return;throw we}else me==="cancelDone"?Se.returnWorkerToPool(N):me==="objectTransfer"?Se.receiveObjectTransfer(B.data):B.data.target==="setimmediate"?N.postMessage(B.data):q("worker sent an unknown command "+me);Se.currentProxiedOperationCallerThread=void 0},N.onerror=function(B){q("pthread sent an error! "+B.filename+":"+B.lineno+": "+B.message)},b&&(N.on("message",function(B){N.onmessage({data:B})}),N.on("error",function(B){N.onerror(B)}),N.on("exit",function(B){})),N.postMessage({cmd:"load",urlOrBlob:c.mainScriptUrlOrBlob||s,wasmMemory:J,wasmModule:ie})},allocateUnusedWorker:function(){var N=C("tfjs-backend-wasm-threaded-simd.worker.js");Se.unusedWorkers.push(new Worker(N))},getNewWorker:function(){return Se.unusedWorkers.length==0&&(Se.allocateUnusedWorker(),Se.loadWasmModuleToWorker(Se.unusedWorkers[0])),Se.unusedWorkers.length>0?Se.unusedWorkers.pop():null},busySpinWait:function(N){for(var F=performance.now()+N;performance.now()>2]=N,N}function S0(N,F){if(k)return Pr(1,1,N,F)}function C0(N,F){if(N==F)postMessage({cmd:"processQueuedMainThreadWork"});else if(k)postMessage({targetThread:N,cmd:"processThreadQueue"});else{var B=Se.pthreads[N],K=B&&B.worker;if(!K)return;K.postMessage({cmd:"processThreadQueue"})}return 1}function T0(){Ar()}function N0(N,F,B){var K=$0(F,B);return m0[N].apply(null,K)}function E0(N,F){}function R0(N,F,B){if(N<=0||N>a().length||N&!0)return-28;if(y){if(Atomics.load(i(),N>>2)!=F)return-6;for(var me=performance.now(),pe=me+B,fe=Atomics.exchange(i(),yi>>2,N);;){if(me=performance.now(),me>pe)return fe=Atomics.exchange(i(),yi>>2,0),-73;if(fe=Atomics.exchange(i(),yi>>2,0),fe==0)break;if(Em(),Atomics.load(i(),N>>2)!=F)return-6;fe=Atomics.exchange(i(),yi>>2,N)}return 0}else{var K=Atomics.wait(i(),N>>2,F,B);if(K==="timed-out")return-73;if(K==="not-equal")return-6;if(K==="ok")return 0;throw"Atomics.wait returned an unexpected value "+K}}function _0(N,F,B){o().copyWithin(N,F,F+B)}function D0(){return b?vi("os").cpus().length:navigator.hardwareConcurrency}function Pr(N,F){for(var B=arguments.length-2,K=Ru(),me=B,pe=Ai(me*8),fe=pe>>3,we=0;we>=2;B=o()[N++];){var K=B<105;K&&F&1&&F++,Iu.push(K?u()[F++>>1]:i()[F]),++F}return Iu}function F0(N,F,B){ku.length=F;for(var K=B>>3,me=0;me>>16),sn(J.buffer),1}catch(F){}}function M0(N){var F=O0();if(N<=F)return!1;var B=2147483648;if(N>B)return!1;for(var K=1;K<=4;K*=2){var me=F*(1+.2/K);me=Math.min(me,N+100663296);var pe=Math.min(B,it(Math.max(N,me),65536)),fe=P0(pe);if(fe)return!0}return!1}var Le={inEventHandler:0,removeAllEventListeners:function(){for(var N=Le.eventHandlers.length-1;N>=0;--N)Le._removeHandler(N);Le.eventHandlers=[],Le.deferredCalls=[]},registerRemoveEventListeners:function(){Le.removeEventListenersRegistered||(Fr.push(Le.removeAllEventListeners),Le.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(N,F,B){function K(fe,we){if(fe.length!=we.length)return!1;for(var rt in fe)if(fe[rt]!=we[rt])return!1;return!0}for(var me in Le.deferredCalls){var pe=Le.deferredCalls[me];if(pe.targetFunction==N&&K(pe.argsList,B))return}Le.deferredCalls.push({targetFunction:N,precedence:F,argsList:B}),Le.deferredCalls.sort(function(fe,we){return fe.precedence>2]=B,i()[fe+4>>2]=K,i()[fe+8>>2]=me,Rm(0,N,637534208,F,K,fe),gi(pe)},getTargetThreadForEventCallback:function(N){switch(N){case 1:return 0;case 2:return Se.currentProxiedOperationCallerThread;default:return N}},getNodeNameForTarget:function(N){return N?N==window?"#window":N==screen?"#screen":N&&N.nodeName?N.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function z0(N){var F=st(N)+1,B=Ia(F);return nt(N,B,F),B}function L0(N,F,B,K){var me=Ru(),pe=Ai(12),fe=0;F&&(fe=z0(F)),i()[pe>>2]=fe,i()[pe+4>>2]=B,i()[pe+8>>2]=K,Rm(0,N,657457152,0,fe,pe),gi(me)}function B0(N,F,B,K){F=F?Fe(F):"",L0(N,F,B,K)}function W0(N){return N>2?Fe(N):N}var V0=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function U0(N){N=W0(N);var F=V0[N]||(typeof document!="undefined"?document.querySelector(N):void 0);return F}function Su(N){return U0(N)}function Ed(N,F,B){var K=Su(N);if(!K)return-4;if(K.canvasSharedPtr&&(i()[K.canvasSharedPtr>>2]=F,i()[K.canvasSharedPtr+4>>2]=B),K.offscreenCanvas||!K.controlTransferredOffscreen){K.offscreenCanvas&&(K=K.offscreenCanvas);var me=!1;if(K.GLctxObject&&K.GLctxObject.GLctx){var pe=K.GLctxObject.GLctx.getParameter(2978);me=pe[0]===0&&pe[1]===0&&pe[2]===K.width&&pe[3]===K.height}K.width=F,K.height=B,me&&K.GLctxObject.GLctx.viewport(0,0,F,B)}else if(K.canvasSharedPtr){var fe=i()[K.canvasSharedPtr+8>>2];return B0(fe,N,F,B),1}else return-4;return 0}function Rd(N,F,B){return k?Pr(2,1,N,F,B):Ed(N,F,B)}function H0(N,F,B){var K=Su(N);return K?Ed(N,F,B):Rd(N,F,B)}function G0(N){}function j0(N,F){}function q0(N){var F=N.getExtension("ANGLE_instanced_arrays");if(F)return N.vertexAttribDivisor=function(B,K){F.vertexAttribDivisorANGLE(B,K)},N.drawArraysInstanced=function(B,K,me,pe){F.drawArraysInstancedANGLE(B,K,me,pe)},N.drawElementsInstanced=function(B,K,me,pe,fe){F.drawElementsInstancedANGLE(B,K,me,pe,fe)},1}function X0(N){var F=N.getExtension("OES_vertex_array_object");if(F)return N.createVertexArray=function(){return F.createVertexArrayOES()},N.deleteVertexArray=function(B){F.deleteVertexArrayOES(B)},N.bindVertexArray=function(B){F.bindVertexArrayOES(B)},N.isVertexArray=function(B){return F.isVertexArrayOES(B)},1}function K0(N){var F=N.getExtension("WEBGL_draw_buffers");if(F)return N.drawBuffers=function(B,K){F.drawBuffersWEBGL(B,K)},1}function Z0(N){return!!(N.multiDrawWebgl=N.getExtension("WEBGL_multi_draw"))}var tt={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(F){tt.lastError||(tt.lastError=F)},getNewId:function(N){for(var F=tt.counter++,B=N.length;B>2]:-1;me+=Fe(i()[B+pe*4>>2],fe<0?void 0:fe)}return me},createContext:function(N,F){var B=N.getContext("webgl",F);if(!B)return 0;var K=tt.registerContext(B,F);return K},registerContext:function(N,F){var B=Ia(8);i()[B+4>>2]=mi();var K={handle:B,attributes:F,version:F.majorVersion,GLctx:N};return N.canvas&&(N.canvas.GLctxObject=K),tt.contexts[B]=K,(typeof F.enableExtensionsByDefault=="undefined"||F.enableExtensionsByDefault)&&tt.initExtensions(K),B},makeContextCurrent:function(N){return tt.currentContext=tt.contexts[N],c.ctx=Mr=tt.currentContext&&tt.currentContext.GLctx,!(N&&!Mr)},getContext:function(N){return tt.contexts[N]},deleteContext:function(N){tt.currentContext===tt.contexts[N]&&(tt.currentContext=null),typeof Le=="object"&&Le.removeAllHandlersOnTarget(tt.contexts[N].GLctx.canvas),tt.contexts[N]&&tt.contexts[N].GLctx.canvas&&(tt.contexts[N].GLctx.canvas.GLctxObject=void 0),Eu(tt.contexts[N].handle),tt.contexts[N]=null},initExtensions:function(N){if(N||(N=tt.currentContext),!N.initExtensionsDone){N.initExtensionsDone=!0;var F=N.GLctx;q0(F),X0(F),K0(F),F.disjointTimerQueryExt=F.getExtension("EXT_disjoint_timer_query"),Z0(F);var B=F.getSupportedExtensions()||[];B.forEach(function(K){K.indexOf("lose_context")<0&&K.indexOf("debug")<0&&F.getExtension(K)})}},populateUniformTable:function(N){for(var F=tt.programs[N],B=tt.programInfos[N]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},K=B.uniforms,me=Mr.getProgramParameter(F,35718),pe=0;pe>2,K=i()[B+(24>>2)],me={alpha:!!i()[B+(0>>2)],depth:!!i()[B+(4>>2)],stencil:!!i()[B+(8>>2)],antialias:!!i()[B+(12>>2)],premultipliedAlpha:!!i()[B+(16>>2)],preserveDrawingBuffer:!!i()[B+(20>>2)],powerPreference:Y0[K],failIfMajorPerformanceCaveat:!!i()[B+(28>>2)],majorVersion:i()[B+(32>>2)],minorVersion:i()[B+(36>>2)],enableExtensionsByDefault:i()[B+(40>>2)],explicitSwapControl:i()[B+(44>>2)],proxyContextToMainThread:i()[B+(48>>2)],renderViaOffscreenBackBuffer:i()[B+(52>>2)]},pe=Su(N);if(!pe||me.explicitSwapControl)return 0;var fe=tt.createContext(pe,me);return fe}function Q0(N,F){return J0(N,F)}var pi={mappings:{},buffers:[null,[],[]],printChar:function(N,F){var B=pi.buffers[N];F===0||F===10?((N===1?j:q)(Me(B,0)),B.length=0):B.push(F)},varargs:void 0,get:function(){pi.varargs+=4;var N=i()[pi.varargs-4>>2];return N},getStr:function(N){var F=Fe(N);return F},get64:function(N,F){return N}};function _d(N){return k?Pr(3,1,N):0}function Dd(N,F,B,K,me){if(k)return Pr(4,1,N,F,B,K,me)}function $d(N,F,B,K){if(k)return Pr(5,1,N,F,B,K);for(var me=0,pe=0;pe>2],we=i()[F+(pe*8+4)>>2],rt=0;rt>2]=me,0}function em(N){var F=Se.threadExitHandlers.pop();N&&F()}function tm(N,F){Se.threadExitHandlers.push(function(){rs.get(N)(F)})}function Fd(N){if(k)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var F=Se.getNewWorker();if(F.pthread!==void 0)throw"Internal error!";if(!N.pthread_ptr)throw"Internal error, no pthread ptr!";Se.runningWorkers.push(F);for(var B=Ia(128*4),K=0;K<128;++K)i()[B+K*4>>2]=0;var me=N.stackBase+N.stackSize,pe=Se.pthreads[N.pthread_ptr]={worker:F,stackBase:N.stackBase,stackSize:N.stackSize,allocatedOwnStack:N.allocatedOwnStack,threadInfoStruct:N.pthread_ptr},fe=pe.threadInfoStruct>>2;Atomics.store(l(),fe+(64>>2),N.detached),Atomics.store(l(),fe+(100>>2),B),Atomics.store(l(),fe+(40>>2),pe.threadInfoStruct),Atomics.store(l(),fe+(80>>2),N.stackSize),Atomics.store(l(),fe+(76>>2),me),Atomics.store(l(),fe+(104>>2),N.stackSize),Atomics.store(l(),fe+(104+8>>2),me),Atomics.store(l(),fe+(104+12>>2),N.detached);var we=t5(),rt=we+40;Atomics.store(l(),fe+(172>>2),rt),F.pthread=pe;var Kt={cmd:"run",start_routine:N.startRoutine,arg:N.arg,threadInfoStruct:N.pthread_ptr,stackBase:N.stackBase,stackSize:N.stackSize};F.runPthread=function(){Kt.time=performance.now(),F.postMessage(Kt,N.transferList)},F.loaded&&(F.runPthread(),delete F.runPthread)}function nm(N,F,B,K){if(typeof SharedArrayBuffer=="undefined")return q("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!N)return q("pthread_create called with a null thread pointer!"),28;var me=[],pe=0;if(k&&(me.length===0||pe))return a5(687865856,N,F,B,K);if(pe)return pe;var fe=0,we=0,rt=0;F&&F!=-1?(fe=i()[F>>2],fe+=81920,we=i()[F+8>>2],rt=i()[F+12>>2]!==0):fe=2097152;var Kt=we==0;Kt?we=l5(16,fe):(we-=fe,Ae(we>0));for(var Vt=Ia(228),Lr=0;Lr<228>>2;++Lr)l()[(Vt>>2)+Lr]=0;i()[N>>2]=Vt,i()[Vt+12>>2]=Vt;var xi=Vt+152;i()[xi>>2]=xi;var fn={stackBase:we,stackSize:fe,allocatedOwnStack:Kt,detached:rt,startRoutine:B,pthread_ptr:Vt,arg:K,transferList:me};return k?(fn.cmd="spawnThread",postMessage(fn,me)):Fd(fn),0}function Od(N){if(k)return Pr(6,1,N);switch(N){case 30:return 16384;case 85:var F=2147483648;return F/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return I0(28),-1}k||Se.initMainThreadBlock();var Mr,sm=[null,S0,Rd,_d,Dd,$d,Od],rm={e:w0,r:k0,x:C0,b:T0,y:N0,j:E0,c:R0,d:wu,f:ka,p:_0,z:D0,u:F0,q:M0,v:H0,i:G0,t:j0,w:Q0,m:_d,n:Dd,g:$d,o:Nd,a:J||c.wasmMemory,k:em,l:tm,h:nm,s:Od},Qy=f0(),Pd=c.___wasm_call_ctors=function(){return(Pd=c.___wasm_call_ctors=c.asm.A).apply(null,arguments)},am=c._init=function(){return(am=c._init=c.asm.B).apply(null,arguments)},om=c._register_tensor=function(){return(om=c._register_tensor=c.asm.C).apply(null,arguments)},im=c._dispose_data=function(){return(im=c._dispose_data=c.asm.D).apply(null,arguments)},lm=c._dispose=function(){return(lm=c._dispose=c.asm.E).apply(null,arguments)},um=c._Abs=function(){return(um=c._Abs=c.asm.G).apply(null,arguments)},cm=c._Add=function(){return(cm=c._Add=c.asm.H).apply(null,arguments)},dm=c._AddN=function(){return(dm=c._AddN=c.asm.I).apply(null,arguments)},hm=c._All=function(){return(hm=c._All=c.asm.J).apply(null,arguments)},pm=c._Any=function(){return(pm=c._Any=c.asm.K).apply(null,arguments)},fm=c._ArgMax=function(){return(fm=c._ArgMax=c.asm.L).apply(null,arguments)},mm=c._AvgPool=function(){return(mm=c._AvgPool=c.asm.M).apply(null,arguments)},gm=c._BatchMatMul=function(){return(gm=c._BatchMatMul=c.asm.N).apply(null,arguments)},Am=c._Ceil=function(){return(Am=c._Ceil=c.asm.O).apply(null,arguments)},ym=c._ClipByValue=function(){return(ym=c._ClipByValue=c.asm.P).apply(null,arguments)},xm=c._Conv2D=function(){return(xm=c._Conv2D=c.asm.Q).apply(null,arguments)},bm=c._Conv2DBackpropInput=function(){return(bm=c._Conv2DBackpropInput=c.asm.R).apply(null,arguments)},vm=c._Cos=function(){return(vm=c._Cos=c.asm.S).apply(null,arguments)},wm=c._Cosh=function(){return(wm=c._Cosh=c.asm.T).apply(null,arguments)},km=c._CropAndResize=function(){return(km=c._CropAndResize=c.asm.U).apply(null,arguments)},Im=c._Cumsum=function(){return(Im=c._Cumsum=c.asm.V).apply(null,arguments)},Sm=c._DepthToSpace=function(){return(Sm=c._DepthToSpace=c.asm.W).apply(null,arguments)},Cm=c._DepthwiseConv2dNative=function(){return(Cm=c._DepthwiseConv2dNative=c.asm.X).apply(null,arguments)},Tm=c._Elu=function(){return(Tm=c._Elu=c.asm.Y).apply(null,arguments)},Md=c._Equal=function(){return(Md=c._Equal=c.asm.Z).apply(null,arguments)},zd=c._Exp=function(){return(zd=c._Exp=c.asm._).apply(null,arguments)},Ld=c._FlipLeftRight=function(){return(Ld=c._FlipLeftRight=c.asm.$).apply(null,arguments)},Cu=c._Floor=function(){return(Cu=c._Floor=c.asm.aa).apply(null,arguments)},fi=c._FloorDiv=function(){return(fi=c._FloorDiv=c.asm.ba).apply(null,arguments)},Nm=c._FusedBatchNorm=function(){return(Nm=c._FusedBatchNorm=c.asm.ca).apply(null,arguments)},Tu=c._FusedConv2D=function(){return(Tu=c._FusedConv2D=c.asm.da).apply(null,arguments)},Y=c._FusedDepthwiseConv2D=function(){return(Y=c._FusedDepthwiseConv2D=c.asm.ea).apply(null,arguments)},re=c._Gather=function(){return(re=c._Gather=c.asm.fa).apply(null,arguments)},xe=c._GatherNd=function(){return(xe=c._GatherNd=c.asm.ga).apply(null,arguments)},Qe=c._Greater=function(){return(Qe=c._Greater=c.asm.ha).apply(null,arguments)},Et=c._GreaterEqual=function(){return(Et=c._GreaterEqual=c.asm.ia).apply(null,arguments)},bt=c._LeakyRelu=function(){return(bt=c._LeakyRelu=c.asm.ja).apply(null,arguments)},je=c._Less=function(){return(je=c._Less=c.asm.ka).apply(null,arguments)},qe=c._LessEqual=function(){return(qe=c._LessEqual=c.asm.la).apply(null,arguments)},rn=c._Log=function(){return(rn=c._Log=c.asm.ma).apply(null,arguments)},yr=c._LogicalAnd=function(){return(yr=c._LogicalAnd=c.asm.na).apply(null,arguments)},xr=c._Max=function(){return(xr=c._Max=c.asm.oa).apply(null,arguments)},Bd=c._MaxPool=function(){return(Bd=c._MaxPool=c.asm.pa).apply(null,arguments)},Nu=c._Maximum=function(){return(Nu=c._Maximum=c.asm.qa).apply(null,arguments)},Un=c._Mean=function(){return(Un=c._Mean=c.asm.ra).apply(null,arguments)},zr=c._Min=function(){return(zr=c._Min=c.asm.sa).apply(null,arguments)},Wd=c._Minimum=function(){return(Wd=c._Minimum=c.asm.ta).apply(null,arguments)},Q8=c._MirrorPad=function(){return(Q8=c._MirrorPad=c.asm.ua).apply(null,arguments)},eI=c._Multiply=function(){return(eI=c._Multiply=c.asm.va).apply(null,arguments)},tI=c._Neg=function(){return(tI=c._Neg=c.asm.wa).apply(null,arguments)},nI=c._NonMaxSuppressionV3=function(){return(nI=c._NonMaxSuppressionV3=c.asm.xa).apply(null,arguments)},sI=c._NonMaxSuppressionV4=function(){return(sI=c._NonMaxSuppressionV4=c.asm.ya).apply(null,arguments)},rI=c._NonMaxSuppressionV5=function(){return(rI=c._NonMaxSuppressionV5=c.asm.za).apply(null,arguments)},aI=c._NotEqual=function(){return(aI=c._NotEqual=c.asm.Aa).apply(null,arguments)},oI=c._OneHot=function(){return(oI=c._OneHot=c.asm.Ba).apply(null,arguments)},iI=c._PadV2=function(){return(iI=c._PadV2=c.asm.Ca).apply(null,arguments)},lI=c._Pow=function(){return(lI=c._Pow=c.asm.Da).apply(null,arguments)},uI=c._Prelu=function(){return(uI=c._Prelu=c.asm.Ea).apply(null,arguments)},cI=c._Prod=function(){return(cI=c._Prod=c.asm.Fa).apply(null,arguments)},dI=c._RealDiv=function(){return(dI=c._RealDiv=c.asm.Ga).apply(null,arguments)},hI=c._Relu=function(){return(hI=c._Relu=c.asm.Ha).apply(null,arguments)},pI=c._Relu6=function(){return(pI=c._Relu6=c.asm.Ia).apply(null,arguments)},fI=c._ResizeBilinear=function(){return(fI=c._ResizeBilinear=c.asm.Ja).apply(null,arguments)},mI=c._Reverse=function(){return(mI=c._Reverse=c.asm.Ka).apply(null,arguments)},gI=c._RotateWithOffset=function(){return(gI=c._RotateWithOffset=c.asm.La).apply(null,arguments)},AI=c._Round=function(){return(AI=c._Round=c.asm.Ma).apply(null,arguments)},yI=c._Rsqrt=function(){return(yI=c._Rsqrt=c.asm.Na).apply(null,arguments)},xI=c._ScatterNd=function(){return(xI=c._ScatterNd=c.asm.Oa).apply(null,arguments)},bI=c._SelectV2=function(){return(bI=c._SelectV2=c.asm.Pa).apply(null,arguments)},vI=c._Sigmoid=function(){return(vI=c._Sigmoid=c.asm.Qa).apply(null,arguments)},wI=c._Sin=function(){return(wI=c._Sin=c.asm.Ra).apply(null,arguments)},kI=c._Softmax=function(){return(kI=c._Softmax=c.asm.Sa).apply(null,arguments)},II=c._Sqrt=function(){return(II=c._Sqrt=c.asm.Ta).apply(null,arguments)},SI=c._Square=function(){return(SI=c._Square=c.asm.Ua).apply(null,arguments)},CI=c._SquaredDifference=function(){return(CI=c._SquaredDifference=c.asm.Va).apply(null,arguments)},TI=c._Step=function(){return(TI=c._Step=c.asm.Wa).apply(null,arguments)},NI=c._StridedSlice=function(){return(NI=c._StridedSlice=c.asm.Xa).apply(null,arguments)},EI=c._Sub=function(){return(EI=c._Sub=c.asm.Ya).apply(null,arguments)},RI=c._Sum=function(){return(RI=c._Sum=c.asm.Za).apply(null,arguments)},_I=c._Tan=function(){return(_I=c._Tan=c.asm._a).apply(null,arguments)},DI=c._Tanh=function(){return(DI=c._Tanh=c.asm.$a).apply(null,arguments)},$I=c._Tile=function(){return($I=c._Tile=c.asm.ab).apply(null,arguments)},FI=c._TopK=function(){return(FI=c._TopK=c.asm.bb).apply(null,arguments)},OI=c._Transform=function(){return(OI=c._Transform=c.asm.cb).apply(null,arguments)},PI=c._Transpose=function(){return(PI=c._Transpose=c.asm.db).apply(null,arguments)},MI=c.__FusedMatMul=function(){return(MI=c.__FusedMatMul=c.asm.eb).apply(null,arguments)},Ia=c._malloc=function(){return(Ia=c._malloc=c.asm.fb).apply(null,arguments)},Eu=c._free=function(){return(Eu=c._free=c.asm.gb).apply(null,arguments)},e5=c.___errno_location=function(){return(e5=c.___errno_location=c.asm.hb).apply(null,arguments)},t5=c._emscripten_get_global_libc=function(){return(t5=c._emscripten_get_global_libc=c.asm.ib).apply(null,arguments)},mi=c._pthread_self=function(){return(mi=c._pthread_self=c.asm.jb).apply(null,arguments)},n5=c.___pthread_tsd_run_dtors=function(){return(n5=c.___pthread_tsd_run_dtors=c.asm.kb).apply(null,arguments)},Em=c._emscripten_main_thread_process_queued_calls=function(){return(Em=c._emscripten_main_thread_process_queued_calls=c.asm.lb).apply(null,arguments)},zI=c._emscripten_current_thread_process_queued_calls=function(){return(zI=c._emscripten_current_thread_process_queued_calls=c.asm.mb).apply(null,arguments)},s5=c._emscripten_register_main_browser_thread_id=function(){return(s5=c._emscripten_register_main_browser_thread_id=c.asm.nb).apply(null,arguments)},r5=c.__emscripten_do_dispatch_to_thread=function(){return(r5=c.__emscripten_do_dispatch_to_thread=c.asm.ob).apply(null,arguments)},a5=c._emscripten_sync_run_in_main_thread_4=function(){return(a5=c._emscripten_sync_run_in_main_thread_4=c.asm.pb).apply(null,arguments)},o5=c._emscripten_run_in_main_runtime_thread_js=function(){return(o5=c._emscripten_run_in_main_runtime_thread_js=c.asm.qb).apply(null,arguments)},Rm=c.__emscripten_call_on_thread=function(){return(Rm=c.__emscripten_call_on_thread=c.asm.rb).apply(null,arguments)},LI=c._emscripten_tls_init=function(){return(LI=c._emscripten_tls_init=c.asm.sb).apply(null,arguments)},_m=c.__emscripten_thread_init=function(){return(_m=c.__emscripten_thread_init=c.asm.tb).apply(null,arguments)},Ru=c.stackSave=function(){return(Ru=c.stackSave=c.asm.ub).apply(null,arguments)},gi=c.stackRestore=function(){return(gi=c.stackRestore=c.asm.vb).apply(null,arguments)},Ai=c.stackAlloc=function(){return(Ai=c.stackAlloc=c.asm.wb).apply(null,arguments)},i5=c._emscripten_stack_set_limits=function(){return(i5=c._emscripten_stack_set_limits=c.asm.xb).apply(null,arguments)},l5=c._memalign=function(){return(l5=c._memalign=c.asm.yb).apply(null,arguments)},u5=c.__emscripten_allow_main_runtime_queued_calls=10016,yi=c.__emscripten_main_thread_futex=11652;c.cwrap=De,c.PThread=Se,c.PThread=Se,c.wasmMemory=J,c.ExitStatus=_u;var Vd;function _u(N){this.name="ExitStatus",this.message="Program terminated with exit("+N+")",this.status=N}wa=function N(){Vd||Dm(),Vd||(wa=N)};function Dm(N){if(N=N||m,gr>0)return;if(k){d(c),vu(),postMessage({cmd:"loaded"});return}if(i0(),gr>0)return;function F(){Vd||(Vd=!0,c.calledRun=!0,!le&&(vu(),l0(),d(c),c.onRuntimeInitialized&&c.onRuntimeInitialized(),En()))}c.setStatus?(c.setStatus("Running..."),setTimeout(function(){setTimeout(function(){c.setStatus("")},1),F()},1)):F()}c.run=Dm;function BI(N,F){if(!(F&&se&&N===0)){if(!F&&k)throw postMessage({cmd:"exitProcess",returnCode:N}),new _u(N);se||(Se.terminateAllThreads(),he=N,wd(),c.onExit&&c.onExit(N),le=!0),A(N,new _u(N))}}if(c.preInit)for(typeof c.preInit=="function"&&(c.preInit=[c.preInit]);c.preInit.length>0;)c.preInit.pop()();return k&&(se=!1,Se.initWorker()),Dm(),r.ready}}();typeof e=="object"&&typeof t=="object"?t.exports=n:typeof define=="function"&&define.amd?define([],function(){return n}):typeof e=="object"&&(e.WasmBackendModuleThreadedSimd=n)}}),pS=vt({"node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.9.0_@tensorflow+tfjs-core@3.9.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(e,t){var n=function(){var s=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(s=s||__filename),function(r){r=r||{};var a=typeof r!="undefined"?r:{},o,i;a.ready=new Promise(function(Y,re){o=Y,i=re});var l={},u;for(u in a)a.hasOwnProperty(u)&&(l[u]=a[u]);var c=[],d="./this.program",h=function(Y,re){throw re},p=!1,f=!1,m=!1,g=!1;p=typeof window=="object",f=typeof importScripts=="function",m=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",g=!p&&!m&&!f;var A="";function y(Y){return a.locateFile?a.locateFile(Y,A):A+Y}var x,b,v,k,S,C;m?(f?A=Du().dirname(A)+"/":A=__dirname+"/",x=function(re,xe){return S||(S=vi("fs")),C||(C=Du()),re=C.normalize(re),S.readFileSync(re,xe?null:"utf8")},v=function(re){var xe=x(re,!0);return xe.buffer||(xe=new Uint8Array(xe)),j(xe.buffer),xe},process.argv.length>1&&(d=process.argv[1].replace(/\\/g,"/")),c=process.argv.slice(2),process.on("uncaughtException",function(Y){if(!(Y instanceof Nm))throw Y}),process.on("unhandledRejection",Zs),h=function(Y){process.exit(Y)},a.inspect=function(){return"[Emscripten Module object]"}):g?(typeof read!="undefined"&&(x=function(re){return read(re)}),v=function(re){var xe;return typeof readbuffer=="function"?new Uint8Array(readbuffer(re)):(xe=read(re,"binary"),j(typeof xe=="object"),xe)},typeof scriptArgs!="undefined"?c=scriptArgs:typeof arguments!="undefined"&&(c=arguments),typeof quit=="function"&&(h=function(Y){quit(Y)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(p||f)&&(f?A=self.location.href:typeof document!="undefined"&&document.currentScript&&(A=document.currentScript.src),s&&(A=s),A.indexOf("blob:")!==0?A=A.substr(0,A.lastIndexOf("/")+1):A="",x=function(Y){var re=new XMLHttpRequest;return re.open("GET",Y,!1),re.send(null),re.responseText},f&&(v=function(Y){var re=new XMLHttpRequest;return re.open("GET",Y,!1),re.responseType="arraybuffer",re.send(null),new Uint8Array(re.response)}),b=function(Y,re,xe){var Qe=new XMLHttpRequest;Qe.open("GET",Y,!0),Qe.responseType="arraybuffer",Qe.onload=function(){if(Qe.status==200||Qe.status==0&&Qe.response){re(Qe.response);return}xe()},Qe.onerror=xe,Qe.send(null)},k=function(Y){document.title=Y});var _=a.print||console.log.bind(console),O=a.printErr||console.warn.bind(console);for(u in l)l.hasOwnProperty(u)&&(a[u]=l[u]);l=null,a.arguments&&(c=a.arguments),a.thisProgram&&(d=a.thisProgram),a.quit&&(h=a.quit);var E;a.wasmBinary&&(E=a.wasmBinary);var R=a.noExitRuntime||!0;typeof WebAssembly!="object"&&Zs("no native wasm support detected");var T,P=!1,V;function j(Y,re){Y||Zs("Assertion failed: "+re)}function q(Y){var re=a["_"+Y];return j(re,"Cannot call unknown function "+Y+", make sure it is exported"),re}function X(Y,re,xe,Qe,Et){var bt={string:function(Un){var zr=0;if(Un!=null&&Un!==0){var Wd=(Un.length<<2)+1;zr=Cu(Wd),ie(Un,zr,Wd)}return zr},array:function(Un){var zr=Cu(Un.length);return le(Un,zr),zr}};function je(Un){return re==="string"?se(Un):re==="boolean"?Boolean(Un):Un}var qe=q(Y),rn=[],yr=0;if(Qe)for(var xr=0;xr=Qe);)++Et;if(Et-re>16&&Y.subarray&&te)return te.decode(Y.subarray(re,Et));for(var bt="";re>10,56320|yr&1023)}}return bt}function se(Y,re){return Y?ne(Te,Y,re):""}function J(Y,re,xe,Qe){if(!(Qe>0))return 0;for(var Et=xe,bt=xe+Qe-1,je=0;je=55296&&qe<=57343){var rn=Y.charCodeAt(++je);qe=65536+((qe&1023)<<10)|rn&1023}if(qe<=127){if(xe>=bt)break;re[xe++]=qe}else if(qe<=2047){if(xe+1>=bt)break;re[xe++]=192|qe>>6,re[xe++]=128|qe&63}else if(qe<=65535){if(xe+2>=bt)break;re[xe++]=224|qe>>12,re[xe++]=128|qe>>6&63,re[xe++]=128|qe&63}else{if(xe+3>=bt)break;re[xe++]=240|qe>>18,re[xe++]=128|qe>>12&63,re[xe++]=128|qe>>6&63,re[xe++]=128|qe&63}}return re[xe]=0,xe-Et}function ie(Y,re,xe){return J(Y,Te,re,xe)}function le(Y,re){Ce.set(Y,re)}function he(Y,re){return Y%re>0&&(Y+=re-Y%re),Y}var Ae,Ce,Te,De,Me,Fe,ut,nt,st;function et(Y){Ae=Y,a.HEAP8=Ce=new Int8Array(Y),a.HEAP16=De=new Int16Array(Y),a.HEAP32=Fe=new Int32Array(Y),a.HEAPU8=Te=new Uint8Array(Y),a.HEAPU16=Me=new Uint16Array(Y),a.HEAPU32=ut=new Uint32Array(Y),a.HEAPF32=nt=new Float32Array(Y),a.HEAPF64=st=new Float64Array(Y)}var it=a.INITIAL_MEMORY||16777216,He,Nn=[],St=[],Wn=[],nn=[],ks=!1;St.push({func:function(){Nd()}});function pn(){if(a.preRun)for(typeof a.preRun=="function"&&(a.preRun=[a.preRun]);a.preRun.length;)ss(a.preRun.shift());Or(Nn)}function ts(){ks=!0,Or(St)}function ns(){Or(Wn)}function sn(){if(a.postRun)for(typeof a.postRun=="function"&&(a.postRun=[a.postRun]);a.postRun.length;)rs(a.postRun.shift());Or(nn)}function ss(Y){Nn.unshift(Y)}function rs(Y){nn.unshift(Y)}var Vn=0,Ks=null,mr=null;function Fr(Y){Vn++,a.monitorRunDependencies&&a.monitorRunDependencies(Vn)}function ci(Y){if(Vn--,a.monitorRunDependencies&&a.monitorRunDependencies(Vn),Vn==0&&(Ks!==null&&(clearInterval(Ks),Ks=null),mr)){var re=mr;mr=null,re()}}a.preloadedImages={},a.preloadedAudios={};function Zs(Y){a.onAbort&&a.onAbort(Y),Y+="",O(Y),P=!0,V=1,Y="abort("+Y+"). Build with -s ASSERTIONS=1 for more info.";var re=new WebAssembly.RuntimeError(Y);throw i(re),re}function vd(Y,re){return String.prototype.startsWith?Y.startsWith(re):Y.indexOf(re)===0}var i0="data:application/octet-stream;base64,";function vu(Y){return vd(Y,i0)}var l0="file://";function wd(Y){return vd(Y,l0)}var En="tfjs-backend-wasm.wasm";vu(En)||(En=y(En));function kd(Y){try{if(Y==En&&E)return new Uint8Array(E);if(v)return v(Y);throw"both async and sync fetching of the wasm failed"}catch(re){Zs(re)}}function u0(){if(!E&&(p||f)){if(typeof fetch=="function"&&!wd(En))return fetch(En,{credentials:"same-origin"}).then(function(Y){if(!Y.ok)throw"failed to load wasm binary file at '"+En+"'";return Y.arrayBuffer()}).catch(function(){return kd(En)});if(b)return new Promise(function(Y,re){b(En,function(xe){Y(new Uint8Array(xe))},re)})}return Promise.resolve().then(function(){return kd(En)})}function gr(){var Y={a:f0};function re(je,qe){var rn=je.exports;a.asm=rn,T=a.asm.i,et(T.buffer),He=a.asm.o,ci("wasm-instantiate")}Fr("wasm-instantiate");function xe(je){re(je.instance)}function Qe(je){return u0().then(function(qe){return WebAssembly.instantiate(qe,Y)}).then(je,function(qe){O("failed to asynchronously prepare wasm: "+qe),Zs(qe)})}function Et(){return!E&&typeof WebAssembly.instantiateStreaming=="function"&&!vu(En)&&!wd(En)&&typeof fetch=="function"?fetch(En,{credentials:"same-origin"}).then(function(je){var qe=WebAssembly.instantiateStreaming(je,Y);return qe.then(xe,function(rn){return O("wasm streaming compile failed: "+rn),O("falling back to ArrayBuffer instantiation"),Qe(xe)})}):Qe(xe)}if(a.instantiateWasm)try{var bt=a.instantiateWasm(Y,re);return bt}catch(je){return O("Module.instantiateWasm callback failed with error: "+je),!1}return Et().catch(i),{}}function Or(Y){for(;Y.length>0;){var re=Y.shift();if(typeof re=="function"){re(a);continue}var xe=re.func;typeof xe=="number"?re.arg===void 0?He.get(xe)():He.get(xe)(re.arg):xe(re.arg===void 0?null:re.arg)}}function wa(){Zs()}function c0(Y,re,xe){Te.copyWithin(Y,re,re+xe)}function d0(){return Te.length}function Ar(Y){try{return T.grow(Y-Ae.byteLength+65535>>>16),et(T.buffer),1}catch(re){}}function Id(Y){var re=d0(),xe=2147483648;if(Y>xe)return!1;for(var Qe=1;Qe<=4;Qe*=2){var Et=re*(1+.2/Qe);Et=Math.min(Et,Y+100663296);var bt=Math.min(xe,he(Math.max(Y,Et),65536)),je=Ar(bt);if(je)return!0}return!1}var di={mappings:{},buffers:[null,[],[]],printChar:function(Y,re){var xe=di.buffers[Y];re===0||re===10?((Y===1?_:O)(ne(xe,0)),xe.length=0):xe.push(re)},varargs:void 0,get:function(){di.varargs+=4;var Y=Fe[di.varargs-4>>2];return Y},getStr:function(Y){var re=se(Y);return re},get64:function(Y,re){return Y}};function Sd(Y){return 0}function h0(Y,re,xe,Qe,Et){}function Cd(Y,re,xe,Qe){for(var Et=0,bt=0;bt>2],qe=Fe[re+(bt*8+4)>>2],rn=0;rn>2]=Et,0}function Rn(){return 6}function Td(Y){return Fe[Md()>>2]=Y,Y}function p0(Y){switch(Y){case 30:return 16384;case 85:var re=2147483648;return re/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return Td(28),-1}var f0={a:wa,d:c0,e:Id,f:Sd,c:h0,b:Cd,g:Rn,h:p0},m0=gr(),Nd=a.___wasm_call_ctors=function(){return(Nd=a.___wasm_call_ctors=a.asm.j).apply(null,arguments)},hi=a._init=function(){return(hi=a._init=a.asm.k).apply(null,arguments)},wu=a._register_tensor=function(){return(wu=a._register_tensor=a.asm.l).apply(null,arguments)},g0=a._dispose_data=function(){return(g0=a._dispose_data=a.asm.m).apply(null,arguments)},A0=a._dispose=function(){return(A0=a._dispose=a.asm.n).apply(null,arguments)},y0=a._Abs=function(){return(y0=a._Abs=a.asm.p).apply(null,arguments)},Se=a._Add=function(){return(Se=a._Add=a.asm.q).apply(null,arguments)},x0=a._AddN=function(){return(x0=a._AddN=a.asm.r).apply(null,arguments)},b0=a._All=function(){return(b0=a._All=a.asm.s).apply(null,arguments)},v0=a._Any=function(){return(v0=a._Any=a.asm.t).apply(null,arguments)},w0=a._ArgMax=function(){return(w0=a._ArgMax=a.asm.u).apply(null,arguments)},k0=a._AvgPool=function(){return(k0=a._AvgPool=a.asm.v).apply(null,arguments)},ka=a._BatchMatMul=function(){return(ka=a._BatchMatMul=a.asm.w).apply(null,arguments)},I0=a._Ceil=function(){return(I0=a._Ceil=a.asm.x).apply(null,arguments)},S0=a._ClipByValue=function(){return(S0=a._ClipByValue=a.asm.y).apply(null,arguments)},C0=a._Conv2D=function(){return(C0=a._Conv2D=a.asm.z).apply(null,arguments)},T0=a._Conv2DBackpropInput=function(){return(T0=a._Conv2DBackpropInput=a.asm.A).apply(null,arguments)},N0=a._Cos=function(){return(N0=a._Cos=a.asm.B).apply(null,arguments)},E0=a._Cosh=function(){return(E0=a._Cosh=a.asm.C).apply(null,arguments)},R0=a._CropAndResize=function(){return(R0=a._CropAndResize=a.asm.D).apply(null,arguments)},_0=a._Cumsum=function(){return(_0=a._Cumsum=a.asm.E).apply(null,arguments)},D0=a._DepthToSpace=function(){return(D0=a._DepthToSpace=a.asm.F).apply(null,arguments)},Pr=a._DepthwiseConv2dNative=function(){return(Pr=a._DepthwiseConv2dNative=a.asm.G).apply(null,arguments)},ku=a._Elu=function(){return(ku=a._Elu=a.asm.H).apply(null,arguments)},Iu=a._Equal=function(){return(Iu=a._Equal=a.asm.I).apply(null,arguments)},$0=a._Exp=function(){return($0=a._Exp=a.asm.J).apply(null,arguments)},F0=a._FlipLeftRight=function(){return(F0=a._FlipLeftRight=a.asm.K).apply(null,arguments)},O0=a._Floor=function(){return(O0=a._Floor=a.asm.L).apply(null,arguments)},P0=a._FloorDiv=function(){return(P0=a._FloorDiv=a.asm.M).apply(null,arguments)},M0=a._FusedBatchNorm=function(){return(M0=a._FusedBatchNorm=a.asm.N).apply(null,arguments)},Le=a._FusedConv2D=function(){return(Le=a._FusedConv2D=a.asm.O).apply(null,arguments)},z0=a._FusedDepthwiseConv2D=function(){return(z0=a._FusedDepthwiseConv2D=a.asm.P).apply(null,arguments)},L0=a._Gather=function(){return(L0=a._Gather=a.asm.Q).apply(null,arguments)},B0=a._GatherNd=function(){return(B0=a._GatherNd=a.asm.R).apply(null,arguments)},W0=a._Greater=function(){return(W0=a._Greater=a.asm.S).apply(null,arguments)},V0=a._GreaterEqual=function(){return(V0=a._GreaterEqual=a.asm.T).apply(null,arguments)},U0=a._LeakyRelu=function(){return(U0=a._LeakyRelu=a.asm.U).apply(null,arguments)},Su=a._Less=function(){return(Su=a._Less=a.asm.V).apply(null,arguments)},Ed=a._LessEqual=function(){return(Ed=a._LessEqual=a.asm.W).apply(null,arguments)},Rd=a._Log=function(){return(Rd=a._Log=a.asm.X).apply(null,arguments)},H0=a._LogicalAnd=function(){return(H0=a._LogicalAnd=a.asm.Y).apply(null,arguments)},G0=a._Max=function(){return(G0=a._Max=a.asm.Z).apply(null,arguments)},j0=a._MaxPool=function(){return(j0=a._MaxPool=a.asm._).apply(null,arguments)},q0=a._Maximum=function(){return(q0=a._Maximum=a.asm.$).apply(null,arguments)},X0=a._Mean=function(){return(X0=a._Mean=a.asm.aa).apply(null,arguments)},K0=a._Min=function(){return(K0=a._Min=a.asm.ba).apply(null,arguments)},Z0=a._Minimum=function(){return(Z0=a._Minimum=a.asm.ca).apply(null,arguments)},tt=a._MirrorPad=function(){return(tt=a._MirrorPad=a.asm.da).apply(null,arguments)},Y0=a._Multiply=function(){return(Y0=a._Multiply=a.asm.ea).apply(null,arguments)},J0=a._Neg=function(){return(J0=a._Neg=a.asm.fa).apply(null,arguments)},Q0=a._NonMaxSuppressionV3=function(){return(Q0=a._NonMaxSuppressionV3=a.asm.ga).apply(null,arguments)},pi=a._NonMaxSuppressionV4=function(){return(pi=a._NonMaxSuppressionV4=a.asm.ha).apply(null,arguments)},_d=a._NonMaxSuppressionV5=function(){return(_d=a._NonMaxSuppressionV5=a.asm.ia).apply(null,arguments)},Dd=a._NotEqual=function(){return(Dd=a._NotEqual=a.asm.ja).apply(null,arguments)},$d=a._OneHot=function(){return($d=a._OneHot=a.asm.ka).apply(null,arguments)},em=a._PadV2=function(){return(em=a._PadV2=a.asm.la).apply(null,arguments)},tm=a._Pow=function(){return(tm=a._Pow=a.asm.ma).apply(null,arguments)},Fd=a._Prelu=function(){return(Fd=a._Prelu=a.asm.na).apply(null,arguments)},nm=a._Prod=function(){return(nm=a._Prod=a.asm.oa).apply(null,arguments)},Od=a._RealDiv=function(){return(Od=a._RealDiv=a.asm.pa).apply(null,arguments)},Mr=a._Relu=function(){return(Mr=a._Relu=a.asm.qa).apply(null,arguments)},sm=a._Relu6=function(){return(sm=a._Relu6=a.asm.ra).apply(null,arguments)},rm=a._ResizeBilinear=function(){return(rm=a._ResizeBilinear=a.asm.sa).apply(null,arguments)},Qy=a._Reverse=function(){return(Qy=a._Reverse=a.asm.ta).apply(null,arguments)},Pd=a._RotateWithOffset=function(){return(Pd=a._RotateWithOffset=a.asm.ua).apply(null,arguments)},am=a._Round=function(){return(am=a._Round=a.asm.va).apply(null,arguments)},om=a._Rsqrt=function(){return(om=a._Rsqrt=a.asm.wa).apply(null,arguments)},im=a._ScatterNd=function(){return(im=a._ScatterNd=a.asm.xa).apply(null,arguments)},lm=a._SelectV2=function(){return(lm=a._SelectV2=a.asm.ya).apply(null,arguments)},um=a._Sigmoid=function(){return(um=a._Sigmoid=a.asm.za).apply(null,arguments)},cm=a._Sin=function(){return(cm=a._Sin=a.asm.Aa).apply(null,arguments)},dm=a._Softmax=function(){return(dm=a._Softmax=a.asm.Ba).apply(null,arguments)},hm=a._Sqrt=function(){return(hm=a._Sqrt=a.asm.Ca).apply(null,arguments)},pm=a._Square=function(){return(pm=a._Square=a.asm.Da).apply(null,arguments)},fm=a._SquaredDifference=function(){return(fm=a._SquaredDifference=a.asm.Ea).apply(null,arguments)},mm=a._Step=function(){return(mm=a._Step=a.asm.Fa).apply(null,arguments)},gm=a._StridedSlice=function(){return(gm=a._StridedSlice=a.asm.Ga).apply(null,arguments)},Am=a._Sub=function(){return(Am=a._Sub=a.asm.Ha).apply(null,arguments)},ym=a._Sum=function(){return(ym=a._Sum=a.asm.Ia).apply(null,arguments)},xm=a._Tan=function(){return(xm=a._Tan=a.asm.Ja).apply(null,arguments)},bm=a._Tanh=function(){return(bm=a._Tanh=a.asm.Ka).apply(null,arguments)},vm=a._Tile=function(){return(vm=a._Tile=a.asm.La).apply(null,arguments)},wm=a._TopK=function(){return(wm=a._TopK=a.asm.Ma).apply(null,arguments)},km=a._Transform=function(){return(km=a._Transform=a.asm.Na).apply(null,arguments)},Im=a._Transpose=function(){return(Im=a._Transpose=a.asm.Oa).apply(null,arguments)},Sm=a.__FusedMatMul=function(){return(Sm=a.__FusedMatMul=a.asm.Pa).apply(null,arguments)},Cm=a._malloc=function(){return(Cm=a._malloc=a.asm.Qa).apply(null,arguments)},Tm=a._free=function(){return(Tm=a._free=a.asm.Ra).apply(null,arguments)},Md=a.___errno_location=function(){return(Md=a.___errno_location=a.asm.Sa).apply(null,arguments)},zd=a.stackSave=function(){return(zd=a.stackSave=a.asm.Ta).apply(null,arguments)},Ld=a.stackRestore=function(){return(Ld=a.stackRestore=a.asm.Ua).apply(null,arguments)},Cu=a.stackAlloc=function(){return(Cu=a.stackAlloc=a.asm.Va).apply(null,arguments)};a.cwrap=ee;var fi;function Nm(Y){this.name="ExitStatus",this.message="Program terminated with exit("+Y+")",this.status=Y}mr=function Y(){fi||Tu(),fi||(mr=Y)};function Tu(Y){if(Y=Y||c,Vn>0||(pn(),Vn>0))return;function re(){fi||(fi=!0,a.calledRun=!0,!P&&(ts(),ns(),o(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),sn()))}a.setStatus?(a.setStatus("Running..."),setTimeout(function(){setTimeout(function(){a.setStatus("")},1),re()},1)):re()}if(a.run=Tu,a.preInit)for(typeof a.preInit=="function"&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return Tu(),r.ready}}();typeof e=="object"&&typeof t=="object"?t.exports=n:typeof define=="function"&&define.amd?define([],function(){return n}):typeof e=="object"&&(e.WasmBackendModule=n)}}),fS="3.9.0",mS="3.9.0",gS="3.9.0",AS="3.9.0",yS="3.9.0",xS="3.9.0",bS="3.9.0",vS="3.9.0",wS=1e-7,kS=1e-4,Hd=class{constructor(e,t){this.backend=e,this.dataMover=t,this.data=new WeakMap,this.dataIdsCount=0}get(e){return this.data.has(e)||this.dataMover.moveData(this.backend,e),this.data.get(e)}set(e,t){this.dataIdsCount++,this.data.set(e,t)}has(e){return this.data.has(e)}delete(e){return this.dataIdsCount--,this.data.delete(e)}numDataIds(){return this.dataIdsCount}},$u=class{refCount(e){return Is("refCount")}incRef(e){return Is("incRef")}timerAvailable(){return!0}time(e){return Is("time")}read(e){return Is("read")}readSync(e){return Is("readSync")}numDataIds(){return Is("numDataIds")}disposeData(e,t){return Is("disposeData")}write(e,t,n){return Is("write")}move(e,t,n,s,r){return Is("move")}memory(){return Is("memory")}floatPrecision(){return Is("floatPrecision")}epsilon(){return this.floatPrecision()===32?wS:kS}dispose(){return Is("dispose")}};function Is(e){throw new Error(`'${e}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}function b5(e){let t=e.length,n=0;for(;t>0;)n=Math.random()*t|0,t--,Gd(e,t,n)}function IS(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,s=0;for(;n>0;)s=Math.random()*n|0,n--,Gd(e,n,s),Gd(t,n,s)}function Fu(e,t,n){return Math.max(e,Math.min(t,n))}function SS(e){return e%2==0?e:e+1}function Gd(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function CS(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`)}function Ca(e){M(e!=null,()=>"The input to the tensor constructor must be a non-null value.")}function Ta(e,t=[],n=!1){if(t==null&&(t=[]),Array.isArray(e)||cn(e)&&!n)for(let s=0;s0,n){return new Promise((s,r)=>{let a=0,o=()=>{if(e()){s();return}a++;let i=t(a);if(n!=null&&a>=n){r();return}setTimeout(o,i)};o()})}function FS(e,t){let n=1,s=-1;for(let a=0;a=0)n*=e[a];else if(e[a]===-1){if(s!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${s} and dim ${a}`);s=a}else if(e[a]<0)throw Error(`Shapes can not be < 0. Found ${e[a]} at dim ${a}`);if(s===-1){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(n===0)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);let r=e.slice();return r[s]=t/n,r}function Ss(e,t){let n=t.length;return e=e==null?t.map((s,r)=>r):[].concat(e),M(e.every(s=>s>=-n&&s`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`),M(e.every(s=>Zt(s)),()=>`All values in axis param must be integers but got axis ${e}`),e.map(s=>s<0?n+s:s)}function v5(e,t){let n=[],s=[],r=t!=null&&Array.isArray(t)&&t.length===0,a=t==null||r?null:Ss(t,e).sort(),o=0;for(let i=0;ii)&&e[i]===1&&(n.push(e[i]),s.push(i)),a[o]<=i&&o++}e[i]!==1&&(n.push(e[i]),s.push(i))}return{newShape:n,keptDims:s}}function w5(e,t){let n=null;if(e==null||e==="float32")n=new Float32Array(t);else if(e==="int32")n=new Int32Array(t);else if(e==="bool")n=new Uint8Array(t);else throw new Error(`Unknown data type ${e}`);return n}function k5(e,t){let n=null;if(e==null||e==="float32")n=new Float32Array(t);else if(e==="int32")n=new Int32Array(t);else if(e==="bool")n=new Uint8Array(t);else if(e==="string")n=new Array(t);else throw new Error(`Unknown data type ${e}`);return n}function I5(e,t){for(let n=0;nt+=n.length),t}function Br(e){return typeof e=="string"||e instanceof String}function T5(e){return typeof e=="boolean"}function N5(e){return typeof e=="number"}function jd(e){return Array.isArray(e)?jd(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":N5(e)?"float32":Br(e)?"string":T5(e)?"bool":"float32"}function Wr(e){return!!(e&&e.constructor&&e.call&&e.apply)}function qd(e,t){for(let n=t;n=0;--s)n[s]=n[s+1]*e[s+1];return n}function E5(e,t,n,s=!1){let r=new Array;if(t.length===1){let a=t[0]*(s?2:1);for(let o=0;ol*u)*(s?2:1);for(let l=0;lr*a)*(n?2:1);if(s===0)return[];if(s!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return E5(0,e,t,n)}function Pm(e,t){let n=Xd(e,t);for(let s=0;ss*r,1);if(t==null||t==="float32")return ki(e,new Float32Array(n));if(t==="int32")return ki(e,new Int32Array(n));if(t==="bool")return ki(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function Mm(e){e.forEach(t=>{M(Number.isInteger(t)&&t>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`)})}function MS(e,t,n){if(t===0)return 0;if(t===1)return e[0];let s=e[e.length-1];for(let r=0;r{let[s,r]=n.split(":");this.urlFlags[s]=VS(s,r)})}};function BS(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(n,...s)=>(WS(t,s[0],s[1]),s.join("="))),t}function WS(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}function VS(e,t){if(t=t.toLowerCase(),t==="true"||t==="false")return t==="true";if(`${+t}`===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}function Q(){return os}var os=null;function US(e){os=e}var Lm;function D5(){if(Lm==null){let e;if(typeof window!="undefined")e=window;else if(typeof global!="undefined")e=global;else if(typeof process!="undefined")e=process;else if(typeof self!="undefined")e=self;else throw new Error("Could not find a global object");Lm=e}return Lm}function HS(){let e=D5();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function Bm(e,t){let n=HS();if(n.has(e))return n.get(e);{let s=t();return n.set(e,s),n.get(e)}}var Ii="Abs",Si="Acos",Ci="Acosh",Vr="Add",Na="AddN",Ti="All",Ni="Any",Ea="ArgMax",Pu="ArgMin",Ei="Asin",Ri="Asinh",_i="Atan",Di="Atanh",$i="Atan2",Ra="AvgPool",Kd="AvgPoolGrad",Mu="AvgPool3D",Zd="AvgPool3DGrad",_a="BatchMatMul",Fi="BatchToSpaceND",Yd="Bincount",$5="BroadcastTo",Wm="BroadcastArgs",Da="Cast",$a="Ceil",Ur="ClipByValue",Jd="Complex",zu="ComplexAbs",Oi="Concat",Fa="Conv2D",Qd="Conv2DBackpropFilter",Oa="Conv2DBackpropInput",Lu="Conv3D",eh="Conv3DBackpropFilterV2",th="Conv3DBackpropInputV2",Pa="Cos",Ma="Cosh",za="Cumsum",Pi="CropAndResize",nh="DenseBincount",Mi="DepthToSpace",La="DepthwiseConv2dNative",sh="DepthwiseConv2dNativeBackpropFilter",rh="DepthwiseConv2dNativeBackpropInput",ah="Diag",Bu="Dilation2D",oh="Dilation2DBackpropInput",ih="Dilation2DBackpropFilter",Ba="RealDiv",lh="Einsum",Wa="Elu",uh="EluGrad",zi="Erf",Li="Equal",Va="Exp",Bi="ExpandDims",Wi="Expm1",ch="FFT",Wu="Fill",Vi="FlipLeftRight",Ua="Floor",Ha="FloorDiv",Ga="FusedBatchNorm",Ui="GatherV2",Hi="GatherNd",Gi="Greater",ja="GreaterEqual",qa="Identity",dh="IFFT",hh="Imag",ji="IsFinite",qi="IsInf",Xi="IsNan",Xa="LeakyRelu",Ki="Less",Zi="LessEqual",ph="LinSpace",Ka="Log",Yi="Log1p",Ji="LogicalAnd",Vu="LogicalNot",Uu="LogicalOr",F5="LogSoftmax",Hu="LRN",fh="LRNGrad",Za="Max",Ya="Maximum",Ja="MaxPool",mh="MaxPoolGrad",Gu="MaxPool3D",gh="MaxPool3DGrad",Ah="MaxPoolWithArgmax",Qa="Mean",eo="Min",to="Minimum",no="MirrorPad",Qi="Mod",yh="Multinomial",so="Multiply",el="Neg",tl="NotEqual",nl="NonMaxSuppressionV3",sl="NonMaxSuppressionV4",rl="NonMaxSuppressionV5",al="OnesLike",ro="OneHot",ol="Pack",ao="PadV2",GS="Pool",oo="Pow",io="Prelu",il="Prod",ju="Range",xh="Real",ll="Reciprocal",lo="Relu",ul="Reshape",qu="ResizeNearestNeighbor",bh="ResizeNearestNeighborGrad",uo="ResizeBilinear",vh="ResizeBilinearGrad",co="Relu6",ho="Reverse",po="Round",fo="Rsqrt",cl="ScatterNd",dl="Select",hl="Selu",pl="Slice",mo="Sin",fl="Sinh",ml="Sign",go="Sigmoid",gl="Softplus",Ao="Sqrt",yo="Sum",Al="SpaceToBatchND",yl="SplitV",xo="Softmax",wh="SparseFillEmptyRows",kh="SparseReshape",Ih="SparseSegmentMean",Sh="SparseSegmentSum",Ch="SparseToDense",bo="SquaredDifference",Xu="Square",xl="StridedSlice",Th="StringNGrams",Nh="StringSplit",Eh="StringToHashBucketFast",vo="Sub",wo="Tan",ko="Tanh",Hr="Tile",bl="TopK",vl="Transform",Io="Transpose",Rh="Unique",wl="Unpack",Ku="UnsortedSegmentSum",kl="ZerosLike",Gr="Step",_h="FromPixels",Il="RotateWithOffset",So="_FusedMatMul",Co="FusedConv2D",To="FusedDepthwiseConv2D",Sl=Bm("kernelRegistry",()=>new Map),Zu=Bm("gradRegistry",()=>new Map);function Dh(e,t){let n=Um(e,t);return Sl.get(n)}function Vm(e){return Zu.get(e)}function Cl(e){let t=Sl.entries(),n=[];for(;;){let{done:s,value:r}=t.next();if(s)break;let[a,o]=r,[i]=a.split("_");i===e&&n.push(o)}return n}function No(e){let{kernelName:t,backendName:n}=e,s=Um(t,n);Sl.has(s)&&Ys(`The kernel '${t}' for backend '${n}' is already registered`),Sl.set(s,e)}function O5(e){let{kernelName:t}=e;Zu.has(t)&&Q().getBool("DEBUG")&&Ys(`Overriding the gradient for '${t}'`),Zu.set(t,e)}function jS(e,t){let n=Um(e,t);if(!Sl.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);Sl.delete(n)}function qS(e){if(!Zu.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);Zu.delete(e)}function XS(e,t){Cl(e).forEach(s=>{let r=Object.assign({},s,{backendName:t});No(r)})}function Um(e,t){return`${t}_${e}`}var w={};Pe(w,{arraysEqual:()=>br,assert:()=>M,assertNonNegativeIntegerDimensions:()=>Mm,assertNonNull:()=>Ca,assertShapesMatch:()=>An,bytesFromStringArray:()=>C5,bytesPerElement:()=>Om,checkConversionForErrors:()=>I5,clamp:()=>Fu,computeStrides:()=>wi,createScalarValue:()=>e9,createShuffledIndices:()=>DS,decodeString:()=>Oh,distSquared:()=>NS,encodeString:()=>Qu,fetch:()=>n9,fingerPrint64:()=>QS,flatten:()=>Ta,getArrayFromDType:()=>k5,getTypedArrayFromDType:()=>w5,hasEncodingLoss:()=>OS,hexToLong:()=>Yu,indexToLoc:()=>zS,inferDtype:()=>jd,inferFromImplicitShape:()=>FS,isBoolean:()=>T5,isFunction:()=>Wr,isInt:()=>Zt,isNumber:()=>N5,isPromise:()=>zm,isScalarShape:()=>ES,isString:()=>Br,isTypedArray:()=>cn,isValidDtype:()=>S5,locToIndex:()=>MS,makeOnesTypedArray:()=>Pm,makeZerosNestedTypedArray:()=>PS,makeZerosTypedArray:()=>Xd,nearestDivisor:()=>qd,nearestLargerEven:()=>SS,now:()=>Ju,parseAxisParam:()=>Ss,randUniform:()=>TS,repeatedTry:()=>$S,rightPad:()=>Ou,shuffle:()=>b5,shuffleCombo:()=>IS,sizeFromShape:()=>$t,sizeToSquarishShape:()=>_S,squeezeShape:()=>v5,sum:()=>CS,swap:()=>Gd,tanh:()=>RS,toNestedArray:()=>ki,toTypedArray:()=>Fh});var P5=Sa(XI()),Eo=P5.default||P5;function Yu(e){return Eo.fromString(e,!0,16)}var M5=Yu("c3a5c85c97cb3127"),Ro=Yu("b492b66fbe98f273"),yn=Yu("9ae16a3b2f90404f");function Hm(e){return e.xor(e.shru(47))}function z5(e,t,n){let s=e.slice(t,t+n);return Eo.fromBytes(Array.from(s),!0,!0)}function pt(e,t){return z5(e,t,8)}function L5(e,t){return z5(e,t,4)}function Yt(e,t){return t===0?e:e.shru(t).or(e.shl(64-t))}function jr(e,t,n=Yu("9ddfea08eb382d69")){let s=e.xor(t).mul(n);s=s.xor(s.shru(47));let r=t.xor(s).mul(n);return r=r.xor(r.shru(47)),r=r.mul(n),r}function KS(e,t,n,s,r,a){r=r.add(e),a=Yt(a.add(r).add(s),21);let o=r;return r=r.add(t),r=r.add(n),a=a.add(Yt(r,44)),[r.add(s),a.add(o)]}function $h(e,t,n,s){return KS(pt(e,t),pt(e,t+8),pt(e,t+16),pt(e,t+24),n,s)}function ZS(e,t=e.length){if(t>=8){let n=yn.add(t*2),s=pt(e,0).add(yn),r=pt(e,t-8),a=Yt(r,37).mul(n).add(s),o=Yt(s,25).add(r).mul(n);return jr(a,o,n)}if(t>=4){let n=yn.add(t*2),s=L5(e,0);return jr(s.shl(3).add(t),L5(e,t-4),n)}if(t>0){let n=e[0],s=e[t>>1],r=e[t-1],a=n+(s<<8),o=t+(r<<2);return Hm(yn.mul(a).xor(M5.mul(o))).mul(yn)}return yn}function YS(e,t=e.length){let n=yn.add(t*2),s=pt(e,0).mul(Ro),r=pt(e,8),a=pt(e,t-8).mul(n),o=pt(e,t-16).mul(yn);return jr(Yt(s.add(r),43).add(Yt(a,30)).add(o),s.add(Yt(r.add(yn),18)).add(a),n)}function JS(e,t=e.length){let n=yn.add(t*2),s=pt(e,0).mul(yn),r=pt(e,8),a=pt(e,t-8).mul(n),o=pt(e,t-16).mul(yn),i=Yt(s.add(r),43).add(Yt(a,30)).add(o),l=jr(i,s.add(Yt(r.add(yn),18)).add(a),n),u=pt(e,16).mul(n),c=pt(e,24),d=i.add(pt(e,t-32)).mul(n),h=l.add(pt(e,t-24)).mul(n);return jr(Yt(u.add(c),43).add(Yt(d,30)).add(h),u.add(Yt(c.add(s),18)).add(d),n)}function QS(e,t=e.length){let n=Eo.fromNumber(81,!0);if(t<=32)return t<=16?ZS(e,t):YS(e,t);if(t<=64)return JS(e,t);let s=n,r=n.mul(Ro).add(113),a=Hm(r.mul(yn).add(113)).mul(yn),o=[Eo.UZERO,Eo.UZERO],i=[Eo.UZERO,Eo.UZERO];s=s.mul(yn).add(pt(e,0));let l=0,u=(t-1>>6)*64,c=u+(t-1&63)-63;do s=Yt(s.add(r).add(o[0]).add(pt(e,l+8)),37).mul(Ro),r=Yt(r.add(o[1]).add(pt(e,l+48)),42).mul(Ro),s=s.xor(i[1]),r=r.add(o[0]).add(pt(e,l+40)),a=Yt(a.add(i[0]),33).mul(Ro),o=$h(e,l,o[1].mul(Ro),s.add(i[0])),i=$h(e,l+32,a.add(i[1]),r.add(pt(e,l+16))),[a,s]=[s,a],l+=64;while(l!==u);let d=Ro.add(a.and(255).shl(1));return l=c,i[0]=i[0].add(t-1&63),o[0]=o[0].add(i[0]),i[0]=i[0].add(o[0]),s=Yt(s.add(r).add(o[0]).add(pt(e,l+8)),37).mul(d),r=Yt(r.add(o[1]).add(pt(e,l+48)),42).mul(d),s=s.xor(i[1].mul(9)),r=r.add(o[0].mul(9).add(pt(e,l+40))),a=Yt(a.add(i[0]),33).mul(d),o=$h(e,l,o[1].mul(d),s.add(i[0])),i=$h(e,l+32,a.add(i[1]),r.add(pt(e,l+16))),[a,s]=[s,a],jr(jr(o[0],i[0],d).add(Hm(r).mul(M5)).add(a),jr(o[1],i[1],d).add(s),d)}function e9(e,t){return t==="string"?Qu(e):Fh([e],t)}function t9(e,t){return e instanceof Float32Array&&t==="float32"||e instanceof Int32Array&&t==="int32"||e instanceof Uint8Array&&t==="bool"}function Fh(e,t){if(t==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=Ta(e)),Q().getBool("DEBUG")&&I5(e,t),t9(e,t))return e;if(t==null||t==="float32"||t==="complex64")return new Float32Array(e);if(t==="int32")return new Int32Array(e);if(t==="bool"){let n=new Uint8Array(e.length);for(let s=0;s{s=n()},a,o=Ju();if(this.backendTimer.timerAvailable())a=this.backendTimer.time(r);else{r();for(let l of s)l.dataSync();a=Promise.resolve({kernelMs:Ju()-o})}if(Q().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let l=0;l{r9(c,u.dtype,e)})}return{kernelName:e,outputs:s,inputs:t,timeMs:a.then(l=>l.kernelMs),extraInfo:a.then(l=>l.getExtraProfileInfo!=null?l.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:n,timeMs:s,inputs:r,extraInfo:a}=e;n.forEach(o=>{Promise.all([o.data(),s,a]).then(i=>{this.logger.logKernelProfile(t,o,i[0],i[1],r,i[2])})})}};function r9(e,t,n){if(t!=="float32")return!1;for(let s=0;s0?f:""} `}}console.log(`%c${i} %c${o} %c${l}D ${c} %c${u} %c${d} %c${a}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function o9(e,t,n){let s={},r={};for(let l=0;ls[m.id]=!0),p=!0,r[u.id]=!0;break}if(p)break}}let a={};a[n.id]=!0;let o={};for(let l=e.length-1;l>=0;l--){let u=e[l],c=u.inputs;for(let d=0;d=0;r--){let a=t[r],o=[];if(a.outputs.forEach(l=>{let u=e[l.id];u!=null?o.push(u):o.push(null)}),a.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${a.kernelName}.`);let i=a.gradient(o);for(let l in a.inputs){if(!(l in i))throw new Error(`Cannot backprop through input ${l}. Available gradients found: ${Object.keys(i)}.`);let u=n(()=>i[l]());if(u.dtype!=="float32")throw new Error(`Error in gradient for op ${a.kernelName}. The gradient of input ${l} must have 'float32' dtype, but has '${u.dtype}'`);let c=a.inputs[l];if(!br(u.shape,c.shape))throw new Error(`Error in gradient for op ${a.kernelName}. The gradient of input '${l}' has shape '${u.shape}', which does not match the shape of the input '${c.shape}'`);if(e[c.id]==null)e[c.id]=u;else{let d=e[c.id];e[c.id]=s(d,u),d.dispose()}}}}var B5=20,ec=3,Gm=7;function l9(e,t,n,s){let r=wi(t),a=u9(e,t,n,r),o=t.length,i=Ph(e,t,n,r,a),l=["Tensor"];return s&&(l.push(` dtype: ${n}`),l.push(` rank: ${o}`),l.push(` shape: [${t}]`),l.push(" values:")),l.push(i.map(u=>" "+u).join(` -`)),l.join(` -`)}function u9(e,t,n,s){let r=$t(t),a=s[s.length-1],o=new Array(a).fill(0),i=t.length,l=n==="complex64"?nc(e):e;if(i>1)for(let u=0;uB5){let g=ec*o,A=Array.from(e.slice(0,g)),y=Array.from(e.slice((i-ec)*o,i*o));return n==="complex64"&&(A=nc(A),y=nc(y)),["["+A.map((x,b)=>tc(x,r[b],n)).join(", ")+", ..., "+y.map((x,b)=>tc(x,r[i-ec+b],n)).join(", ")+"]"]}let m=n==="complex64"?nc(e):Array.from(e);return["["+m.map((g,A)=>tc(g,r[A],n)).join(", ")+"]"]}let u=t.slice(1),c=s.slice(1),d=s[0]*o,h=[];if(i>B5){for(let m=0;m`Length of values '${s}' does not match the size inferred by the shape '${this.size}'.`)}if(t==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||k5(t,this.size),this.strides=wi(e)}set(e,...t){t.length===0&&(t=[0]),M(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let s of e){if(s<0||s>=this.shape[t]){let r=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(r)}t++}let n=e[e.length-1];for(let s=0;sOh(n))}catch(n){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();let e=Js().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>Oh(t))}catch(t){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();let e=await Js().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(Js().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Tl.print(this,e)}clone(){return this.throwIfDisposed(),Tl.clone(this)}toString(e=!1){let t=this.dataSync();return l9(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Tl.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),Js().makeVariable(this,e,t,n)}};Object.defineProperty(Ge,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function f9(){return Bm("Tensor",()=>Ge)}f9();var sc=class extends Ge{constructor(e,t,n,s){super(e.shape,e.dtype,e.dataId,s);this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!br(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);Js().disposeTensor(this),this.dataId=e.dataId,Js().incRef(this,null)}dispose(){Js().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(sc,Symbol.hasInstance,{value:e=>e instanceof Ge&&e.assign!=null&&e.assign instanceof Function});var $s={};Pe($s,{assertTypesMatch:()=>V5,getTensorsInContainer:()=>Ym,isTensorInList:()=>g9,makeTypesMatch:()=>Ct});var jm;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(jm||(jm={}));var qm;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(qm||(qm={}));var Xm;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(Xm||(Xm={}));var Km;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(Km||(Km={}));var Zm;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(Zm||(Zm={}));var m9={float32:Km,int32:qm,bool:Xm,complex64:Zm};function Cs(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return m9[e][t]}function Mh(e){return Cs(e,"int32")}function Ct(e,t){if(e.dtype===t.dtype)return[e,t];let n=Cs(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function V5(e,t){M(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function g9(e,t){return t.some(n=>n.id===e.id)}function Ym(e){let t=[],n=new Set;return U5(e,t,n),t}function U5(e,t,n){if(e==null)return;if(e instanceof Ge){t.push(e);return}if(!A9(e))return;let s=e;for(let r in s){let a=s[r];n.has(a)||(n.add(a),U5(a,t,n))}}function A9(e){return Array.isArray(e)||typeof e=="object"}function Jm(e){return e.kernelName!=null}var H5=class{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map(e=>e.name)))}}}dispose(){for(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},rc=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new H5}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{t.setupFunc!=null&&t.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){Cl(e).forEach(n=>{n.disposeFunc!=null&&n.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof $u)&&typeof n.then=="function"){let s=++this.pendingBackendInitId,r=n.then(a=>s(sthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(s),()=>(s=t(),s instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),s))}scopedRun(e,t,n){e();try{let s=n();return t(),s}catch(s){throw t(),s}}nextTensorId(){return rc.nextTensorId++}nextVariableId(){return rc.nextVariableId++}clone(e){let t=z.runKernel(qa,{x:e}),n={x:e},s=a=>({x:()=>{let o="float32",i={x:a},l={dtype:o};return z.runKernel(Da,i,l)}}),r=[];return this.addTapeNode(this.state.activeScope.name,n,[t],s,r,{}),t}runKernel(e,t,n){if(this.backendName==null&&this.backend,!(Dh(e,this.backendName)!=null))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){let s=this.backend.numDataIds(),r=0;n.forEach(i=>{r+=i.dtype==="complex64"?3:1});let a=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],o=s-t-r-a;if(o>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${o} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],s=this.isTapeOn(),r=this.state.numBytes,a=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let o;this.backendName==null&&this.backend;let i,l=Jm(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(Jm(e)){let{kernelName:p,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let g=Dh(p,this.backendName);M(g!=null,()=>`Cannot find registered kernel '${p}' for backend '${this.backendName}'`),o=()=>{let A=this.backend.numDataIds();i=g.kernelFunc({inputs:f,attrs:m,backend:this.backend});let y=Array.isArray(i)?i:[i];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,A,y);let x=y.map(b=>{if(b.rank!=null)return b;let{dataId:v,shape:k,dtype:S}=b;return this.makeTensorFromDataId(v,k,S)});if(s){let b=this.getTensorsForGradient(p,f,x);n=this.saveTensorsForBackwardMode(b)}return x}}else{let{forwardFunc:p}=e,f=m=>{!s||(n=m.map(g=>this.keep(this.clone(g))))};o=()=>{let m=this.backend.numDataIds();i=this.tidy(()=>p(this.backend,f));let g=Array.isArray(i)?i:[i];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,g),g}}let{inputs:u,attrs:c}=e,d=Jm(e)?null:e.backwardsFunc,h;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=o():(h=this.profiler.profileKernel(l,u,()=>o()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(h),t=h.outputs)}),s&&this.addTapeNode(l,u,t,d,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-r,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-a,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(u).map(p=>u[p]!=null?u[p].shape:null),outputShapes:t.map(p=>p.shape),kernelTimeMs:h.timeMs,extraInfo:h.extraInfo}),Array.isArray(i)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(n=>this.keep(this.clone(n)))}getTensorsForGradient(e,t,n){let s=Vm(e);if(s!=null){let r=s.inputsToSave||[],a=s.outputsToSave||[],o;s.saveAllInputs?(M(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),o=Object.keys(t).map(l=>t[l])):o=r.map(l=>t[l]);let i=n.filter((l,u)=>a[u]);return o.concat(i)}return[]}makeTensor(e,t,n,s){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",s=s||this.backend;let r=e;n==="string"&&Br(e[0])&&(r=e.map(i=>Qu(i)));let a=s.write(r,t,n),o=new Ge(t,n,a,this.nextTensorId());if(this.trackTensor(o,s),n==="string"){let i=this.state.tensorInfo.get(a),l=C5(r);this.state.numBytes+=l-i.bytes,i.bytes=l}return o}makeTensorFromDataId(e,t,n,s){n=n||"float32";let r=new Ge(t,n,e,this.nextTensorId());return this.trackTensor(r,s),r}makeVariable(e,t=!0,n,s){n=n||this.nextVariableId().toString(),s!=null&&s!==e.dtype&&(e=e.cast(s));let r=new sc(e,t,n,this.nextTensorId());if(this.state.registeredVariables[r.name]!=null)throw new Error(`Variable with name ${r.name} was already registered`);return this.state.registeredVariables[r.name]=r,this.incRef(r,this.backend),r}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let n=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(n=e.size*Om(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof sc||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;let t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,e.dtype==="string"&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),e.dtype!=="complex64"&&e.dtype!=="string"){let n=e.size*Om(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,e.reasons==null&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;let t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(s=>s.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let s of this.state.activeProfile.kernels)s.kernelTimeMs=await s.kernelTimeMs,s.extraInfo=await s.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,s,r,a){let o={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:r},i=Vm(e);i!=null&&(s=i.gradFunc),s!=null&&(o.gradient=l=>(l=l.map((u,c)=>{if(u==null){let d=n[c],h=Xd(d.size,d.dtype);return this.makeTensor(h,d.shape,d.dtype)}return u}),s(l.length>1?l:l[0],r,a))),this.state.activeTape.push(o)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=Ym(e),n=new Set(t.map(r=>r.id));for(let r=0;r{!r.kept&&r.scopeId===s.id&&this.track(r)})}gradients(e,t,n,s=!1){if(M(t.length>0,()=>"gradients() received an empty list of xs."),n!=null&&n.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);let r=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));M(r instanceof Ge,()=>"The result y returned by f() must be a tensor.");let a=o9(this.state.activeTape,t,r);if(!s&&a.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let o={};o[r.id]=n==null?y9(r.shape):n,i9(o,a,l=>this.tidy(l),x9);let i=t.map(l=>o[l.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(l=>{for(let u of l.saved)u.dispose()}),this.state.activeTape=null),{value:r,grads:i}})}customGrad(e){return M(Wr(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{M(t.every(o=>o instanceof Ge),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,s={};t.forEach((o,i)=>{s[i]=o});let r=(o,i)=>(n=e(...t,i),M(n.value instanceof Ge,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),M(Wr(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),a=(o,i)=>{let l=n.gradFunc(o,i),u=Array.isArray(l)?l:[l];M(u.length===t.length,()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."),M(u.every(d=>d instanceof Ge),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");let c={};return u.forEach((d,h)=>{c[h]=()=>d}),c};return this.runKernelFunc({forwardFunc:r,backwardsFunc:a,inputs:s})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=Ju(),n=await this.backend.time(e);return n.wallMs=Ju()-t,n}track(e){return this.state.activeScope!=null&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new H5;for(let e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}};rc.nextTensorId=0;rc.nextVariableId=0;function y9(e){let t=Pm($t(e),"float32");return z.makeTensor(t,e,"float32")}function G5(){let e=D5();if(e._tfengine==null){let t=new _5(e);e._tfengine=new rc(t)}return US(e._tfengine.ENV),d9(()=>e._tfengine),e._tfengine}var z=G5();function x9(e,t){let n={a:e,b:t};return z.runKernel(Vr,n)}var ac={};Pe(ac,{isBrowser:()=>j5,isMobile:()=>v9});function b9(){return typeof navigator!="undefined"&&navigator!=null}function v9(e){if(e||b9()){if(e||(e=navigator),e.product==="ReactNative")return!0;let t=e.userAgent||e.vendor||(typeof window!="undefined"?window.opera:"");if(!t){let n=e;return n.userAgentData&&n.userAgentData.mobile}return/(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(t)||/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(t.substr(0,4))}return!1}function j5(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var Fs=Q();Fs.registerFlag("DEBUG",()=>!1,e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});Fs.registerFlag("IS_BROWSER",()=>j5());Fs.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");Fs.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));Fs.registerFlag("PROD",()=>!1);Fs.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>Fs.getBool("DEBUG"));Fs.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);Fs.registerFlag("IS_TEST",()=>!1);Fs.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);Fs.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Qs(e,t){let n=e;if(cn(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let s=[];for(;Array.isArray(n)||cn(n)&&t!=="string";)s.push(n.length),n=n[0];return Array.isArray(e)&&Q().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&q5(e,s,[]),s}function q5(e,t,n){if(n=n||[],!Array.isArray(e)&&!cn(e)){M(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}M(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),M(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let s=t.slice(1);for(let r=0;r=0&&(r=s),X5(s,r,t,n),e==null||!cn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let l=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${l}'`)}let a=Qs(e,r);!cn(e)&&!Array.isArray(e)&&(e=[e]);let i=r!=="string"?Fh(e,r):Ta(e,[],!0);return z.makeTensor(i,a,r)}function oc(e,t,n,s="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((a,o)=>$(a,`${t}[${o}]`,n,s))}var K5="__op";function W(e){let t=Object.keys(e);if(t.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0],s=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+K5;let r=(...a)=>{z.startScope(n);try{let o=s(...a);return zm(o)&&console.error("Cannot return a Promise inside of tidy."),z.endScope(o),o}catch(o){throw z.endScope(null),o}};return Object.defineProperty(r,"name",{value:n,configurable:!0}),r}function w9(e,t){let n=$(e,"real","complex"),s=$(t,"imag","complex");An(n.shape,s.shape,`real and imag shapes, ${n.shape} and ${s.shape}, must match in call to tf.complex().`);let r={real:n,imag:s};return z.runKernel(Jd,r)}var qr=W({complex_:w9});function Xr(e,t,n,s){if(s==null&&(s=jd(e)),s==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!cn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(t!=null){Mm(t);let r=$t(t),a=$t(n);M(r===a,()=>`Based on the provided shape, [${t}], the tensor should have ${r} values but has ${a}`);for(let o=0;o`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!cn(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=s!=="string"?Fh(e,s):Ta(e,[],!0),z.makeTensor(e,t,s)}function dn(e,t,n){let s=Qs(e,n);return Xr(e,t,s,n)}var Qm={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},zh=4;async function k9(e,t){let n=[],s=[],r=Array.isArray(e)?e.map(o=>o.name):Object.keys(e);for(let o=0;o{let h=await l.bytes(),p=h.reduce((g,A)=>g+A.length,0)+zh*h.length,f=new Uint8Array(p),m=0;for(let g=0;g{if(t+=a.byteLength,n.push(a.byteLength===a.buffer.byteLength?a:new a.constructor(a)),!(a instanceof Float32Array||a instanceof Int32Array||a instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${a.constructor.name}`)});let s=new Uint8Array(t),r=0;return n.forEach(a=>{s.set(new Uint8Array(a.buffer),r),r+=a.byteLength}),s.buffer}var eg=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function Y5(e){return eg?Buffer.byteLength(e):new Blob([e]).size}function S9(e){if(eg)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let s=0,r=t.length;s{t+=r.byteLength});let n=new Uint8Array(t),s=0;return e.forEach(r=>{n.set(new Uint8Array(r),s),s+=r.byteLength}),n.buffer}function J5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let n=e.split(t);return n[n.length-1]}function Q5(e,t){let n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return e.signature!=null&&(n.signature=e.signature),e.userDefinedMetadata!=null&&(n.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(n.modelInitializer=e.modelInitializer),e.trainingConfig!=null&&(n.trainingConfig=e.trainingConfig),n}async function ng(e,t){let n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(e.trainingConfig!=null&&(n.trainingConfig=e.trainingConfig),e.weightsManifest!=null){let[s,r]=await t(e.weightsManifest);n.weightSpecs=s,n.weightData=r}return e.signature!=null&&(n.signature=e.signature),e.userDefinedMetadata!=null&&(n.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(n.modelInitializer=e.modelInitializer),n}function ic(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:e.modelTopology==null?0:Y5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:Y5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function T9(){let e=n=>{let s=n<<13,r=0;for(;(s&8388608)==0;)r-=8388608,s<<=1;return s&=~8388608,r+=947912704,s|r},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}function N9(){let e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}function E9(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function R9(){let e=T9(),t=N9(),n=E9();return s=>{let r=new ArrayBuffer(4*s.length),a=new Uint32Array(r);for(let o=0;o>10]+(i&1023)]+t[i>>10];a[o]=l}return new Float32Array(r)}}var Rt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Rt.instance==null&&(Rt.instance=new Rt),Rt.instance}static registerSaveRouter(e){Rt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Rt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Rt.getHandlers(e,"save")}static getLoadHandlers(e,t){return Rt.getHandlers(e,"load",t)}static getHandlers(e,t,n){let s=[];return(t==="load"?Rt.getInstance().loadRouters:Rt.getInstance().saveRouters).forEach(a=>{let o=a(e,n);o!==null&&s.push(o)}),s}},_9=e=>Rt.registerSaveRouter(e),D9=e=>Rt.registerLoadRouter(e),$9=e=>Rt.getSaveHandlers(e),F9=(e,t)=>Rt.getLoadHandlers(e,t),sg="tensorflowjs",rg=1,_o="models_store",Kr="model_info_store";function ex(){if(!Q().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let e=typeof window=="undefined"?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(t==null)throw new Error("The current browser does not appear to support IndexedDB.");return t}function ag(e){let t=e.result;t.createObjectStore(_o,{keyPath:"modelPath"}),t.createObjectStore(Kr,{keyPath:"modelPath"})}var Do=class{constructor(e){if(this.indexedDB=ex(),e==null||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise((n,s)=>{let r=this.indexedDB.open(sg,rg);r.onupgradeneeded=()=>ag(r),r.onsuccess=()=>{let a=r.result;if(t==null){let o=a.transaction(_o,"readonly"),l=o.objectStore(_o).get(this.modelPath);l.onsuccess=()=>{if(l.result==null)return a.close(),s(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(l.result.modelArtifacts)},l.onerror=u=>(a.close(),s(l.error)),o.oncomplete=()=>a.close()}else{let o=ic(t),i=a.transaction(Kr,"readwrite"),l=i.objectStore(Kr),u=l.put({modelPath:this.modelPath,modelArtifactsInfo:o}),c;u.onsuccess=()=>{c=a.transaction(_o,"readwrite");let h=c.objectStore(_o).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:o});h.onsuccess=()=>n({modelArtifactsInfo:o}),h.onerror=p=>{l=i.objectStore(Kr);let f=l.delete(this.modelPath);f.onsuccess=()=>(a.close(),s(h.error)),f.onerror=m=>(a.close(),s(h.error))}},u.onerror=d=>(a.close(),s(u.error)),i.oncomplete=()=>{c==null?a.close():c.oncomplete=()=>a.close()}}},r.onerror=a=>s(r.error)})}};Do.URL_SCHEME="indexeddb://";var tx=e=>Q().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(Do.URL_SCHEME)?O9(e.slice(Do.URL_SCHEME.length)):null;Rt.registerSaveRouter(tx);Rt.registerLoadRouter(tx);function O9(e){return new Do(e)}function P9(e){return e.startsWith(Do.URL_SCHEME)?e.slice(Do.URL_SCHEME.length):e}var M9=class{constructor(){this.indexedDB=ex()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(sg,rg);n.onupgradeneeded=()=>ag(n),n.onsuccess=()=>{let s=n.result,r=s.transaction(Kr,"readonly"),o=r.objectStore(Kr).getAll();o.onsuccess=()=>{let i={};for(let l of o.result)i[l.modelPath]=l.modelArtifactsInfo;e(i)},o.onerror=i=>(s.close(),t(o.error)),r.oncomplete=()=>s.close()},n.onerror=s=>t(n.error)})}async removeModel(e){return e=P9(e),new Promise((t,n)=>{let s=this.indexedDB.open(sg,rg);s.onupgradeneeded=()=>ag(s),s.onsuccess=()=>{let r=s.result,a=r.transaction(Kr,"readwrite"),o=a.objectStore(Kr),i=o.get(e),l;i.onsuccess=()=>{if(i.result==null)return r.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let u=o.delete(e),c=()=>{l=r.transaction(_o,"readwrite");let h=l.objectStore(_o).delete(e);h.onsuccess=()=>t(i.result.modelArtifactsInfo),h.onerror=p=>n(i.error)};u.onsuccess=c,u.onerror=d=>(c(),r.close(),n(i.error))}},i.onerror=u=>(r.close(),n(i.error)),a.oncomplete=()=>{l==null?r.close():l.oncomplete=()=>r.close()}},s.onerror=r=>n(s.error)})}},vr="/",Nl="tensorflowjs_models",nx="info",z9="model_topology",L9="weight_specs",B9="weight_data",W9="model_metadata";function sx(e){return{info:[Nl,e,nx].join(vr),topology:[Nl,e,z9].join(vr),weightSpecs:[Nl,e,L9].join(vr),weightData:[Nl,e,B9].join(vr),modelMetadata:[Nl,e,W9].join(vr)}}function rx(e){for(let t of Object.values(e))window.localStorage.removeItem(t)}function V9(e){let t=e.split(vr);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(vr)}function U9(e){return e.startsWith($o.URL_SCHEME)?e.slice($o.URL_SCHEME.length):e}var $o=class{constructor(e){if(!Q().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,e==null||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=sx(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{let t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),s=ic(e);try{this.LS.setItem(this.keys.info,JSON.stringify(s)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,S9(e.weightData));let r={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,signature:e.signature!=null?e.signature:void 0,userDefinedMetadata:e.userDefinedMetadata!=null?e.userDefinedMetadata:void 0,modelInitializer:e.modelInitializer!=null?e.modelInitializer:void 0,trainingConfig:e.trainingConfig!=null?e.trainingConfig:void 0};return this.LS.setItem(this.keys.modelMetadata,JSON.stringify(r)),{modelArtifactsInfo:s}}catch(r){throw rx(this.keys),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${s.modelTopologyBytes}, weightSpecsBytes=${s.weightSpecsBytes}, weightDataBytes=${s.weightDataBytes}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!=="JSON")throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let s=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(s==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=s;let r=this.LS.getItem(this.keys.modelMetadata);if(r!=null){let o=JSON.parse(r);t.format=o.format,t.generatedBy=o.generatedBy,t.convertedBy=o.convertedBy,o.signature!=null&&(t.signature=o.signature),o.userDefinedMetadata!=null&&(t.userDefinedMetadata=o.userDefinedMetadata),o.modelInitializer!=null&&(t.modelInitializer=o.modelInitializer),o.trainingConfig!=null&&(t.trainingConfig=o.trainingConfig)}let a=this.LS.getItem(this.keys.weightData);if(a==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=C9(a),t}};$o.URL_SCHEME="localstorage://";var ax=e=>Q().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith($o.URL_SCHEME)?H9(e.slice($o.URL_SCHEME.length)):null;Rt.registerSaveRouter(ax);Rt.registerLoadRouter(ax);function H9(e){return new $o(e)}var G9=class{constructor(){M(Q().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),M(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=Nl+vr,n=vr+nx;for(let s=0;s"scheme must not be undefined or null."),e.endsWith(El)&&(e=e.slice(0,e.indexOf(El))),M(e.length>0,()=>"scheme must not be an empty string.");let n=is.getInstance();M(n.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),n.managers[e]=t}static getManager(e){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};function Lh(e){if(e.indexOf(El)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${is.getSchemes().join(",")}`);return{scheme:e.split(El)[0],path:e.split(El)[1]}}async function ox(e,t,n=!1){M(e!==t,()=>`Old path and new path are the same: '${e}'`);let s=Rt.getLoadHandlers(e);M(s.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),M(s.length<2,()=>`Copying failed because more than one (${s.length}) load handlers for source URL ${e}.`);let r=s[0],a=Rt.getSaveHandlers(t);M(a.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),M(a.length<2,()=>`Copying failed because more than one (${s.length}) save handlers for destination URL ${t}.`);let o=a[0],i=Lh(e).scheme,l=Lh(e).path,u=i===Lh(e).scheme,c=await r.load();n&&u&&await is.getManager(i).removeModel(l);let d=await o.save(c);return n&&!u&&await is.getManager(i).removeModel(l),d.modelArtifactsInfo}async function j9(){let e=is.getSchemes(),t={};for(let n of e){let s=await is.getManager(n).listModels();for(let r in s){let a=n+El+r;t[a]=s[r]}}return t}async function q9(e){let t=Lh(e);return is.getManager(t.scheme).removeModel(t.path)}async function X9(e,t){return ox(e,t,!1)}async function K9(e,t){return ox(e,t,!0)}var Z9=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(Q().get("IS_BROWSER")){Q().setPlatform("browser",new Z9);try{is.registerManager($o.URL_SCHEME,new G9)}catch(e){}try{is.registerManager(Do.URL_SCHEME,new M9)}catch(e){}}var Y9={importFetch:()=>KI()},og,J9=class{constructor(){this.util=vi("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return Q().global.fetch!=null?Q().global.fetch(e,t):(og==null&&(og=Y9.importFetch()),og(e,t))}now(){let e=process.hrtime();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?"":new this.util.TextDecoder(t).decode(e)}};Q().get("IS_NODE")&&Q().setPlatform("node",new J9);function We(e,t="float32",n){return t=t||"float32",Mm(e),new Ut(e,t,n)}function Q9(e,t){let n=$(e,"x","cast");if(!S5(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&n.dtype!=="string"||t!=="string"&&n.dtype==="string")throw new Error("Only strings can be casted to strings");let s={x:n},r={dtype:t};return z.runKernel(Da,s,r)}var ce=W({cast_:Q9});function eC(e){let n={x:$(e,"x","clone","string_or_numeric")};return z.runKernel(qa,n)}var Os=W({clone_:eC});function ix(e,t=!1){console.log(e.toString(t))}G5();var tC={buffer:We,cast:ce,clone:Os,print:ix};h9(tC);var _n={};Pe(_n,{browserFiles:()=>lC,browserHTTPRequest:()=>pC,concatenateArrayBuffers:()=>tg,copyModel:()=>X9,decodeWeights:()=>Z5,encodeWeights:()=>k9,fromMemory:()=>mC,getLoadHandlers:()=>F9,getModelArtifactsForJSON:()=>ng,getModelArtifactsInfoForJSON:()=>ic,getSaveHandlers:()=>$9,http:()=>ug,isHTTPScheme:()=>lg,listModels:()=>j9,loadWeights:()=>uC,moveModel:()=>K9,registerLoadRouter:()=>D9,registerSaveRouter:()=>_9,removeModel:()=>q9,weightsLoaderFactory:()=>dx,withSaveHandler:()=>gC});var nC="model",sC=".json",rC=".weights.bin";function lx(e){return new Promise(t=>setTimeout(t)).then(e)}var Rl=class{constructor(e){if(!Q().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(Rl.URL_SCHEME)&&(e=e.slice(Rl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=nC),this.modelJsonFileName=e+sC,this.weightDataFileName=e+rC}async save(e){if(typeof document=="undefined")throw new Error("Browser downloads are not supported in this environment since `document` is not present");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{let n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],s=Q5(e,n),r=window.URL.createObjectURL(new Blob([JSON.stringify(s)],{type:"application/json"})),a=this.modelJsonAnchor==null?document.createElement("a"):this.modelJsonAnchor;if(a.download=this.modelJsonFileName,a.href=r,await lx(()=>a.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let o=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;o.download=this.weightDataFileName,o.href=t,await lx(()=>o.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:ic(e)}}}};Rl.URL_SCHEME="downloads://";var aC=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise((e,t)=>{let n=new FileReader;n.onload=s=>{let r=JSON.parse(s.target.result),a=r.modelTopology;if(a==null){t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));return}if(r.weightsManifest==null){t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));return}if(this.weightsFiles.length===0){e({modelTopology:a});return}let i=ng(r,l=>this.loadWeights(l));e(i)},n.onerror=s=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)})}loadWeights(e){let t=[],n=[];for(let a of e)t.push(...a.weights),n.push(...a.paths);let s=this.checkManifestAndWeightFiles(e),r=n.map(a=>this.loadWeightsFile(a,s[a]));return Promise.all(r).then(a=>[t,tg(a)])}loadWeightsFile(e,t){return new Promise((n,s)=>{let r=new FileReader;r.onload=a=>{let o=a.target.result;n(o)},r.onerror=a=>s(`Failed to weights data from file of path '${e}'.`),r.readAsArrayBuffer(t)})}checkManifestAndWeightFiles(e){let t=[],n=this.weightsFiles.map(r=>J5(r.name)),s={};for(let r of e)r.paths.forEach(a=>{let o=J5(a);if(t.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(t.push(o),n.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);s[a]=this.weightsFiles[n.indexOf(o)]});if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return s}},oC=e=>Q().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(Rl.URL_SCHEME)?iC(e.slice(Rl.URL_SCHEME.length)):null;Rt.registerSaveRouter(oC);function iC(e="model"){return new Rl(e)}function lC(e){return new aC(e)}function ux(e,t,n,s){o(e),n=n==null?0:n,s=s==null?1:s,i(n,s);let r=0,a=l=>(l.then(u=>{let c=n+ ++r/e.length*(s-n);return t(c),u}),l);function o(l){M(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function i(l,u){M(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),M(u>=0&&u<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${u}`),M(u>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${u}`)}return Promise.all(e.map(a))}async function cx(e,t){t==null&&(t={});let n=t.fetchFunc==null?Q().platform.fetch:t.fetchFunc,s=e.map(d=>n(d,t.requestInit,{isBinary:!0})),r=0,a=.5,i=(t.onProgress==null?await Promise.all(s):await ux(s,t.onProgress,r,a)).map(d=>d.arrayBuffer()),l=.5,u=1;return t.onProgress==null?await Promise.all(i):await ux(i,t.onProgress,l,u)}async function uC(e,t="",n,s){return dx(o=>cx(o,{requestInit:s}))(e,t,n)}function dx(e){return async(t,n="",s)=>{let r=t.map(()=>!1),a={},o=s!=null?s.map(()=>!1):[],i=[];if(t.forEach((p,f)=>{let m=0;p.weights.forEach(g=>{let A="quantization"in g?g.quantization.dtype:g.dtype,y=Qm[A]*$t(g.shape),x=()=>{r[f]=!0,a[f]==null&&(a[f]=[]),a[f].push({manifestEntry:g,groupOffset:m,sizeBytes:y})};s!=null?s.forEach((b,v)=>{b===g.name&&(x(),o[v]=!0)}):x(),i.push(g.name),m+=y})}),!o.every(p=>p)){let p=s.filter((f,m)=>!o[m]);throw new Error(`Could not find weights in manifest with names: ${p.join(", ")}. -Manifest JSON has weights with names: ${i.join(", ")}.`)}let l=r.reduce((p,f,m)=>(f&&p.push(m),p),[]),u=[];l.forEach(p=>{t[p].paths.forEach(f=>{let m=n+(n.endsWith("/")?"":"/")+f;u.push(m)})});let c=await e(u),d={},h=0;return l.forEach(p=>{let f=t[p].paths.length,m=0;for(let b=0;b{let v=g.slice(b.groupOffset,b.groupOffset+b.sizeBytes),k=Z5(v,[b.manifestEntry]);for(let S in k)d[S]=k[S]}),h+=f}),d}}var cC="application/octet-stream",dC="application/json",ig=class{constructor(e,t){if(this.DEFAULT_METHOD="POST",t==null&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,t.fetchFunc!=null?(M(typeof t.fetchFunc=="function",()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"),this.fetch=t.fetchFunc):this.fetch=Q().platform.fetch,M(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&M(e.length===2,()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`),this.path=e,t.requestInit!=null&&t.requestInit.body!=null)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");let t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;let n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],s=Q5(e,n);t.body.append("model.json",new Blob([JSON.stringify(s)],{type:dC}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:cC}),"model.weights.bin");let r=await this.fetch(this.path,t);if(r.ok)return{modelArtifactsInfo:ic(e),responses:[r]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${r.status}.`)}async load(){let e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(r){let a=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?a+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":a+=" Please make sure the server is serving valid JSON for this request.",new Error(a)}let n=t.modelTopology,s=t.weightsManifest;if(n==null&&s==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return ng(t,r=>this.loadWeights(r))}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,s]=hC(t),r=this.weightPathPrefix||n,a=[];for(let u of e)a.push(...u.weights);let o=[],i=[];for(let u of e)for(let c of u.paths)this.weightUrlConverter!=null?i.push(this.weightUrlConverter(c)):o.push(r+c+s);this.weightUrlConverter&&o.push(...await Promise.all(i));let l=await cx(o,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[a,tg(l)]}};ig.URL_SCHEME_REGEX=/^https?:\/\//;function hC(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),s=e.substring(0,t),r=n>t?e.substring(n):"";return[s+"/",r]}function lg(e){return e.match(ig.URL_SCHEME_REGEX)!=null}var hx=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(s=>lg(s)):n=lg(e),n)return ug(e,t)}return null};Rt.registerSaveRouter(hx);Rt.registerLoadRouter(hx);function ug(e,t){return new ig(e,t)}function pC(e,t){return ug(e,t)}var cg=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},fC=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function mC(e,t,n,s){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new cg(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new cg({modelTopology:e})):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new cg({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:s}))}function gC(e){return new fC(e)}var px={};Pe(px,{confusionMatrix:()=>vC});function AC(e,t,n=!1,s=!1){let r=$(e,"a","matMul"),a=$(t,"b","matMul");[r,a]=Ct(r,a);let o={a:r,b:a},i={transposeA:n,transposeB:s};return z.runKernel(_a,o,i)}var Ve=W({matMul_:AC});function yC(e,t,n=1,s=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let a={indices:$(e,"indices","oneHot","int32")},o={depth:t,onValue:n,offValue:s};return z.runKernel(ro,a,o)}var lc=W({oneHot_:yC});function xC(e,t){let n=$(e,"x","transpose");if(t==null&&(t=n.shape.map((a,o)=>o).reverse()),M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(a=>{M(a>=0&&a`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let s={x:n},r={perm:t};return z.runKernel(Io,s,r)}var Xe=W({transpose_:xC});function bC(e,t,n){let s=$(e,"labels","confusionMatrix"),r=$(t,"predictions","confusionMatrix");M(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),M(s.rank===1,()=>`Expected the rank of labels to be 1, but got ${s.rank}`),M(r.rank===1,()=>`Expected the rank of predictions to be 1, but got ${r.rank}`),M(s.shape[0]===r.shape[0],()=>`Mismatch in the number of examples: ${s.shape[0]} vs. ${r.shape[0]}. Labels and predictions should have the same number of elements.`),M(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let a=lc(ce(s,"int32"),n),o=lc(ce(r,"int32"),n),i=Xe(a),l=Ve(i,o);return ce(l,"int32")}var vC=W({confusionMatrix_:bC}),ls={};Pe(ls,{fromPixels:()=>NC,fromPixelsAsync:()=>CC,toPixels:()=>TC});function Bh(e,t,n){if(Ca(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let s=Qs(e,n);if(s.length!==3&&s.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(s.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Xr(e,t,s,n)}var _l;function fx(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(e==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,s=!1,r=!1,a=!1,o=!1,i=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)s=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)r=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)a=!0;else if(e.getContext!=null)o=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)i=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);if(r){let f=2;if(r&&e.readyState element.")}if(Dh(_h,z.backendName)!=null){let f={pixels:e},m={numChannels:t};return z.runKernel(_h,f,m)}let[u,c]=r?[e.videoWidth,e.videoHeight]:[e.width,e.height],d;o?d=e.getContext("2d").getImageData(0,0,u,c).data:s||n?d=e.data:(a||r||i)&&(_l==null&&(_l=document.createElement("canvas").getContext("2d")),_l.canvas.width=u,_l.canvas.height=c,_l.drawImage(e,0,0,u,c),d=_l.getImageData(0,0,u,c).data);let h;if(t===4)h=new Int32Array(d);else{let f=u*c;h=new Int32Array(f*t);for(let m=0;m4||a===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${a}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let o=await n.data(),i=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(r*s*4);for(let u=0;u1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${p}.`)}else if(n.dtype==="int32"&&(p<0||p>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${p}.`);a===1?(c[0]=p*i,c[1]=p*i,c[2]=p*i):c[h]=p*i}let d=u*4;l[d+0]=Math.round(c[0]),l[d+1]=Math.round(c[1]),l[d+2]=Math.round(c[2]),l[d+3]=Math.round(c[3])}if(t!=null){t.width=r,t.height=s;let u=t.getContext("2d"),c=new ImageData(l,r,s);u.putImageData(c,0,0)}return n!==e&&n.dispose(),l}var NC=W({fromPixels_:fx}),dg={};Pe(dg,{prepareAndValidate:()=>mx});function mx(e,t){let n=e.shape.length,s=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(s<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${s}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[s-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[s-1]} vs. ${n}`);if($t(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let r=t.shape,a=r[r.length-1],o=1;for(let d=0;dd/u),1].slice(0,a);return[l,o,u,c]}var hg={};Pe(hg,{calculateShapes:()=>gx,validateInput:()=>fg,validateUpdateShape:()=>pg});function pg(e,t,n){let s=t.rank>1?t.shape[t.rank-1]:1,r=t.rank>1?t.rank-1:1,a=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${s}, and batchDim: ${r}.`;if(n.rank1?t.shape[s-1]:1,a=n.length,o=1;for(let d=r;dEC,computeFlatOffset:()=>_C,computeOutShape:()=>Ax,getNormalizedAxes:()=>vx,isSliceContinous:()=>RC,maskToAxes:()=>Wh,parseSliceParams:()=>Tx,sliceInfo:()=>DC,startForAxis:()=>Sx,startIndicesWithElidedDims:()=>wx,stopForAxis:()=>Cx,stopIndicesWithElidedDims:()=>kx,stridesForAxis:()=>Ix,stridesWithElidedDims:()=>yx});function EC(e,t,n){let s=e.shape.length;M(s===t.length,()=>`Error in slice${s}D: Length of begin ${t} must match the rank of the array (${s}).`),M(s===n.length,()=>`Error in slice${s}D: Length of size ${n} must match the rank of the array (${s}).`);for(let r=0;r`Error in slice${s}D: begin[${r}] + size[${r}] (${t[r]+n[r]}) would overflow input.shape[${r}] (${e.shape[r]})`)}function Wh(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function Ax(e,t,n){let s=[];for(let r=0;r0){let p=t[0],f=n+1;c=wx(o,p,f,s,e),d=kx(i,p,f,r,e),h=yx(a,p,f,e)}else for(let p=0;p-1)a[i]=0;else{let l=xx(t,n,i),u=s[l];e&1<-1)a[i]=Number.MAX_SAFE_INTEGER;else{let l=xx(t,n,i),u=s[l];e&1<0?o=Number.MIN_SAFE_INTEGER:o=Number.MAX_SAFE_INTEGER);let l=s[r];return o<0&&(o+=l),o=Fu(0,o,l-1),o}function Cx(e,t,n,s,r,a){let o=t[r],i=n[r]||1;(e&1<0?o=Number.MAX_SAFE_INTEGER:o=Number.MIN_SAFE_INTEGER);let l=s[r];return o<0&&(o+=l),i>0?o=Fu(0,o,l):o=Fu(-1,o,l-1),o}function RC(e,t,n){let s=n.length;for(let r=0;r1){s=r;break}for(let r=s+1;r0||n[r]!==e[r])return!1;return!0}function _C(e,t){let n=e.length>0?e[e.length-1]:1;for(let s=0;s{M(o!==-1,()=>"slice() does not support negative begin indexing.")});let a;return n==null?a=new Array(r).fill(-1):typeof n=="number"?a=[n,...new Array(r-1).fill(-1)]:n.lengtho>=0?o:(M(o===-1,()=>`Negative size values should be exactly -1 but got ${o} for the slice() size at index ${i}.`),e.shape[i]-s[i])),[s,a]}function DC(e,t,n,s,r,a,o,i,l){let u=t.slice(),c=n.slice(),d=s;s==null&&(d=new Array(u.length));let h=Wh(o);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(o!==0&&i!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(o!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let p=e.length-u.length,f=Wh(i),m=e.slice();f.forEach(S=>{u[S]=0,c[S]=1,m.splice(S,0,1)});let{begin:g,end:A,strides:y}=vx(m,h,p,u,c,d,r,a,o);u=g,c=A,d=y;let x=Wh(l);x.forEach(S=>{c[S]=u[S]+1,d[S]=1});let b=Ax(u,c,d),v=b.filter((S,C)=>x.indexOf(C)===-1);return{nonStrided:d.every(S=>S===1),$begin:u,$end:c,$strides:d,size:b,newShape:m,outShape:v}}var oe={};Pe(oe,{Serializable:()=>Nx,SerializationMap:()=>Fo,registerClass:()=>Zr});var Nx=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},Fo=class{constructor(){this.classNameMap={}}static getMap(){return Fo.instance==null&&(Fo.instance=new Fo),Fo.instance}static register(e){Fo.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Zr(e){M(e.className!=null,()=>"Class being registered does not have the static className property defined."),M(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),M(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),Fo.register(e)}var Ex={};Pe(Ex,{TEST_EPSILON_FLOAT16:()=>Rx,encodeStrings:()=>_x,expectArrayBuffersEqual:()=>LC,expectArraysClose:()=>FC,expectArraysEqual:()=>PC,expectNumbersClose:()=>MC,expectPromiseToFail:()=>OC,expectValuesInRange:()=>zC,testEpsilon:()=>mg});var $C=.001,Rx=.1;function FC(e,t,n){return n==null&&(n=mg()),gg(e,t,(s,r)=>Ag(s,r,n))}function mg(){return z.backend.floatPrecision()===32?$C:Rx}function gg(e,t,n){let s=!0;if((cn(e)||cn(t))&&(s=!1),cn(e)&&cn(t)&&(s=!0),s){let o=e.constructor.name,i=t.constructor.name;if(o!==i)throw new Error(`Arrays are of different type. Actual: ${o}. Expected: ${i}`)}if(Array.isArray(e)&&Array.isArray(t)){let o=Qs(e),i=Qs(t);if(!br(o,i))throw new Error(`Arrays have different shapes. Actual: [${o}]. Expected: [${i}]`)}let r=cn(e)?e:Ta(e),a=cn(t)?t:Ta(t);if(r.length!==a.length)throw new Error(`Arrays have different lengths actual: ${r.length} vs expected: ${a.length}. -Actual: ${r}. -Expected: ${a}.`);for(let o=0;ot.fail(),()=>t())}function PC(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return Br(e)||Br(e[0])||Br(t)||Br(t[0])?gg(e,n,(s,r)=>s==r):gg(e,t,(s,r)=>Ag(s,r,0))}function MC(e,t,n){if(n==null&&(n=mg()),!Ag(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Ag(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function zC(e,t,n){for(let s=0;sn)throw new Error(`Value out of range:${e[s]} low: ${t}, high: ${n}`)}function LC(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function _x(e){for(let t=0;tn.dispose())}function Jt(e){return z.keep(e)}function GC(e){return z.time(e)}function jC(e){return z.setBackend(e)}function qC(){return z.ready()}function XC(){return z.backendName}function KC(e){z.removeBackend(e)}function xg(e){return z.findBackend(e)}function ZC(e){return z.findBackendFactory(e)}function Dl(e,t,n=1){return z.registerBackend(e,t,n)}function $x(){return z.backend}function YC(e,t){Q().setPlatform(e,t)}function JC(e,t){let n=$(e,"a","add"),s=$(t,"b","add");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel(Vr,r)}var ae=W({add_:JC});function QC(e,t){let n=$(e,"a","floorDiv"),s=$(t,"b","floorDiv");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel(Ha,r)}var bg=W({floorDiv_:QC});function eT(e,t){let n=$(e,"a","div"),s=$(t,"b","div");if([n,s]=Ct(n,s),n.dtype==="int32"&&s.dtype==="int32")return bg(n,s);let r={a:n,b:s},a={};return z.runKernel(Ba,r,a)}var de=W({div_:eT});function tT(e,t){let n=$(e,"a","mul"),s=$(t,"b","mul");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel(so,r)}var L=W({mul_:tT});function nT(e){let t=$(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return z.runKernel(zu,n)}else{let n={x:t};return z.runKernel(Ii,n)}}var Ht=W({abs_:nT});function sT(e){let n={x:$(e,"x","acos")};return z.runKernel(Si,n)}var Fx=W({acos_:sT});function rT(e){let n={x:$(e,"x","acosh")};return z.runKernel(Ci,n)}var Ox=W({acosh_:rT});function aT(e){M(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),M(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((r,a)=>$(r,`tensors${a}`,"addN")),n=t[0];t.forEach(r=>{if(r.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(r=>{if(!br(r.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let s=t;return z.runKernel(Na,s)}var Uh=W({addN_:aT});function oT(e,t=null,n=!1){let r={x:$(e,"x","all","bool")},a={axis:t,keepDims:n};return z.runKernel(Ti,r,a)}var vg=W({all_:oT});function iT(e,t=null,n=!1){let r={x:$(e,"x","any","bool")},a={axis:t,keepDims:n};return z.runKernel(Ni,r,a)}var Hh=W({any_:iT});function lT(e,t=0){let s={x:$(e,"x","argMax")},r={axis:t};return z.runKernel(Ea,s,r)}var er=W({argMax_:lT});function uT(e,t=0){let s={x:$(e,"x","argMin")},r={axis:t};return z.runKernel(Pu,s,r)}var Px=W({argMin_:uT});function cT(e){let n={x:$(e,"x","asin")};return z.runKernel(Ei,n)}var Mx=W({asin_:cT});function dT(e){let n={x:$(e,"x","asinh")};return z.runKernel(Ri,n)}var zx=W({asinh_:dT});function hT(e){let n={x:$(e,"x","atan")};return z.runKernel(_i,n)}var Lx=W({atan_:hT});function pT(e,t){let n=$(e,"a","atan2"),s=$(t,"b","atan2");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel($i,r)}var Bx=W({atan2_:pT});function fT(e){let n={x:$(e,"x","atanh")};return z.runKernel(Di,n)}var Wx=W({atanh_:fT});function mT(e,t,n,s,r="NHWC",a){let o=e[3],i=[...t,o],l=Hx(r);return uc(e,i,n,a,s,null,null,l)}function Vx(e,t,n,s,r,a,o="channelsLast"){let[i,l]=Gh(t),u;if(o==="channelsLast")u=[i,l,e[3],e[3]];else if(o==="channelsFirst")u=[i,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${o}`);return uc(e,u,n,s,r,a,!1,o)}function gT(e,t,n,s,r,a,o="NDHWC"){let[i,l,u]=kg(t),c,d;if(o==="NDHWC")d="channelsLast",c=[i,l,u,e[4],e[4]];else if(o==="NCDHW")d="channelsFirst",c=[i,l,u,e[1],e[1]];else throw new Error(`Unknown dataFormat ${o}`);return Ux(e,c,n,s,r,!1,d,a)}function uc(e,t,n,s,r,a,o=!1,i="channelsLast"){let[l,u,c,d]=[-1,-1,-1,-1];if(i==="channelsLast")[l,u,c,d]=e;else if(i==="channelsFirst")[l,d,u,c]=e;else throw new Error(`Unknown dataFormat ${i}`);let[h,p,,f]=t,[m,g]=Gh(n),[A,y]=Gh(s),x=$l(h,A),b=$l(p,y),{padInfo:v,outHeight:k,outWidth:S}=xT(r,u,c,m,g,x,b,a,i),C=o?f*d:f,_;return i==="channelsFirst"?_=[l,C,k,S]:i==="channelsLast"&&(_=[l,k,S,C]),{batchSize:l,dataFormat:i,inHeight:u,inWidth:c,inChannels:d,outHeight:k,outWidth:S,outChannels:C,padInfo:v,strideHeight:m,strideWidth:g,filterHeight:h,filterWidth:p,effectiveFilterHeight:x,effectiveFilterWidth:b,dilationHeight:A,dilationWidth:y,inShape:e,outShape:_,filterShape:t}}function Ux(e,t,n,s,r,a=!1,o="channelsLast",i){let[l,u,c,d,h]=[-1,-1,-1,-1,-1];if(o==="channelsLast")[l,u,c,d,h]=e;else if(o==="channelsFirst")[l,h,u,c,d]=e;else throw new Error(`Unknown dataFormat ${o}`);let[p,f,m,,g]=t,[A,y,x]=kg(n),[b,v,k]=kg(s),S=$l(p,b),C=$l(f,v),_=$l(m,k),{padInfo:O,outDepth:E,outHeight:R,outWidth:T}=bT(r,u,c,d,A,y,x,S,C,_,i),P=a?g*h:g,V;return o==="channelsFirst"?V=[l,P,E,R,T]:o==="channelsLast"&&(V=[l,E,R,T,P]),{batchSize:l,dataFormat:o,inDepth:u,inHeight:c,inWidth:d,inChannels:h,outDepth:E,outHeight:R,outWidth:T,outChannels:P,padInfo:O,strideDepth:A,strideHeight:y,strideWidth:x,filterDepth:p,filterHeight:f,filterWidth:m,effectiveFilterDepth:S,effectiveFilterHeight:C,effectiveFilterWidth:_,dilationDepth:b,dilationHeight:v,dilationWidth:k,inShape:e,outShape:V,filterShape:t}}function AT(e,t,n,s,r){s==null&&(s=wg(e,t,n));let a=e[0],o=e[1],i=Oo((a-t+2*s)/n+1,r),l=Oo((o-t+2*s)/n+1,r);return[i,l]}function yT(e,t,n,s,r,a){r==null&&(r=wg(e,t,s));let o=e[0],i=e[1],l=e[2],u=Oo((o-t+2*r)/s+1,a),c=Oo((i-t+2*r)/s+1,a),d=Oo((l-t+2*r)/s+1,a);return[u,c,d,n]}function wg(e,t,n,s=1){let r=$l(t,s);return Math.floor((e[0]*(n-1)-n+r)/2)}function Gh(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function kg(e){return typeof e=="number"?[e,e,e]:e}function $l(e,t){return t<=1?e:e+(e-1)*(t-1)}function xT(e,t,n,s,r,a,o,i,l){let u,c,d;if(typeof e=="number"){u={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let p=AT([t,n],a,s,e,i);c=p[0],d=p[1]}else if(e==="same"){c=Math.ceil(t/s),d=Math.ceil(n/r);let h=Math.max(0,(c-1)*s+a-t),p=Math.max(0,(d-1)*r+o-n),f=Math.floor(h/2),m=h-f,g=Math.floor(p/2),A=p-g;u={top:f,bottom:m,left:g,right:A,type:"SAME"}}else if(e==="valid")u={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-a+1)/s),d=Math.ceil((n-o+1)/r);else if(typeof e=="object"){let h=l==="channelsLast"?e[1][0]:e[2][0],p=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];u={top:h,bottom:p,left:f,right:m,type:h===0&&p===0&&f===0&&m===0?"VALID":"EXPLICIT"},c=Oo((t-a+h+p)/s+1,i),d=Oo((n-o+f+m)/r+1,i)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:u,outHeight:c,outWidth:d}}function bT(e,t,n,s,r,a,o,i,l,u,c){let d,h,p,f;if(typeof e=="number"){d={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let g=yT([t,n,s,1],i,1,r,e,c);h=g[0],p=g[1],f=g[2]}else if(e==="same"){h=Math.ceil(t/r),p=Math.ceil(n/a),f=Math.ceil(s/o);let m=(h-1)*r+i-t,g=(p-1)*a+l-n,A=(f-1)*o+u-s,y=Math.floor(m/2),x=m-y,b=Math.floor(g/2),v=g-b,k=Math.floor(A/2),S=A-k;d={top:b,bottom:v,left:k,right:S,front:y,back:x,type:"SAME"}}else if(e==="valid")d={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},h=Math.ceil((t-i+1)/r),p=Math.ceil((n-l+1)/a),f=Math.ceil((s-u+1)/o);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:d,outDepth:h,outHeight:p,outWidth:f}}function Oo(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function Yr(e){let[t,n,s]=Gh(e);return t===1&&n===1&&s===1}function tr(e,t){return Yr(e)||Yr(t)}function Hx(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function vT(e,t){let s={x:$(e,"x","reshape","string_or_numeric")},r={shape:t};return z.runKernel(ul,s,r)}var U=W({reshape_:vT});function wT(e,t,n,s,r){let a=$(e,"x","avgPool","float32"),o=1;M(tr(n,o),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${o}'`);let i=a,l=!1;a.rank===3&&(l=!0,i=U(a,[1,a.shape[0],a.shape[1],a.shape[2]])),M(i.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${i.rank}.`),r!=null&&M(Zt(s),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${r} but got pad ${s}.`);let u={x:i},c={filterSize:t,strides:n,pad:s,dimRoundingMode:r},d=z.runKernel(Ra,u,c);return d=ce(d,a.dtype),l?U(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var jh=W({avgPool_:wT});function kT(e,t,n,s,r,a="NDHWC"){let o=$(e,"x","avgPool3d","float32"),i=o,l=!1;o.rank===4&&(l=!0,i=U(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]])),M(i.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${i.rank}.`),M(a==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${a}`),r!=null&&M(Zt(s),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${r} but got pad ${s}.`);let u={x:i},c={filterSize:t,strides:n,pad:s,dimRoundingMode:r,dataFormat:a},d=z.runKernel(Mu,u,c);return d=ce(d,i.dtype),l?U(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var Ig=W({avgPool3d_:kT});function IT(e,t=0){M(e.length>=1,()=>"Pass at least one tensor to concat");let n=oc(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(a=>{if(a.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${a.dtype}. `)}),n.length===1)return Os(n[0]);let s=n,r={axis:t};return z.runKernel(Oi,s,r)}var ft=W({concat_:IT});function ST(e){let n={x:$(e,"x","sigmoid")};return z.runKernel(go,n)}var Hn=W({sigmoid_:ST});function CT(e,t,n){let s=$(e,"x","slice","string_or_numeric");if(s.rank===0)throw new Error("Slicing scalar is not possible");let r={x:s},a={begin:t,size:n};return z.runKernel(pl,r,a)}var Re=W({slice_:CT});function TT(e){let n={x:$(e,"x","tanh")};return z.runKernel(ko,n)}var Fl=W({tanh_:TT});function NT(e,t,n,s,r,a){let o=$(e,"forgetBias","basicLSTMCell"),i=$(t,"lstmKernel","basicLSTMCell"),l=$(n,"lstmBias","basicLSTMCell"),u=$(s,"data","basicLSTMCell"),c=$(r,"c","basicLSTMCell"),d=$(a,"h","basicLSTMCell"),h=ft([u,d],1),p=Ve(h,i),f=ae(p,l),m=f.shape[0],g=f.shape[1]/4,A=[m,g],y=Re(f,[0,0],A),x=Re(f,[0,g],A),b=Re(f,[0,g*2],A),v=Re(f,[0,g*3],A),k=ae(L(Hn(y),Fl(x)),L(c,Hn(ae(o,b)))),S=L(Fl(k),Hn(v));return[k,S]}var ET=W({basicLSTMCell_:NT});function RT(e,t,n){let s=$(e,"x","batchToSpaceND"),r=t.reduce((i,l)=>i*l);M(s.rank>=1+t.length,()=>`input rank is ${s.rank} but should be > than blockShape.length ${t.length}`),M(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),M(s.shape[0]%r==0,()=>`input tensor batch is ${s.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${r}`);let a={x:s},o={blockShape:t,crops:n};return z.runKernel(Fi,a,o)}var qh=W({batchToSpaceND_:RT});function _T(e){let t;return e.rank===0||e.rank===1?t=U(e,[1,1,1,e.size]):e.rank===2?t=U(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=U(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function DT(e,t,n,s,r,a){a==null&&(a=.001);let o=$(e,"x","batchNorm"),i=$(t,"mean","batchNorm"),l=$(n,"variance","batchNorm"),u;r!=null&&(u=$(r,"scale","batchNorm"));let c;s!=null&&(c=$(s,"offset","batchNorm")),M(i.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),M(c==null||i.rank===c.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),M(u==null||i.rank===u.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let h={x:_T(o),scale:u,offset:c,mean:i,variance:l},p={varianceEpsilon:a},f=z.runKernel(Ga,h,p);return U(f,o.shape)}var Ol=W({batchNorm_:DT});function $T(e,t,n,s,r,a){let o=$(e,"x","batchNorm"),i=$(t,"mean","batchNorm"),l=$(n,"variance","batchNorm"),u;r!=null&&(u=$(r,"scale","batchNorm"));let c;return s!=null&&(c=$(s,"offset","batchNorm")),M(o.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${o.rank}.`),M(i.rank===2||i.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${i.rank}.`),M(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),u!=null&&M(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`),c!=null&&M(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${c.rank}.`),Ol(o,i,l,c,u,a)}var Gx=W({batchNorm2d_:$T});function FT(e,t,n,s,r,a){let o=$(e,"x","batchNorm"),i=$(t,"mean","batchNorm"),l=$(n,"variance","batchNorm"),u;r!=null&&(u=$(r,"scale","batchNorm"));let c;return s!=null&&(c=$(s,"offset","batchNorm")),M(o.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${o.rank}.`),M(i.rank===3||i.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${i.rank}.`),M(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),u!=null&&M(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`),c!=null&&M(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${c.rank}.`),Ol(o,i,l,c,u,a)}var jx=W({batchNorm3d_:FT});function OT(e,t,n,s,r,a){let o=$(e,"x","batchNorm"),i=$(t,"mean","batchNorm"),l=$(n,"variance","batchNorm"),u;r!=null&&(u=$(r,"scale","batchNorm"));let c;return s!=null&&(c=$(s,"offset","batchNorm")),M(o.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${o.rank}.`),M(i.rank===4||i.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${i.rank}.`),M(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),u!=null&&M(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`),c!=null&&M(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${c.rank}.`),Ol(o,i,l,c,u,a)}var qx=W({batchNorm4d_:OT});function PT(e,t,n){let s=$(e,"x","bincount"),r=$(t,"weights","bincount");M(s.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${s.dtype}`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(r.size===s.size||r.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${s.shape}, weights shape: ${r.shape}.`);let a={x:s,weights:r},o={size:n};return z.runKernel(Yd,a,o)}var Sg=W({bincount_:PT});function MT(e,t){let n=$(e,"s0","broadcastArgs","int32"),s=$(t,"s1","broadcastArgs","int32");if(n.rank!==1)throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${n.rank}`);if(s.rank!==1)throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${s.rank}`);let r={s0:n,s1:s};return z.runKernel(Wm,r)}var Xx=W({broadcastArgs_:MT});function zT(e,t){let n=$(e,"broadcastTo","x"),s=n.shape;if(t.some(u=>!(u>0)||u%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let u=n.shape.slice();for(;u.length=0;u--)if(r[u]===t[u])a[u]=1;else if(n.shape[u]!==1)throw new Error(`broadcastTo(): [${s}] cannot be broadcast to [${t}].`);if(a.map((u,c)=>u>1?c:-1).filter(u=>u>=0).length===0)return Os(n);let i={x:n},l={reps:a};return z.runKernel(Hr,i,l)}var cc=W({broadcastTo_:zT});function LT(e){let n={x:$(e,"x","ceil")};return z.runKernel($a,n)}var Kx=W({ceil_:LT});function BT(e,t,n){let s=$(e,"x","clipByValue");M(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let r={x:s},a={clipValueMin:t,clipValueMax:n};return z.runKernel(Ur,r,a)}var Gn=W({clipByValue_:BT});function WT(e){return ft(e,0)}var Zx=W({concat1d_:WT});function VT(e,t){return ft(e,t)}var Pl=W({concat2d_:VT});function UT(e,t){return ft(e,t)}var Yx=W({concat3d_:UT});function HT(e,t){return ft(e,t)}var Jx=W({concat4d_:HT});function GT(e,t,n,s,r="NHWC",a=[1,1],o){let i=$(e,"x","conv2d"),l=$(t,"filter","conv2d"),u=i,c=!1;i.rank===3&&(c=!0,u=U(i,[1,i.shape[0],i.shape[1],i.shape[2]])),M(u.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${u.rank}.`),M(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),o!=null&&M(Zt(s),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${o} but got pad ${s}.`);let d=r==="NHWC"?u.shape[3]:u.shape[1];M(d===l.shape[2],()=>`Error in conv2d: depth of input (${d}) must match input depth for filter ${l.shape[2]}.`),M(tr(n,a),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${a}'`);let h={x:u,filter:l},p={strides:n,pad:s,dataFormat:r,dilations:a,dimRoundingMode:o},f=z.runKernel(Fa,h,p);return c?U(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Jr=W({conv2d_:GT});function jT(e,t,n,s,r="NWC",a=1,o){let i=$(e,"x","conv1d"),l=$(t,"filter","conv1d"),u=i,c=!1;i.rank===2&&(c=!0,u=U(i,[1,i.shape[0],i.shape[1]])),M(u.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${u.rank}.`),M(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),o!=null&&M(Zt(s),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${o} but got pad ${s}.`),M(u.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${l.shape[1]}.`),M(tr(n,a),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${a}'`),M(r==="NWC",()=>`Error in conv1d: got dataFormat of ${r} but only NWC is currently supported.`);let d=U(l,[1,l.shape[0],l.shape[1],l.shape[2]]),h=U(u,[u.shape[0],1,u.shape[1],u.shape[2]]),g=Jr(h,d,[1,n],s,"NHWC",[1,a],o);return c?U(g,[g.shape[2],g.shape[3]]):U(g,[g.shape[0],g.shape[2],g.shape[3]])}var Cg=W({conv1d_:jT});function qT(e,t,n,s,r,a="NHWC",o){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let i=e,l=t,u=!1;t.rank===3&&(u=!0,l=U(t,[1,t.shape[0],t.shape[1],t.shape[2]]),i=[1,e[0],e[1],e[2]]),M(i.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${i.length}.`),M(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),M(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let c=a==="NHWC"?i[3]:i[1],d=a==="NHWC"?l.shape[3]:l.shape[1];M(c===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${c}) must match input depth for filter ${n.shape[2]}.`),M(d===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${d}) must match output depth for filter ${n.shape[3]}.`),o!=null&&M(Zt(r),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${o} but got pad ${r}.`);let h={dy:l,filter:n},p={strides:s,pad:r,dataFormat:a,dimRoundingMode:o,inputShape:i},f=z.runKernel(Oa,h,p);return u?U(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Tg=W({conv2DBackpropInput_:qT});function XT(e,t,n,s,r,a){let o=$(e,"x","conv2dTranspose"),i=$(t,"filter","conv2dTranspose");return Tg(n,o,i,s,r,"NHWC",a)}var Ng=W({conv2dTranspose_:XT});function KT(e,t,n,s,r="NDHWC",a=[1,1,1]){let o=$(e,"x","conv3d"),i=$(t,"filter","conv3d"),l=o,u=!1;o.rank===4&&(u=!0,l=U(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]])),M(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),M(i.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${i.rank}.`),M(l.shape[4]===i.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${i.shape[3]}.`),M(tr(n,a),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${a}'`),M(r==="NDHWC",()=>`Error in conv3d: got dataFormat of ${r} but only NDHWC is currently supported.`);let c={x:l,filter:i},d={strides:n,pad:s,dataFormat:r,dilations:a},h=z.runKernel(Lu,c,d);return u?U(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Eg=W({conv3d_:KT});function ZT(e,t,n,s,r){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let a=e,o=t,i=!1;t.rank===4&&(i=!0,o=U(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),a=[1,e[0],e[1],e[2],e[3]]);let l=a[4],u=o.shape[4];M(a.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${a.length}.`),M(o.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${o.rank}`),M(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),M(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),M(u===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${n.shape[4]}.`);let c={dy:o,filter:n},d={pad:r,strides:s,inputShape:a},h=z.runKernel(th,c,d);return i?U(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Qx=W({conv3DBackpropInput_:ZT});function YT(e,t,n,s,r){let a=$(e,"x","conv3dTranspose"),o=$(t,"filter","conv3dTranspose");return Qx(n,a,o,s,r)}var eb=W({conv3dTranspose_:YT});function JT(e){let n={x:$(e,"x","cos")};return z.runKernel(Pa,n)}var Xh=W({cos_:JT});function QT(e){let n={x:$(e,"x","cosh")};return z.runKernel(Ma,n)}var Rg=W({cosh_:QT});function eN(e,t=0,n=!1,s=!1){let a={x:$(e,"x","cumsum")},o={axis:t,exclusive:n,reverse:s};return z.runKernel(za,a,o)}var _g=W({cumsum_:eN});function tN(e,t,n,s=!1){let r=$(e,"x","denseBincount"),a=$(t,"weights","denseBincount");M(r.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${r.dtype}`),M(r.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${r.rank}.`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(a.size===r.size||a.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${r.shape}, weights shape: ${a.shape}.`);let o={x:r,weights:a},i={size:n,binaryOutput:s};return z.runKernel(nh,o,i)}var tb=W({denseBincount_:tN});function nN(e,t,n="NHWC"){let s=$(e,"x","depthToSpace"),r=n==="NHWC"?s.shape[1]:s.shape[2],a=n==="NHWC"?s.shape[2]:s.shape[3],o=n==="NHWC"?s.shape[3]:s.shape[1];M(r*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${r} and ${t} for depthToSpace with input shape - ${s.shape}`),M(a*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${a} and ${t} for depthToSpace with input shape - ${s.shape}`),M(o%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${o} for depthToSpace with input shape ${s.shape}`);let i={x:s},l={blockSize:t,dataFormat:n};return z.runKernel(Mi,i,l)}var nb=W({depthToSpace_:nN});function sN(e,t,n,s,r="NHWC",a=[1,1],o){let i=$(e,"x","depthwiseConv2d"),l=$(t,"filter","depthwiseConv2d"),u=i,c=!1;i.rank===3&&(c=!0,u=U(i,[1,i.shape[0],i.shape[1],i.shape[2]])),M(u.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`),M(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),M(u.shape[3]===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${u.shape[3]}) must match the inChannels dimension in filter ${l.shape[2]}.`),o!=null&&M(Zt(s),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${o} but got pad ${s}.`);let d={x:u,filter:l},h={strides:n,pad:s,dataFormat:r,dilations:a,dimRoundingMode:o},p=z.runKernel(La,d,h);return c?U(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var dc=W({depthwiseConv2d_:sN});function rN(e){let n={x:$(e,"x","diag")};return z.runKernel(ah,n)}var aN=W({diag_:rN});function oN(e,t,n,s,r=[1,1],a="NHWC"){let o=$(e,"x","dilation2d"),i=$(t,"filter","dilation2d");M(o.rank===3||o.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${o.rank}.`),M(i.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${i.rank}.`),M(a==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${a}`);let l=o,u=!1;o.rank===3&&(l=U(o,[1,o.shape[0],o.shape[1],o.shape[2]]),u=!0);let c={x:l,filter:i},d={strides:n,pad:s,dilations:r},h=z.runKernel(Bu,c,d);return u?U(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var sb=W({dilation2d_:oN});function iN(e,t){let n=e.length,s=[];for(let r=0;r1&&o===1&&s.unshift(a)}return s}function Gt(e,t){let n=[];for(let s=0;s1)&&n.unshift(a)}return n}function At(e,t){let n=[],s=Math.max(e.length,t.length);for(let r=0;r`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${s.rank}.`);let r=n.rank===1?n.size:n.shape[1],a=s.rank===1?s.size:s.shape[0];if(M(r===a,()=>`Error in dot: inner dimensions of inputs must match, but got ${r} and ${a}.`),n.rank===1&&s.rank===1){let o=U(n,[1,-1]),i=U(s,[-1,1]),l=Ve(o,i);return U(l,[])}else if(n.rank===1&&s.rank===2){let o=U(n,[1,-1]),i=U(s,[s.shape[0],s.shape[1]]),l=Ve(o,i);return U(l,[l.size])}else if(n.rank===2&&s.rank===1){let o=U(s,[-1,1]),i=Ve(n,o);return U(i,[i.size])}else{let o=U(s,[s.shape[0],s.shape[1]]);return Ve(n,o)}}var pN=W({dot_:hN});function fN(e,...t){let n=t.map((r,a)=>$(r,`tensors${a}`,"einsum")),s={equation:e};return z.runKernel(lh,n,s)}var ab=W({einsum_:fN});function mN(e){let n={x:$(e,"x","elu")};return z.runKernel(Wa,n)}var hc=W({elu_:mN});function gN(e){let t=$(e,"x","erf");M(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=ce(t,"float32"));let n={x:t};return z.runKernel(zi,n)}var ob=W({erf_:gN});function AN(e){let n={x:$(e,"x","exp")};return z.runKernel(Va,n)}var cs=W({exp_:AN});function yN(e,t=0){let n=$(e,"x","expandDims","string_or_numeric");M(t<=n.rank,()=>"Axis must be <= rank of the tensor");let s={input:n},r={dim:t};return z.runKernel(Bi,s,r)}var Ot=W({expandDims_:yN});function xN(e){let n={x:$(e,"x","expm1")};return z.runKernel(Wi,n)}var ib=W({expm1_:xN});function bN(e,t){let n=$(e,"x","tile","string_or_numeric");M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let s={x:n},r={reps:t};return z.runKernel(Hr,s,r)}var Ts=W({tile_:bN});function vN(e,t,n,s="float32"){t==null&&(t=e);let r=We([e,t],s),a=e<=t?e:t;for(let i=0;i`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${a.rank}.`),M(Zt(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let o=a,i=!1;a.rank===3&&(i=!0,o=U(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let l={x:o},u={depthRadius:t,bias:n,alpha:s,beta:r},c=z.runKernel(Hu,l,u);return i?U(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var cb=W({localResponseNormalization_:ON});function PN(e){let n={x:$(e,"x","log")};return z.runKernel(Ka,n)}var ds=W({log_:PN});function MN(e){let n={x:$(e,"x","log1p")};return z.runKernel(Yi,n)}var Yh=W({log1p_:MN});function zN(e){return M(Wr(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let s=$(t,"x","tf.grad","string_or_numeric"),r=n!=null?$(n,"dy","tf.grad"):null;return z.tidy(()=>{let{value:a,grads:o}=z.gradients(()=>e(s),[s],r);return r!=null&&An(a.shape,r.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),Jh(o),o[0]})}}function LN(e){return M(Wr(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{M(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let s=oc(t,"args","tf.grads","string_or_numeric"),r=n!=null?$(n,"dy","tf.grads"):null;return z.tidy(()=>{let{value:a,grads:o}=z.gradients(()=>e(...s),s,r);return r!=null&&An(a.shape,r.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Jh(o),o})}}function BN(e){return M(Wr(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{M(t instanceof Ge,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),M(n==null||n instanceof Ge,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:s,value:r}=z.gradients(()=>e(t),[t],n);return Jh(s),{grad:s[0],value:r}}}function WN(e){return M(Wr(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{M(Array.isArray(t)&&t.every(r=>r instanceof Ge),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),M(n==null||n instanceof Ge,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let s=z.gradients(()=>e(...t),t,n);return n!=null&&An(s.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),Jh(s.grads),s}}function db(e,t){M(Wr(e),()=>"The f passed in variableGrads(f) must be a function"),M(t==null||Array.isArray(t)&&t.every(u=>u instanceof sc),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let u in z.registeredVariables)t.push(z.registeredVariables[u])}let s=n?t.filter(u=>!u.trainable):null,r=t.length;t=t.filter(u=>u.trainable),M(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${r} variables is trainable.`);let a=!0,{value:o,grads:i}=z.gradients(e,t,null,a);M(i.some(u=>u!=null),()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."),M(o.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${o.rank} tensor`);let l={};return t.forEach((u,c)=>{i[c]!=null&&(l[u.name]=i[c])}),s!=null&&s.forEach(u=>l[u.name]=null),{value:o,grads:l}}function nr(e){return z.customGrad(e)}function Jh(e){if(e.filter(n=>n==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that - the f you passed encloses all operations that lead from x to y.`)}function VN(e){let n={x:$(e,"x","neg")};return z.runKernel(el,n)}var Tt=W({neg_:VN});function UN(e){let n={x:$(e,"x","softplus")};return z.runKernel(gl,n)}var Ll=W({softplus_:UN});function HN(e){let t=$(e,"x","logSigmoid");return nr(s=>({value:Tt(Ll(Tt(s))),gradFunc:o=>L(o,Hn(Tt(s)))}))(t)}var GN=W({logSigmoid_:HN});function jN(e,t=null,n=!1){let r={x:$(e,"x","max")},a={reductionIndices:t,keepDims:n};return z.runKernel(Za,r,a)}var hs=W({max_:jN});function qN(e,t){let n=$(e,"a","sub"),s=$(t,"b","sub");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel(vo,r)}var ge=W({sub_:qN});function XN(e,t=null,n=!1){let s=$(e,"x","sum");s.dtype==="bool"&&(s=ce(s,"int32"));let r={x:s},a={axis:t,keepDims:n};return z.runKernel(yo,r,a)}var ve=W({sum_:XN});function KN(e,t=-1){let n=$(e,"logits","logSoftmax");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return nr((r,a)=>{let o=!0,i=hs(r,t,!0),l=ge(r,i),u=ge(ce(l,"float32"),ds(ve(cs(l),t,o)));return a([u]),{value:u,gradFunc:(d,h)=>{let[p]=h,f=!0,m=cs(p);return ge(d,L(ve(d,t,f),m))}}})(n)}var Fg=W({logSoftmax_:KN});function Og(e,t){for(let n=0;ne[a]);return[n,r]}function zo(e,t){let n=t.map(s=>1);return hb(e,n,t)}function ZN(e,t,n){M(Og(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function fb(e,t){if(Og(e,t))return null;let n=[];for(let s=0;sn.push(s)),n}function Pg(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function YN(e,t){let n=[];for(let s=t-e;s`Error in maxPool: input must be rank 4 but got rank ${i.rank}.`),M(tr(n,o),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${o}'`),r!=null&&M(Zt(s),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${r} but got pad ${s}.`);let u={x:i},c={filterSize:t,strides:n,pad:s,dimRoundingMode:r},d=z.runKernel(Ja,u,c);return l?U(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var ep=W({maxPool_:rE});function aE(e,t=[1,1,1],n,s,r,a="NDHWC"){let o=$(e,"x","maxPool3d"),i=o,l=!1;o.rank===4&&(l=!0,i=U(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]])),M(i.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${i.rank}.`),M(a==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${a}`),r!=null&&M(Zt(s),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${r} but got pad ${s}.`);let u={x:i},c={filterSize:t,strides:n,pad:s,dimRoundingMode:r,dataFormat:a},d=z.runKernel(Gu,u,c);return l?U(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var zg=W({maxPool3d_:aE});function oE(e,t,n,s,r=!1){let o={x:$(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:s,includeBatchInIndex:r},l=z.runKernel(Ah,o,i);return{result:l[0],indexes:l[1]}}var gb=W({maxPoolWithArgmax_:oE});function iE(e,t){let n=$(e,"a","maximum"),s=$(t,"b","maximum");[n,s]=Ct(n,s),n.dtype==="bool"&&(n=ce(n,"int32"),s=ce(s,"int32")),At(n.shape,s.shape);let r={a:n,b:s};return z.runKernel(Ya,r)}var kr=W({maximum_:iE});function lE(e,t=null,n=!1){let r={x:$(e,"x","mean")},a={axis:t,keepDims:n};return z.runKernel(Qa,r,a)}var _t=W({mean_:lE});function Pt(e,t="float32"){if(t==="complex64"){let s=Pt(e,"float32"),r=Pt(e,"float32");return qr(s,r)}let n=Xd($t(e),t);return z.makeTensor(n,e,t)}function qn(e,t="float32"){if(t==="complex64"){let s=qn(e,"float32"),r=Pt(e,"float32");return qr(s,r)}let n=Pm($t(e),t);return z.makeTensor(n,e,t)}function uE(e,t,{indexing:n="xy"}={}){if(n!=="xy"&&n!=="ij")throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(e===void 0)return[];let s=$(e,"x","meshgrid",e instanceof Ge?e.dtype:"float32");if(t===void 0)return[s];let r=$(t,"y","meshgrid",t instanceof Ge?t.dtype:"float32"),a=$t(s.shape),o=$t(r.shape);return n==="xy"?(s=U(s,[1,-1]),r=U(r,[-1,1]),[Ve(qn([o,1],s.dtype),s),Ve(r,qn([1,a],r.dtype))]):(s=U(s,[-1,1]),r=U(r,[1,-1]),[Ve(s,qn([1,o],s.dtype)),Ve(qn([a,1],r.dtype),r)])}function cE(e,t=null,n=!1){let r={x:$(e,"x","min")},a={axis:t,keepDims:n};return z.runKernel(eo,r,a)}var tp=W({min_:cE});function dE(e,t){let n=$(e,"a","minimum"),s=$(t,"b","minimum");[n,s]=Ct(n,s),n.dtype==="bool"&&(n=ce(n,"int32"),s=ce(s,"int32")),At(n.shape,s.shape);let r={a:n,b:s};return z.runKernel(to,r)}var fc=W({minimum_:dE});function hE(e,t,n){M(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let s=$(e,"x","mirrorPad");if(s.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");M(t.length===s.rank,()=>`Padding doesn't match input. Must be ${s.rank}. Got ${t.length}.`);let r=n==="reflect"?1:0;for(let i=0;i"Invalid number of paddings. Must be length of 2 each."),M(t[i][0]>=0&&t[i][0]<=s.shape[i]-r&&t[i][1]>=0&&t[i][1]<=s.shape[i]-r,()=>`Padding in dimension ${i} cannot be greater than or equal to ${s.shape[i]-r} or less than 0 for input of shape ${s.shape}`);let a={paddings:t,mode:n},o={x:s};return z.runKernel(no,o,a)}var Ab=W({mirrorPad_:hE});function pE(e,t){let n=$(e,"a","mod"),s=$(t,"b","mod");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel(Qi,r)}var yb=W({mod_:pE});function fE(e){let t=$(e,"x","square"),n={};return z.runKernel("Square",{x:t},n)}var ct=W({square_:fE});function mE(e,t=null,n=!1){e=$(e,"x","moments");let s=Ss(t,e.shape),r=_t(e,s,n),a=r.shape;n||(a=zo(r.shape,s));let o=ct(ge(ce(e,"float32"),U(r,a))),i=_t(o,s,n);return{mean:r,variance:i}}var np=W({moments_:mE});function gE(e,t,n,s){let r=$(t,"data","multiRNNCell"),a=oc(n,"c","multiRNNCell"),o=oc(s,"h","multiRNNCell"),i=r,l=[];for(let d=0;d2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${o}`);n=n||Math.random();let l={logits:o===1?U(r,[1,-1]):r},u={numSamples:t,seed:n,normalized:s},c=z.runKernel(yh,l,u);return o===1?U(c,[c.size]):c}var xb=W({multinomial_:yE});function xE(e,t){let n=$(e,"a","notEqual","string_or_numeric"),s=$(t,"b","notEqual","string_or_numeric");[n,s]=Ct(n,s),At(n.shape,s.shape);let r={a:n,b:s};return z.runKernel(tl,r)}var Bl=W({notEqual_:xE});function bE(e){let n={x:$(e,"x","onesLike")};return z.runKernel(al,n)}var ps=W({onesLike_:bE});function vE(e,t){let n=$(e,"v1","outerProduct"),s=$(t,"v2","outerProduct");M(n.rank===1&&s.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${s.rank}.`);let r=U(n,[-1,1]),a=U(s,[1,-1]);return Ve(r,a)}var wE=W({outerProduct_:vE});function kE(e,t,n=0){let s=$(e,"x","pad");if(s.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let r={paddings:t,constantValue:n},a={x:s};return z.runKernel(ao,a,r)}var Qr=W({pad_:kE});function IE(e,t,n=0){return M(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),Qr(e,[t],n)}var SE=W({pad1d_:IE});function CE(e,t,n=0){return M(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),Qr(e,t,n)}var TE=W({pad2d_:CE});function NE(e,t,n=0){return M(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),Qr(e,t,n)}var EE=W({pad3d_:NE});function RE(e,t,n=0){return M(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),Qr(e,t,n)}var _E=W({pad4d_:RE});function DE(e,t,n){let s=$(e,"x","spaceToBatchND");M(s.rank>=1+t.length,()=>`input rank ${s.rank} should be > than [blockShape] ${t.length}`),M(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),M(s.shape.reduce((o,i,l)=>l>0&&l<=t.length?o&&(i+n[l-1][0]+n[l-1][1])%t[l-1]==0:o,!0),()=>`input spatial dimensions ${s.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let r={x:s},a={blockShape:t,paddings:n};return z.runKernel(Al,r,a)}var sp=W({spaceToBatchND_:DE});function $E(e,t,n,s,r,a){r==null&&(r=[1,1]),a==null&&(a=1),s===0&&(s="valid");let o=$(e,"x","maxPool"),i=o,l=!1;o.rank===3&&(l=!0,i=U(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(tr(a,r),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${a} and dilations '${r}'`);let u=Vx(i.shape,t,a,r,s),c=[u.dilationHeight,u.dilationWidth],d;s==="same"?d=OE([u.filterHeight,u.filterWidth],c):d=[[0,0],[0,0]];let h=c[0]===1&&c[1]===1,[p,f]=FE([u.inHeight,u.inWidth],c,d),m=h?s:"valid",g=h?i:sp(i,c,p),y=(n==="avg"?()=>jh(g,t,a,m):()=>ep(g,t,a,m))(),x=h?y:qh(y,c,f);return l?U(x,[x.shape[1],x.shape[2],x.shape[3]]):x}function FE(e,t,n){let s=n.map(c=>c[0]),r=n.map(c=>c[1]),a=e.concat(s,r),o=t.map((c,d)=>(c-a[d]%c)%c),i=r.map((c,d)=>c+o[d]),l=t.map((c,d)=>[s[d],i[d]]),u=t.map((c,d)=>[0,o[d]]);return[l,u]}function OE(e,t){let s=e.map((o,i)=>o+(o-1)*(t[i]-1)).map(o=>o-1),r=s.map(o=>Math.floor(o/2)),a=s.map((o,i)=>o-r[i]);return s.map((o,i)=>[r[i],a[i]])}var PE=W({pool_:$E});function ME(e,t){let n=$(e,"base","pow"),s=$(t,"exp","pow");[n,s]=Ct(n,s);let r={a:n,b:s};return z.runKernel(oo,r)}var ea=W({pow_:ME});function zE(e,t){let n=$(e,"x","prelu"),s=$(t,"alpha","prelu"),r={x:n,alpha:s};return z.runKernel(io,r)}var rp=W({prelu_:zE});function LE(e,t=null,n=!1){let s=$(e,"x","prod");s.dtype==="bool"&&(s=ce(s,"int32"));let r={x:s},a={axis:t,keepDims:n};return z.runKernel(il,r,a)}var Lg=W({prod_:LE});function BE(e,t,n){let s=$t(e),r=null;if(n==null||n==="float32")r=new Float32Array(s);else if(n==="int32")r=new Int32Array(s);else if(n==="bool")r=new Uint8Array(s);else throw new Error(`Unknown data type ${n}`);for(let a=0;a=1||a===0);let o=Math.sqrt(-2*Math.log(a)/a);e=this.mean+this.stdDev*s*o,t=this.mean+this.stdDev*r*o,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},VE=class{constructor(e,t,n,s){this.alpha=e,this.beta=1/t,this.dtype=n;let r=s||Math.random();this.randu=Bg.alea(r.toString()),this.randn=new Wg(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,s,r,a;for(;;){do s=this.randn.nextValue(),a=1+this.c*s;while(a<=0);if(a*=a*a,e=s*s,t=1-.331*e*e,n=.5*e+this.d*(1-a+Math.log(a)),r=this.randu(),rthis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,s==null&&(s=Math.random()),typeof s=="number"&&(s=s.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=Bg.alea(s)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function HE(e,t,n=1,s="float32",r){if(n==null&&(n=1),s==null&&(s="float32"),s!=="float32"&&s!=="int32")throw new Error(`Unsupported data type ${s}`);let a=new VE(t,n,s,r),o=We(e,s);for(let i=0;i`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),fs(t,0)}var eR=W({reverse1d_:QE});function tR(e,t){let n=$(e,"x","reverse");return M(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),fs(n,t)}var nR=W({reverse2d_:tR});function sR(e,t){let n=$(e,"x","reverse");return M(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),fs(n,t)}var rR=W({reverse3d_:sR});function aR(e,t){let n=$(e,"x","reverse");return M(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),fs(n,t)}var oR=W({reverse4d_:aR});function iR(e){let n={x:$(e,"x","round")};return z.runKernel(po,n)}var Ug=W({round_:iR});function lR(e){let n={x:$(e,"x","rsqrt")};return z.runKernel(fo,n)}var Hg=W({rsqrt_:lR});function Ie(e,t){if((cn(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&cn(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Xr(e,[],[],t)}function uR(e){let n={x:$(e,"x","selu")};return z.runKernel(hl,n)}var Gg=W({selu_:uR});function cR(e,t,n,s,r,a=[1,1],o="NHWC"){let i=$(e,"x","separableConv2d"),l=$(t,"depthwiseFilter","separableConv2d"),u=$(n,"pointwiseFilter","separableConv2d"),c=i,d=!1;if(i.rank===3&&(d=!0,c=U(i,[1,i.shape[0],i.shape[1],i.shape[2]])),o==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");M(c.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),M(u.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),M(u.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`),M(u.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`);let h=l.shape[2],p=l.shape[3];M(u.shape[2]===h*p,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${h*p}, but got ${u.shape[2]}.`);let f=dc(c,l,s,r,o,a),g=Jr(f,u,1,"valid",o);return d?U(g,[g.shape[1],g.shape[2],g.shape[3]]):g}var wb=W({separableConv2d_:cR});async function dR(e,t){let n=$(e,"x","setdiff1d"),s=$(t,"y","setdiff1d");M(n.dtype===s.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${s.dtype}).`),M(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),M(s.rank===1,()=>`y should be 1D tensor, but got y (${s.shape}).`);let r=await n.data(),a=await s.data(),o=new Set(a),i=0;for(let c=0;c`slice1d expects a rank-1 tensor, but got a rank-${s.rank} tensor`),Re(s,[t],[n])}var ap=W({slice1d_:mR});function gR(e,t,n){let s=$(e,"x","slice2d");return M(s.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${s.rank} tensor`),Re(s,t,n)}var Xg=W({slice2d_:gR});function AR(e,t,n){let s=$(e,"x","slice3d");return M(s.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${s.rank} tensor`),Re(s,t,n)}var op=W({slice3d_:AR});function yR(e,t,n){let s=$(e,"x","slice4d");return M(s.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${s.rank} tensor`),Re(s,t,n)}var gc=W({slice4d_:yR});function xR(e,t=-1){let n=$(e,"logits","softmax","float32");if(t===-1&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);let s={logits:n},r={dim:t};return z.runKernel(xo,s,r)}var ip=W({softmax_:xR});function bR(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return z.runKernel(ch,t)}var lp=W({fft_:bR});function vR(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return z.runKernel(dh,t)}var Ac=W({ifft_:vR});function wR(e){let t=e.shape[e.shape.length-1],n=e.size/t,s;if(t<=2){let r=U(e,[n,t]);s=Ac(r)}else{let r=[n,2*(t-1)],a=U(mc(e),[n,t]),o=U(Kh(e),[n,t]),i=fs(Re(a,[0,1],[n,t-2]),1),l=L(fs(Re(o,[0,1],[n,t-2]),1),Ie(-1)),u=ft([a,i],1),c=ft([o,l],1),d=U(qr(u,c),[r[0],r[1]]);s=Ac(d)}if(s=mc(s),e.rank===3&&e.shape[0]!==0){let r=s,a=e.shape[0];s=U(s,[a,s.shape[0]/a,s.shape[1]]),r.dispose()}return s}var Kg=W({irfft_:wR});function kR(e,t,n=0){let r={x:$(e,"x","split")},a={numOrSizeSplits:t,axis:n};return z.runKernel(yl,r,a)}var an=W({split_:kR});function IR(e,t){M(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],s=e.size/n,r;if(t!=null&&t0),m=e.shape.map(g=>g);m[e.shape.length-1]=t,r=Re(e,f,m),n=t}else if(t!=null&&t>n){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-n,r=ft([e,Pt(f)],e.shape.length-1),n=t}else r=e;let a=Ke(r),o=U(qr(r,a),[s,n]),i=lp(o),l=Math.floor(n/2)+1,u=mc(i),c=Kh(i),d=an(u,[l,n-l],u.shape.length-1),h=an(c,[l,n-l],c.shape.length-1),p=r.shape.slice();return p[r.shape.length-1]=l,U(qr(d[0],h[0]),p)}var up=W({rfft_:IR});function SR(e){let n={x:$(e,"x","sqrt")};return z.runKernel(Ao,n)}var hn=W({sqrt_:SR});function CR(e,t){let n=$(e,"a","squaredDifference"),s=$(t,"b","squaredDifference");[n,s]=Ct(n,s),At(n.shape,s.shape);let r={a:n,b:s},a={};return z.runKernel(bo,r,a)}var Zg=W({squaredDifference_:CR});function TR(e,t){let n=$(e,"x","squeeze");return U(n,v5(n.shape,t).newShape)}var lt=W({squeeze_:TR});function NR(e,t=0){let n=oc(e,"tensors","stack","string_or_numeric");M(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&M(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let s=n,r={axis:t};return z.runKernel(ol,s,r)}var Dn=W({stack_:NR});function ER(e,t=0){let s={x:$(e,"x","step")},r={alpha:t};return z.runKernel(Gr,s,r)}var yc=W({step_:ER});function RR(e,t,n,s,r=0,a=0,o=0,i=0,l=0){let c={x:$(e,"x","stridedSlice","string_or_numeric")},d={begin:t,end:n,strides:s,beginMask:r,endMask:a,ellipsisMask:o,newAxisMask:i,shrinkAxisMask:l};return z.runKernel(xl,c,d)}var Sb=W({stridedSlice_:RR});function _R(e){let n={x:$(e,"x","tan")};return z.runKernel(wo,n)}var Cb=W({tan_:_R});function Mt(e,t){Ca(e);let n=Qs(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Xr(e,null,n,t)}function Ms(e,t,n){if(Ca(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let s=Qs(e,n);if(s.length!==2&&s.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(s.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Xr(e,t,s,n)}function DR(e,t,n){if(Ca(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let s=Qs(e,n);if(s.length!==4&&s.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(s.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Xr(e,t,s,n)}function $R(e,t,n){if(Ca(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let s=Qs(e,n);if(s.length!==5&&s.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(s.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Xr(e,t,s,n)}function FR(e,t,n){if(Ca(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let s=Qs(e,n);if(s.length!==6&&s.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(s.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||s,Xr(e,t,s,n)}function OR(e,t=1,n=!0){let s=$(e,"x","topk");if(s.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let r=s.shape[s.shape.length-1];if(t<0)throw new Error(`'k' passed to topk() must be >= 0 but got ${t}`);if(t>r)throw new Error(`'k' passed to topk() must be <= the last dimension (${r}) but got ${t}`);let a={x:s},o={k:t,sorted:n},[i,l]=z.runKernel(bl,a,o);return{values:i,indices:l}}var Tb=W({topk_:OR});function PR(e,t=0,n=1,s,r){if(s!=null&&s==="bool")throw new Error("Unsupported data type $ { dtype }");let a=new Wg(t,n,s,!0,r),o=We(e,s);for(let i=0;i0,()=>"The input tensor must be at least 1D");let s={x:n},r={axis:t},[a,o]=z.runKernel(Rh,s,r);return{values:a,indices:o}}var Yg=W({unique_:MR});function zR(e,t,n){let s=$(e,"x","unsortedSegmentSum"),r=$(t,"segmentIds","unsortedSegmentSum","int32");M(Zt(n),()=>"numSegments must be of dtype int");let a={x:s,segmentIds:r},o={numSegments:n};return z.runKernel(Ku,a,o)}var Nb=W({unsortedSegmentSum_:zR});function LR(e,t=0){let n=$(e,"x","unstack","string_or_numeric");M(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let s={value:n},r={axis:t};return z.runKernel(wl,s,r)}var ms=W({unstack_:LR});function Eb(e,t=!0,n,s){return z.makeVariable(e,t,n,s)}function Rb(e,t){let n=[];for(let a=0;a0,()=>"mask cannot be scalar"),An(i.slice(a,a+o),r.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let m=a;m"Shape mismatch in v and x");let l=Ie(1),u=ge(l,i),c=L(ge(o,a),u);if(r){M(s!=null,()=>"When using zeroDebias: true, step is required.");let d=$(s,"step","movingAverage");c=de(c,ge(l,ea(i,d)))}return ae(a,c)}var GR=W({movingAverage_:HR});function jR(e,t,n){let s=$(e,"indices","scatterND","int32"),r=$(t,"updates","scatterND");fg(r,s,n);let a={indices:s,updates:r},o={shape:n};return z.runKernel(cl,a,o)}var Db=W({scatterND_:jR});function qR(e,t,n,s){if(e.dtype!=="int32")throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);let r=e.rank>0?e.shape[0]:1,a=e.rank>1?e.shape[1]:1;if(n.length!==a)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${a}.`);let o=t.size;if(!(t.rank===0||t.rank===1&&o===r))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${r}]`);if(t.dtype!==s.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function XR(e,t,n,s=0){let r=$(e,"sparseIndices","sparseToDense","int32"),a=$(t,"sparseValues","sparseToDense"),o=$(s,"defaultValue","sparseToDense",a.dtype);qR(r,a,n,o);let i={sparseIndices:r,sparseValues:a,defaultValue:o},l={outputShape:n};return z.runKernel(Ch,i,l)}var eA=W({sparseToDense_:XR});function KR(e,t){let n=$(t,"indices","gatherND","int32"),r={params:$(e,"x","gatherND","string_or_numeric"),indices:n};return z.runKernel(Hi,r)}var $b=W({gatherND_:KR});function ZR(e,t){if(t==null)return e.shape.slice();if(br(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let s=0;s`x has to be a floating point tensor since it's going to be scaled, but got a ${r.dtype} tensor instead.`),M(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Ge?r.clone():r;let a=ZR(r,n),o=1-t,i=de(pc(ae(Wl(a,0,1,"float32",s),o)),o);return L(r,i)}var Fb=W({dropout_:YR});function Ob(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function tA(e,t,n){let s=1-e%2,r=new Float32Array(e);for(let a=0;a1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${s.rank}`),M(s.rank-1===r.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${s.rank} and targets rank ${r.rank}`),An(s.shape.slice(0,s.shape.length-1),r.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let a=s.shape[s.shape.length-1];M(n>0&&n<=a,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${a}), but got ${n}`);let o=await s.data(),i=await r.data(),[l,u]=[o.length/a,a],c=w5("bool",l);for(let d=0;dg.value-m.value),c[d]=0;for(let m=0;mn_,depthwiseConv2d:()=>o_,matMul:()=>l_});function e_(e,t,n,s,r,a="NHWC",o){let i=e;e.rank===3&&(i=U(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=U(t,[1,t.shape[0],t.shape[1],t.shape[2]])),M(i.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${i.shape}.`),M(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),M(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let u=a==="NHWC"?i.shape[3]:i.shape[1],c=a==="NHWC"?l.shape[3]:l.shape[1];M(u===n[2],()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${n[2]}.`),M(c===n[3],()=>`Error in conv2dDerFilter: depth of dy (${c}) must match output depth for filter (${n[3]}).`),o!=null&&M(Zt(r),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${o} but got pad ${r}.`);let d={x:i,dy:l},h={strides:s,pad:r,dataFormat:a,dimRoundingMode:o,filterShape:n};return z.runKernel(Qd,d,h)}var nA=W({conv2DBackpropFilter_:e_});function dp(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return L(e,yc(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function hp(e,t){let n=t,s=Gt(e.shape,t.shape);return s.length>0&&(n=ve(n,s)),U(n,e.shape)}function pp(e,t,n,s){if(t==="linear")return e;if(t==="relu")return sr(e);if(t==="elu")return hc(e);if(t==="relu6")return Vg(e);if(t==="prelu")return rp(e,n);if(t==="leakyrelu")return Zh(e,s);if(t==="sigmoid")return Hn(e);throw new Error(`Unknown fused activation ${t}.`)}var fp=(e,t)=>!(e>0)||t==="linear";function t_({x:e,filter:t,strides:n,pad:s,dataFormat:r="NHWC",dilations:a=[1,1],dimRoundingMode:o,bias:i,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(l=l||"linear",fp(z.state.gradientDepth,l)===!1){let v=Jr(e,t,n,s,r,a,o);return i!=null&&(v=ae(v,i)),pp(v,l,u,c)}let d=$(e,"x","conv2d"),h=$(t,"filter","conv2d"),p=d,f=!1;d.rank===3&&(f=!0,p=U(d,[1,d.shape[0],d.shape[1],d.shape[2]])),M(p.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`),M(h.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${h.rank}.`),o!=null&&M(Zt(s),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${o} but got pad ${s}.`),M(p.shape[3]===h.shape[2],()=>`Error in conv2d: depth of input (${p.shape[3]}) must match input depth for filter ${h.shape[2]}.`),M(tr(n,a),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${a}'`),M(r==="NHWC",()=>`Error in conv2d: got dataFormat of ${r} but only NHWC is currently supported.`);let m=uc(p.shape,h.shape,n,a,s,o),g;i!=null&&(g=$(i,"bias","fused conv2d"),[g]=Ct(g,d),At(m.outShape,g.shape));let A;u!=null&&(A=$(u,"prelu weights","fused conv2d"));let y=(v,k)=>{let[S,C,_,O]=k,E=dp(v,_,l);M(Yr(a),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${a}'`);let R=Tg(C.shape,E,S,n,s),T=nA(C,E,S.shape,n,s),P=[R,T];if(O!=null){let V=hp(O,E);P.push(V)}return P},x={x:p,filter:h,bias:g,preluActivationWeights:A},b={strides:n,pad:s,dataFormat:r,dilations:a,dimRoundingMode:o,activation:l,leakyreluAlpha:c};return i==null?nr((k,S,C)=>{let _=z.runKernel(Co,x,b);return C([S,k,_]),f&&(_=U(_,[_.shape[1],_.shape[2],_.shape[3]])),{value:_,gradFunc:y}})(p,h):nr((k,S,C,_)=>{let O=z.runKernel(Co,x,b);return _([S,k,O,C]),f&&(O=U(O,[O.shape[1],O.shape[2],O.shape[3]])),{value:O,gradFunc:y}})(p,h,g)}var n_=W({fusedConv2d_:t_});function s_(e,t,n,s,r,a=[1,1],o){let i=e;e.rank===3&&(i=U(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=U(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let u={x:i,dy:l},c={strides:s,pad:r,dimRoundingMode:o,dilations:a,filterShape:n};return z.runKernel(sh,u,c)}var Pb=W({depthwiseConv2dNativeBackpropFilter_:s_});function r_(e,t,n,s,r,a=[1,1],o){let i=t,l=!1;t.rank===3&&(l=!0,i=U(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let u={dy:i,filter:n},c={strides:s,pad:r,dimRoundingMode:o,dilations:a,inputShape:e},d=z.runKernel(rh,u,c);return l?U(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var Mb=W({depthwiseConv2dNativeBackpropInput_:r_});function a_({x:e,filter:t,strides:n,pad:s,dataFormat:r="NHWC",dilations:a=[1,1],dimRoundingMode:o,bias:i,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(fp(z.state.gradientDepth,l)===!1){let v=dc(e,t,n,s,r,a,o);return i!=null&&(v=ae(v,i)),pp(v,l,u,c)}let d=$(e,"x","depthwiseConv2d"),h=$(t,"filter","depthwiseConv2d"),p=d,f=!1;d.rank===3&&(f=!0,p=U(d,[1,d.shape[0],d.shape[1],d.shape[2]])),M(p.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`),M(h.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${h.rank}.`),M(p.shape[3]===h.shape[2],()=>`Error in fused depthwiseConv2d: number of input channels (${p.shape[3]}) must match the inChannels dimension in filter ${h.shape[2]}.`),a==null&&(a=[1,1]),M(tr(n,a),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${a}'`),o!=null&&M(Zt(s),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${o} but got pad ${s}.`);let m=uc(p.shape,h.shape,n,a,s,o,!0),g;i!=null&&(g=$(i,"bias","fused conv2d"),[g]=Ct(g,d),At(m.outShape,g.shape));let A;u!=null&&(A=$(u,"prelu weights","fused depthwiseConv2d"));let y=(v,k)=>{M(Yr(a),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${a}'`);let[S,C,_,O]=k,E=dp(v,_,l),R=Mb(C.shape,E,S,n,s,a,o),T=Pb(C,E,S.shape,n,s,a,o);if(O!=null){let P=hp(g,E);return[R,T,P]}return[R,T]},x={x:p,filter:h,bias:g,preluActivationWeights:A},b={strides:n,pad:s,dataFormat:r,dilations:a,dimRoundingMode:o,activation:l,leakyreluAlpha:c};return i==null?nr((k,S,C)=>{let _=z.runKernel(To,x,b);return C([S,k,_]),f&&(_=U(_,[_.shape[1],_.shape[2],_.shape[3]])),{value:_,gradFunc:y}})(p,h):nr((k,S,C,_)=>{let O=z.runKernel(To,x,b);return _([S,k,O,C]),f&&(O=U(O,[O.shape[1],O.shape[2],O.shape[3]])),{value:O,gradFunc:y}})(p,h,g)}var o_=W({fusedDepthwiseConv2d_:a_});function i_({a:e,b:t,transposeA:n=!1,transposeB:s=!1,bias:r,activation:a="linear",preluActivationWeights:o,leakyreluAlpha:i}){if(fp(z.state.gradientDepth,a)===!1){let O=Ve(e,t,n,s);return r!=null&&(O=ae(O,r)),pp(O,a,o,i)}let l=$(e,"a","fused matMul"),u=$(t,"b","fused matMul");[l,u]=Ct(l,u);let c=n?l.shape[l.rank-2]:l.shape[l.rank-1],d=s?u.shape[u.rank-1]:u.shape[u.rank-2],h=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=s?u.shape[u.rank-2]:u.shape[u.rank-1],f=l.shape.slice(0,-2),m=u.shape.slice(0,-2),g=$t(f),A=$t(m);M(l.rank>=2&&u.rank>=2&&l.rank===u.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${l.rank} and ${u.rank}.`),M(br(f,m),()=>`Error in fused matMul: outer dimensions (${f}) and (${m}) of Tensors with shapes ${l.shape} and ${u.shape} must match.`),M(c===d,()=>`Error in fused matMul: inner shapes (${c}) and (${d}) of Tensors with shapes ${l.shape} and ${u.shape} and transposeA=${n} and transposeB=${s} must match.`);let y=l.shape.slice(0,-2).concat([h,p]),x=n?U(l,[g,c,h]):U(l,[g,h,c]),b=s?U(u,[A,p,d]):U(u,[A,d,p]),v;r!=null&&(v=$(r,"bias","fused matMul"),[v]=Ct(v,l),At(y,v.shape));let k;o!=null&&(k=$(o,"prelu weights","fused matMul"));let S=(O,E)=>{let[R,T,P,V]=E,j=dp(U(O,P.shape),P,a),q,X;if(!n&&!s?(q=Ve(j,T,!1,!0),X=Ve(R,j,!0,!1)):!n&&s?(q=Ve(j,T,!1,!1),X=Ve(j,R,!0,!1)):n&&!s?(q=Ve(T,j,!1,!0),X=Ve(R,j,!1,!1)):(q=Ve(T,j,!0,!0),X=Ve(j,R,!0,!0)),r!=null){let ee=hp(V,j);return[q,X,ee]}else return[q,X]},C={a:x,b,bias:v,preluActivationWeights:k},_={transposeA:n,transposeB:s,activation:a,leakyreluAlpha:i};return r==null?nr((E,R,T)=>{let P=z.runKernel(So,C,_);return T([E,R,P]),{value:U(P,y),gradFunc:S}})(x,b):nr((E,R,T,P)=>{let V=z.runKernel(So,C,_);return P([E,R,V,T]),{value:U(V,y),gradFunc:S}})(x,b,v)}var l_=W({fusedMatMul_:i_});function u_(e){return tA(e,.54,.46)}var c_=W({hammingWindow_:u_});function d_(e){return tA(e,.5,.5)}var zb=W({hannWindow_:d_});function h_(e,t,n,s=!1,r=0){let a=0,o=[];for(;a+t<=e.size;)o.push(Re(e,a,t)),a+=n;if(s)for(;a`Error in cropAndResize: image must be rank 4,but got rank ${o.rank}.`),M(i.rank===2&&i.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${u},4] but had shape ${i.shape}.`),M(l.rank===1&&l.shape[0]===u,()=>`Error in cropAndResize: boxInd must be have size [${u}] but had shape ${i.shape}.`),M(s.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${s.length}.`),M(s[0]>=1&&s[1]>=1,()=>`cropSize must be atleast [1,1], but was ${s}`),M(r==="bilinear"||r==="nearest",()=>`method must be bilinear or nearest, but was ${r}`);let c={image:o,boxes:i,boxInd:l},d={method:r,extrapolationValue:a,cropSize:s};return z.runKernel(Pi,c,d)}var g_=W({cropAndResize_:m_});function A_(e){let t=$(e,"image","flipLeftRight","float32");M(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return z.runKernel(Vi,n,{})}var y_=W({flipLeftRight_:A_});function x_(e){let t=$(e,"image","grayscaleToRGB"),n=t.rank-1,s=t.shape[n];M(t.rank>=2,()=>`Error in grayscaleToRGB: images must be at least rank 2, but got rank ${t.rank}.`),M(s===1,()=>`Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${s}.`);let r=new Array(t.rank);return r.fill(1,0,n),r[n]=3,Ts(t,r)}var b_=W({grayscaleToRGB_:x_});function v_(e,t,n=0,s=.5){let r=$(e,"image","rotateWithOffset","float32");M(r.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${r.rank}.`);let a={image:r},o={radians:t,fillValue:n,center:s};return z.runKernel(Il,a,o)}var w_=W({rotateWithOffset_:v_});function Ul(e,t,n,s,r,a){s==null&&(s=.5),r==null&&(r=Number.NEGATIVE_INFINITY),a==null&&(a=0);let o=e.shape[0];return n=Math.min(n,o),M(0<=s&&s<=1,()=>`iouThreshold must be in [0, 1], but was '${s}'`),M(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),M(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),M(t.rank===1,()=>"scores must be a 1D tensor"),M(t.shape[0]===o,()=>`scores has incompatible shape with boxes. Expected ${o}, but was ${t.shape[0]}`),M(0<=a&&a<=1,()=>`softNmsSigma must be in [0, 1], but was '${a}'`),{maxOutputSize:n,iouThreshold:s,scoreThreshold:r,softNmsSigma:a}}function k_(e,t,n,s=.5,r=Number.NEGATIVE_INFINITY){let a=$(e,"boxes","nonMaxSuppression"),o=$(t,"scores","nonMaxSuppression"),i=Ul(a,o,n,s,r);n=i.maxOutputSize,s=i.iouThreshold,r=i.scoreThreshold;let l={maxOutputSize:n,iouThreshold:s,scoreThreshold:r};return z.runKernel(nl,{boxes:a,scores:o},l)}var I_=W({nonMaxSuppression_:k_});function S_(e,t,n){let s=C_(e,t,n),r=s<0?-(s+1):s;e.splice(r,0,t)}function C_(e,t,n){return N_(e,t,n||T_)}function T_(e,t){return e>t?1:e>>1);let i=n(t,e[a]);i>0?s=a+1:(r=a,o=!i)}return o?s:-s-1}function Bb(e,t,n,s,r){return sA(e,t,n,s,r,0)}function Wb(e,t,n,s,r,a){return sA(e,t,n,s,r,0,!1,a,!0)}function Vb(e,t,n,s,r,a){return sA(e,t,n,s,r,a,!0)}function sA(e,t,n,s,r,a,o=!1,i=!1,l=!1){let u=[];for(let g=0;gr&&u.push({score:t[g],boxIndex:g,suppressBeginIndex:0});u.sort(Ub);let c=a>0?-.5/a:0,d=[],h=[];for(;d.length0;){let g=u.pop(),{score:A,boxIndex:y,suppressBeginIndex:x}=g;if(A=x;--v){let k=E_(e,y,d[v]);if(k>=s){b=!0;break}if(g.score=g.score*R_(s,c,k),g.score<=r)break}g.suppressBeginIndex=d.length,b||(g.score===A?(d.push(y),h.push(g.score)):g.score>r&&S_(u,g,Ub))}let p=d.length,f=n-p;i&&f>0&&(d.push(...new Array(f).fill(0)),h.push(...new Array(f).fill(0)));let m={selectedIndices:d};return o&&(m.selectedScores=h),l&&(m.validOutputs=p),m}function E_(e,t,n){let s=e.subarray(t*4,t*4+4),r=e.subarray(n*4,n*4+4),a=Math.min(s[0],s[2]),o=Math.min(s[1],s[3]),i=Math.max(s[0],s[2]),l=Math.max(s[1],s[3]),u=Math.min(r[0],r[2]),c=Math.min(r[1],r[3]),d=Math.max(r[0],r[2]),h=Math.max(r[1],r[3]),p=(i-a)*(l-o),f=(d-u)*(h-c);if(p<=0||f<=0)return 0;let m=Math.max(a,u),g=Math.max(o,c),A=Math.min(i,d),y=Math.min(l,h),x=Math.max(A-m,0)*Math.max(y-g,0);return x/(p+f-x)}function R_(e,t,n){let s=Math.exp(t*n*n);return n<=e?s:0}function Ub(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function __(e,t,n,s=.5,r=Number.NEGATIVE_INFINITY){let a=$(e,"boxes","nonMaxSuppressionAsync"),o=$(t,"scores","nonMaxSuppressionAsync"),i=Ul(a,o,n,s,r);n=i.maxOutputSize,s=i.iouThreshold,r=i.scoreThreshold;let l=await Promise.all([a.data(),o.data()]),u=l[0],c=l[1],{selectedIndices:d}=Bb(u,c,n,s,r);return a!==e&&a.dispose(),o!==t&&o.dispose(),Mt(d,"int32")}var D_=__;function $_(e,t,n,s=.5,r=Number.NEGATIVE_INFINITY,a=0){let o=$(e,"boxes","nonMaxSuppression"),i=$(t,"scores","nonMaxSuppression"),l=Ul(o,i,n,s,r,a);n=l.maxOutputSize,s=l.iouThreshold,r=l.scoreThreshold,a=l.softNmsSigma;let u={boxes:o,scores:i},c={maxOutputSize:n,iouThreshold:s,scoreThreshold:r,softNmsSigma:a},d=z.runKernel(rl,u,c);return{selectedIndices:d[0],selectedScores:d[1]}}var F_=W({nonMaxSuppressionWithScore_:$_});async function O_(e,t,n,s=.5,r=Number.NEGATIVE_INFINITY,a=0){let o=$(e,"boxes","nonMaxSuppressionAsync"),i=$(t,"scores","nonMaxSuppressionAsync"),l=Ul(o,i,n,s,r,a);n=l.maxOutputSize,s=l.iouThreshold,r=l.scoreThreshold,a=l.softNmsSigma;let u=await Promise.all([o.data(),i.data()]),c=u[0],d=u[1],{selectedIndices:h,selectedScores:p}=Vb(c,d,n,s,r,a);return o!==e&&o.dispose(),i!==t&&i.dispose(),{selectedIndices:Mt(h,"int32"),selectedScores:Mt(p)}}var P_=O_;function M_(e,t,n,s=.5,r=Number.NEGATIVE_INFINITY,a=!1){let o=$(e,"boxes","nonMaxSuppression"),i=$(t,"scores","nonMaxSuppression"),l=Ul(o,i,n,s,r,null),u=l.maxOutputSize,c=l.iouThreshold,d=l.scoreThreshold,h={boxes:o,scores:i},p={maxOutputSize:u,iouThreshold:c,scoreThreshold:d,padToMaxOutputSize:a},f=z.runKernel(sl,h,p);return{selectedIndices:f[0],validOutputs:f[1]}}var z_=W({nonMaxSuppressionPadded_:M_});async function L_(e,t,n,s=.5,r=Number.NEGATIVE_INFINITY,a=!1){let o=$(e,"boxes","nonMaxSuppressionAsync"),i=$(t,"scores","nonMaxSuppressionAsync"),l=Ul(o,i,n,s,r,null),u=l.maxOutputSize,c=l.iouThreshold,d=l.scoreThreshold,[h,p]=await Promise.all([o.data(),i.data()]),{selectedIndices:f,validOutputs:m}=Wb(h,p,u,c,d,a);return o!==e&&o.dispose(),i!==t&&i.dispose(),{selectedIndices:Mt(f,"int32"),validOutputs:Ie(m,"int32")}}var B_=L_;function W_(e,t,n=!1,s=!1){let r=$(e,"images","resizeBilinear");M(r.rank===3||r.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${r.rank}.`),M(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),M(s===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let a=r,o=!1;r.rank===3&&(o=!0,a=U(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,i={images:a},l={alignCorners:n,halfPixelCenters:s,size:t},u=z.runKernel(uo,i,l);return o?U(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var V_=W({resizeBilinear_:W_});function U_(e,t,n=!1,s=!1){let r=$(e,"images","resizeNearestNeighbor");M(r.rank===3||r.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${r.rank}.`),M(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),M(r.dtype==="float32"||r.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),M(s===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let a=r,o=!1;r.rank===3&&(o=!0,a=U(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let[]=t,i={images:a},l={alignCorners:n,halfPixelCenters:s,size:t},u=z.runKernel(qu,i,l);return o?U(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var H_=W({resizeNearestNeighbor_:U_});function G_(e,t="binary",n=!1,s=.5){let r=$(e,"image","threshold"),a=.2989,o=.587,i=.114,l=r.shape[0]*r.shape[1],u=L(Mt([s]),255),c,d,h,p;if(M(r.rank===3,()=>`Error in threshold: image must be rank 3,but got rank ${r.rank}.`),M(r.shape[2]===3||r.shape[2]===1,()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${r.shape[2]}.`),M(r.dtype==="int32"||r.dtype==="float32",()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${r.dtype}.`),M(t==="otsu"||t==="binary",()=>`Method must be binary or otsu, but was ${t}`),r.shape[2]===3){[c,d,h]=an(r,[1,1,1],-1);let g=L(c,a),A=L(d,o),y=L(h,i);p=ae(ae(g,A),y)}else p=e;if(t==="otsu"){let g=Sg(ce(Ug(p),"int32"),dn([]),256);u=j_(g,l)}let f=n?Mo(p,u):jn(p,u);return ce(L(f,255),"int32")}function j_(e,t){let n=Mt([-1]),s=Mt([0]),r=Mt([0]),a,o,i,l,u,c;for(let d=0;d`Error in transform: image must be rank 4,but got rank ${o.rank}.`),M(i.rank===2&&(i.shape[0]===o.shape[0]||i.shape[0]===1)&&i.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),M(a==null||a.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${a}.`);let l={image:o,transforms:i},u={interpolation:n,fillMode:s,fillValue:r,outputShape:a};return z.runKernel(vl,l,u)}var K_=W({transform_:X_});function Z_(e,t,n){M(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),M(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let s=$(e,"a","bandPart");M(s.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${s.rank}.`);let r=s.shape,[a,o]=s.shape.slice(-2);if(!(t<=a))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${a}).`);if(!(n<=o))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${o}).`);t<0&&(t=a),n<0&&(n=o);let i=U(Vl(0,a,1,"int32"),[-1,1]),l=Vl(0,o,1,"int32"),u=ge(i,l),c=Ps(Mo(u,Ie(+t,"int32")),Po(u,Ie(-n,"int32"))),d=Pt([a,o],s.dtype);return U(Dn(ms(U(s,[-1,a,o])).map(h=>bn(c,h,d))),r)}var Y_=W({bandPart_:Z_});function J_(e){let t;if(Array.isArray(e)){t=!1,M(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let r=e[0].shape[0];for(let a=1;a`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[a].shape[0]} vs. ${r})`)}else t=!0,e=an(e,e.shape[0],0).map(r=>lt(r,[0]));M(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],s=e;for(let r=0;r{let a=s[r];if(r>0)for(let o=0;o=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return Hb(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,u)=>l*u),s=ms(U(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),r=[],a=[];s.forEach(l=>{let[u,c]=Hb(l,t);r.push(u),a.push(c)});let o=U(Dn(r,0),e.shape),i=U(Dn(a,0),e.shape);return[o,i]}}function Hb(e,t=!1){return z.tidy(()=>{M(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],s=e.shape[1],r=Dg(n),a=Os(e),o=Ms([[1]],[1,1]),i=Os(o),l=n>=s?s:n;for(let u=0;u{let p=Re(a,[u,u],[n-u,1]),f=Qg(p),m=Re(a,[u,u],[1,1]),g=bn(jn(m,0),Ms([[-1]]),Ms([[1]])),A=ge(m,L(g,f)),y=de(p,A);y.shape[0]===1?i=Os(o):i=ft([o,Re(y,[1,0],[y.shape[0]-1,y.shape[1]])],0);let x=Tt(de(Ve(g,A),f)),b=Re(a,[u,0],[n-u,s]),v=L(x,i),k=Xe(i);if(u===0)a=ge(b,Ve(v,Ve(k,b)));else{let _=ge(b,Ve(v,Ve(k,b)));a=ft([Re(a,[0,0],[u,s]),_],0)}let S=Xe(v),C=Re(r,[0,u],[n,r.shape[1]-u]);if(u===0)r=ge(C,Ve(Ve(C,i),S));else{let _=ge(C,Ve(Ve(C,i),S));r=ft([Re(r,[0,0],[n,u]),_],1)}return[i,a,r]}),Z([c,d,h])}return!t&&n>s&&(r=Re(r,[0,0],[n,s]),a=Re(a,[0,0],[s,s])),[r,a]})}var tD=W({qr_:eD}),vn;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(vn||(vn={}));function nD(e,t,n=vn.SUM_BY_NONZERO_WEIGHTS){let s=$(e,"losses","computeWeightedLoss"),r=null;t!=null&&(r=$(t,"weights","computeWeightedLoss"));let a=r==null?s:L(s,r);if(n===vn.NONE)return a;if(n===vn.SUM)return ve(a);if(n===vn.MEAN){if(r==null)return _t(a);{let o=s.size/r.size,i=de(ve(a),ve(r));return o>1?de(i,Ie(o)):i}}if(n===vn.SUM_BY_NONZERO_WEIGHTS){if(r==null)return de(ve(a),Ie(s.size));{let o=L(r,qn(s.shape)),i=ce(ve(Bl(o,Ie(0))),"float32");return de(ve(a),i)}}throw Error(`Unknown reduction: ${n}`)}var Ir=W({computeWeightedLoss_:nD});function sD(e,t,n,s=vn.SUM_BY_NONZERO_WEIGHTS){let r=$(e,"labels","absoluteDifference"),a=$(t,"predictions","absoluteDifference"),o=null;n!=null&&(o=$(n,"weights","absoluteDifference")),An(r.shape,a.shape,"Error in absoluteDifference: ");let i=Ht(ge(r,a));return Ir(i,o,s)}var rD=W({absoluteDifference_:sD});function aD(e,t,n,s,r=vn.SUM_BY_NONZERO_WEIGHTS){let a=$(e,"labels","cosineDistance"),o=$(t,"predictions","cosineDistance"),i=null;s!=null&&(i=$(s,"weights","cosineDistance")),An(a.shape,o.shape,"Error in cosineDistance: ");let l=Ie(1),u=ge(l,ve(L(a,o),n,!0));return Ir(u,i,r)}var oD=W({cosineDistance_:aD});function iD(e,t,n,s=vn.SUM_BY_NONZERO_WEIGHTS){let r=$(e,"labels","hingeLoss"),a=$(t,"predictions","hingeLoss"),o=null;n!=null&&(o=$(n,"weights","hingeLoss")),An(r.shape,a.shape,"Error in hingeLoss: ");let i=Ie(1);r=ge(L(Ie(2),r),i);let l=sr(ge(i,L(r,a)));return Ir(l,o,s)}var lD=W({hingeLoss_:iD});function uD(e,t,n,s=1,r=vn.SUM_BY_NONZERO_WEIGHTS){let a=$(e,"labels","huberLoss"),o=$(t,"predictions","huberLoss"),i=null;n!=null&&(i=$(n,"weights","huberLoss")),An(a.shape,o.shape,"Error in huberLoss: ");let l=Ie(s),u=Ht(ge(o,a)),c=fc(u,l),d=ge(u,c),h=ae(L(Ie(.5),ct(c)),L(l,d));return Ir(h,i,r)}var cD=W({huberLoss_:uD});function dD(e,t,n,s=1e-7,r=vn.SUM_BY_NONZERO_WEIGHTS){let a=$(e,"labels","logLoss"),o=$(t,"predictions","logLoss"),i=null;n!=null&&(i=$(n,"weights","logLoss")),An(a.shape,o.shape,"Error in logLoss: ");let l=Ie(1),u=Ie(s),c=Tt(L(a,ds(ae(o,u)))),d=L(ge(l,a),ds(ae(ge(l,o),u))),h=ge(c,d);return Ir(h,i,r)}var hD=W({logLoss_:dD});function pD(e,t,n,s=vn.SUM_BY_NONZERO_WEIGHTS){let r=$(e,"labels","meanSquaredError"),a=$(t,"predictions","meanSquaredError"),o=null;n!=null&&(o=$(n,"weights","meanSquaredError")),An(r.shape,a.shape,"Error in meanSquaredError: ");let i=Zg(r,a);return Ir(i,o,s)}var fD=W({meanSquaredError_:pD});function mD(e,t){let n=$(e,"labels","sigmoidCrossEntropyWithLogits"),s=$(t,"logits","sigmoidCrossEntropyWithLogits");An(n.shape,s.shape,"Error in sigmoidCrossEntropyWithLogits: ");let r=sr(s),a=L(s,n),o=Yh(cs(Tt(Ht(s))));return ae(ge(r,a),o)}function gD(e,t,n,s=0,r=vn.SUM_BY_NONZERO_WEIGHTS){let a=$(e,"multiClassLabels","sigmoidCrossEntropy"),o=$(t,"logits","sigmoidCrossEntropy"),i=null;if(n!=null&&(i=$(n,"weights","sigmoidCrossEntropy")),An(a.shape,o.shape,"Error in sigmoidCrossEntropy: "),s>0){let u=Ie(s),c=Ie(1),d=Ie(.5);a=ae(L(a,ge(c,u)),L(d,u))}let l=mD(a,o);return Ir(l,i,r)}var AD=W({sigmoidCrossEntropy_:gD});function yD(e,t,n=-1){if(n===-1&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);return nr((r,a,o)=>{let l=mb(a,[n],!0),u=ge(ce(a,"float32"),l);o([r,u]);let c=Tt(L(u,r));return{value:ve(c,[n]),gradFunc:(p,f)=>{let[m,g]=f,A=zo(p.shape,[n]);return[L(U(p,A),ge(ce(m,"float32"),cs(g))),L(U(p,A),ge(cs(g),ce(m,"float32")))]}}})(e,t)}function xD(e,t,n,s=0,r=vn.SUM_BY_NONZERO_WEIGHTS){let a=$(e,"onehotLabels","softmaxCrossEntropy"),o=$(t,"logits","softmaxCrossEntropy"),i=null;if(n!=null&&(i=$(n,"weights","softmaxCrossEntropy")),An(a.shape,o.shape,"Error in softmaxCrossEntropy: "),s>0){let u=Ie(s),c=Ie(1),d=Ie(a.shape[1]);a=ae(L(a,ge(c,u)),de(u,d))}let l=yD(a,o);return Ir(l,i,r)}var bD=W({softmaxCrossEntropy_:xD});function vD(e,t,n,s){let r=$(e,"indices","sparseFillEmptyRows"),a=$(t,"values","sparseFillEmptyRows"),o=$(n,"denseShape","sparseFillEmptyRows"),i=$(s,"defaultValue","sparseFillEmptyRows",a.dtype);if(r.rank!==2)throw new Error(`Indices should be Tensor2D but received shape - ${r.shape}`);if(a.rank!==1)throw new Error(`Values should be Tensor1D but received shape ${a.shape}`);if(o.rank!==1)throw new Error(`Dense shape should be Tensor1D but received shape ${o.shape}`);if(i.rank!==0)throw new Error(`Default value should be a scalar but received shape ${i.shape}`);let l={indices:r,values:a,denseShape:o,defaultValue:i},u=z.runKernel(wh,l);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}var wD=W({sparseFillEmptyRows_:vD});function kD(e,t,n){let s=$(e,"inputIndices","sparseReshape"),r=$(t,"inputShape","sparseReshape"),a=$(n,"newShape","sparseReshape");if(s.rank!==2)throw new Error(`Input indices should be Tensor2D but received shape - ${s.shape}`);if(r.rank!==1)throw new Error(`Input shape should be Tensor1D but received shape ${r.shape}`);if(a.rank!==1)throw new Error(`New shape should be Tensor1D but received shape ${a.shape}`);let o={inputIndices:s,inputShape:r,newShape:a},i=z.runKernel(kh,o);return{outputIndices:i[0],outputShape:i[1]}}var ID=W({sparseReshape_:kD});function SD(e,t,n){let s=$(e,"data","sparseSegmentMean"),r=$(t,"indices","sparseSegmentMean"),a=$(n,"segmentIds","sparseSegmentMean");if(s.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.rank!==1)throw new Error(`Indices should be Tensor1D but received shape - ${r.shape}`);if(a.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape - ${a.shape}`);let o={data:s,indices:r,segmentIds:a};return z.runKernel(Ih,o)}var CD=W({sparseSegmentMean_:SD});function TD(e,t,n){let s=$(e,"data","sparseSegmentSum"),r=$(t,"indices","sparseSegmentSum"),a=$(n,"segmentIds","sparseSegmentSum");if(s.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(r.rank!==1)throw new Error(`Indices should be Tensor1D but received shape - ${r.shape}`);if(a.rank!==1)throw new Error(`Segment ids should be Tensor1D but received shape - ${a.shape}`);let o={data:s,indices:r,segmentIds:a};return z.runKernel(Sh,o)}var ND=W({sparseSegmentSum_:TD});function ED(e,t,n,s,r,a,o,i){let l=$(e,"data","stringNGrams","string");if(l.dtype!=="string")throw new Error("Data must be of datatype string");if(l.shape.length!==1)throw new Error(`Data must be a vector, saw: ${l.shape}`);let u=$(t,"dataSplits","stringNGrams");if(u.dtype!=="int32")throw new Error("Data splits must be of datatype int32");let c={separator:n,nGramWidths:s,leftPad:r,rightPad:a,padWidth:o,preserveShortSequences:i},d={data:l,dataSplits:u},h=z.runKernel(Th,d,c);return{nGrams:h[0],nGramsSplits:h[1]}}var RD=W({stringNGrams_:ED});function _D(e,t,n=!0){let s=$(e,"input","stringSplit","string"),r=$(t,"delimiter","stringSplit","string");if(s.rank!==1)throw new Error(`Input should be Tensor1D but received shape ${s.shape}`);if(r.rank!==0)throw new Error(`Delimiter should be a scalar but received shape ${r.shape}`);let a={skipEmpty:n},o={input:s,delimiter:r},i=z.runKernel(Nh,o,a);return{indices:i[0],values:i[1],shape:i[2]}}var DD=W({stringSplit_:_D});function $D(e,t){let n=$(e,"input","stringToHashBucketFast","string"),s={numBuckets:t};if(t<=0)throw new Error("Number of buckets must be at least 1");let r={input:n};return z.runKernel(Eh,r,s)}var FD=W({stringToHashBucketFast_:$D}),OD={fft:lp,ifft:Ac,rfft:up,irfft:Kg},PD={hammingWindow:c_,hannWindow:zb,frame:Lb,stft:f_},_e={flipLeftRight:y_,grayscaleToRGB:b_,resizeNearestNeighbor:H_,resizeBilinear:V_,rotateWithOffset:w_,cropAndResize:g_,nonMaxSuppression:I_,nonMaxSuppressionAsync:D_,nonMaxSuppressionWithScore:F_,nonMaxSuppressionWithScoreAsync:P_,nonMaxSuppressionPadded:z_,nonMaxSuppressionPaddedAsync:B_,threshold:q_,transform:K_},Gb={bandPart:Y_,gramSchmidt:Q_,qr:tD},MD={absoluteDifference:rD,computeWeightedLoss:Ir,cosineDistance:oD,hingeLoss:lD,huberLoss:cD,logLoss:hD,meanSquaredError:fD,sigmoidCrossEntropy:AD,softmaxCrossEntropy:bD},xc={sparseFillEmptyRows:wD,sparseReshape:ID,sparseSegmentMean:CD,sparseSegmentSum:ND},mp={stringNGrams:RD,stringSplit:DD,stringToHashBucketFast:FD},Sr=class extends Nx{minimize(e,t=!1,n){let{value:s,grads:r}=this.computeGradients(e,n);if(n!=null){let a=n.map(o=>({name:o.name,tensor:r[o.name]}));this.applyGradients(a)}else this.applyGradients(r);return Z(r),t?s:(s.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return db(e,t)}dispose(){this.iterations_!=null&&Z(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:Ie(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}};Object.defineProperty(Sr,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var gp=class extends Sr{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=z.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(n=>n.name):Object.keys(e)).forEach((n,s)=>{let r=z.registeredVariables[n],a=!1;this.accumulatedGrads[s]==null&&(this.accumulatedGrads[s]={originalName:`${n}/accum_grad`,variable:H(()=>Ke(r).variable(a))}),this.accumulatedUpdates[s]==null&&(this.accumulatedUpdates[s]={originalName:`${n}/accum_var`,variable:H(()=>Ke(r).variable(a))});let o=Array.isArray(e)?e[s].tensor:e[n];if(o==null)return;let i=this.accumulatedGrads[s].variable,l=this.accumulatedUpdates[s].variable;H(()=>{let u=ae(L(i,this.rho),L(ct(o),1-this.rho)),c=L(de(hn(ae(l,this.epsilon)),hn(ae(i,this.epsilon))),o),d=ae(L(l,this.rho),L(ct(c),1-this.rho));i.assign(u),l.assign(d);let h=ae(L(c,-this.learningRate),r);r.assign(h)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(Z(this.accumulatedGrads.map(e=>e.variable)),Z(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(s=>({originalName:s.name,variable:s.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(s=>({originalName:s.name,variable:s.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}};gp.className="Adadelta";Zr(gp);var Ap=class extends Sr{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(n=>n.name):Object.keys(e)).forEach((n,s)=>{let r=z.registeredVariables[n];if(this.accumulatedGrads[s]==null){let i=!1;this.accumulatedGrads[s]={originalName:`${n}/accumulator`,variable:H(()=>Ml(r.shape,this.initialAccumulatorValue).variable(i))}}let a=Array.isArray(e)?e[s].tensor:e[n];if(a==null)return;let o=this.accumulatedGrads[s].variable;H(()=>{let i=ae(o,ct(a));o.assign(i);let l=ae(L(de(a,hn(ae(i,z.backend.epsilon()))),-this.learningRate),r);r.assign(l)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&Z(this.accumulatedGrads.map(e=>e.variable))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};Ap.className="Adagrad";Zr(Ap);var yp=class extends Sr{constructor(e,t,n,s=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=s,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],H(()=>{this.accBeta1=Ie(t).variable(),this.accBeta2=Ie(n).variable()}),s==null&&(this.epsilon=z.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);H(()=>{let n=ge(1,this.accBeta1),s=ge(1,this.accBeta2);t.forEach((r,a)=>{let o=z.registeredVariables[r],i=!1;this.accumulatedFirstMoment[a]==null&&(this.accumulatedFirstMoment[a]={originalName:`${r}/m`,variable:H(()=>Ke(o).variable(i))}),this.accumulatedSecondMoment[a]==null&&(this.accumulatedSecondMoment[a]={originalName:`${r}/v`,variable:H(()=>Ke(o).variable(i))});let l=Array.isArray(e)?e[a].tensor:e[r];if(l==null)return;let u=this.accumulatedFirstMoment[a].variable,c=this.accumulatedSecondMoment[a].variable,d=ae(L(u,this.beta1),L(l,1-this.beta1)),h=ae(L(c,this.beta2),L(ct(l),1-this.beta2)),p=de(d,n),f=de(h,s);u.assign(d),c.assign(h);let m=ae(L(de(p,ae(hn(f),this.epsilon)),-this.learningRate),o);o.assign(m)}),this.accBeta1.assign(L(this.accBeta1,this.beta1)),this.accBeta2.assign(L(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&Z(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&Z(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),H(()=>{this.accBeta1.assign(ea(this.beta1,this.iterations_+1)),this.accBeta2.assign(ea(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(s=>({originalName:s.name,variable:s.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(s=>({originalName:s.name,variable:s.tensor.variable(n)}))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}};yp.className="Adam";Zr(yp);var xp=class extends Sr{constructor(e,t,n,s=null,r=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=s,this.decay=r,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],H(()=>{this.iteration=Ie(0).variable(),this.accBeta1=Ie(t).variable()}),s==null&&(this.epsilon=z.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);H(()=>{let n=ge(1,this.accBeta1),s=de(-this.learningRate,ae(L(this.iteration,this.decay),1));t.forEach((r,a)=>{let o=z.registeredVariables[r],i=!1;this.accumulatedFirstMoment[a]==null&&(this.accumulatedFirstMoment[a]={originalName:`${r}/m`,variable:Ke(o).variable(i)}),this.accumulatedWeightedInfNorm[a]==null&&(this.accumulatedWeightedInfNorm[a]={originalName:`${r}/v`,variable:Ke(o).variable(i)});let l=Array.isArray(e)?e[a].tensor:e[r];if(l==null)return;let u=this.accumulatedFirstMoment[a].variable,c=this.accumulatedWeightedInfNorm[a].variable,d=ae(L(u,this.beta1),L(l,1-this.beta1)),h=L(c,this.beta2),p=Ht(l),f=kr(h,p);u.assign(d),c.assign(f);let m=ae(L(de(s,n),de(d,ae(f,this.epsilon))),o);o.assign(m)}),this.iteration.assign(ae(this.iteration,1)),this.accBeta1.assign(L(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&Z(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&Z(this.accumulatedWeightedInfNorm.map(e=>e.variable))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}};xp.className="Adamax";Zr(xp);var bc=class extends Sr{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(n=>n.name):Object.keys(e)).forEach((n,s)=>{let r=Array.isArray(e)?e[s].tensor:e[n];if(r==null)return;let a=z.registeredVariables[n];H(()=>{let o=ae(L(this.c,r),a);a.assign(o)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Jt(Ie(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};bc.className="SGD";Zr(bc);var bp=class extends bc{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Ie(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(n=>n.name):Object.keys(e)).forEach((n,s)=>{let r=z.registeredVariables[n];if(this.accumulations[s]==null){let i=!1;this.accumulations[s]={originalName:`${n}/momentum`,variable:H(()=>Ke(r).variable(i))}}let a=this.accumulations[s].variable,o=Array.isArray(e)?e[s].tensor:e[n];o!=null&&H(()=>{let i,l=ae(L(this.m,a),o);this.useNesterov?i=ae(L(this.c,ae(o,L(l,this.m))),r):i=ae(L(this.c,l),r),a.assign(l),r.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&Z(this.accumulations.map(e=>e.variable))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map(e=>({name:e.originalName,tensor:e.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};bp.className="Momentum";Zr(bp);var vp=class extends Sr{constructor(e,t=.9,n=0,s=null,r=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=s,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=r,s==null&&(this.epsilon=z.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(n=>n.name):Object.keys(e)).forEach((n,s)=>{let r=z.registeredVariables[n],a=!1;this.accumulatedMeanSquares[s]==null&&(this.accumulatedMeanSquares[s]={originalName:`${n}/rms`,variable:H(()=>Ke(r).variable(a))}),this.accumulatedMoments[s]==null&&(this.accumulatedMoments[s]={originalName:`${n}/momentum`,variable:H(()=>Ke(r).variable(a))}),this.accumulatedMeanGrads[s]==null&&this.centered&&(this.accumulatedMeanGrads[s]={originalName:`${n}/mg`,variable:H(()=>Ke(r).variable(a))});let o=Array.isArray(e)?e[s].tensor:e[n];if(o==null)return;let i=this.accumulatedMeanSquares[s].variable,l=this.accumulatedMoments[s].variable;H(()=>{let u=ae(L(i,this.decay),L(ct(o),1-this.decay));if(this.centered){let c=this.accumulatedMeanGrads[s].variable,d=ae(L(c,this.decay),L(o,1-this.decay)),h=de(L(o,this.learningRate),hn(ge(u,ae(ct(d),this.epsilon)))),p=ae(L(l,this.momentum),h);i.assign(u),c.assign(d),l.assign(p);let f=ge(r,p);r.assign(f)}else{let c=ae(L(i,this.decay),L(ct(o),1-this.decay)),d=ae(L(l,this.momentum),de(L(o,this.learningRate),hn(ae(c,this.epsilon))));i.assign(c),l.assign(d);let h=ge(r,d);r.assign(h)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&Z(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&Z(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&Z(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(s=>({originalName:s.name,variable:s.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(s=>({originalName:s.name,variable:s.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(s=>({originalName:s.name,variable:s.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}};vp.className="RMSProp";Zr(vp);var Lo=class{static sgd(e){return new bc(e)}static momentum(e,t,n=!1){return new bp(e,t,n)}static rmsprop(e,t=.9,n=0,s=null,r=!1){return new vp(e,t,n,s,r)}static adam(e=.001,t=.9,n=.999,s=null){return new yp(e,t,n,s)}static adadelta(e=.001,t=.95,n=null){return new gp(e,t,n)}static adamax(e=.002,t=.9,n=.999,s=null,r=0){return new xp(e,t,n,s,r)}static adagrad(e,t=.1){return new Ap(e,t)}},Bo={sgd:Lo.sgd,momentum:Lo.momentum,adadelta:Lo.adadelta,adagrad:Lo.adagrad,rmsprop:Lo.rmsprop,adamax:Lo.adamax,adam:Lo.adam},zD=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function wp(){return new Promise(e=>zD(()=>e()))}var D={};Pe(D,{ERF_A1:()=>KD,ERF_A2:()=>ZD,ERF_A3:()=>YD,ERF_A4:()=>JD,ERF_A5:()=>QD,ERF_P:()=>XD,PARALLELIZE_THRESHOLD:()=>rA,SELU_SCALE:()=>qb,SELU_SCALEALPHA:()=>jb,applyActivation:()=>pp,assertAndGetBroadcastShape:()=>At,assertAxesAreInnerMostDims:()=>ZN,assertParamsConsistent:()=>LD,assignToTypedArray:()=>a$,axesAreInnerMostDims:()=>Og,calculateShapes:()=>gx,checkEinsumDimSizes:()=>d$,combineLocations:()=>hb,complexWithEvenIndex:()=>n$,complexWithOddIndex:()=>s$,computeConv2DInfo:()=>uc,computeConv3DInfo:()=>Ux,computeDefaultPad:()=>wg,computeDilation2DInfo:()=>mT,computeOptimalWindowSize:()=>WD,computeOutAndReduceShapes:()=>pb,computeOutShape:()=>BD,computePool2DInfo:()=>Vx,computePool3DInfo:()=>gT,convertConv2DDataFormat:()=>Hx,decodeEinsumEquation:()=>u$,eitherStridesOrDilationsAreOne:()=>tr,expandShapeToKeepDim:()=>zo,exponent:()=>i$,exponents:()=>o$,fromStringArrayToUint8:()=>b$,fromUint8ToStringArray:()=>x$,getAxesPermutation:()=>fb,getBroadcastDims:()=>iN,getComplexWithIndex:()=>r$,getEinsumComputePath:()=>h$,getEinsumPermutation:()=>c$,getFusedBiasGradient:()=>hp,getFusedDyActivation:()=>dp,getImageCenter:()=>VD,getInnerMostAxes:()=>YN,getPermuted:()=>HD,getReductionAxes:()=>Gt,getReshaped:()=>UD,getReshapedPermuted:()=>GD,getSliceBeginCoords:()=>jD,getSliceSize:()=>qD,getUndoAxesPermutation:()=>Pg,isIdentityPermutation:()=>p$,log:()=>LS,mergeRealAndImagArrays:()=>e$,prepareAndValidate:()=>mx,prepareSplitSize:()=>m$,segment_util:()=>Zb,shouldFuse:()=>fp,slice_util:()=>xn,splitRealAndImagArrays:()=>t$,tupleValuesAreOne:()=>Yr,upcastType:()=>Cs,validateInput:()=>fg,validateUpdateShape:()=>pg,warn:()=>Ys});function LD(e,t){let n=e[0].length;e.forEach((r,a)=>{M(r.length===n,()=>`Error in concat${n}D: rank of tensors[${a}] must be the same as the rank of the rest (${n})`)}),M(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let s=e[0];e.forEach((r,a)=>{for(let o=0;o`Error in concat${n}D: Shape of tensors[${a}] (${r}) does not match the shape of the rest (${s}) along the non-concatenated axis ${a}.`)})}function BD(e,t){let n=e[0].slice();for(let s=1;s=t*2+1||o%2==1?a.push(o):r.push(o);s.push(...r),s.push(0),s.push(...a)}return s}function GD(e,t,n,s=!0){let r=[];s?r.push(e[0]/n):r.push(e[0]*n);for(let a=1;a/g,Xb=",",Kb="...";function u$(e,t){e=e.replace(/\s/g,"");let n=(e.length-e.replace(l$,"").length)/aA.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error(`Equation must contain exactly one arrow ("${aA}").`);let[s,r]=e.split(aA);M(s.indexOf(Kb)===-1,()=>`The ellipsis notation ("${Kb}") is not supported yet.`);let a=s.split(Xb),o=a.length;if(t!==o)throw new Error(`Expected ${o} input tensors, received ${t}`);if(o>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");let i=[];for(let h=0;hf.indexOf(p)!==-1))throw new Error(`Output subscripts contain the label ${p} not present in the input subscripts.`);i.indexOf(p)===-1&&i.push(p)}for(let h=0;hr!==-1),{permutationIndices:n,expandDims:s}}function d$(e,t,n){let s=new Array(e);for(let r=0;r`Expected dimension ${s[t[r][o]]} at axis ${o} of input shaped ${JSON.stringify(a)}, but got dimension ${a[o]}`)}}function h$(e,t){let n=e,s=[],r=0;e.length===0&&n.push(-1),r=e.length+1;for(let o=0;ot===n)}function f$(e,t){let n=[];for(let s=0;s"Number of splits must evenly divide the axis."),s=new Array(t).fill(e.shape[n]/t);else{let r=t.reduce((o,i)=>(i===-1&&(o+=1),o),0);M(r<=1,()=>"There should be only one negative value in split array.");let a=t.indexOf(-1);if(a!==-1){let o=t.reduce((i,l)=>l>0?i+l:i);t[a]=e.shape[n]-o}M(e.shape[n]===t.reduce((o,i)=>o+i),()=>"The sum of sizes must match the size of the axis dimension."),s=t}return s}var Zb={};Pe(Zb,{collectGatherOpShapeInfo:()=>y$,computeOutShape:()=>A$,segOpComputeOptimalWindowSize:()=>g$});function g$(e,t){let n=!1,s;for(e<=rA?(s=e,n=!0):s=qd(e,Math.floor(Math.sqrt(e)));!n;)s>t||s===e?n=!0:s=qd(e,s+1);return s}function A$(e,t,n){let s=[],r=e.length;for(let a=0;ar))throw new Error(`Expect batchDims in the range of [-${r}, ${r}], but got ${s}`);if(s<0&&(s+=r),s>a)throw new Error(`batchDims (${s}) must be less than rank(x) ( - ${a}).`);if(nOh(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function b$(e){return e.map(t=>Qu(t))}var rr={};Pe(rr,{nonMaxSuppressionV3Impl:()=>Bb,nonMaxSuppressionV4Impl:()=>Wb,nonMaxSuppressionV5Impl:()=>Vb,whereImpl:()=>Rb});var Yb={kernelName:Ii,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,yc(ce(n,"float32"),-1))}}},v$={kernelName:Si,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>{let s=ct(ce(n,"float32")),r=hn(ge(Ie(1),s));return Tt(de(e,r))}}}},w$={kernelName:Ci,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>{let s=hn(ge(ct(ce(n,"float32")),1));return de(e,s)}}}},k$={kernelName:Vr,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=e,l=Gt(n.shape,r);return l.length>0&&(i=ve(i,l)),U(i,n.shape)},b:()=>{let i=e,l=Gt(s.shape,r);return l.length>0&&(i=ve(i,l)),U(i,s.shape)}}}},I$={kernelName:Na,saveAllInputs:!0,gradFunc:(e,t)=>{let n={};return t.forEach((s,r)=>{n[r]=()=>e.clone()}),n}},S$={kernelName:Ea,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>Ke(n)}}},C$={kernelName:Pu,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>Ke(n)}}},T$={kernelName:Ei,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,hn(ge(Ie(1),ct(ce(n,"float32")))))}}},N$={kernelName:Ri,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>{let s=hn(ae(Ie(1),ct(ce(n,"float32"))));return de(e,s)}}}},E$={kernelName:$i,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=ae(ct(n),ct(s)),l=L(e,de(s,i)),u=Gt(n.shape,r);return u.length>0&&(l=ve(l,u)),U(l,n.shape)},b:()=>{let i=ae(ct(n),ct(s)),l=Tt(L(e,de(n,i))),u=Gt(s.shape,r);return u.length>0&&(l=ve(l,u)),U(l,s.shape)}}}},R$={kernelName:_i,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,ae(ct(ce(n,"float32")),1))}}},_$={kernelName:Di,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,ge(Ie(1),ct(ce(n,"float32"))))}}};function D$(e,t,n,s,r,a){let o=$(e,"dy","avgPool3dGrad"),i=$(t,"input","avgPool3dGrad"),l=o,u=i,c=!1;i.rank===4&&(c=!0,l=U(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]]),u=U(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(l.rank===5,()=>`Error in avgPool3dGrad: dy must be rank 5 but got rank ${l.rank}.`),M(u.rank===5,()=>`Error in avgPool3dGrad: input must be rank 5 but got rank ${u.rank}.`),a!=null&&M(Zt(r),()=>`Error in avgPool3dGrad: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let d={dy:l,input:u},h={filterSize:n,strides:s,pad:r,dimRoundingMode:a},p=z.runKernel(Zd,d,h);return c?U(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}var $$=W({avgPool3dGrad_:D$}),F$={kernelName:Mu,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{filterSize:r,strides:a,pad:o,dimRoundingMode:i}=n;return{x:()=>$$(e,s,r,a,o,i)}}};function O$(e,t,n,s,r){let a=$(e,"dy","avgPoolGrad"),o=$(t,"input","avgPoolGrad");M(o.rank===a.rank,()=>`Rank of input (${o.rank}) does not match rank of dy (${a.rank})`);let i=o,l=a,u=!1;o.rank===3&&(u=!0,i=U(o,[1,o.shape[0],o.shape[1],o.shape[2]]),l=U(a,[1,a.shape[0],a.shape[1],a.shape[2]])),M(l.rank===4,()=>`Error in avgPoolGrad: dy must be rank 4 but got rank ${l.rank}.`),M(i.rank===4,()=>`Error in avgPoolGrad: input must be rank 4 but got rank ${i.rank}.`);let c={dy:l,input:i},d={filterSize:n,strides:s,pad:r},h=z.runKernel(Kd,c,d);return u?U(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var P$=W({avgPoolGrad_:O$}),M$={kernelName:Ra,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{filterSize:r,strides:a,pad:o}=n;return{x:()=>P$(e,s,r,a,o)}}},z$={kernelName:_a,inputsToSave:["a","b"],gradFunc:(e,t,n)=>{let[s,r]=t,{transposeA:a,transposeB:o}=n;return!a&&!o?{a:()=>Ve(e,r,!1,!0),b:()=>Ve(s,e,!0,!1)}:!a&&o?{a:()=>Ve(e,r,!1,!1),b:()=>Ve(e,s,!0,!1)}:a&&!o?{a:()=>Ve(r,e,!1,!0),b:()=>Ve(s,e,!1,!1)}:{a:()=>Ve(r,e,!0,!0),b:()=>Ve(e,s,!0,!0)}}},L$={kernelName:Fi,gradFunc:(e,t,n)=>{let{blockShape:s,crops:r}=n;return{x:()=>sp(e,s,r)}}},B$={kernelName:$5,gradFunc:(e,t,n)=>{let s=n,r=s.inputShape,a=s.shape,o=Array.from(a);for(let l=r.length-1;l>=0;l--)if(r[l]===a[l])o[l]=1;else if(r[l]!==1)throw new Error(`broadcastTo(): [${r}] cannot be broadcast to [${a}].`);let i=[];for(let l=0;l1&&i.push(l);return{x:()=>ve(e,i,!0)}}},W$={kernelName:Da,gradFunc:e=>({x:()=>e.clone()})},V$={kernelName:$a,gradFunc:e=>({x:()=>Ke(e)})},U$={kernelName:Ur,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{clipValueMin:r,clipValueMax:a}=n;return{x:()=>bn(Ps(Po(s,r),Mo(s,a)),e,Ke(e))}}},H$={kernelName:zu,inputsToSave:["x"],gradFunc:Yb.gradFunc},G$={kernelName:Oi,saveAllInputs:!0,gradFunc:(e,t,n)=>{let s=t.map(l=>l.shape),{axis:r}=n,a=Ss(r,t[0].shape)[0],o=s.map(l=>l[a]);return an(e,o,a).map(l=>()=>l)}},j$={kernelName:Fa,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{let[s,r]=t,{dilations:a,strides:o,pad:i,dataFormat:l}=n;return M(Yr(a),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${a}'`),{x:()=>Tg(s.shape,e,r,o,i,l),filter:()=>nA(s,e,r.shape,o,i,l)}}},q$={kernelName:Oa,inputsToSave:["dy","filter"],gradFunc:(e,t,n)=>{let[s,r]=t,{strides:a,pad:o,dataFormat:i,dimRoundingMode:l}=n;return{dy:()=>Jr(e,r,a,o,i,1,l),filter:()=>nA(e,s,r.shape,a,o,i,l)}}};function X$(e,t,n,s,r){let a=e;e.rank===4&&(a=U(e,[1,e.shape[0],e.shape[1],e.shape[2],e.shape[3]]));let o=t;o.rank===4&&(o=U(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]])),M(a.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${a.shape}.`),M(o.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${o.shape}.`),M(n.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${n}.`),M(a.shape[4]===n[3],()=>`Error in conv3dDerFilter: depth of input ${a.shape[4]}) must match input depth in filter (${n[3]}.`),M(o.shape[4]===n[4],()=>`Error in conv3dDerFilter: depth of dy (${o.shape[4]}) must match output depth for filter (${n[4]}).`);let i={x:a,dy:o},l={strides:s,pad:r,filterShape:n};return z.runKernel(eh,i,l)}var K$=W({conv3DBackpropFilter_:X$}),Z$={kernelName:Lu,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{let{dilations:s,strides:r,pad:a}=n;M(Yr(s),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let[o,i]=t;return{x:()=>Qx(o.shape,e,i,r,a),filter:()=>K$(o,e,i.shape,r,a)}}},Y$={kernelName:Pa,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(Tt(jg(ce(n,"float32"))),e)}}},J$={kernelName:Ma,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(qg(ce(n,"float32")),e)}}},Q$={kernelName:za,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{axis:r,exclusive:a,reverse:o}=n;return{x:()=>{let i=fb([r],s.rank),l=_g(e,r,a,!o);return i!=null&&(l=Xe(l,i)),l}}}},eF={kernelName:La,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{let{dilations:s,strides:r,pad:a,dimRoundingMode:o}=n,i=s==null?[1,1]:s;M(Yr(i),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${i}'`);let[l,u]=t;return M(l.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${l.rank}.`),M(u.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${u.rank}.`),M(l.shape[3]===u.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${l.shape[3]}) must match the inChannels dimension in filter ${u.shape[2]}.`),M(tr(r,i),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${r} and dilations '${i}'.`),o!=null&&M(Zt(a),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${o} but got pad ${a}.`),{x:()=>Mb(l.shape,e,u,r,a,i,o),filter:()=>Pb(l,e,u.shape,r,a,i,o)}}},tF={kernelName:Bu,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{let[s,r]=t,a={x:s,filter:r,dy:e},o={x:s,filter:r,dy:e};return{x:()=>z.runKernel(oh,a,n),filter:()=>z.runKernel(ih,o,n)}}},nF={kernelName:Wa,outputsToSave:[!0],gradFunc:(e,t)=>{let[n]=t,s={dy:e,y:n};return{x:()=>z.runKernel(uh,s)}}},sF={kernelName:zi,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t,s=L(cs(Tt(ct(n))),2/Math.sqrt(Math.PI));return{x:()=>L(e,s)}}},rF={kernelName:Va,outputsToSave:[!0],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,n)}}},aF={kernelName:Bi,inputsToSave:["input"],gradFunc:(e,t)=>{let[n]=t;return{input:()=>U(e,n.shape)}}},oF={kernelName:Wi,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,cs(n))}}},iF={kernelName:Ua,gradFunc:e=>({x:()=>Ke(e)})},lF={kernelName:Ha,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=de(e,ce(s,"float32")),l=Gt(n.shape,r);return l.length>0?U(ve(i,l),n.shape):i},b:()=>{let i=L(e,ce(n,"float32")),l=Gt(s.shape,r);l.length>0&&(i=U(ve(i,l),s.shape));let u=ct(s);return Tt(de(i,ce(u,"float32")))}}}},uF={kernelName:Ga,inputsToSave:["x","mean","variance","scale"],gradFunc:(e,t,n)=>{let{varianceEpsilon:s}=n,[r,a,o,i]=t,l=i==null?Ie(1):i,u=Gt(a.shape,r.shape),c=[];if(a.rank===1){for(let b=0;ba.rank===1?U(L(L(e,Ts(U(p,[1,1,1,a.shape[0]]),c)),l),r.shape):U(L(L(e,p),l),r.shape),mean:()=>{let b=L(L(p,Ie(-1)),h);return a.rank===1&&(b=ve(b,u)),U(b,a.shape)},variance:()=>{let b=L(L(f,d),h);return a.rank===1&&(b=ve(b,u)),U(b,a.shape)},scale:()=>{let b=L(d,p),v=L(e,b);return a.rank===1&&(v=ve(v,u)),U(v,a.shape)},offset:()=>{let b=e;return a.rank===1&&(b=ve(b,u)),U(b,a.shape)}}}},cF={kernelName:Ui,inputsToSave:["x","indices"],gradFunc:(e,t,n)=>{let[s,r]=t,{axis:a}=n,o=Ss(a,s.shape)[0];return{x:()=>{let l=s.shape,u=r.size,c=l.slice(0,o),d=c.length,h=l.slice(a,l.length).slice(1),p=h.length,f=Jb(0,d),m=Jb(d+1,d+1+p),g=Qb([c,[u],h]),A=U(e,g),y=U(r,[u]),x=Qb([[d],f,m]),b=Xe(A,x),v=Nb(b,y,s.shape[o]),k=Pg(x);return v=Xe(v,k),v},indices:()=>r}}};function Jb(e,t){let n=[];for(let s=e;s{let[n,s]=t;return{a:()=>Ke(n),b:()=>Ke(s)}}},hF={kernelName:qa,gradFunc:e=>({x:()=>ce(e,"float32")})},pF={kernelName:ji,gradFunc:e=>({x:()=>Ke(e)})},fF={kernelName:qi,gradFunc:e=>({x:()=>Ke(e)})},mF={kernelName:Xi,gradFunc:e=>({x:()=>Ke(e)})},gF={kernelName:Xa,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{alpha:r}=n,a=jn(s,0);return{x:()=>bn(a,e,L(e,r))}}},AF={kernelName:Yi,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,ae(n,1))}}},yF={kernelName:Ka,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,ce(n,"float32"))}}},xF={kernelName:F5,inputsToSave:[],outputsToSave:[!0],gradFunc:(e,t,n)=>{let[s]=t,{axis:r}=n;return{logits:()=>{let a=!0,o=cs(s);return ge(e,L(ve(e,r,a),o))}}}};function bF(e,t,n,s=5,r=1,a=1,o=.5){let i={x:e,y:t,dy:n},l={depthRadius:s,bias:r,alpha:a,beta:o};return z.runKernel(fh,i,l)}var vF=W({localResponseNormalizationBackprop_:bF}),wF={kernelName:Hu,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{let[s,r]=t,{depthRadius:a,bias:o,alpha:i,beta:l}=n;return{x:()=>vF(s,r,e,a,o,i,l)}}};function e3(e,t,n,s){return t.rankL(e,ce(us(n,t),e.dtype))}}var t3={kernelName:Za,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{let s=n,{reductionIndices:r}=s,a=t[0],o=t[1],i=Ss(r,a.shape),l=e3(e,o,a,i);return{x:()=>l.x()}}},kF={kernelName:Ya,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t;return{a:()=>L(e,ce(Po(n,s),"float32")),b:()=>L(e,ce($g(n,s),"float32"))}}};function IF(e,t,n,s,r,a,o){let i=$(e,"dy","maxPool3dGrad"),l=$(t,"input","maxPool3dGrad"),u=$(n,"output","maxPool3dGrad"),c=i,d=l,h=u,p=!1;l.rank===4&&(p=!0,c=U(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]]),d=U(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),h=U(u,[1,u.shape[0],u.shape[1],u.shape[2],u.shape[3]])),M(c.rank===5,()=>`Error in maxPool3dGrad: dy must be rank 5 but got rank ${c.rank}.`),M(d.rank===5,()=>`Error in maxPool3dGrad: input must be rank 5 but got rank ${d.rank}.`),M(h.rank===5,()=>`Error in maxPool3dGrad: output must be rank 5 but got rank ${h.rank}.`),o!=null&&M(Zt(a),()=>`Error in maxPool3dGrad: pad must be an integer when using, dimRoundingMode ${o} but got pad ${a}.`);let f={dy:c,input:d,output:h},m={filterSize:s,strides:r,pad:a,dimRoundingMode:o},g=z.runKernel(gh,f,m);return p?U(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}var SF=W({maxPool3dGrad_:IF}),CF={kernelName:Gu,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{let[s,r]=t,{filterSize:a,strides:o,pad:i,dimRoundingMode:l}=n;return{x:()=>SF(e,s,r,a,o,i,l)}}};function TF(e,t,n,s,r,a,o){let i=$(e,"dy","maxPoolGrad"),l=$(t,"input","maxPoolGrad"),u=$(n,"output","maxPoolGrad");M(l.rank===i.rank,()=>`Rank of input (${l.rank}) does not match rank of dy (${i.rank})`),M(i.rank===4,()=>`Error in maxPoolGrad: dy must be rank 4 but got rank ${i.rank}.`),M(l.rank===4,()=>`Error in maxPoolGrad: input must be rank 4 but got rank ${l.rank}.`),o!=null&&M(Zt(a),()=>`Error in maxPoolGrad: pad must be an integer when using, dimRoundingMode ${o} but got pad ${a}.`);let c={dy:i,input:l,output:u},d={filterSize:s,strides:r,pad:a,dimRoundingMode:o};return z.runKernel(mh,c,d)}var NF=W({maxPoolGrad_:TF}),EF={kernelName:Ja,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{let[s,r]=t,{filterSize:a,strides:o,pad:i}=n;return{x:()=>NF(e,s,r,a,o,i)}}},RF={kernelName:Qa,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{axis:r}=n,a=Ss(r,s.shape),i=pb(s.shape,a)[1],l=$t(i);return{x:()=>{let c=s.shape.slice();a.forEach(p=>{c[p]=1});let d=U(e,c);return de(L(d,qn(s.shape,"float32")),l)}}}},_F={kernelName:eo,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{let s=n,{axis:r}=s,[a,o]=t,i=Ss(r,a.shape),l=e3(e,o,a,i);return{x:()=>l.x()}}},DF={kernelName:to,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t;return{a:()=>L(e,ce(Mo(n,s),"float32")),b:()=>L(e,ce(jn(n,s),"float32"))}}},$F={kernelName:no,inputsToSave:["x"],gradFunc:(e,t,n)=>{let s=t[0],{paddings:r}=n,a=r.map(o=>o[0]);return{x:()=>Re(e,a,s.shape)}}},FF={kernelName:Qi,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=Gt(n.shape,r);return i.length>0?U(ve(e,i),n.shape):e},b:()=>{let i=L(e,Tt(pc(de(n,s)))),l=Gt(s.shape,r);return l.length>0?U(ve(i,l),s.shape):i}}}},OF={kernelName:so,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=L(e,ce(s,"float32")),l=Gt(n.shape,r);return l.length>0?U(ve(i,l),n.shape):i},b:()=>{let i=L(e,ce(n,"float32")),l=Gt(s.shape,r);return l.length>0?U(ve(i,l),s.shape):i}}}},PF={kernelName:el,gradFunc:e=>({x:()=>Tt(e)})},MF={kernelName:ro,inputsToSave:["indices"],gradFunc:(e,t)=>{let n=t[0];return{indices:()=>Pt(n.shape,"float32")}}},zF={kernelName:al,gradFunc:e=>({x:()=>Ke(e)})},LF={kernelName:ol,saveAllInputs:!0,gradFunc:(e,t,n)=>{let{axis:s}=n;return ms(e,s).map(a=>()=>a)}},n3={kernelName:ao,inputsToSave:["x"],gradFunc:(e,t,n)=>{let s=t[0],{paddings:r}=n,a=r.map(o=>o[0]);return{x:()=>Re(e,a,s.shape)}}},BF={kernelName:oo,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(e,t)=>{let[n,s,r]=t,a=n,o=s,i=At(a.shape,o.shape);return{a:()=>{let c=ce(o,"float32"),d=L(e,L(c,ea(a,ge(c,Ie(1))))),h=Gt(a.shape,i);return h.length>0&&(d=ve(d,h)),U(d,a.shape)},b:()=>{let c=jn(a,0),d=bn(c,ds(a),Ke(a)),h=L(e,L(r,d)),p=Gt(o.shape,i);return p.length>0&&(h=ve(h,p)),U(h,o.shape)}}}},WF={kernelName:io,inputsToSave:["x","alpha"],gradFunc:(e,t)=>{let[n,s]=t,r=jn(n,0);return{x:()=>bn(r,e,L(e,s)),alpha:()=>{let a=bn(r,Ke(e),L(e,n)),o=Gt(s.shape,e.shape);return o.length>0&&(a=ve(a,o)),U(a,s.shape)}}}},VF={kernelName:Ba,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=de(e,ce(s,"float32")),l=Gt(n.shape,r);return l.length>0?U(ve(i,l),n.shape):i},b:()=>{let i=L(e,ce(n,"float32")),l=Gt(s.shape,r);l.length>0&&(i=U(ve(i,l),s.shape));let u=ct(s);return Tt(de(i,ce(u,"float32")))}}}},UF={kernelName:ll,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,Tt(ct(n)))}}},HF={kernelName:co,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t,s=L(Mo(n,6),yc(n));return{x:()=>L(e,ce(s,"float32"))}}},GF={kernelName:lo,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,ce(yc(n),"float32"))}}},jF={kernelName:ul,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>U(e,n.shape)}}},qF={kernelName:uo,inputsToSave:["images"],gradFunc:(e,t,n)=>{let[s]=t,r={dy:e,images:s};return{images:()=>z.runKernel(vh,r,n)}}},XF={kernelName:qu,inputsToSave:["images"],gradFunc:(e,t,n)=>{let[s]=t,r={dy:e,images:s};return{images:()=>z.runKernel(bh,r,n)}}},KF={kernelName:ho,gradFunc:(e,t,n)=>{let{dims:s}=n,r=Ss(s,e.shape);return{x:()=>fs(e,r)}}},ZF={kernelName:po,gradFunc:e=>({x:()=>Ke(e)})},YF={kernelName:fo,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>Tt(de(e,L(ea(n,1.5),2)))}}},JF={kernelName:dl,inputsToSave:["condition"],gradFunc:(e,t)=>{let[n]=t;return{condition:()=>ce(Ke(n),"float32"),t:()=>L(e,ce(n,e.dtype)),e:()=>L(e,ce(Qh(n),e.dtype))}}},QF={kernelName:hl,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>{let s=jn(n,Ie(0)),r=Ie(jb),a=Ie(qb),o=L(e,a),i=L(L(e,r),cs(ce(n,"float32")));return bn(s,o,i)}}}},eO={kernelName:go,outputsToSave:[!0],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,L(n,ge(Ie(1),n)))}}},tO={kernelName:ml,gradFunc:e=>({x:()=>Ke(e)})},nO={kernelName:mo,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(Xh(ce(n,"float32")),e)}}},sO={kernelName:fl,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(Rg(ce(n,"float32")),e)}}},rO={kernelName:pl,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{begin:r,size:a}=n,o=s.shape,[i,l]=Tx(s,r,a),u=[];for(let c=0;cQr(e,u)}}},aO={kernelName:xo,outputsToSave:[!0],gradFunc:(e,t,n)=>{let[s]=t,{dim:r}=n,a=!0,o=L(e,s);return{logits:()=>ge(o,L(ve(o,[r],a),s))}}},oO={kernelName:gl,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,Hn(n))}}},s3={kernelName:Al,gradFunc:(e,t,n)=>{let{blockShape:s,paddings:r}=n;return{x:()=>qh(e,s,r)}}},r3={kernelName:yl,gradFunc:(e,t,n)=>{let{axis:s}=n;return{x:()=>ft(e,s)}}},iO={kernelName:Ao,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,L(hn(ce(n,"float32")),2))}}},lO={kernelName:Xu,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(e,L(ce(n,"float32"),2))}}},uO={kernelName:bo,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=Ie(2);return{a:()=>L(e,L(r,ge(n,s))),b:()=>L(e,L(r,ge(s,n)))}}},cO={kernelName:Gr,gradFunc:e=>({x:()=>Ke(e)})},dO={kernelName:vo,inputsToSave:["a","b"],gradFunc:(e,t)=>{let[n,s]=t,r=At(n.shape,s.shape);return{a:()=>{let i=e,l=Gt(n.shape,r);return l.length>0&&(i=ve(i,l)),U(i,n.shape)},b:()=>{let i=e,l=Gt(s.shape,r);return l.length>0&&(i=ve(i,l)),U(Tt(i),s.shape)}}}},hO={kernelName:yo,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,r=s.shape.slice(),{axis:a}=n;Ss(a,s.shape).forEach(u=>{r[u]=1});let i=U(e,r),l=L(i,qn(s.shape,"float32"));return{x:()=>l}}},pO={kernelName:wo,inputsToSave:["x"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>de(e,ct(Xh(n)))}}},fO={kernelName:ko,outputsToSave:[!0],gradFunc:(e,t)=>{let[n]=t;return{x:()=>L(ge(Ie(1),ct(n)),e)}}},mO={kernelName:Hr,inputsToSave:["x"],gradFunc:(e,t,n)=>{let[s]=t,{reps:r}=n;return{x:()=>{let o=Ke(s);if(s.rank===1)for(let i=0;i{let s=n,{perm:r}=s,a=Pg(r);return{x:()=>Xe(e,a)}}},AO={kernelName:wl,gradFunc:(e,t,n)=>{let s=n,{axis:r}=s;return{value:()=>Dn(e,r)}}},yO={kernelName:Ku,inputsToSave:["segmentIds"],gradFunc:(e,t)=>{let[n]=t;return{x:()=>xO(e,n)}}};function xO(e,t){let n=kr(t,Ke(t)),s=zl(e,n),r=Po(t,Ie(0,"int32")),a=s.rank-r.rank;for(let i=0;i({x:()=>Ke(e)})},vO=[Yb,v$,w$,k$,I$,S$,C$,T$,N$,E$,R$,_$,F$,M$,z$,L$,B$,W$,V$,U$,H$,G$,q$,j$,Z$,Y$,J$,Q$,eF,tF,VF,nF,sF,rF,aF,oF,lF,iF,uF,cF,dF,hF,pF,fF,mF,gF,AF,yF,xF,wF,t3,t3,kF,CF,EF,RF,_F,DF,$F,FF,OF,PF,MF,zF,LF,n3,n3,BF,WF,UF,HF,GF,jF,qF,XF,KF,ZF,YF,JF,QF,eO,tO,nO,sO,rO,aO,oO,s3,s3,r3,r3,iO,uO,lO,cO,dO,hO,pO,fO,mO,gO,AO,yO,bO];for(let e of vO)O5(e);var a3={};Pe(a3,{maxNorm:()=>SO,minMaxNorm:()=>NO,nonNeg:()=>TO,unitNorm:()=>CO});var oA;function jt(){return oA==null&&(oA=$x().epsilon()),oA}function zs(){return"channelsLast"}var Cr=class extends Error{constructor(e){super(e);Object.setPrototypeOf(this,Cr.prototype)}},Ls=class extends Error{constructor(e){super(e);Object.setPrototypeOf(this,Ls.prototype)}},G=class extends Error{constructor(e){super(e);Object.setPrototypeOf(this,G.prototype)}},Oe=class extends Error{constructor(e){super(e);Object.setPrototypeOf(this,Oe.prototype)}},o3=class extends Error{constructor(e){super(e);Object.setPrototypeOf(this,o3.prototype)}};function Wo(e,t){if(Array.isArray(e)){let n=[];for(let s=0;sn.toUpperCase())}var Ns={};function iA(e){if(e==null)return null;let t={};return t.className=e.getClassName(),t.config=e.getConfig(),t}function lA(e){if(!(e==null||typeof e!="object"))if(Array.isArray(e))e.forEach(t=>lA(t));else{let t=Object.keys(e);for(let n of t){let s=e[n];s!=null&&typeof s=="object"&&(!Array.isArray(s)&&s.type==="ndarray"&&typeof s.value=="number"?e[n]=s.value:lA(s))}}}function vc(e,t={},n={},s="object",r=!1){if(typeof e=="string"){let a=e,o;if(a in n)o=n[a];else if(a in Ns)o=Ns[a];else if(o=t[a],o==null)throw new G(`Unknown ${s}: ${e}. This may be due to one of the following reasons: -1. The ${s} is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code. -2. The custom ${s} is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().`);return o}else{let a=e;if(a.className==null||a.config==null)throw new G(`${s}: Improper config format: ${JSON.stringify(a)}. -'className' and 'config' must set.`);let o=a.className,i,l;if(o in n?[i,l]=n[o]:o in Ns?[i,l]=Ns.className:o in t&&([i,l]=t[o]),i==null)throw new G(`Unknown ${s}: ${o}. This may be due to one of the following reasons: -1. The ${s} is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code. -2. The custom ${s} is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().`);if(l!=null){let u={};for(let p of Object.keys(Ns))u[p]=Ns[p];for(let p of Object.keys(n))u[p]=n[p];let c=a.config;c.customObjects=u;let d=Object.assign({},Ns);for(let p of Object.keys(n))Ns[p]=n[p];lA(a.config);let h=l(i,a.config,n,r);return Ns=Object.assign({},d),h}else{let u=Object.assign({},Ns);for(let d of Object.keys(n))Ns[d]=n[d];let c=new i(a.config);return Ns=Object.assign({},u),c}}}function wO(e,t){return et?1:0}function kp(e,t){return-1*wO(e,t)}function na(e){if(e==null)return e;let t=[];for(let n of e)t.indexOf(n)===-1&&t.push(n);return t}function kO(e){if(e==null)throw new G(`Invalid value in obj: ${JSON.stringify(e)}`);for(let t in e)if(e.hasOwnProperty(t))return!1;return!0}function Uo(e,t,n){if(n!=null&&e.indexOf(n)<0)throw new G(`${n} is not a valid ${t}. Valid values are ${e} or null/undefined.`)}function uA(e,t,n=0,s=1/0){return ar(n>=0),ar(s>=n),Array.isArray(e)&&e.length>=n&&e.length<=s&&e.every(r=>typeof r===t)}function Qt(e,t){Array.isArray(e)?(w.assert(e.length>0,()=>`${t} is unexpectedly an empty array.`),e.forEach((n,s)=>Qt(n,`element ${s+1} of ${t}`))):w.assert(Number.isInteger(e)&&e>0,()=>`Expected ${t} to be a positive integer, but got ${l3(e)}.`)}function l3(e){return e===null?"null":Array.isArray(e)?"["+e.map(t=>l3(t)).join(",")+"]":typeof e=="string"?`"${e}"`:`${e}`}function IO(e,t){let n=w.now(),s;return(...a)=>{let o=w.now();return o-nhn(ve(L(e,e),t,!0)))}var wc=class extends oe.Serializable{getConfig(){return{}}},dA=class extends wc{constructor(e){super();this.defaultMaxValue=2,this.defaultAxis=0,this.maxValue=e.maxValue!=null?e.maxValue:this.defaultMaxValue,this.axis=e.axis!=null?e.axis:this.defaultAxis}apply(e){return H(()=>{let t=cA(e,this.axis),n=Gn(t,0,this.maxValue);return L(e,de(n,ae(jt(),t)))})}getConfig(){return{maxValue:this.maxValue,axis:this.axis}}};dA.className="MaxNorm";oe.registerClass(dA);var hA=class extends wc{constructor(e){super();this.defaultAxis=0,this.axis=e.axis!=null?e.axis:this.defaultAxis}apply(e){return H(()=>de(e,ae(jt(),cA(e,this.axis))))}getConfig(){return{axis:this.axis}}};hA.className="UnitNorm";oe.registerClass(hA);var pA=class extends wc{apply(e){return sr(e)}};pA.className="NonNeg";oe.registerClass(pA);var fA=class extends wc{constructor(e){super();this.defaultMinValue=0,this.defaultMaxValue=1,this.defaultRate=1,this.defaultAxis=0,this.minValue=e.minValue!=null?e.minValue:this.defaultMinValue,this.maxValue=e.maxValue!=null?e.maxValue:this.defaultMaxValue,this.rate=e.rate!=null?e.rate:this.defaultRate,this.axis=e.axis!=null?e.axis:this.defaultAxis}apply(e){return H(()=>{let t=cA(e,this.axis),n=ae(L(this.rate,Gn(t,this.minValue,this.maxValue)),L(1-this.rate,t));return L(e,de(n,ae(jt(),t)))})}getConfig(){return{minValue:this.minValue,maxValue:this.maxValue,rate:this.rate,axis:this.axis}}};fA.className="MinMaxNorm";oe.registerClass(fA);var c3={maxNorm:"MaxNorm",minMaxNorm:"MinMaxNorm",nonNeg:"NonNeg",unitNorm:"UnitNorm"};function qt(e){return iA(e)}function d3(e,t={}){return vc(e,oe.SerializationMap.getMap().classNameMap,t,"constraint")}function Xt(e){if(e==null)return null;if(typeof e=="string"){let n={className:e in c3?c3[e]:e,config:{}};return d3(n)}else return e instanceof wc?e:d3(e)}function SO(e){return new dA(e)}function CO(e){return new hA(e)}function TO(){return new pA}function NO(e){return new fA(e)}var h3={};Pe(h3,{constant:()=>YO,glorotNormal:()=>rP,glorotUniform:()=>sP,heNormal:()=>aP,heUniform:()=>oP,identity:()=>tP,leCunNormal:()=>iP,leCunUniform:()=>lP,ones:()=>ZO,orthogonal:()=>uP,randomNormal:()=>QO,randomUniform:()=>JO,truncatedNormal:()=>eP,varianceScaling:()=>nP,zeros:()=>KO});var EO=["channelsFirst","channelsLast"],RO=["nearest","bilinear"],_O=["valid","same","causal"],DO=["max","avg"],$O=["sum","mul","concat","ave"],Hl=new Map;function Ft(e){Uo(EO,"DataFormat",e)}function FO(e){Uo(RO,"InterpolationFormat",e)}function gs(e){Uo(_O,"PaddingMode",e)}function p3(e){Uo(DO,"PoolMode",e)}var kc=[],f3="/";function Ho(e,t){kc.push(e);try{let n=t();return kc.pop(),n}catch(n){throw kc.pop(),n}}function OO(){return kc.length===0?"":kc.join(f3)+f3}function m3(e){if(!A3(e))throw new Error("Not a valid tensor name: '"+e+"'");return OO()+e}function g3(e){if(!A3(e))throw new Error("Not a valid tensor name: '"+e+"'");Hl.has(e)||Hl.set(e,0);let t=Hl.get(e);if(Hl.set(e,Hl.get(e)+1),t>0){let n=`${e}_${t}`;return Hl.set(n,1),n}else return e}var PO=new RegExp(/^[A-Za-z0-9][-A-Za-z0-9\._\/]*$/);function A3(e){return!!e.match(PO)}function MO(e){return e===parseInt(e.toString(),10)}function sa(e,t,n){t==null&&(t=0),n==null&&(n=e.length);let s=1;for(let r=t;rt&&(t=s)}return t}function Bs(e,t){if(t{if(e.shape.length!==2)throw new G(`repeat() expects a rank-2 tensor, but received a rank-${e.shape.length} tensor.`);let n=Ic(e,1);return AA(n,[1,t,1])})}function LO(e){let t=[sa(e.shape)];return U(e,t)}function BO(e){if(e.rank<=1)throw new G(`batchFlatten requires a minimum rank of 2. Got rank: ${e.rank}.`);let t=[e.shape[0],sa(e.shape,1)];return U(e,t)}function Go(e,t,n){return H(()=>{switch(e.rank){case 1:return ap(e,t,n);case 2:return Xg(e,[t,0],[n,e.shape[1]]);case 3:return op(e,[t,0,0],[n,e.shape[1],e.shape[2]]);case 4:return gc(e,[t,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3]]);case 5:return Re(e,[t,0,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3],e.shape[4]]);case 6:return Re(e,[t,0,0,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3],e.shape[4],e.shape[5]]);default:throw new G(`sliceAlongFirstAxis() received an unsupported tensor rank: ${e.rank}`)}})}function mA(e,t,n){return H(()=>{switch(e.rank){case 1:return ap(e,t,n);case 2:return Xg(e,[0,t],[e.shape[0],n]);case 3:return op(e,[0,0,t],[e.shape[0],e.shape[1],n]);case 4:return gc(e,[0,0,0,t],[e.shape[0],e.shape[1],e.shape[2],n]);default:throw new G(`sliceAlongLastAxis() received an unsupported tensor rank: ${e.rank}`)}})}function Sp(e,t,n,s){return H(()=>{switch(e.rank){case 1:return ap(e,t,n);case 2:switch(s){case 1:return Go(e,t,n);case 2:return mA(e,t,n);default:throw new G(`The axis is not within the rank of the tensor ${s}`)}case 3:switch(s){case 1:return Go(e,t,n);case 2:return op(e,[0,t,0],[e.shape[0],n,e.shape[2]]);case 3:return mA(e,t,n);default:throw new G(`The axis is not within the rank of the tensor ${s}`)}case 4:switch(s){case 1:return Go(e,t,n);case 2:return gc(e,[0,t,0,0],[e.shape[0],n,e.shape[2],e.shape[3]]);case 3:return gc(e,[0,0,t,0],[e.shape[0],e.shape[1],n,e.shape[3]]);case 4:return mA(e,t,n);default:throw new G(`The axis is not within the rank of the tensor ${s}`)}default:throw new G(`sliceAlongLastAxis() received an unsupported tensor rank: ${e.rank}`)}})}function gA(e,t=-1){let n;return t<0&&(n=e[0].rank,n!==0?t=n:t=0),t===e[0].rank&&(t=-1),ft(e,t)}function y3(e,t){switch(e.rank){case 1:return Zx([e,t]);case 2:return Pl([e,t],0);case 3:return Yx([e,t],0);case 4:return Jx([e,t],0);default:throw new G(`concatAlongFirstAxis() received an unsupported tensor rank: ${e.rank}`)}}function AA(e,t){if(Array.isArray(t)||(t=[t]),e.rank!==t.length)throw new G(`The length of input n (${t.length}) does not match the number of dimensions in input x (${e.rank})`);return Ts(e,t)}function Cp(e,t=0,n=1,s,r){return bb(e,t,n,s,r)}function or(e,t,n,s){if(e.rank<2||t.rank<2)throw new Oe(`dot requires both inputs to be rank >= 2 but got x shape = ${e.shape} and y shape = ${t.shape}`);if(t.rank>=3){let r=e.shape.slice(-1)[0],a=t.shape.slice(-2)[0];if(r!==a)throw new Oe(`If rank y >= 3, then the second last dim of y must equal the last dim of x but got x shape = ${e.shape} and y shape = ${t.shape}`)}if(e.rank===2&&t.rank===2){let r=!1,a=!1;return ta.matMul({a:e,b:t,transposeA:r,transposeB:a,bias:s?yA(e.rank,s,zs()):null,activation:n})}else{let r=e.shape.slice(),a=r.pop();e=U(e,[-1,a]);let o=t.shape.slice(),i=o.pop(),l=o.pop(),u=[...o,i],c=Array.from({length:t.rank},(f,m)=>m===0?t.rank-2:m<=t.rank-2?m-1:m);t=U(Xe(t,c),[l,-1]);let d=[...r,...u],h=!1,p=!1;return U(ta.matMul({a:e,b:t,transposeA:h,transposeB:p,bias:s?yA(e.rank,s,zs()):null,activation:n}),d)}}function x3(e,t,n){return H(()=>(Array.isArray(t)?t=Mt(t,"int32"):t=ce(t,"int32"),zl(e,t,n)))}function Sc(e){return L(e,e)}function yA(e,t,n){let s=t.shape;if(t.rank!==1&&t.rank!==e)throw new G(`Unexpected bias dimensions: ${t.rank}; expected it to be 1 or ${e}`);if(e===5){if(n==="channelsFirst")return s.length===1?U(t,[1,s[0],1,1,1]):U(t,[1,s[3],s[0],s[1],s[2]]);if(n==="channelsLast")return s.length===1?U(t,[1,1,1,1,s[0]]):U(t,[1].concat(s))}else if(e===4){if(n==="channelsFirst")return s.length===1?U(t,[1,s[0],1,1]):U(t,[1,s[2],s[0],s[1]]);if(n==="channelsLast")return s.length===1?U(t,[1,1,1,s[0]]):U(t,[1].concat(s))}else if(e===3){if(n==="channelsFirst")return s.length===1?U(t,[1,s[0],1]):U(t,[1,s[1],s[0]]);if(n==="channelsLast")return s.length===1?U(t,[1,1,s[0]]):U(t,[1].concat(s))}else if(e<3)return t;throw new G(`Unsupported input rank by biasAdd: ${t.rank}`)}function Ws(e,t,n){return H(()=>(n==null&&(n=zs()),Ft(n),ae(e,yA(e.rank,t,n))))}function WO(e,t=1){if(t!==1)throw new Oe(`Support for alpha values other than 1 (${t}) is not implemented yet.`);return hc(e)}function VO(e){return H(()=>de(e,ae(Ht(e),1)))}function b3(e,t,n,s){return H(()=>Fb(e,t,n,s))}function UO(e){return H(()=>{let t=ae(.5,L(.2,e));return Gn(t,0,1)})}function Cc(e,t,n=!1){return n?e():t()}var HO=["fanIn","fanOut","fanAvg"],GO=["normal","uniform","truncatedNormal"];function jO(e){Uo(HO,"FanMode",e)}function qO(e){Uo(GO,"Distribution",e)}var Es=class extends oe.Serializable{fromConfigUsesCustomObjects(){return!1}getConfig(){return{}}},xA=class extends Es{apply(e,t){return Pt(e,t)}};xA.className="Zeros";oe.registerClass(xA);var Tp=class extends Es{apply(e,t){return qn(e,t)}};Tp.className="Ones";oe.registerClass(Tp);var bA=class extends Es{constructor(e){super();if(typeof e!="object")throw new G(`Expected argument of type ConstantConfig but got ${e}`);if(e.value===void 0)throw new G(`config must have value set but got ${e}`);this.value=e.value}apply(e,t){return H(()=>L(Ie(this.value),qn(e,t)))}getConfig(){return{value:this.value}}};bA.className="Constant";oe.registerClass(bA);var vA=class extends Es{constructor(e){super();this.DEFAULT_MINVAL=-.05,this.DEFAULT_MAXVAL=.05,this.minval=e.minval||this.DEFAULT_MINVAL,this.maxval=e.maxval||this.DEFAULT_MAXVAL,this.seed=e.seed}apply(e,t){return Wl(e,this.minval,this.maxval,t)}getConfig(){return{minval:this.minval,maxval:this.maxval,seed:this.seed}}};vA.className="RandomUniform";oe.registerClass(vA);var wA=class extends Es{constructor(e){super();this.DEFAULT_MEAN=0,this.DEFAULT_STDDEV=.05,this.mean=e.mean||this.DEFAULT_MEAN,this.stddev=e.stddev||this.DEFAULT_STDDEV,this.seed=e.seed}apply(e,t){if(t=t||"float32",t!=="float32"&&t!=="int32")throw new Oe(`randomNormal does not support dType ${t}.`);return Cp(e,this.mean,this.stddev,t,this.seed)}getConfig(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}}};wA.className="RandomNormal";oe.registerClass(wA);var kA=class extends Es{constructor(e){super();this.DEFAULT_MEAN=0,this.DEFAULT_STDDEV=.05,this.mean=e.mean||this.DEFAULT_MEAN,this.stddev=e.stddev||this.DEFAULT_STDDEV,this.seed=e.seed}apply(e,t){if(t=t||"float32",t!=="float32"&&t!=="int32")throw new Oe(`truncatedNormal does not support dType ${t}.`);return cp(e,this.mean,this.stddev,t,this.seed)}getConfig(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}}};kA.className="TruncatedNormal";oe.registerClass(kA);var IA=class extends Es{constructor(e){super();this.gain=e.gain!=null?e.gain:1}apply(e,t){return H(()=>{if(e.length!==2||e[0]!==e[1])throw new G("Identity matrix initializer can only be used for 2D square matrices.");return L(this.gain,Dg(e[0]))})}getConfig(){return{gain:this.gain}}};IA.className="Identity";oe.registerClass(IA);function XO(e,t="channelsLast"){let n,s;if(Ft(t),e.length===2)n=e[0],s=e[1];else if([3,4,5].indexOf(e.length)!==-1){if(t==="channelsFirst"){let r=sa(e,2);n=e[1]*r,s=e[0]*r}else if(t==="channelsLast"){let r=sa(e,0,e.length-2);n=e[e.length-2]*r,s=e[e.length-1]*r}}else{let r=sa(e);n=Math.sqrt(r),s=Math.sqrt(r)}return[n,s]}var Fn=class extends Es{constructor(e){super();if(e.scale<0)throw new G(`scale must be a positive float. Got: ${e.scale}`);this.scale=e.scale==null?1:e.scale,this.mode=e.mode==null?"fanIn":e.mode,jO(this.mode),this.distribution=e.distribution==null?"normal":e.distribution,qO(this.distribution),this.seed=e.seed}apply(e,t){let n=XO(e),s=n[0],r=n[1],a=this.scale;if(this.mode==="fanIn"?a/=Math.max(1,s):this.mode==="fanOut"?a/=Math.max(1,r):a/=Math.max(1,(s+r)/2),this.distribution==="normal"){let o=Math.sqrt(a);if(t=t||"float32",t!=="float32"&&t!=="int32")throw new Oe(`${this.getClassName()} does not support dType ${t}.`);return cp(e,0,o,t,this.seed)}else{let o=Math.sqrt(3*a);return Wl(e,-o,o,t)}}getConfig(){return{scale:this.scale,mode:this.mode,distribution:this.distribution,seed:this.seed}}};Fn.className="VarianceScaling";oe.registerClass(Fn);var Np=class extends Fn{constructor(e){super({scale:1,mode:"fanAvg",distribution:"uniform",seed:e==null?null:e.seed})}getClassName(){return Fn.className}};Np.className="GlorotUniform";oe.registerClass(Np);var Ep=class extends Fn{constructor(e){super({scale:1,mode:"fanAvg",distribution:"normal",seed:e==null?null:e.seed})}getClassName(){return Fn.className}};Ep.className="GlorotNormal";oe.registerClass(Ep);var Rp=class extends Fn{constructor(e){super({scale:2,mode:"fanIn",distribution:"normal",seed:e==null?null:e.seed})}getClassName(){return Fn.className}};Rp.className="HeNormal";oe.registerClass(Rp);var _p=class extends Fn{constructor(e){super({scale:2,mode:"fanIn",distribution:"uniform",seed:e==null?null:e.seed})}getClassName(){return Fn.className}};_p.className="HeUniform";oe.registerClass(_p);var Dp=class extends Fn{constructor(e){super({scale:1,mode:"fanIn",distribution:"normal",seed:e==null?null:e.seed})}getClassName(){return Fn.className}};Dp.className="LeCunNormal";oe.registerClass(Dp);var $p=class extends Fn{constructor(e){super({scale:1,mode:"fanIn",distribution:"uniform",seed:e==null?null:e.seed})}getClassName(){return Fn.className}};$p.className="LeCunNormal";oe.registerClass($p);var SA=class extends Es{constructor(e){super();if(this.DEFAULT_GAIN=1,this.gain=e.gain==null?this.DEFAULT_GAIN:e.gain,this.seed=e.seed,this.seed!=null)throw new Oe("Random seed is not implemented for Orthogonal Initializer yet.")}apply(e,t){return H(()=>{if(e.length<2)throw new Oe("Shape must be at least 2D.");e[0]*e[1]>2e3&&console.warn(`Orthogonal initializer is being called on a matrix with more than 2000 (${e[0]*e[1]}) elements: Slowness may result.`);let n=e[0]>e[1]?[e[1],e[0]]:e,s=Cp(n,0,1,"float32"),r=Gb.gramSchmidt(s);return e[0]>e[1]&&(r=Xe(r)),L(this.gain,r)})}getConfig(){return{gain:this.gain,seed:this.seed}}};SA.className="Orthogonal";oe.registerClass(SA);var v3={constant:"Constant",glorotNormal:"GlorotNormal",glorotUniform:"GlorotUniform",heNormal:"HeNormal",heUniform:"HeUniform",identity:"Identity",leCunNormal:"LeCunNormal",leCunUniform:"LeCunUniform",ones:"Ones",orthogonal:"Orthogonal",randomNormal:"RandomNormal",randomUniform:"RandomUniform",truncatedNormal:"TruncatedNormal",varianceScaling:"VarianceScaling",zeros:"Zeros"};function w3(e,t={}){return vc(e,oe.SerializationMap.getMap().classNameMap,t,"initializer")}function Nt(e){return iA(e)}function wt(e){if(typeof e=="string"){let t=e in v3?v3[e]:e;if(t==="GlorotNormal")return new Ep;if(t==="GlorotUniform")return new Np;if(t==="HeNormal")return new Rp;if(t==="HeUniform")return new _p;if(t==="LeCunNormal")return new Dp;if(t==="LeCunUniform")return new $p;{let n={};return n.className=t,n.config={},w3(n)}}else return e instanceof Es?e:w3(e)}function KO(){return new xA}function ZO(){return new Tp}function YO(e){return new bA(e)}function JO(e){return new vA(e)}function QO(e){return new wA(e)}function eP(e){return new kA(e)}function tP(e){return new IA(e)}function nP(e){return new Fn(e)}function sP(e){return new Np(e)}function rP(e){return new Ep(e)}function aP(e){return new Rp(e)}function oP(e){return new _p(e)}function iP(e){return new Dp(e)}function lP(e){return new $p(e)}function uP(e){return new SA(e)}var k3={};Pe(k3,{Layer:()=>Ze,RNN:()=>ur,RNNCell:()=>Oc,activation:()=>GM,add:()=>ez,alphaDropout:()=>Mz,average:()=>tz,averagePooling1d:()=>U1,averagePooling2d:()=>H1,averagePooling3d:()=>G1,avgPool1d:()=>cz,avgPool2d:()=>hz,avgPool3d:()=>fz,avgPooling1d:()=>dz,avgPooling2d:()=>pz,avgPooling3d:()=>mz,batchNormalization:()=>iz,bidirectional:()=>Ez,concatenate:()=>nz,conv1d:()=>PM,conv2d:()=>MM,conv2dTranspose:()=>zM,conv3d:()=>LM,conv3dTranspose:()=>BM,convLstm2d:()=>Sz,convLstm2dCell:()=>Cz,cropping2D:()=>VM,dense:()=>jM,depthwiseConv2d:()=>HM,dot:()=>oz,dropout:()=>qM,elu:()=>RM,embedding:()=>QM,flatten:()=>KM,gaussianDropout:()=>Pz,gaussianNoise:()=>Oz,globalAveragePooling1d:()=>gz,globalAveragePooling2d:()=>Az,globalMaxPool1d:()=>_z,globalMaxPool2d:()=>Dz,globalMaxPooling1d:()=>Dv,globalMaxPooling2d:()=>$v,gru:()=>xz,gruCell:()=>bz,input:()=>nv,inputLayer:()=>EM,layerNormalization:()=>lz,leakyReLU:()=>DM,lstm:()=>vz,lstmCell:()=>wz,masking:()=>zz,maxPool1d:()=>$z,maxPool2d:()=>Fz,maxPooling1d:()=>Fv,maxPooling2d:()=>Ov,maxPooling3d:()=>yz,maximum:()=>sz,minimum:()=>rz,multiply:()=>az,permute:()=>JM,prelu:()=>$M,reLU:()=>_M,repeatVector:()=>ZM,reshape:()=>YM,rnn:()=>Tz,separableConv2d:()=>WM,simpleRNN:()=>kz,simpleRNNCell:()=>Iz,softmax:()=>FM,spatialDropout1d:()=>XM,stackedRNNCells:()=>Nz,thresholdedReLU:()=>OM,timeDistributed:()=>Rz,upSampling2d:()=>UM,zeroPadding2d:()=>uz});var cP=0;function I3(){return cP++}var Fp={};function Op(e=""){return e in Fp||(Fp[e]=0),Fp[e]+=1,e+Fp[e].toString()}function CA(e){return Array.isArray(e)&&Array.isArray(e[0])}function Pp(e){return e.length===0?[]:Array.isArray(e[0])?e:[e]}function ze(e){let t;if(Array.isArray(e)){if(e.length!==1)throw new G(`Expected Tensor length to be 1; got ${e.length}`);t=e[0]}else t=e;return t}function at(e){if(Array.isArray(e)&&Array.isArray(e[0])){if(e.length===1)return e=e,e[0];throw new G(`Expected exactly 1 Shape; got ${e.length}`)}else return e}function Mp(e){let t=0;for(let n of e)n.shape.length===0?t+=1:t+=n.shape.reduce((s,r)=>s*r);return t}var S3="Variable",C3=class{constructor(e,t="float32",n=S3,s=!0,r=null){this.dtype=t==null?"float32":t,this.shape=e.shape,this.id=I3(),n=n==null?S3:n,this.originalName=m3(n),this.name=g3(this.originalName),this.trainable_=s,this.constraint=r,this.val=Eb(e,this.trainable_,this.name,this.dtype)}read(){return this.assertNotDisposed(),this.val}write(e){return this.assertNotDisposed(),dP(this.val,e),this.val.id!==e.id&&(this.val.assign(e),this.constraint!=null&&this.val.assign(this.constraint.apply(this.val))),this}dispose(){this.assertNotDisposed(),this.val.dispose()}assertNotDisposed(){if(this.val.isDisposed)throw new Error(`LayersVariable ${this.name} is already disposed.`)}get trainable(){return this.trainable_}set trainable(e){this.trainable_=e,this.val.trainable=e}};function dP(e,t){if(e.shape.toString()!==t.shape.toString())throw new Error("Shape mismatch: "+JSON.stringify(e.shape)+" vs. "+JSON.stringify(t.shape))}function TA(e){return e.map(t=>t.read())}function NA(e){e.forEach(t=>{t[0].write(t[1])})}var zt=class{constructor(e){this.dtype=e.dtype,this.shape=e.shape,e.shape!=null?this.ndim=e.shape.length:this.ndim=e.ndim,this.maxNDim=e.maxNDim,this.minNDim=e.minNDim,this.axes=e.axes||{}}},Vs=class{constructor(e,t,n,s,r,a,o){this.dtype=e,this.shape=t,this.sourceLayer=n,this.inputs=s,this.callArgs=r,this.outputTensorIndex=o,this.id=I3(),a!=null&&(this.originalName=m3(a),this.name=g3(this.originalName)),this.rank=t.length}},hP=0,zp=class{constructor(e,t){this.callArgs=t,this.id=hP++,this.outboundLayer=e.outboundLayer,this.inboundLayers=e.inboundLayers,this.nodeIndices=e.nodeIndices,this.tensorIndices=e.tensorIndices,this.inputTensors=e.inputTensors,this.outputTensors=e.outputTensors,this.inputMasks=e.inputMasks,this.outputMasks=e.outputMasks,this.inputShapes=e.inputShapes,this.outputShapes=e.outputShapes;for(let n of e.inboundLayers)n!=null&&n.outboundNodes.push(this);e.outboundLayer.inboundNodes.push(this)}getConfig(){let e=[];for(let t of this.inboundLayers)t!=null?e.push(t.name):e.push(null);return{outboundLayer:this.outboundLayer?this.outboundLayer.name:null,inboundLayers:e,nodeIndices:this.nodeIndices,tensorIndices:this.tensorIndices}}},pP=0,Ze=class extends oe.Serializable{constructor(e={}){super();this._callHook=null,this._addedWeightNames=[],this._stateful=!1,this.id=pP++,this.activityRegularizer=null,this.inputSpec=null,this.supportsMasking=!1,this._trainableWeights=[],this._nonTrainableWeights=[],this._losses=[],this._updates=[],this._built=!1,this.inboundNodes=[],this.outboundNodes=[];let t=e.name;if(!t){let n=this.getClassName();t=Tr(n)+"_"+Op(n)}if(this.name=t,this.trainable_=e.trainable==null?!0:e.trainable,e.inputShape!=null||e.batchInputShape!=null){let n;if(e.batchInputShape!=null)n=e.batchInputShape;else if(e.inputShape!=null){let r=null;e.batchSize!=null&&(r=e.batchSize),n=[r].concat(e.inputShape)}this.batchInputShape=n;let s=e.dtype;s==null&&(s=e.inputDType),s==null&&(s="float32"),this.dtype=s}e.weights!=null?this.initialWeights=e.weights:this.initialWeights=null,this._refCount=null,this.fastWeightInitDuringBuild=!1}static nodeKey(e,t){return e.name+"_ib-"+t.toString()}getNodeAtIndex(e,t){if(this.inboundNodes.length===0)throw new Ls(`The layer has never been called and thus has no defined ${t}.`);if(this.inboundNodes.length<=e)throw new G(`Asked to get ${t} at node ${e}, but the layer has only ${this.inboundNodes.length} inbound nodes.`);return this.inboundNodes[e]}getInputAt(e){return $n(this.getNodeAtIndex(e,"input").inputTensors)}getOutputAt(e){return $n(this.getNodeAtIndex(e,"output").outputTensors)}get input(){if(this.inboundNodes.length>1)throw new Cr(`Layer ${this.name} has multiple inbound nodes, hence the notion of "layer input" is ill-defined. Use \`getInputAt(nodeIndex)\` instead.`);if(this.inboundNodes.length===0)throw new Cr(`Layer ${this.name} is not connected, no input to return.`);return $n(this.getNodeAtIndex(0,"input").inputTensors)}get output(){if(this.inboundNodes.length===0)throw new Cr(`Layer ${this.name} has no inbound nodes.`);if(this.inboundNodes.length>1)throw new Cr(`Layer ${this.name} has multiple inbound nodes, hence the notion of "layer output" is ill-defined. Use \`getOutputAt(nodeIndex)\` instead.`);return $n(this.getNodeAtIndex(0,"output").outputTensors)}get losses(){return this._losses}calculateLosses(){return this.losses.map(e=>e())}get updates(){return this._updates}get built(){return this._built}set built(e){this._built=e}get trainable(){return this.trainable_}set trainable(e){this._trainableWeights.forEach(t=>t.trainable=e),this.trainable_=e}get trainableWeights(){return this.trainable_?this._trainableWeights.filter(e=>e.trainable):[]}set trainableWeights(e){this._trainableWeights=e}get nonTrainableWeights(){return this.trainable?this._trainableWeights.filter(e=>!e.trainable).concat(this._nonTrainableWeights):this._trainableWeights.concat(this._nonTrainableWeights)}set nonTrainableWeights(e){this._nonTrainableWeights=e}get weights(){return this.trainableWeights.concat(this.nonTrainableWeights)}get stateful(){return this._stateful}resetStates(){if(!this.stateful)throw new Error("Cannot call the resetStates() method of a non-stateful Layer object.")}assertInputCompatibility(e){if(e=yt(e),this.inputSpec==null||this.inputSpec.length===0)return;let t=yt(this.inputSpec);if(e.length!==t.length)throw new G(`Layer ${this.name} expects ${t.length} inputs, but it received ${e.length} input tensors. Input received: ${e}`);for(let n=0;nr.maxNDim)throw new G(`Input ${n} is incompatible with layer ${this.name}: expected max_ndim=${r.maxNDim}, found ndim=${a}`);if(r.minNDim!=null&&a=0?o[l]:o[o.length+l];if(u!=null&&[u,null].indexOf(c)===-1)throw new G(`Input ${n} is incompatible with layer ${this.name}: expected axis ${l} of input shape to have value ${u} but got shape ${o}.`)}}if(r.shape!=null)for(let o=0;o{if(!this.built){this.assertInputCompatibility(e);let a=[];for(let o of yt(e))a.push(o.shape);this.build($n(a)),this.built=!0,this.initialWeights&&this.setWeights(this.initialWeights),this._refCount===null&&r&&(this._refCount=1)}if(this.assertInputCompatibility(e),r){let a=this.call(e,t),o=yt(a),i=[];for(let l of o)n.indexOf(l)!==-1&&(l=l.clone()),i.push(l);if(a=$n(i),this.activityRegularizer!=null)throw new Oe("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return a}else{let a=fP(e),o=this.computeOutputShape(a),i,l=mP(e);if(this.warnOnIncompatibleInputShape(Array.isArray(e)?a[0]:a),o!=null&&o.length>0&&Array.isArray(o[0])?i=o.map((u,c)=>new Vs(l,u,this,yt(e),t,this.name,c)):i=new Vs(l,o,this,yt(e),t,this.name),this.addInboundNode(e,i,null,null,a,o,t),this._refCount++,this.activityRegularizer!=null)throw new Oe("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return i}})}warnOnIncompatibleInputShape(e){if(this.batchInputShape!=null)if(e.length!==this.batchInputShape.length)console.warn(`The rank of the input tensor provided (shape: ${JSON.stringify(e)}) does not match that of the batchInputShape (${JSON.stringify(this.batchInputShape)}) of the layer ${this.name}`);else{let t=!1;this.batchInputShape.forEach((n,s)=>{n!=null&&e[s]!=null&&e[s]!==n&&(t=!0)}),t&&console.warn(`The shape of the input tensor (${JSON.stringify(e)}) does not match the expectation of layer ${this.name}: ${JSON.stringify(this.batchInputShape)}`)}}get outputShape(){if(this.inboundNodes==null||this.inboundNodes.length===0)throw new Cr(`The layer ${this.name} has never been called and thus has no defined output shape.`);let e=[];for(let t of this.inboundNodes){let n=JSON.stringify(t.outputShapes);e.indexOf(n)===-1&&e.push(n)}if(e.length===1){let t=this.inboundNodes[0].outputShapes;return Array.isArray(t)&&Array.isArray(t[0])&&t.length===1?t[0]:t}else throw new Cr(`The layer ${this.name} has multiple inbound nodes with different output shapes. Hence the notion of "output shape" is ill-defined for the layer.`)}countParams(){if(!this.built)throw new Ls(`You tried to call countParams() on ${this.name}, but the layer is not built yet. Build it first by calling build(batchInputShape).`);return Mp(this.weights)}build(e){this.built=!0}getWeights(e=!1){return TA(e?this.trainableWeights:this.weights)}setWeights(e){H(()=>{let t=this.weights;if(t.length!==e.length)throw new G(`You called setWeights(weights) on layer "${this.name}" with a weight list of length ${e.length}, but the layer was expecting ${t.length} weights. Provided weights: ${e}...`);if(t.length===0)return;let n=[],s=TA(t);for(let r=0;rr.apply(l.read())),a==null&&(a=!0),a?this._trainableWeights.push(l):this._nonTrainableWeights.push(l),l}setFastWeightInitDuringBuild(e){this.fastWeightInitDuringBuild=e}addLoss(e){e==null||Array.isArray(e)&&e.length===0||(e=yt(e),this._losses!==void 0&&this._losses!==null&&this.losses.push(...e))}computeOutputShape(e){return e}computeMask(e,t){if(!this.supportsMasking){if(t!=null)if(Array.isArray(t))t.forEach(n=>{if(n!=null)throw new TypeError(`Layer ${this.name} does not support masking, but was passed an inputMask.`)});else throw new TypeError(`Layer ${this.name} does not support masking, but was passed an inputMask.`);return null}return t}addInboundNode(e,t,n,s,r,a,o=null){let i=yt(e);t=yt(t),n=yt(n),s=yt(s),r=Pp(r),a=Pp(a);let l=[],u=[],c=[];for(let d of i)l.push(d.sourceLayer),u.push(d.nodeIndex),c.push(d.tensorIndex);new zp({outboundLayer:this,inboundLayers:l,nodeIndices:u,tensorIndices:c,inputTensors:i,outputTensors:t,inputMasks:n,outputMasks:s,inputShapes:r,outputShapes:a},o);for(let d=0;de.dispose()),this.weights.length}assertNotDisposed(){if(this._refCount===0)throw new Error(`Layer '${this.name}' is already disposed.`)}dispose(){if(!this.built)throw new Error(`Cannot dispose Layer ${this.name} because it has not been built yet.`);if(this._refCount===null)throw new Error(`Cannot dispose Layer ${this.name} because it has not been used yet.`);this.assertNotDisposed();let e=0;return--this._refCount==0&&(e=this.disposeWeights()),{refCountAfterDispose:this._refCount,numDisposedVariables:e}}};function fP(e){e=yt(e);let t=[];for(let n of e)t.push(n.shape);return $n(t)}function mP(e){return"float32"}function T3(e,t,n){if((t==null||n!=null&&n>0)&&(t=e.sourceLayer,n=e.nodeIndex),t.inboundNodes.length===0)return[e];{let s=t.inboundNodes[n];if(s.inboundLayers.length===0)return s.inputTensors;{let r=[];for(let a=0;a0){let r=await Promise.all(t);for(let a=0;aae(this.totals[s],L(r,n)));this.totals[s]=o,a!=null&&a.dispose()}}}async onEpochEnd(e,t){if(t!=null)for(let n of this.params.metrics)this.totals[n]!=null&&(typeof this.totals[n]=="number"?t[n]=this.totals[n]/this.seen:H(()=>{let s=L(de(1,this.seen),this.totals[n]);t[n]=s,this.totals[n].dispose(),Jt(t[n])}))}},D3=class extends ql{async onTrainBegin(e){this.epoch=[],this.history={}}async onEpochEnd(e,t){t==null&&(t={}),this.epoch.push(e);for(let n in t)this.history[n]==null&&(this.history[n]=[]),this.history[n].push(t[n])}async syncData(){let e=[],t=[],n=[];for(let r in this.history){let a=this.history[r];for(let o=0;onew $3(s,t))}var Rs=class{constructor(){}static registerCallbackConstructor(e,t){w.assert(e>=0&&Number.isInteger(e),()=>`Verbosity level is expected to be an integer >= 0, but got ${e}`),Rs.checkForDuplicate(t),Rs.constructors[e]==null&&(Rs.constructors[e]=[]),Rs.constructors[e].push(t)}static checkForDuplicate(e){for(let t in Rs.constructors)Rs.constructors[+t].forEach(s=>{if(s===e)throw new G("Duplicate callback constructor.")})}static clear(){Rs.constructors={}}static createCallbacks(e){let t=[];for(let n in Rs.constructors){let s=+n;e>=s&&t.push(...Rs.constructors[s])}return t.map(n=>new n)}};Rs.constructors={};function O3(e,t,n,s,r,a,o,i,l){let u=new D3,c=[new AP,...Rs.createCallbacks(t)];e!=null&&c.push(...e),c.push(u);let d=new _3(c);return d.setParams({epochs:n,initialEpoch:s,samples:r,steps:a,batchSize:o,verbose:t,doValidation:i,metrics:l}),{callbackList:d,history:u}}function Us(e,t={},n=!1){return vc(e,oe.SerializationMap.getMap().classNameMap,t,"layer",n)}function Lp(e,t){return H(()=>{e.dtype!=="float32"&&(e=ce(e,"float32"));let n=ve(Sc(e),t,!0),s=Ml(n.shape,jt()),r=hn(kr(n,s));return de(e,r)})}function jo(e,t){return H(()=>_t(Sc(ge(t,e)),-1))}function Bp(e,t){return H(()=>_t(Ht(ge(t,e)),-1))}function Xl(e,t){return H(()=>{let n=ge(e,t),s=Gn(Ht(e),jt(),Number.MAX_VALUE),r=Ht(de(n,s));return L(100,_t(r,-1))})}function yP(e,t){return H(()=>{let n=Gn(t,jt(),Number.MAX_VALUE),s=ds(ae(1,n)),r=Gn(e,jt(),Number.MAX_VALUE),a=ds(ae(1,r));return _t(Sc(ge(s,a)),-1)})}function xP(e,t){return H(()=>{let n=kr(0,ge(1,L(e,t)));return _t(Sc(n),-1)})}function bP(e,t){return H(()=>{let n=kr(0,ge(1,L(e,t)));return _t(n,-1)})}function vP(e,t){return H(()=>{let n=ve(L(e,t),-1),s=hs(L(ge(1,e),t),-1);return kr(0,ae(1,ge(s,n)))})}function wP(e,t){return H(()=>{let n=Math.log(2),s=ge(t,e),r=ge(ae(s,Ll(L(-2,s))),n);return _t(r,-1)})}function Tc(e,t,n=!1){return H(()=>{if(n)t=ip(t);else{let s=ve(t,t.shape.length-1,!0);t=de(t,s)}return t=Gn(t,jt(),1-jt()),Tt(ve(L(ce(e,"float32"),ds(t)),t.shape.length-1))})}function Wp(e,t,n=!1){return H(()=>{let s=ce(pc(LO(e)),"int32");t=Gn(t,jt(),1-jt());let r=t.shape,a=U(lc(s,r[r.length-1]),r);return Tc(a,t,n)})}function kP(e,t){if(!w.arraysEqual(e.shape,t.shape))throw new G(`logits and labels must have the same shape, but got shapes ${JSON.stringify(e.shape)} and ${JSON.stringify(t.shape)}`);return H(()=>{let n=sr(t),s=Tt(Ht(t));return ae(ge(n,L(t,e)),Yh(cs(s)))})}function Vp(e,t){return H(()=>{let n;return n=Gn(t,jt(),1-jt()),n=ds(de(n,ge(1,n))),_t(kP(e,n),-1)})}function IP(e,t){return H(()=>{let n=Gn(e,jt(),1),s=Gn(t,jt(),1);return ve(L(e,ds(de(n,s))),-1)})}function SP(e,t){return H(()=>{let n=ds(ae(jt(),t));return _t(ge(t,L(e,n)),-1)})}function EA(e,t){return H(()=>{let n=Lp(e,-1),s=Lp(t,-1),r=L(n,s);return Tt(ve(r,-1))})}var Up={meanSquaredError:jo,meanAbsoluteError:Bp,meanAbsolutePercentageError:Xl,meanSquaredLogarithmicError:yP,squaredHinge:xP,hinge:bP,categoricalHinge:vP,logcosh:wP,categoricalCrossentropy:Tc,sparseCategoricalCrossentropy:Wp,binaryCrossentropy:Vp,kullbackLeiblerDivergence:IP,poisson:SP,cosineProximity:EA};function RA(e){if(typeof e=="string"){if(e in Up)return Up[e];let t=`Unknown loss ${e}`;throw e.toLowerCase().includes("softmaxcrossentropy")&&(t=`Unknown loss ${e}. Use "categoricalCrossentropy" as the string name for tf.losses.softmaxCrossEntropy`),new G(t)}else return e}function _A(e,t){return H(()=>{let n=L(.5,ps(t)),s=Ip(jn(t,n),e.dtype);return _t(us(e,s),-1)})}function DA(e,t){return H(()=>Ip(us(er(e,-1),er(t,-1)),"float32"))}function P3(e,t){return H(()=>ce(ve(Ps(us(e,1),us(t,1))),"float32"))}function CP(e,t){return H(()=>ce(ve(Ps(us(e,1),us(t,0))),"float32"))}function TP(e,t){return H(()=>ce(ve(Ps(us(e,0),us(t,1))),"float32"))}function M3(e,t){return H(()=>{let n=P3(e,t),s=TP(e,t),r=ae(n,s);return ce(bn(jn(r,0),de(n,r),0),"float32")})}function NP(e,t){return H(()=>{let n=P3(e,t),s=CP(e,t),r=ae(n,s);return ce(bn(jn(r,0),de(n,r),0),"float32")})}function z3(e,t){return Vp(e,t)}function L3(e,t){return e.rank===t.rank&&(e=lt(e,[e.rank-1])),t=er(t,-1),t.dtype!==e.dtype&&(t=ce(t,e.dtype)),ce(us(e,t),"float32")}var EP=jo,RP=jo,_P=Bp,DP=Bp,$P=Xl,FP=Xl,$A=Tc,OP=EA,B3=Wp,Hp={binaryAccuracy:_A,categoricalAccuracy:DA,precision:M3,categoricalCrossentropy:$A,sparseCategoricalCrossentropy:B3,mse:EP,MSE:RP,mae:_P,MAE:DP,mape:$P,MAPE:FP,cosine:OP};function PP(e){if(typeof e=="string"&&e in Hp)return Hp[e];if(typeof e!="string"&&e!=null)return e;throw new G(`Unknown metric ${e}`)}function Gp(e){if(ar(e!==null,`Unknown LossOrMetricFn ${e}`),typeof e=="string")return e;{let t;for(let n of Object.keys(Up))if(Up[n]===e){t=n;break}if(t!==void 0)return t;for(let n of Object.keys(Hp))if(Hp[n]===e){t=n;break}return t!==void 0?t:e.name}}function MP(e){let t={Adagrad:()=>Bo.adagrad(.01),Adadelta:()=>Bo.adadelta(1,.95,jt()),Adam:()=>Bo.adam(.001,.9,.999,jt()),Adamax:()=>Bo.adamax(.002,.9,.999,jt(),0),RMSProp:()=>Bo.rmsprop(.001,.9,0,jt()),SGD:()=>Bo.sgd(.01)};if(t.adagrad=t.Adagrad,t.adadelta=t.Adadelta,t.adam=t.Adam,t.adamax=t.Adamax,t.rmsprop=t.RMSProp,t.sgd=t.SGD,e in t)return t[e]();throw new G(`Unknown Optimizer ${e}`)}var W3=1*1024*1024;function V3(e,t,n=!1){if(e==null||typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype||!FA(e))throw new Error("User-defined metadata is expected to be a JSON object, but is not.");if(n){let s=JSON.stringify(e);s.length>W3&&console.warn(`User-defined metadata of model "${t}" is too large in size (length=${s.length} when serialized). It is not recommended to store such large objects in user-defined metadata. Please make sure its serialized length is <= ${W3}.`)}}function FA(e){if(e===null)return!0;if(typeof e=="object")if(Object.getPrototypeOf(e)===Object.prototype){let t=Object.keys(e);for(let n of t)if(typeof n!="string"||!FA(e[n]))return!1;return!0}else if(Array.isArray(e)){for(let t of e)if(!FA(t))return!1;return!0}else return!1;else{let t=typeof e;return t==="string"||t==="number"||t==="boolean"}}function zP(e,t,n,s=console.log){let r=BP(e),a=["Layer (type)","Output shape","Param #"];r?(t=t||65,n=n||[.45,.85,1]):(t=t||98,n=n||[.33,.55,.67,1]),n[n.length-1]<=1&&(n=n.map(c=>Math.floor(t*c)));let o;if(!r){a.push("Receives inputs"),o=[];for(let c in e.nodesByDepth)o.push(...e.nodesByDepth[c])}s("_".repeat(t)),jp(a,n,s),s("=".repeat(t));let i=e.layers;for(let c=0;c1||r.length===1&&r[0].inboundLayers.length>1){t=!1;break}s.push(...r)}if(t)for(let r of e.layers){let a=!1;for(let o of r.inboundNodes)if(s.indexOf(o)!==-1)if(a){t=!1;break}else a=!0;if(!t)break}return t}function jp(e,t,n=console.log){let s="";for(let r=0;r0&&(s=s.slice(0,s.length-1)+" "),s+=e[r],s=s.slice(0,t[r]),s+=" ".repeat(t[r]-s.length);n(s)}function WP(e,t,n){let s;try{s=JSON.stringify(e.outputShape)}catch(i){s="multiple"}let r=e.name,a=e.getClassName(),o=[`${r} (${a})`,s,e.countParams().toString()];jp(o,t,n)}function VP(e,t,n,s){let r;try{r=JSON.stringify(e.outputShape)}catch(c){r="multiple"}let a=[];for(let c of e.inboundNodes)if(!(n!=null&&n.length>0&&n.indexOf(c)===-1))for(let d=0;df.name),l=[],u=t.names();for(let f of i)u.indexOf(f)!==-1?l.push(t.getValue(f)):l.push(null);s!=null&&(s.maxNumTensors=-1/0,s.minNumTensors=1/0);let c=i.join(",")+"|"+t.names().join(","),d,h;if(MA[c]==null){let f=HP(o,t);d=f.sorted,h=f.recipientCounts,MA[c]=d,H3[c]=h}d=MA[c],h={},r||Object.assign(h,H3[c]);let p=new qo(t);for(let f=0;fs.maxNumTensors&&(s.maxNumTensors=_),_0,()=>"Expected at least one fetch, got none");let n=[],s={};if(e.length===1){let r=G3(e[0],t);n=r.sorted,s=r.recipientMap}else{let r=new Set;for(let a of e){let{sorted:o,recipientMap:i}=G3(a,t);for(let l of o)r.has(l.name)||(n.push(l),r.add(l.name));for(let l in i)s[l]==null&&(s[l]=new Set),i[l].forEach(u=>s[l].add(u))}}return{sorted:n,recipientCounts:GP(s)}}function GP(e){let t={};for(let n in e)t[n]=e[n].size;return t}function G3(e,t){let n=new Set,s=[],r={};for(let i of t.names())n.add(i);let a=[],o=[];for(a.push(e);a.length>0;){let i=a[a.length-1];if(n.has(i.name)){a.pop();continue}let l=o[o.length-1]===a.length-1;if(i.inputs.length===0||l)a.pop(),s.push(i),n.add(i.name),l&&o.pop();else{o.push(a.length-1);for(let u of i.inputs)r[u.name]==null&&(r[u.name]=new Set),r[u.name].add(i.name),!n.has(u.name)&&a.push(u)}}return{sorted:s,recipientMap:r}}function jP(e){let t;if(e.sourceLayer.inboundNodes.length===1)t=e.sourceLayer.output;else{let n=null;for(let s=0;sA.name)}`);na(this.outputs).length!==this.outputs.length&&console.warn(`The list of outputs passed to the model is redundant. All outputs should only appear once. Found: ${this.outputs.map(A=>A.name)}`),this.inputLayers=[],this.inputLayersNodeIndices=[],this.inputLayersTensorIndices=[],this.outputLayers=[],this.outputLayersNodeIndices=[],this.outputLayersTensorIndices=[],this.layers=[],this.internalContainerRefs=[];for(let A of this.outputs){let y=A.sourceLayer,x=A.nodeIndex,b=A.tensorIndex;this.outputLayers.push(y),this.outputLayersNodeIndices.push(x),this.outputLayersTensorIndices.push(b)}for(let A of this.inputs){let y=A.sourceLayer,x=A.nodeIndex,b=A.tensorIndex;ar(x===0,"input layer has >1 nodes"),ar(b===0,"input layer has >1 tensors"),this.inputLayers.push(y),this.inputLayersNodeIndices.push(x),this.inputLayersTensorIndices.push(b)}this.inputNames=[],this.outputNames=[],this.feedInputShapes=[],this.feedInputNames=[],this.feedOutputNames=[];for(let A=0;AA.shape),this.internalOutputShapes=this.outputs.map(A=>A.shape);let t={},n={},s={},r={},a={},o=[],i=(A,y,x,b,v,k)=>{(b==null||v==null||k==null)&&(b=A.sourceLayer,v=A.nodeIndex,k=A.tensorIndex);let S=b.inboundNodes[v];if(x.indexOf(S)!==-1)throw new Ls(`The tensor ${A.name} at layer "${b.name}" is part of a cycle.`);if(y.indexOf(S)!==-1)return;this.containerNodes.add(ir.nodeKey(b,v)),b.id in a||(a[b.id]=Object.keys(a).length),x.indexOf(S)===-1&&x.push(S);let C=S.inboundLayers.length;for(let _=0;_=0;)x.splice(x.indexOf(S),1);o.push(S)},l=[],u=[];for(let A of this.outputs)i(A,l,u);let c=o.slice().reverse();for(let A of c){n[A.id]=A,A.id in t||(t[A.id]=0);let y=t[A.id],x=s[A.outboundLayer.id]==null?0:s[A.outboundLayer.id];y=Math.max(y,x),s[A.outboundLayer.id]=y,r[A.outboundLayer.id]=A.outboundLayer,t[A.id]=y;for(let b=0;bparseInt(A,10)).sort(kp);this.layers=[];for(let A of p){let y=h[A];y.sort((x,b)=>{let v=a[x.id],k=a[b.id];return vk?1:0});for(let x of y)x instanceof ir&&this.internalContainerRefs.push(x),this.layers.push(x)}this.layersByDepth=h,p=Object.keys(d).map(A=>parseInt(A,10)).sort(kp);let f=this.inputs.slice(),m=[];for(let A of p)for(let y of d[A]){let x=y.outboundLayer;if(x!=null){for(let b of y.inputTensors)if(f.indexOf(b)===-1)throw new Ls(`Graph disconnected: cannot obtain value for tensor ${b} at layer "${x.name}". The following previous layers were accessed without issue: ${m}`);for(let b of y.outputTensors)f.push(b);m.push(x.name)}}this.nodesByDepth=d;let g=this.layers.map(A=>A.name);for(let A of g){let y=g.filter(x=>x===A).length;if(y!==1)throw new Ls(`The name "${A}" is used ${y} times in the model. All layer names should be unique. Layer names: `+JSON.stringify(g))}this.outboundNodes=[],this.inboundNodes=[],new zp({outboundLayer:this,inboundLayers:[],nodeIndices:[],tensorIndices:[],inputTensors:this.inputs,outputTensors:this.outputs,inputMasks:this.inputs.map(A=>null),outputMasks:this.outputs.map(A=>null),inputShapes:this.inputs.map(A=>A.shape),outputShapes:this.outputs.map(A=>A.shape)}),this.built=!0,this._refCount=1}assertNotDisposed(){if(this._refCount===0)throw new Error(`Container '${this.name}' is already disposed.`)}dispose(){this.assertNotDisposed();let e={refCountAfterDispose:null,numDisposedVariables:0};if(--this._refCount==0){for(let t of this.layers)e.numDisposedVariables+=t.dispose().numDisposedVariables;for(let t of this.internalContainerRefs)e.numDisposedVariables+=t.dispose().numDisposedVariables}return e.refCountAfterDispose=this._refCount,e}get trainable(){return this.trainable_}set trainable(e){this.layers.forEach(t=>{t._trainableWeights.forEach(n=>n.trainable=e)}),this.trainable_=e}get trainableWeights(){if(this._trainableWeights.length>0)throw new G("Container instance unexpectedly contains _trainableWeights.The trainable weights of a Container are a union of the trainable weights of its consituent Layers. Its own _trainableWeights must remain an empty Array.");if(!this.trainable)return[];let e=[];for(let t of this.layers)e=e.concat(t.trainableWeights);return e}get nonTrainableWeights(){let e=[];for(let t of this.layers)e.push(...t.nonTrainableWeights);if(!this.trainable){let t=[];for(let n of this.layers)t.push(...n.trainableWeights);return t.concat(e)}return e}get weights(){return this.trainableWeights.concat(this.nonTrainableWeights)}loadWeights(e,t=!0){let n={},s=0;for(let a of this.layers)for(let o of a.weights){if(n[o.originalName]!=null)throw new G(`Duplicate weight name: ${o.originalName}`);n[o.originalName]=o,s++}let r=[];for(let a in e){let o=a;if(n[a]==null){let i=a.split("/");o=i.slice(0,-2).concat([i[i.length-1]]).join("/")}if(n[o]!=null)r.push([n[o],e[a]]);else if(t)throw new G(`Provided weight data has no target variable: ${a}`);delete n[o]}if(t){let a=[];for(let o in n)a.push(o);if(a.length>0)throw new G(`${a.length} of ${s} weights are not set: ${a}`)}NA(r)}updatedConfig(){let e=this.getConfig(),t={};return t.className=this.getClassName(),t.config=e,t.kerasVersion=`tfjs-layers ${PA}`,t.backend="TensorFlow.js",t}toJSON(e,t=!0){let n=OA(this.updatedConfig());return t?JSON.stringify(n):n}call(e,t){return H(()=>{e=yt(e);let n=new qo;for(let s=0;s{e=yt(e);let n;return t==null?n=Wo(null,e.length):n=yt(t),this.runInternalGraph(e,n)[1]})}computeOutputShape(e){let t=Pp(e);if(t.length!==this.inputLayers.length)throw new G(`Invalid inputShape argument ${e}: model has ${this.inputLayers.length} tensor inputs.`);let n={};for(let o=0;oparseInt(o,10)).sort(kp);if(s.length>1)for(let o of s){let i=this.nodesByDepth[o];for(let l of i){let u=l.outboundLayer;if(this.inputLayers.map(f=>f.id).indexOf(u.id)!==-1)continue;let c=[];for(let f=0;fparseInt(i,10)).sort(kp);for(let i of s){let l=this.nodesByDepth[i];for(let u of l){let c=u.outboundLayer,d=u.inputTensors,h=u.outputTensors,p=new Array;for(let f of d)f.id in n&&p.push(n[f.id]);if(p.length===d.length){let f={},m,g,A,y;if(u.callArgs!=null&&(f=u.callArgs),p.length===1){let[x,b]=p[0];f.mask==null&&(f.mask=b),A=yt(c.call(x,f)),y=yt(c.computeMask(x,b)),m=[x],g=[b]}else m=p.map(x=>x[0]),g=p.map(x=>x[1]),f.mask==null&&(f.mask=g),A=yt(c.call(m,f)),y=yt(c.computeMask(m,g));if(c.activityRegularizer)throw new Oe("LayersModel invocation with concrete Tensor value(s) in the presence of activity regularizer(s) is not supported yet.");for(let x=0;x{let e=[];for(let t of this.layers)for(let n=0;n0){let f=[];for(let m=0;m0&&m.apply($n(A),y)}function l(m){let g=m.name,A=Us(m,t.customObjects!=null?t.customObjects:{});A.setFastWeightInitDuringBuild(s),r[g]=A,m.inboundNodes.forEach(x=>{if(!(x instanceof Array))throw new G(`Corrupted configuration, expected array for nodeData: ${x}`);o(A,x)})}let u=t.name,c=t.layers;for(let m of c)l(m);for(;!kO(a);)for(let m of c){let g=r[m.name];if(g.name in a){let A=a[g.name];delete a[g.name];for(let y of A)i(g,y)}}let d=[],h=[],p=t.inputLayers;for(let m of p){let g=m[0],A=m[1],y=m[2];ar(g in r);let b=r[g].inboundNodes[A].outputTensors;d.push(b[y])}let f=t.outputLayers;for(let m of f){let g=m[0],A=m[1],y=m[2];ar(g in r);let b=r[g].inboundNodes[A].outputTensors;h.push(b[y])}return new e({inputs:d,outputs:h,name:u})}get stateful(){if(this._stateful)throw new G("Container instance unexpectedly has _stateful = true. The statefulness of a Container is determined by the Layers it contains. Its _stateful property must remain the default false.");for(let e of this.layers)if(e.stateful)return!0;return!1}resetStates(){H(()=>{this.layers.forEach(e=>{e.stateful&&e.resetStates()})})}};function qP(e,t,n){let s=t.length;if(e==null||Array.isArray(e)&&e.length===0)return t.map(r=>null);if(s===1)return Array.isArray(e)&&e.length===1?e:typeof e=="object"&&t[0]in e?[e[t[0]]]:[e];if(Array.isArray(e)){if(e.length!==s)throw new Error(`Provided ${n} is an array of ${e.length} element(s), but the model has ${s} outputs. Make sure a set of weights is provided for each model output.`);return e}else if(typeof e=="object"&&Object.keys(e).length>0&&typeof e[Object.keys(e)[0]]=="object"){let r=[];return t.forEach(a=>{a in e?r.push(e[a]):r.push(null)}),r}else throw new Error(`The model has multiple (${s}) outputs, so ${n} must be either an array with ${s} elements or an object with ${t} keys. Provided ${n} not understood: ${JSON.stringify(e)}`)}function j3(e,t){return qP(e,t,"classWeight")}async function q3(e,t,n,s){if(t!=null||s!=null)throw new Error("Support sampleWeight is not implemented yet");if(n!=null){let r=H(()=>{if(e.shape.length===1)return Os(e);if(e.shape.length===2){if(e.shape[1]>1)return er(e,1);if(e.shape[1]===1)return U(e,[e.shape[0]]);throw new Error(`Encountered unexpected last-dimension size (${e.shape[1]}) during handling of class weights. The size is expected to be >= 1.`)}else throw new Error(`Unexpected rank of target (y) tensor (${e.rank}) during handling of class weights. The rank is expected to be 1 or 2.`)}),a=Array.from(await r.data());Z(r);let o=[];return a.forEach(i=>{if(n[i]==null)throw new Error(`classWeight must contain all classes in the training data. The class ${i} exists in the data but not in classWeight`);o.push(n[i])}),Mt(o,"float32")}else return null}function XP(e,t){return L(e,t)}var KP=32;function X3(e,t){let n,s,r=t;n=r.xs,s=r.ys,w.assert(n!=null&&s!=null,()=>`A Dataset iterator for fitDataset() is expected to generate objects of the form \`{xs: xVal, ys: yVal}\`, where the two values may be \`tf.Tensor\`, an array of Tensors, or a map of string to Tensor. The provided Dataset instead generates ${t}`);let a=K3("input",e.inputNames,n),o=K3("output",e.outputNames,s),i=a[0].shape[0];w.assert(a.length===e.inputs.length,()=>`LayersModel has ${e.inputs.length} inputs, but the dataset provides ${a.length} inputs. (Expected input keys: ${JSON.stringify(e.inputNames)})`),w.assert(o.length===e.outputs.length,()=>`LayersModel has ${e.outputs.length} outputs, but the dataset provides ${o.length} outputs. (Expected output keys: ${JSON.stringify(e.outputNames)})`);for(let l=0;l`Batch size mismatch: input ${e.inputNames[l]} has ${a[l].shape[0]}; expected ${i} based on input ${e.inputNames[0]}.`);for(let l=0;l`Batch size mismatch: output ${e.outputNames[l]} has ${o[l].shape[0]}; expected ${i} based on input ${e.inputNames[0]}.`);return{xs:a,ys:o}}function K3(e,t,n){if(n instanceof Ge)return[n];if(Array.isArray(n))return w.assert(n.length===t.length,()=>`Received an array of ${n.length} Tensors, but expected ${t.length} to match the ${e} keys ${t}.`),n;{let s=[];for(let r of t){if(n[r]==null)throw new G(`The feature data generated by the dataset lacks the required ${e} key '${r}'.`);s.push(n[r])}return s}}function ZP(e){if(e.length===3)throw new Oe("Validation with sample weights is not implemented yet.");return{xs:e[0],ys:e[1]}}async function YP(e,t,n){let s=n.batchesPerEpoch!=null;if(w.assert(e.optimizer!=null,()=>"You must compile a model before training/testing. Use LayersModel.compile(modelCompileConfig)."),w.assert(n!=null,()=>"For fitDataset(), the 2nd argument (config) is required, but it is not provided in this call."),w.assert(n.epochs!=null&&n.epochs>0&&Number.isInteger(n.epochs),()=>`For fitDataset(), config.epochs is expected to be a positive integer, but got ${n.epochs}`),w.assert(!s||n.batchesPerEpoch>0&&Number.isInteger(n.batchesPerEpoch),()=>`For fitDataset(), config.batchesPerEpoch is expected to be a positive integer if specified, but got ${n.batchesPerEpoch}`),w.assert(n.validationSplit==null,()=>"`validationSplit` is not supported by `fitDataset()`. Use validationData instead."),e.isTraining)throw new Error("Cannot start training because another fit() call is ongoing.");e.isTraining=!0;try{let r=n.validationData!=null,a,o;if(r)if(Z3(n.validationData))w.assert(n.validationBatches==null||n.validationBatches>0&&Number.isInteger(n.validationBatches),()=>`For fitDataset() with dataset-based validation, config.validationBatches is expected not to be provided, or to be a positive integer, but got ${n.validationBatches}`);else{let g=ZP(n.validationData);a=g.xs,o=g.ys}let i=e.makeTrainFunction(),l=e.getDedupedMetricsNames(),u;r?u=l.slice().concat(l.map(g=>"val_"+g)):u=l.slice();let c=F3(n.callbacks,n.yieldEvery),d=n.verbose==null?1:n.verbose,{callbackList:h,history:p}=O3(c,d,n.epochs,null,null,JP(t,n),null,r,u);h.setModel(e),e.history=p,await h.onTrainBegin(),e.stopTraining_=!1;let f=n.initialEpoch==null?0:n.initialEpoch,m=await t.iterator();for(;f=n.batchesPerEpoch:x.done){if(r){let b;Z3(n.validationData)?b=yt(await e.evaluateDataset(n.validationData,{batches:n.validationBatches})):b=yt(e.evaluate(a,o,{batchSize:n.validationBatchSize==null?KP:n.validationBatchSize,verbose:0}));for(let v=0;v0)throw new Oe("Verbose mode is not implemented yet.");w.assert(!s||n.batches>0&&Number.isInteger(n.batches),()=>`Test loop expects \`batches\` to be a positive integer, but received ${JSON.stringify(n.batches)}`);let o=QP(t)?t:await t.iterator(),i=0,l=0;for(;s?l{if(u.value){let{xs:c,ys:d}=X3(e,u.value),h=c.concat(d),p=H(()=>r(h));if(Z(h),l===0)for(let m=0;mae(a[m],L(f,g))),l>0&&Z(A)}Z(p),i+=f,++l}return a}),u.done){s&&console.warn(`Your dataset iterator ran out of data during evaluateDataset(). Interrupting evalution. Make sure that your dataset can generate at least \`batches\` batches (in this case, ${n.batches} batches). You may need to use the repeat() function when building your dataset.`);break}}for(let u=0;u0&&Number.isInteger(e),()=>`batchSize is required to be a positive integer, but got ${e}`)}function Rc(e,t,n){return e==null?[null]:Array.isArray(e)?e.map(s=>Go(s,t,n-t)):Go(e,t,n-t)}function LA(e,t){return H(()=>e==null?null:Array.isArray(e)?e.map(n=>LA(n,t)):x3(e,t.dtype==="int32"?t:ce(t,"int32")))}function BA(e,t){let n=[],s=0,r=null;for(;s=e&&(r=e),n.push([s,r]),s=r;return n}async function tM(e,t,n,s,r,a,o,i,l,u,c,d,h,p,f){r==null&&(r=32),a==null&&(a=1),c==null&&(c=!0),h==null&&(h=0);let m=!1;if(l!=null&&u!=null&&(m=!0),f!=null&&(m=!0,p==null))throw new G("Can only use `validationSteps` when doing step-wise training, i.e., `stepsPerEpoch` must be set.");let g=e.checkNumSamples(n,r,p,"steps_per_epoch"),A;g!=null&&(A=Bs(0,g)),o==null&&(o=1);let{callbackList:y,history:x}=O3(i,o,a,h,g,p,r,m,d);y.setModel(e),e.history=x,await y.onTrainBegin(),e.stopTraining_=!1;for(let b=h;b{let O=S[C][0],E=S[C][1],R=Go(k,O,E-O);_.batch=C,_.size=E-O;let T=LA(n,R),P=t(T);for(let V=0;V0){if(f=!0,s.validationData.length===2)o=s.validationData[0],i=s.validationData[1];else throw s.validationData.length===3?new Oe("validationData including sample weights is not supported yet."):new G(`When passing validation data, it must contain 2 (valX, valY) or 3 (valX, valY, valSampleWeight) items; ${s.validationData} is invalid.`);let S=!0,C=await e.standardizeUserData(o,i,null,null,S,d);l=C[0],u=C[1],m=l.concat(u)}else if(s.validationSplit!=null&&s.validationSplit>0&&s.validationSplit<1){f=!0;let S=Math.floor(r[0].shape[0]*(1-s.validationSplit)),C=r[0].shape[0];l=Rc(r,S,C),r=Rc(r,0,S),u=Rc(a,S,C),a=Rc(a,0,S),m=l.concat(u)}else s.validationSteps!=null&&(f=!0);let g=r.concat(a).concat(c);e.checkTrainableWeightsConsistency();let A=e.makeTrainFunction(),y=e.getDedupedMetricsNames(),x,b;f?(e.makeTestFunction(),x=e.testFunction,b=y.slice().concat(y.map(S=>"val_"+S))):(x=null,m=[],b=y.slice());let v=F3(s.callbacks,s.yieldEvery);return await tM(e,A,g,y,d,s.epochs,s.verbose,v,x,m,s.shuffle,b,s.initialEpoch,null,null)}finally{e.isTraining=!1,Xo(r,t),Xo(a,n),Xo(l,o),Xo(u,i),c!=null&&Z(c)}}function Y3(e){let t=[];e instanceof Ge&&(e=[e]);for(let n=0;nn.push(r.id));else if(t!=null)for(let r in t){let a=t[r];n.push(a.id)}let s=[];if(e instanceof Ge)n.indexOf(e.id)===-1&&s.push(e);else if(Array.isArray(e))e.forEach(r=>{n.indexOf(r.id)===-1&&s.push(r)});else if(e!=null)for(let r in e){let a=e[r];n.indexOf(a.id)===-1&&s.push(a)}s.forEach(r=>{r.isDisposed||r.dispose()})}function sM(e){return e instanceof Ge}function WA(e){return Array.isArray(e)}function J3(e){return!sM(e)&&!WA(e)}function Q3(e,t,n,s=!0,r=""){if(t==null||t.length===0){if(e!=null){let o=!1;if(WA(e)&&e.length>0)o=!0;else if(J3(e)){for(let i in e)if(e.hasOwnProperty(i)){o=!0;break}}else o=!0;if(o)throw new G(`Error when checking model ${r} expected no data, but got ${e}`)}return[]}if(e==null)return t.map(o=>null);let a;if(J3(e)){e=e,a=[];for(let o of t){if(e[o]==null)throw new G(`No data provided for "${o}". Need data for each key in: ${t}`);a.push(e[o])}}else if(WA(e)){if(e=e,e.length!==t.length)throw new G(`Error when checking model ${r}: the Array of Tensors that you are passing to your model is not the size the model expected. Expected to see ${t.length} Tensor(s), but instead got the following list of Tensor(s): ${e}`);a=e}else{if(e=e,t.length>1)throw new G(`The model ${r} expects ${t.length} Tensor(s), but only received one Tensor. Found: Tensor with shape ${e.shape}`);a=[e]}if(a=Y3(a),n!=null)for(let o=0;o=0&&u!==c)throw new G(`${r} expected a batch of elements where each example has shape [${n[o].slice(1,n[o].length)}] (i.e.,tensor shape [*,${n[o].slice(1,n[o].length)}]) but the ${r} received an input with ${i.shape[0]} examples, each with shape [${i.shape.slice(1,i.shape.length)}] (tensor shape [${i.shape}])`)}}return a}function rM(e,t,n){let s=na(e.map(a=>a.shape[0]));s.sort();let r=na(t.map(a=>a.shape[0]));if(r.sort(),s.length>1)throw new G(`All input Tensors (x) should have the same number of samples. Got array shapes: ${JSON.stringify(e.map(a=>a.shape))}`);if(r.length>1)throw new G(`All target Tensors (y) should have the same number of samples. Got array shapes: ${JSON.stringify(t.map(a=>a.shape))}`);if(s.length>0&&r.length>0&&!w.arraysEqual(s,r))throw new G(`Input Tensors should have the same number of samples as target Tensors. Found ${s[0]} input sample(s) and ${r[0]} target sample(s).`)}function aM(e,t,n){let s=[jo,Vp,Tc];for(let r=0;r1)throw new G(`The model expects ${t.length} ${r} Tensors, but only received one Tensor. Found: array with shape ${JSON.stringify(e.shape)}.`);a=[e]}if(n!=null)for(let o=0;o[]);let n;if(typeof e=="string"||typeof e=="function")n=[e];else if(Array.isArray(e)||typeof e=="object")n=e;else throw new TypeError(`Type of metrics argument not understood. Expected an string,function, Array, or Object, found: ${e}`);if(Array.isArray(n))return t.map(s=>n);{let s=[];for(let r of t){let a=n.hasOwnProperty(r)?n[r]:[];Array.isArray(a)||(a=[a]),s.push(a)}return s}}var iM="layers-model",Nr=class extends ir{constructor(e){super(e);this.isTraining=!1}summary(e,t,n=console.log){if(!this.built)throw new G("This model has never been called, thus its weights have not been created yet. So no summary can be displayed. Build the model first (e.g., by calling it on some test data).");zP(this,e,t,n)}compile(e){if(e.loss==null&&(e.loss=[]),this.loss=e.loss,typeof e.optimizer=="string")this.optimizer_=MP(e.optimizer),this.isOptimizerOwned=!0;else{if(!(e.optimizer instanceof Sr))throw new G("User-defined optimizer must be an instance of tf.Optimizer.");this.optimizer_=e.optimizer,this.isOptimizerOwned=!1}let t=[];if(!Array.isArray(e.loss)&&typeof e.loss!="string"&&typeof e.loss!="function"){e.loss=e.loss;for(let a in e.loss)if(this.outputNames.indexOf(a)===-1)throw new G(`Unknown entry in loss dictionary: "${a}". Only expected the following keys: ${this.outputNames}`);for(let a of this.outputNames)e.loss[a]==null&&console.warn(`Output "${a}" is missing from loss dictionary. We assume this was done on purpose, and we will not be expecting data to be passed to ${a} during training`),t.push(RA(e.loss[a]))}else if(Array.isArray(e.loss)){if(e.loss.length!==this.outputs.length)throw new G(`When passing an Array as loss, it should have one entry per model output. The model has ${this.outputs.length} output(s), but you passed loss=${e.loss}.`);t=e.loss.map(o=>RA(o))}else{let a=RA(e.loss);this.outputs.forEach(o=>{t.push(a)})}this.lossFunctions=t,this.feedOutputNames=[],this.feedOutputShapes=[],this.feedLossFns=[];for(let a=0;a{for(let a=0;a1&&(this.metricsTensors.push([o,a]),this.metricsNames.push(this.outputNames[a]+"_loss"))}});let s=oM(e.metrics,this.outputNames),r=(a,o,i)=>{this.outputNames.length>1&&(o=this.outputNames[a]+"_"+o),this.metricsNames.push(o),this.metricsTensors.push([i,a])};Ho("metric",()=>{for(let a=0;a{let u="",c,d,h;for(let p of l){if(typeof p=="string"&&["accuracy","acc","crossentropy","ce"].indexOf(p)!==-1){let m=this.internalOutputShapes[a];m[m.length-1]===1||this.lossFunctions[a]===Vp?["accuracy","acc"].indexOf(p)!==-1?d=_A:["crossentropy","ce"].indexOf(p)!==-1&&(d=z3):this.lossFunctions[a]===Wp?["accuracy","acc"].indexOf(p)!==-1?d=L3:["crossentropy","ce"].indexOf(p)!==-1&&(d=B3):["accuracy","acc"].indexOf(p)!==-1?d=DA:["crossentropy","ce"].indexOf(p)!==-1&&(d=$A);let g;["accuracy","acc"].indexOf(p)!==-1?g="acc":["crossentropy","ce"].indexOf(p)!==-1&&(g="ce"),h=d,c=u+g}else h=PP(p),c=u+Gp(p);let f;Ho(c,()=>{f=h}),r(a,c,f)}})(o)}}),this.collectedTrainableWeights=this.trainableWeights}checkTrainableWeightsConsistency(){this.collectedTrainableWeights!=null&&this.trainableWeights.length!==this.collectedTrainableWeights.length&&console.warn("Discrepancy between trainableweights and collected trainable weights. Did you set `model.trainable` without calling `model.compile()` afterwards?")}evaluate(e,t,n={}){let s=n.batchSize==null?32:n.batchSize;zA(s);let r=!0,a=this.standardizeUserDataXY(e,t,r,s);try{let o=a[0].concat(a[1]);this.makeTestFunction();let i=this.testFunction,l=this.testLoop(i,o,s,n.verbose,n.steps);return $n(l)}finally{Xo(a[0],e),Xo(a[1],t)}}async evaluateDataset(e,t){return this.makeTestFunction(),eM(this,e,t)}checkNumSamples(e,t,n,s="steps"){let r;if(n!=null){if(r=null,t!=null)throw new G(`If ${s} is set, batchSize must be null or undefined.Got batchSize = ${t}`)}else if(e!=null)Array.isArray(e)?r=e[0].shape[0]:r=e.shape[0];else throw new G(`Either the input data should have a defined shape, or ${s} shoud be specified.`);return r}execute(e,t){if(Array.isArray(t)&&t.length===0)throw new G("`outputs` is an empty Array, which is not allowed.");let n=Array.isArray(t),s=n?t:[t],r=this.retrieveSymbolicTensors(s),a=new qo;if(e instanceof Ge&&(e=[e]),Array.isArray(e)){if(e.length!==this.inputs.length)throw new G(`The number of inputs provided (${e.length}) does not match the number of inputs of this model (${this.inputs.length}).`);for(let i=0;io.name);for(let o=0;o0){let s=[];throw t.forEach((r,a)=>{r==null&&s.push(e[a])}),new G(`Cannot find SymbolicTensors for output name(s): ${JSON.stringify(s)}`)}return t}predictLoop(e,t=32,n=!1){return H(()=>{let s=this.checkNumSamples(e);if(n)throw new Oe("Verbose predictLoop() is not implemented yet.");let r=BA(s,t),a=this.outputs.map(o=>[]);for(let o=0;o{let l=r[o][0],u=r[o][1],c=Rc(e,l,u),d=[];if(Array.isArray(c))for(let p=0;pa[u].push(l));return $n(a.map(o=>ft(o,0)))})}predict(e,t={}){let n=Y3(e);ev(n,this.inputNames,this.feedInputShapes,!1);try{let s=t.batchSize==null?32:t.batchSize;return zA(s),this.predictLoop(n,s)}finally{Xo(n,e)}}predictOnBatch(e){ev(e,this.inputNames,this.feedInputShapes,!0);let t=(Array.isArray(e)?e[0]:e).shape[0];return this.predictLoop(e,t)}standardizeUserDataXY(e,t,n=!0,s){if(this.optimizer_==null)throw new Ls("You must compile a model before training/testing. Use LayersModel.compile(modelCompileArgs).");let r=[];for(let a=0;a0&&e[0].shape[0]%s!=0)throw new G(`In a stateful network, you should only pass inputs with a number of samples that is divisible by the batch size ${s}. Found: ${e[0].shape[0]} sample(s).`);return[e,t]}async standardizeUserData(e,t,n,s,r=!0,a){let[o,i]=this.standardizeUserDataXY(e,t,r,a);if(n!=null)throw new Error("sample weight is not supported yet.");let l=null;if(s!=null){let u=j3(s,this.outputNames);l=[];for(let c=0;c{let a=this.checkNumSamples(t,n,r,"steps"),o=[];if(s>0)throw new Oe("Verbose mode is not implemented yet.");if(r!=null)throw new Oe("steps mode in testLoop() is not implemented yet");{let i=BA(a,n),l=Mt(Bs(0,a));for(let u=0;u1&&(r+=`_${i3(e.slice(0,n),s)}`),t.push(r)}return t}makeTrainFunction(){return e=>{let t=[],n=e.slice(0,this.inputs.length),s=e.slice(this.inputs.length,this.inputs.length+this.outputs.length),r=e.slice(this.inputs.length+this.outputs.length,this.inputs.length+this.outputs.length*2),a=[],o=()=>{let c=[];for(let f=0;f1&&f{p=ae(p,f)}),p},i=this.collectedTrainableWeights.map(c=>c.read()),l=!0;return[this.optimizer_.minimize(o,l,i)].concat(a)}}makeTestFunction(){this.testFunction=e=>H(()=>{let t=[],n,s=e.slice(0,this.inputs.length),r=e.slice(this.inputs.length,this.inputs.length+this.outputs.length),a=[];for(let l=0;lTr(t))}else{let t=Object.keys(this.loss);e={};let n=this.loss;for(let s of t)if(typeof n[s]=="string")e[s]=Tr(n[s]);else throw new Error("Serialization of non-string loss is not supported.")}return e}getMetricIdentifiers(){if(typeof this.metrics=="string"||typeof this.metrics=="function")return[Tr(Gp(this.metrics))];if(Array.isArray(this.metrics))return this.metrics.map(e=>Tr(Gp(e)));{let e={};for(let t in this.metrics)e[t]=Tr(Gp(this.metrics[t]));return e}}getTrainingConfig(){return{loss:this.getLossIdentifiers(),metrics:this.getMetricIdentifiers(),optimizer_config:{class_name:this.optimizer.getClassName(),config:this.optimizer.getConfig()}}}loadTrainingConfig(e){if(e.weighted_metrics!=null)throw new Error("Loading weight_metrics is not supported yet.");if(e.loss_weights!=null)throw new Error("Loading loss_weights is not supported yet.");if(e.sample_weight_mode!=null)throw new Error("Loading sample_weight_mode is not supported yet.");let t=Nc(e.optimizer_config),n=Us(t),s;if(typeof e.loss=="string")s=Vo(e.loss);else if(Array.isArray(e.loss))s=e.loss.map(a=>Vo(a));else if(e.loss!=null){s={};for(let a in e.loss)s[a]=Vo(e.loss[a])}let r;if(Array.isArray(e.metrics))r=e.metrics.map(a=>Vo(a));else if(e.metrics!=null){r={};for(let a in e.metrics)r[a]=Vo(e.metrics[a])}this.compile({loss:s,metrics:r,optimizer:n})}async save(e,t){if(typeof e=="string"){let l=_n.getSaveHandlers(e);if(l.length===0)throw new G(`Cannot find any save handlers for URL '${e}'`);if(l.length>1)throw new G(`Found more than one (${l.length}) save handlers for URL '${e}'`);e=l[0]}if(e.save==null)throw new G("LayersModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");let n=await _n.encodeWeights(this.getNamedWeights(t)),s=!1,r=null,o={modelTopology:this.toJSON(r,s),format:iM,generatedBy:`TensorFlow.js tfjs-layers v${PA}`,convertedBy:null};if((t==null?!1:t.includeOptimizer)&&this.optimizer!=null){o.trainingConfig=this.getTrainingConfig();let l="optimizer",{data:u,specs:c}=await _n.encodeWeights(await this.optimizer.getWeights(),l);n.specs.push(...c),n.data=_n.concatenateArrayBuffers([n.data,u])}if(this.userDefinedMetadata!=null){let l=!0;V3(this.userDefinedMetadata,this.name,l),o.userDefinedMetadata=this.userDefinedMetadata}return o.weightData=n.data,o.weightSpecs=n.specs,e.save(o)}setUserDefinedMetadata(e){V3(e,this.name),this.userDefinedMetadata=e}getUserDefinedMetadata(){return this.userDefinedMetadata}};Nr.className="Model";oe.registerClass(Nr);var tv=class extends Nr{};tv.className="Functional";oe.registerClass(tv);async function lM(e,t){"modelTopology"in e||(e={modelTopology:e}),e=e;let n=e.modelTopology;n.model_config!=null&&(n=n.model_config);let s=Nc(n),r=Us(s,t);if(e.weightsManifest!=null){let a=await _n.loadWeights(e.weightsManifest,e.pathPrefix,r.weights.map(i=>i.originalName)),o={};for(let i of r.weights)o[i.originalName]=a[i.originalName];r.loadWeights(o),Z(a)}return r}async function uM(e,t){if(t==null&&(t={}),typeof e=="string"){let n=_n.getLoadHandlers(e,t);if(n.length===0)n.push(_n.browserHTTPRequest(e,t));else if(n.length>1)throw new G(`Found more than one (${n.length}) load handlers for URL '${e}'`);e=n[0]}return cM(e,void 0,t)}async function cM(e,t,n){if(n==null&&(n={}),e.load==null)throw new G("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");let s=await e.load(),r=s.modelTopology;r.model_config!=null&&(r=r.model_config);let a=n.strict==null?!0:n.strict,o=s.weightData!=null&&s.weightSpecs!=null&&a,i=Us(Nc(r),t,o),l=s.trainingConfig;if(l!=null&&i.loadTrainingConfig(l),s.userDefinedMetadata!=null&&i.setUserDefinedMetadata(s.userDefinedMetadata),s.weightData!=null){if(s.weightSpecs==null)throw new G("LayersModel artifacts contains weight data, but not weight specs. Therefore loading of weights cannot proceed.");let{modelWeights:u,optimizerWeights:c}=dM(s.weightData,s.weightSpecs);i.loadWeights(u,a),i.optimizer!=null&&c.length>0&&await i.optimizer.setWeights(c),Z(u),Z(c.map(d=>d.tensor))}return i}function dM(e,t){let n=_n.decodeWeights(e,t),s={},r=[];return t.forEach(a=>{a.group==="optimizer"?r.push({name:a.name,tensor:n[a.name]}):s[a.name]=n[a.name]}),{modelWeights:s,optimizerWeights:r}}var Kl=class extends Nr{constructor(e){super({inputs:[],outputs:[]});if(e=e||{},this.trainable=!0,this.built=!1,this.name=e.name!=null?e.name:Op("sequential_"),e.layers!=null)for(let t of e.layers)this.add(t)}checkShape(e){if(e.inboundNodes[0].outputTensors[0].shape.some(n=>n<0))throw new G(`Negative dimension size caused by adding layer ${e.name} with input shape [${e.inboundNodes[0].inputTensors[0].shape}]`)}add(e){let t=e instanceof Kl||e instanceof Nr,n;if(t){if(n=e,n.outputs.length!==1)throw new G("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");if(n.inputs.length!==1)throw new G("All layers in a Sequential model should have a single input tensor. For multi-input layers, use the functional API.")}if(this.outputs.length===0){if(e.inboundNodes.length===0){if(e.batchInputShape==null)throw new G("The first layer in a Sequential model must get an `inputShape` or `batchInputShape` argument.");let s=N3({batchShape:e.batchInputShape,dtype:e.dtype,name:e.name+"_input"});e.apply(s)}if(t)this.outputs=n.outputs,this.inputs=n.inputs;else{if(e.inboundNodes.length!==1)throw new G(`A layer added to a Sequential model must not already be connected somewhere else. LayersModel received layer ${e.name} which has ${e.inboundNodes.length} pre-existing inbound connections.`);if(e.inboundNodes[0].outputTensors.length!==1)throw new G("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");this.checkShape(e),this.outputs=[e.inboundNodes[0].outputTensors[0]],this.inputs=T3(this.outputs[0])}this.inboundNodes=[],new zp({outboundLayer:this,inboundLayers:[],nodeIndices:[],tensorIndices:[],inputTensors:this.inputs,outputTensors:this.outputs,inputMasks:Wo(null,this.inputs.length),outputMasks:[null],inputShapes:this.inputs.map(s=>s.shape),outputShapes:this.outputs[0].shape})}else{let s=e.apply(this.outputs[0]);if(Array.isArray(s))throw new TypeError("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");this.checkShape(e),this.outputs=[s],this.inboundNodes[0].outputTensors=this.outputs,this.inboundNodes[0].outputShapes=[this.outputs[0].shape]}this.layers.push(e),this.built=!1}pop(){if(this.layers.length===0)throw new TypeError("There are no layers in the model.");if(this.layers.pop(),this.layers.length===0)this.outputs=[],this.inboundNodes=[],this.outboundNodes=[];else{let e=this.layers.length-1;this.layers[e].outboundNodes=[],this.outputs=[this.layers[e].output],this.inboundNodes[0].outputTensors=this.outputs,this.inboundNodes[0].outputShapes=[this.outputs[0].shape]}}call(e,t){return this.model==null&&this.build(),this.model.call(e,t)}build(e){if(at(e),this.inputs.length===0||this.outputs.length===0)throw new TypeError("Sequential model cannot be built: model is empty. Add some layers first.");this.model=new Nr({inputs:this.inputs,outputs:this.outputs[0],name:this.name+"_model"}),this.model.trainable=this.trainable,this.supportsMasking=this.model.supportsMasking,this.inputLayers=this.model.inputLayers,this.inputLayersNodeIndices=this.model.inputLayersNodeIndices,this.inputLayersTensorIndices=this.model.inputLayersTensorIndices,this.outputLayers=this.model.outputLayers,this.outputLayersNodeIndices=this.model.outputLayersNodeIndices,this.outputLayersTensorIndices=this.model.outputLayersTensorIndices,this.nodesByDepth=this.model.nodesByDepth,this.containerNodes=this.model.containerNodes,this.outputNames=this.model.outputNames,this.inputNames=this.model.inputNames,this.built=!0}countParams(){return this.built||this.build(),super.countParams()}summary(e,t,n=console.log){this.built||this.build(),super.summary(e,t,n)}setWeights(e){this.model==null&&this.build(),this.model.setWeights(e)}evaluate(e,t,n={}){if(!this.built)throw new Ls("The model needs to be compiled before being used.");return this.model.evaluate(e,t,n)}async evaluateDataset(e,t){if(!this.built)throw new Ls("The model needs to be compiled before being used.");return this.model.evaluateDataset(e,t)}predict(e,t={}){return this.model==null&&this.build(),this.model.predict(e,t)}predictOnBatch(e){return this.model==null&&this.build(),this.model.predictOnBatch(e)}compile(e){this.build(),this.model.compile(e),this.optimizer_=this.model.optimizer,this.isOptimizerOwned=this.model.isOptimizerOwned,this.loss=this.model.loss,this.metrics=this.model.metrics,this.metricsTensors=this.model.metricsTensors,this.metricsNames=this.model.metricsNames}get optimizer(){return this.model==null?void 0:this.model.optimizer}set optimizer(e){this.model.optimizer=e}async fit(e,t,n={}){if(!this.built)throw new Ls("The model needs to be compiled before being used.");return this.model.fit(e,t,n)}async fitDataset(e,t){if(!this.built)throw new Ls("The model needs to be compiled before being used.");return this.model.fitDataset(e,t)}async trainOnBatch(e,t){return this.model.trainOnBatch(e,t)}static fromConfig(e,t,n={},s=!1){let r,a={};if(t instanceof Array){if(t[0].className==null||t[0].className==="Merge")throw new G("Legacy serialization format not supported yet.");r=t}else w.assert(t.layers!=null,()=>"When the config data for a Sequential model is not an Array, it must be an Object that contains the 'layers' field."),r=t.layers,delete t.layers,a=t;let o=new e(a);if(!(o instanceof Kl))throw new Oe(`Sequential.fromConfig called on non-Sequential input: ${o}`);for(let i of r){let u=Us(i,void 0,s);s&&u.setFastWeightInitDuringBuild(!0),o.add(u)}return o}set stopTraining(e){if(this.model==null)throw new G("Cannot set the stopTraining property of a sequential model before it is compiled.");this.model.stopTraining=e}get stopTraining(){if(this.model==null)throw new G("Cannot get the stopTraining property of a sequential model before it is compiled.");return this.model.stopTraining}getConfig(){let e=[];for(let t of this.layers){let n={};n.className=t.getClassName(),n.config=t.getConfig(),e.push(n)}return{name:this.name,layers:e}}};Kl.className="Sequential";oe.registerClass(Kl);function hM(e){return new Nr(e)}function pM(e){return new Kl(e)}function fM(e,t){return t==null&&(t={}),uM(e,t)}function nv(e){return N3(e)}function mM(e,t){Rs.registerCallbackConstructor(e,t)}var On=class extends oe.Serializable{getConfig(){return{}}},sv=class extends On{apply(e,t=1){return WO(e,t)}};sv.className="elu";oe.registerClass(sv);var rv=class extends On{apply(e){return Gg(e)}};rv.className="selu";oe.registerClass(rv);var av=class extends On{apply(e){return sr(e)}};av.className="relu";oe.registerClass(av);var ov=class extends On{apply(e){return H(()=>fc(6,sr(e)))}};ov.className="relu6";oe.registerClass(ov);var iv=class extends On{apply(e){return e}};iv.className="linear";oe.registerClass(iv);var lv=class extends On{apply(e){return Hn(e)}};lv.className="sigmoid";oe.registerClass(lv);var uv=class extends On{apply(e){return UO(e)}};uv.className="hardSigmoid";oe.registerClass(uv);var cv=class extends On{apply(e){return Ll(e)}};cv.className="softplus";oe.registerClass(cv);var dv=class extends On{apply(e){return VO(e)}};dv.className="softsign";oe.registerClass(dv);var hv=class extends On{apply(e){return Fl(e)}};hv.className="tanh";oe.registerClass(hv);var VA=class extends On{apply(e,t=-1){return ip(e,t)}};VA.className="softmax";oe.registerClass(VA);var pv=class extends On{apply(e,t=-1){return Fg(e,t)}};pv.className="logSoftmax";oe.registerClass(pv);var fv=class extends On{apply(e,t=1){return H(()=>L(Hn(L(e,t)),e))}};fv.className="swish";oe.registerClass(fv);var mv=class extends On{apply(e){return H(()=>L(e,Fl(Ll(e))))}};mv.className="mish";oe.registerClass(mv);function oa(e){return e.getClassName()}function UA(e,t={}){return vc(e,oe.SerializationMap.getMap().classNameMap,t,"activation")}function ia(e){if(e==null){let t={};return t.className="linear",t.config={},UA(t)}if(typeof e=="string"){let t={};return t.className=e,t.config={},UA(t)}else return e instanceof On?e:UA(e)}function HA(e){if(e!=null&&typeof e!="object")throw new Error(`Argument to L1L2 regularizer's constructor is expected to be an object, but received: ${e}`)}var gv=class extends oe.Serializable{},_c=class extends gv{constructor(e){super();HA(e),this.l1=e==null||e.l1==null?.01:e.l1,this.l2=e==null||e.l2==null?.01:e.l2,this.hasL1=this.l1!==0,this.hasL2=this.l2!==0}apply(e){return H(()=>{let t=Pt([1]);return this.hasL1&&(t=ae(t,ve(L(this.l1,Ht(e))))),this.hasL2&&(t=ae(t,ve(L(this.l2,Sc(e))))),U(t,[])})}getConfig(){return{l1:this.l1,l2:this.l2}}static fromConfig(e,t){return new e({l1:t.l1,l2:t.l2})}};_c.className="L1L2";oe.registerClass(_c);function gM(e){return HA(e),new _c({l1:e!=null?e.l1:null,l2:0})}function AM(e){return HA(e),new _c({l2:e!=null?e.l2:null,l1:0})}var Av={l1l2:"L1L2"};function dt(e){return iA(e)}function yv(e,t={}){return vc(e,oe.SerializationMap.getMap().classNameMap,t,"regularizer")}function kt(e){if(e==null)return null;if(typeof e=="string"){let n={className:e in Av?Av[e]:e,config:{}};return yv(n)}else return e instanceof gv?e:yv(e)}var GA=class extends Ze{constructor(e){super(e==null?{}:e);this.supportsMasking=!0,e!=null&&(this.maxValue=e.maxValue)}call(e,t){e=ze(e);let n=sr(e);return this.maxValue!=null&&(n=Gn(n,0,this.maxValue)),n}computeOutputShape(e){return e}getConfig(){let e={maxValue:this.maxValue},t=super.getConfig();return Object.assign(e,t),e}};GA.className="ReLU";oe.registerClass(GA);var jA=class extends Ze{constructor(e){super(e==null?{}:e);this.DEFAULT_ALPHA=.3,e==null&&(e={}),this.alpha=e.alpha==null?this.DEFAULT_ALPHA:e.alpha}call(e,t){let n=ze(e);return Zh(n,this.alpha)}computeOutputShape(e){return e}getConfig(){let e={alpha:this.alpha},t=super.getConfig();return Object.assign(e,t),e}};jA.className="LeakyReLU";oe.registerClass(jA);var qA=class extends Ze{constructor(e){super(e==null?{}:e);if(this.DEFAULT_ALPHA_INITIALIZER="zeros",e==null&&(e={}),this.supportsMasking=!0,this.alphaInitializer=wt(e.alphaInitializer||this.DEFAULT_ALPHA_INITIALIZER),this.alphaRegularizer=kt(e.alphaRegularizer),this.alphaConstraint=Xt(e.alphaConstraint),e.sharedAxes==null)this.sharedAxes=null;else if(Array.isArray(e.sharedAxes))this.sharedAxes=e.sharedAxes;else if(typeof e.sharedAxes=="number")this.sharedAxes=[e.sharedAxes];else throw new G(`Expected sharedAxes to be a number or an array of numbers, but got ${e.sharedAxes}`)}build(e){e=at(e);let t=e.slice(1);if(this.sharedAxes!=null)for(let s of this.sharedAxes)t[s-1]=1;this.alpha=this.addWeight("alpha",t,"float32",this.alphaInitializer,this.alphaRegularizer,!0,this.alphaConstraint);let n={};if(this.sharedAxes!=null)for(let s=1;s(Ft(t),t==="channelsFirst"?Xe(e,[0,2,3,1]):e))}function xv(e,t){return H(()=>(Ft(t),t==="channelsFirst"?Xe(e,[0,2,3,4,1]):e))}function yM(e,t,n,s=1,r="valid",a,o=1){return H(()=>{if(a==null&&(a=zs()),Ft(a),e.shape.length!==3)throw new G(`The input of a conv1dWithBias operation should be 3, but is ${e.shape.length} instead.`);if(t.shape.length!==3)throw new G(`The kernel for a conv1dWithBias operation should be 3, but is ${t.shape.length} instead`);if(n!=null&&n.shape.length!==1)throw new G(`The bias for a conv1dWithBias operation should be 1, but is ${t.shape.length} instead`);if(a==="channelsFirst"&&(e=Xe(e,[0,2,1])),r==="causal")throw new Oe("The support for CAUSAL padding mode in conv1dWithBias is not implemented yet.");let i=Cg(e,t,s,r==="same"?"same":"valid","NWC",o);return n!=null&&(i=Ws(i,n)),i})}function bv(e,t,n,s=[1,1],r="valid",a,o,i=null){return H(()=>{if(a==null&&(a=zs()),Ft(a),e.rank!==3&&e.rank!==4)throw new G(`conv2dWithBiasActivation expects input to be of rank 3 or 4, but received ${e.rank}.`);if(t.rank!==3&&t.rank!==4)throw new G(`conv2dWithBiasActivation expects kernel to be of rank 3 or 4, but received ${e.rank}.`);let l=YA(e,a);if(r==="causal")throw new Oe("The support for CAUSAL padding mode in conv1dWithBias is not implemented yet.");return l=ta.conv2d({x:l,filter:t,strides:s,pad:r==="same"?"same":"valid",dilations:o,dataFormat:"NHWC",bias:n,activation:i}),a==="channelsFirst"&&(l=Xe(l,[0,3,1,2])),l})}function xM(e,t,n,s=[1,1,1],r="valid",a,o){return H(()=>{if(a==null&&(a=zs()),Ft(a),e.rank!==4&&e.rank!==5)throw new G(`conv3dWithBias expects input to be of rank 4 or 5, but received ${e.rank}.`);if(t.rank!==4&&t.rank!==5)throw new G(`conv3dWithBias expects kernel to be of rank 4 or 5, but received ${e.rank}.`);let i=xv(e,a);if(r==="causal")throw new Oe("The support for CAUSAL padding mode in conv3dWithBias is not implemented yet.");return i=Eg(i,t,s,r==="same"?"same":"valid","NDHWC",o),n!=null&&(i=Ws(i,n)),a==="channelsFirst"&&(i=Xe(i,[0,4,1,2,3])),i})}var JA=class extends Ze{constructor(e,t){super(t);if(this.bias=null,this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_BIAS_INITIALIZER="zeros",JA.verifyArgs(t),this.rank=e,Qt(this.rank,"rank"),this.rank!==1&&this.rank!==2&&this.rank!==3)throw new Oe(`Convolution layer for rank other than 1, 2, or 3 (${this.rank}) is not implemented yet.`);if(this.kernelSize=Zl(t.kernelSize,e,"kernelSize"),this.strides=Zl(t.strides==null?1:t.strides,e,"strides"),this.padding=t.padding==null?"valid":t.padding,gs(this.padding),this.dataFormat=t.dataFormat==null?"channelsLast":t.dataFormat,Ft(this.dataFormat),this.activation=ia(t.activation),this.useBias=t.useBias==null?!0:t.useBias,this.biasInitializer=wt(t.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.biasConstraint=Xt(t.biasConstraint),this.biasRegularizer=kt(t.biasRegularizer),this.activityRegularizer=kt(t.activityRegularizer),this.dilationRate=Zl(t.dilationRate==null?1:t.dilationRate,e,"dilationRate"),this.rank===1&&Array.isArray(this.dilationRate)&&this.dilationRate.length!==1)throw new G(`dilationRate must be a number or an array of a single number for 1D convolution, but received ${JSON.stringify(this.dilationRate)}`);if(this.rank===2){if(typeof this.dilationRate=="number")this.dilationRate=[this.dilationRate,this.dilationRate];else if(this.dilationRate.length!==2)throw new G(`dilationRate must be a number or array of two numbers for 2D convolution, but received ${JSON.stringify(this.dilationRate)}`)}else if(this.rank===3){if(typeof this.dilationRate=="number")this.dilationRate=[this.dilationRate,this.dilationRate,this.dilationRate];else if(this.dilationRate.length!==3)throw new G(`dilationRate must be a number or array of three numbers for 3D convolution, but received ${JSON.stringify(this.dilationRate)}`)}}static verifyArgs(e){if(ar("kernelSize"in e,"required key 'kernelSize' not in config"),typeof e.kernelSize!="number"&&!uA(e.kernelSize,"number",1,3))throw new G(`BaseConv expects config.kernelSize to be number or number[] with length 1, 2, or 3, but received ${JSON.stringify(e.kernelSize)}.`)}getConfig(){let e={kernelSize:this.kernelSize,strides:this.strides,padding:this.padding,dataFormat:this.dataFormat,dilationRate:this.dilationRate,activation:oa(this.activation),useBias:this.useBias,biasInitializer:Nt(this.biasInitializer),biasRegularizer:dt(this.biasRegularizer),activityRegularizer:dt(this.activityRegularizer),biasConstraint:qt(this.biasConstraint)},t=super.getConfig();return Object.assign(e,t),e}},Dc=class extends JA{constructor(e,t){super(e,t);this.kernel=null,Dc.verifyArgs(t),this.filters=t.filters,Qt(this.filters,"filters"),this.kernelInitializer=wt(t.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.kernelConstraint=Xt(t.kernelConstraint),this.kernelRegularizer=kt(t.kernelRegularizer)}build(e){e=at(e);let t=this.dataFormat==="channelsFirst"?1:e.length-1;if(e[t]==null)throw new G(`The channel dimension of the input should be defined. Found ${e[t]}`);let n=e[t],s=this.kernelSize.concat([n,this.filters]);this.kernel=this.addWeight("kernel",s,null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[{ndim:this.rank+2,axes:{[t]:n}}],this.built=!0}call(e,t){return H(()=>{e=ze(e);let n,s=this.bias==null?null:this.bias.read(),r=u3(this.activation.getClassName());if(r!=null&&this.rank===2)n=bv(e,this.kernel.read(),s,this.strides,this.padding,this.dataFormat,this.dilationRate,r);else{if(this.rank===1)n=yM(e,this.kernel.read(),s,this.strides[0],this.padding,this.dataFormat,this.dilationRate[0]);else if(this.rank===2)n=bv(e,this.kernel.read(),s,this.strides,this.padding,this.dataFormat,this.dilationRate);else if(this.rank===3)n=xM(e,this.kernel.read(),s,this.strides,this.padding,this.dataFormat,this.dilationRate);else throw new Oe("convolutions greater than 3D are not implemented yet.");this.activation!=null&&(n=this.activation.apply(n))}return n})}computeOutputShape(e){e=at(e);let t=[],n=this.dataFormat==="channelsLast"?e.slice(1,e.length-1):e.slice(2);for(let r=0;r 0 but got ${JSON.stringify(e.filters)}`)}},$c=class extends Dc{constructor(e){super(2,e);$c.verifyArgs(e)}getConfig(){let e=super.getConfig();return delete e.rank,e}static verifyArgs(e){if(typeof e.kernelSize!="number"&&!uA(e.kernelSize,"number",1,2))throw new G(`Conv2D expects config.kernelSize to be number or number[] with length 1 or 2, but received ${JSON.stringify(e.kernelSize)}.`)}};$c.className="Conv2D";oe.registerClass($c);var Fc=class extends Dc{constructor(e){super(3,e);Fc.verifyArgs(e)}getConfig(){let e=super.getConfig();return delete e.rank,e}static verifyArgs(e){if(typeof e.kernelSize!="number"&&!(Array.isArray(e.kernelSize)&&(e.kernelSize.length===1||e.kernelSize.length===3)))throw new G(`Conv3D expects config.kernelSize to be number or [number, number, number], but received ${JSON.stringify(e.kernelSize)}.`)}};Fc.className="Conv3D";oe.registerClass(Fc);var QA=class extends $c{constructor(e){super(e);if(this.inputSpec=[new zt({ndim:4})],this.padding!=="same"&&this.padding!=="valid")throw new G(`Conv2DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode ${this.padding}`)}build(e){if(e=at(e),e.length!==4)throw new G("Input should have rank 4; Received input shape: "+JSON.stringify(e));let t=this.dataFormat==="channelsFirst"?1:e.length-1;if(e[t]==null)throw new G("The channel dimension of the inputs should be defined. Found `None`.");let n=e[t],s=this.kernelSize.concat([this.filters,n]);this.kernel=this.addWeight("kernel",s,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new zt({ndim:4,axes:{[t]:n}})],this.built=!0}call(e,t){return H(()=>{let n=ze(e);if(n.shape.length!==4)throw new G(`Conv2DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-${n.shape.length}`);let s=n.shape,r=s[0],a,o;this.dataFormat==="channelsFirst"?(a=2,o=3):(a=1,o=2);let i=s[a],l=s[o],u=this.kernelSize[0],c=this.kernelSize[1],d=this.strides[0],h=this.strides[1],p=lr(i,d,u,this.padding),f=lr(l,h,c,this.padding),m=[r,p,f,this.filters];this.dataFormat!=="channelsLast"&&(n=Xe(n,[0,2,3,1]));let g=Ng(n,this.kernel.read(),m,this.strides,this.padding);return this.dataFormat!=="channelsLast"&&(g=Xe(g,[0,3,1,2])),this.bias!=null&&(g=Ws(g,this.bias.read(),this.dataFormat)),this.activation!=null&&(g=this.activation.apply(g)),g})}computeOutputShape(e){e=at(e);let t=e.slice(),n,s,r;this.dataFormat==="channelsFirst"?(n=1,s=2,r=3):(n=3,s=1,r=2);let a=this.kernelSize[0],o=this.kernelSize[1],i=this.strides[0],l=this.strides[1];return t[n]=this.filters,t[s]=lr(t[s],i,a,this.padding),t[r]=lr(t[r],l,o,this.padding),t}getConfig(){let e=super.getConfig();return delete e.dilationRate,e}};QA.className="Conv2DTranspose";oe.registerClass(QA);var e1=class extends Fc{constructor(e){super(e);if(this.inputSpec=[new zt({ndim:5})],this.padding!=="same"&&this.padding!=="valid")throw new G(`Conv3DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode ${this.padding}`)}build(e){if(e=at(e),e.length!==5)throw new G("Input should have rank 5; Received input shape: "+JSON.stringify(e));let t=this.dataFormat==="channelsFirst"?1:e.length-1;if(e[t]==null)throw new G("The channel dimension of the inputs should be defined. Found `None`.");let n=e[t],s=this.kernelSize.concat([this.filters,n]);this.kernel=this.addWeight("kernel",s,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new zt({ndim:5,axes:{[t]:n}})],this.built=!0}call(e,t){return H(()=>{let n=ze(e);if(n.shape.length!==5)throw new G(`Conv3DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-${n.shape.length}`);let s=n.shape,r=s[0],a,o,i;this.dataFormat==="channelsFirst"?(i=2,a=3,o=4):(i=1,a=2,o=3);let l=s[i],u=s[a],c=s[o],d=this.kernelSize[0],h=this.kernelSize[1],p=this.kernelSize[2],f=this.strides[0],m=this.strides[1],g=this.strides[2],A=lr(l,f,d,this.padding),y=lr(u,m,h,this.padding),x=lr(c,g,p,this.padding),b=[r,A,y,x,this.filters];this.dataFormat!=="channelsLast"&&(n=Xe(n,[0,2,3,4,1]));let v=eb(n,this.kernel.read(),b,this.strides,this.padding);return this.dataFormat!=="channelsLast"&&(v=Xe(v,[0,4,1,2,3])),this.bias!==null&&(v=Ws(v,this.bias.read(),this.dataFormat)),this.activation!==null&&(v=this.activation.apply(v)),v})}computeOutputShape(e){e=at(e);let t=e.slice(),n,s,r,a;this.dataFormat==="channelsFirst"?(n=1,s=2,r=3,a=4):(n=4,s=1,r=2,a=3);let o=this.kernelSize[0],i=this.kernelSize[1],l=this.kernelSize[2],u=this.strides[0],c=this.strides[1],d=this.strides[2];return t[n]=this.filters,t[s]=lr(t[s],u,o,this.padding),t[r]=lr(t[r],c,i,this.padding),t[a]=lr(t[a],d,l,this.padding),t}getConfig(){let e=super.getConfig();return delete e.dilationRate,e}};e1.className="Conv3DTranspose";oe.registerClass(e1);var vv=class extends Dc{constructor(e,t){super(e,t);if(this.DEFAULT_DEPTHWISE_INITIALIZER="glorotUniform",this.DEFAULT_POINTWISE_INITIALIZER="glorotUniform",this.depthwiseKernel=null,this.pointwiseKernel=null,t.filters==null)throw new G("The `filters` configuration field is required by SeparableConv, but is unspecified.");if(t.kernelInitializer!=null||t.kernelRegularizer!=null||t.kernelConstraint!=null)throw new G("Fields kernelInitializer, kernelRegularizer and kernelConstraint are invalid for SeparableConv2D. Use depthwiseInitializer, depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, pointwiseRegularizer and pointwiseConstraint instead.");if(t.padding!=null&&t.padding!=="same"&&t.padding!=="valid")throw new G(`SeparableConv${this.rank}D supports only padding modes: 'same' and 'valid', but received ${JSON.stringify(t.padding)}`);this.depthMultiplier=t.depthMultiplier==null?1:t.depthMultiplier,this.depthwiseInitializer=wt(t.depthwiseInitializer||this.DEFAULT_DEPTHWISE_INITIALIZER),this.depthwiseRegularizer=kt(t.depthwiseRegularizer),this.depthwiseConstraint=Xt(t.depthwiseConstraint),this.pointwiseInitializer=wt(t.depthwiseInitializer||this.DEFAULT_POINTWISE_INITIALIZER),this.pointwiseRegularizer=kt(t.pointwiseRegularizer),this.pointwiseConstraint=Xt(t.pointwiseConstraint)}build(e){if(e=at(e),e.length{e=ze(e);let n;if(this.rank===1)throw new Oe("1D separable convolution is not implemented yet.");return this.rank===2&&(this.dataFormat==="channelsFirst"&&(e=Xe(e,[0,2,3,1])),n=wb(e,this.depthwiseKernel.read(),this.pointwiseKernel.read(),this.strides,this.padding,this.dilationRate,"NHWC")),this.useBias&&(n=Ws(n,this.bias.read(),this.dataFormat)),this.activation!=null&&(n=this.activation.apply(n)),this.dataFormat==="channelsFirst"&&(n=Xe(n,[0,3,1,2])),n})}getConfig(){let e=super.getConfig();return delete e.rank,delete e.kernelInitializer,delete e.kernelRegularizer,delete e.kernelConstraint,e.depthwiseInitializer=Nt(this.depthwiseInitializer),e.pointwiseInitializer=Nt(this.pointwiseInitializer),e.depthwiseRegularizer=dt(this.depthwiseRegularizer),e.pointwiseRegularizer=dt(this.pointwiseRegularizer),e.depthwiseConstraint=qt(this.depthwiseConstraint),e.pointwiseConstraint=qt(this.pointwiseConstraint),e}};vv.className="SeparableConv";var t1=class extends vv{constructor(e){super(2,e)}};t1.className="SeparableConv2D";oe.registerClass(t1);var qp=class extends Dc{constructor(e){super(1,e);qp.verifyArgs(e),this.inputSpec=[{ndim:3}]}getConfig(){let e=super.getConfig();return delete e.rank,delete e.dataFormat,e}static verifyArgs(e){if(typeof e.kernelSize!="number"&&!uA(e.kernelSize,"number",1,1))throw new G(`Conv1D expects config.kernelSize to be number or number[] with length 1, but received ${JSON.stringify(e.kernelSize)}.`)}};qp.className="Conv1D";oe.registerClass(qp);var n1=class extends Ze{constructor(e){super(e);typeof e.cropping=="number"?this.cropping=[[e.cropping,e.cropping],[e.cropping,e.cropping]]:typeof e.cropping[0]=="number"?this.cropping=[[e.cropping[0],e.cropping[0]],[e.cropping[1],e.cropping[1]]]:this.cropping=e.cropping,this.dataFormat=e.dataFormat===void 0?"channelsLast":e.dataFormat,this.inputSpec=[{ndim:4}]}computeOutputShape(e){return this.dataFormat==="channelsFirst"?[e[0],e[1],e[2]-this.cropping[0][0]-this.cropping[0][1],e[3]-this.cropping[1][0]-this.cropping[1][1]]:[e[0],e[1]-this.cropping[0][0]-this.cropping[0][1],e[2]-this.cropping[1][0]-this.cropping[1][1],e[3]]}call(e,t){return H(()=>{if(e=ze(e),this.dataFormat==="channelsLast"){let n=Sp(e,this.cropping[0][0],e.shape[1]-this.cropping[0][0]-this.cropping[0][1],2);return Sp(n,this.cropping[1][0],e.shape[2]-this.cropping[1][1]-this.cropping[1][0],3)}else{let n=Sp(e,this.cropping[0][0],e.shape[2]-this.cropping[0][0]-this.cropping[0][1],3);return Sp(n,this.cropping[1][0],e.shape[3]-this.cropping[1][1]-this.cropping[1][0],4)}})}getConfig(){let e={cropping:this.cropping,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}};n1.className="Cropping2D";oe.registerClass(n1);var s1=class extends Ze{constructor(e){super(e);this.DEFAULT_SIZE=[2,2],this.inputSpec=[{ndim:4}],this.size=e.size==null?this.DEFAULT_SIZE:e.size,this.dataFormat=e.dataFormat==null?"channelsLast":e.dataFormat,Ft(this.dataFormat),this.interpolation=e.interpolation==null?"nearest":e.interpolation,FO(this.interpolation)}computeOutputShape(e){if(this.dataFormat==="channelsFirst"){let t=e[2]==null?null:this.size[0]*e[2],n=e[3]==null?null:this.size[1]*e[3];return[e[0],e[1],t,n]}else{let t=e[1]==null?null:this.size[0]*e[1],n=e[2]==null?null:this.size[1]*e[2];return[e[0],t,n,e[3]]}}call(e,t){return H(()=>{let n=ze(e),s=n.shape;if(this.dataFormat==="channelsFirst"){n=Xe(n,[0,2,3,1]);let r=this.size[0]*s[2],a=this.size[1]*s[3],o=this.interpolation==="nearest"?_e.resizeNearestNeighbor(n,[r,a]):_e.resizeBilinear(n,[r,a]);return Xe(o,[0,3,1,2])}else{let r=this.size[0]*s[1],a=this.size[1]*s[2];return this.interpolation==="nearest"?_e.resizeNearestNeighbor(n,[r,a]):_e.resizeBilinear(n,[r,a])}})}getConfig(){let e={size:this.size,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}};s1.className="UpSampling2D";oe.registerClass(s1);function bM(e,t,n=[1,1],s="valid",r,a){return H(()=>{r==null&&(r=zs()),Ft(r);let o=YA(e,r);if(e.rank!==4)throw new G(`Input for depthwiseConv2d is required to be 4-D, but is instead ${e.rank}-D`);if(t.rank!==4)throw new G(`depthwiseKernel is required to be 4-D, but is instead ${t.rank}-D`);return o=dc(o,t,n,s==="same"?"same":"valid","NHWC",a),r==="channelsFirst"&&(o=Xe(o,[0,3,1,2])),o})}var r1=class extends JA{constructor(e){super(2,e);this.depthwiseKernel=null,this.depthMultiplier=e.depthMultiplier==null?1:e.depthMultiplier,this.depthwiseInitializer=wt(e.depthwiseInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.depthwiseConstraint=Xt(e.depthwiseConstraint),this.depthwiseRegularizer=kt(e.depthwiseRegularizer)}build(e){if(e=at(e),e.length<4)throw new G(`Inputs to DepthwiseConv2D should have rank 4. Received input shape: ${JSON.stringify(e)}.`);let t=this.dataFormat==="channelsFirst"?1:3;if(e[t]==null||e[t]<0)throw new G(`The channel dimension of the inputs to DepthwiseConv2D should be defined, but is not (${e[t]}).`);let n=e[t],s=[this.kernelSize[0],this.kernelSize[1],n,this.depthMultiplier];this.depthwiseKernel=this.addWeight("depthwise_kernel",s,null,this.depthwiseInitializer,this.depthwiseRegularizer,!0,this.depthwiseConstraint),this.useBias?this.bias=this.addWeight("bias",[n*this.depthMultiplier],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return H(()=>{e=ze(e);let n=bM(e,this.depthwiseKernel.read(),this.strides,this.padding,this.dataFormat,null);return this.useBias&&(n=Ws(n,this.bias.read(),this.dataFormat)),this.activation!=null&&(n=this.activation.apply(n)),n})}computeOutputShape(e){e=at(e);let t=this.dataFormat==="channelsFirst"?e[2]:e[1],n=this.dataFormat==="channelsFirst"?e[3]:e[2],s=this.dataFormat==="channelsFirst"?e[1]*this.depthMultiplier:e[3]*this.depthMultiplier,r=Hs(t,this.kernelSize[0],this.padding,this.strides[0]),a=Hs(n,this.kernelSize[1],this.padding,this.strides[1]);return this.dataFormat==="channelsFirst"?[e[0],s,r,a]:[e[0],r,a,s]}getConfig(){let e=super.getConfig();return e.depthMultiplier=this.depthMultiplier,e.depthwiseInitializer=Nt(this.depthwiseInitializer),e.depthwiseRegularizer=dt(this.depthwiseRegularizer),e.depthwiseConstraint=qt(this.depthwiseRegularizer),e}};r1.className="DepthwiseConv2D";oe.registerClass(r1);function wv(e,t,n,s){if(Array.isArray(e)){if(t!=null||n!=null)throw new G("When inputs is an array, neither initialState or constants should be provided");s!=null&&(n=e.slice(e.length-s,e.length),e=e.slice(0,e.length-s)),e.length>1&&(t=e.slice(1,e.length)),e=e[0]}function r(a){return a==null||Array.isArray(a)?a:[a]}return t=r(t),n=r(n),{inputs:e,initialState:t,constants:n}}function kv(e,t,n,s=!1,r,a,o=!1,i=!1){return H(()=>{let l=t.shape.length;if(l<3)throw new G(`Input should be at least 3D, but is ${l}D.`);let u=[1,0].concat(Bs(2,l));if(t=Xe(t,u),a!=null)throw new Oe("The rnn() functoin of the deeplearn.js backend does not support constants yet.");o&&console.warn("Backend rnn(): the unroll = true option is not applicable to the imperative deeplearn.js backend."),r!=null&&(r=ce(ce(r,"bool"),"float32"),r.rank===l-1&&(r=Ot(r,-1)),r=Xe(r,u)),s&&(t=fs(t,0),r!=null&&(r=fs(r,0)));let c=[],d,h=n,p=t.shape[0],f=ms(t),m;r!=null&&(m=ms(r));for(let A=0;Ae(y,h));if(r==null)d=x[0],h=x[1];else{let b=H(()=>{let v=m[A],k=ge(ps(v),v),S=ae(L(x[0],v),L(h[0],k)),C=h.map((_,O)=>ae(L(x[1][O],v),L(_,k)));return{output:S,newStates:C}});d=b.output,h=b.newStates}i&&c.push(d)}let g;return i&&(g=Dn(c,1)),[d,g,h]})}var ur=class extends Ze{constructor(e){super(e);let t;if(e.cell==null)throw new G("cell property is missing for the constructor of RNN.");if(Array.isArray(e.cell)?t=new Zp({cells:e.cell}):t=e.cell,t.stateSize==null)throw new G("The RNN cell should have an attribute `stateSize` (tuple of integers, one integer per RNN state).");this.cell=t,this.returnSequences=e.returnSequences==null?!1:e.returnSequences,this.returnState=e.returnState==null?!1:e.returnState,this.goBackwards=e.goBackwards==null?!1:e.goBackwards,this._stateful=e.stateful==null?!1:e.stateful,this.unroll=e.unroll==null?!1:e.unroll,this.supportsMasking=!0,this.inputSpec=[new zt({ndim:3})],this.stateSpec=null,this.states_=null,this.numConstants=null,this.keptStates=[]}getStates(){if(this.states_==null){let e=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1;return Bs(0,e).map(t=>null)}else return this.states_}setStates(e){this.states_=e}computeOutputShape(e){CA(e)&&(e=e[0]),e=e;let t=this.cell.stateSize;Array.isArray(t)||(t=[t]);let n=t[0],s;if(this.returnSequences?s=[e[0],e[1],n]:s=[e[0],n],this.returnState){let r=[];for(let a of t)r.push([e[0],a]);return[s].concat(r)}else return s}computeMask(e,t){return H(()=>{Array.isArray(t)&&(t=t[0]);let n=this.returnSequences?t:null;if(this.returnState){let s=this.states.map(r=>null);return[n].concat(s)}else return n})}get states(){if(this.states_==null){let e=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1,t=[];for(let n=0;no.shape[o.shape.length-1]),a))throw new G(`An initialState was passed that is not compatible with cell.stateSize. Received stateSpec=${this.stateSpec}; However cell.stateSize is ${this.cell.stateSize}`)}else this.stateSpec=a.map(o=>new zt({shape:[null,o]}));this.stateful&&this.resetStates()}resetStates(e,t=!1){H(()=>{if(!this.stateful)throw new Cr("Cannot call resetStates() on an RNN Layer that is not stateful.");let n=this.inputSpec[0].shape[0];if(n==null)throw new G("If an RNN is stateful, it needs to know its batch size. Specify the batch size of your input tensors: \n- If using a Sequential model, specify the batch size by passing a `batchInputShape` option to your first layer.\n- If using the functional API, specify the batch size by passing a `batchShape` option to your Input layer.");if(this.states_==null)Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map(s=>Pt([n,s])):this.states_=[Pt([n,this.cell.stateSize])];else if(e==null)Z(this.states_),this.keptStates!=null&&(Z(this.keptStates),this.keptStates=[]),Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map(s=>Pt([n,s])):this.states_[0]=Pt([n,this.cell.stateSize]);else{if(Array.isArray(e)||(e=[e]),e.length!==this.states_.length)throw new G(`Layer ${this.name} expects ${this.states_.length} state(s), but it received ${e.length} state value(s). Input received: ${e}`);t===!0?this.keptStates.push(this.states_.slice()):Z(this.states_);for(let s=0;sJt(s.clone()))})}apply(e,t){let n=t==null?null:t.initialState,s=t==null?null:t.constants;t==null&&(t={});let r=wv(e,n,s,this.numConstants);e=r.inputs,n=r.initialState,s=r.constants;let a=[],o=[];if(n!=null){t.initialState=n,a=a.concat(n),this.stateSpec=[];for(let l of n)this.stateSpec.push(new zt({shape:l.shape}));o=o.concat(this.stateSpec)}if(s!=null&&(t.constants=s,a=a.concat(s),this.numConstants=s.length),a[0]instanceof Vs){let l=[e].concat(a),u=this.inputSpec.concat(o),c=this.inputSpec;this.inputSpec=u;let d=super.apply(l,t);return this.inputSpec=c,d}else return super.apply(e,t)}call(e,t){return H(()=>{let n=t==null?null:t.mask,s=t==null?null:t.training,r=t==null?null:t.initialState;e=ze(e),r==null&&(this.stateful?r=this.states_:r=this.getInitialState(e));let a=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1;if(r.length!==a)throw new G(`RNN Layer has ${a} state(s) but was passed ${r.length} initial state(s).`);this.unroll&&console.warn("Ignoring unroll = true for RNN layer, due to imperative backend.");let o={training:s},l=kv((p,f)=>{let m=this.cell.call([p].concat(f),o);return[m[0],m.slice(1)]},e,r,this.goBackwards,n,null,this.unroll,this.returnSequences),u=l[0],c=l[1],d=l[2];this.stateful&&this.resetStates(d,s);let h=this.returnSequences?c:u;return this.returnState?[h].concat(d):h})}getInitialState(e){return H(()=>{let t=Pt(e.shape);return t=ve(t,[1,2]),t=Ic(t),Array.isArray(this.cell.stateSize)?this.cell.stateSize.map(n=>n>1?AA(t,[1,n]):t):this.cell.stateSize>1?[AA(t,[1,this.cell.stateSize])]:[t]})}get trainableWeights(){return this.trainable?this.cell.trainableWeights:[]}get nonTrainableWeights(){return this.trainable?this.cell.nonTrainableWeights:this.cell.weights}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),this.cell!=null&&this.cell.setFastWeightInitDuringBuild(e)}getConfig(){let e=super.getConfig(),t={returnSequences:this.returnSequences,returnState:this.returnState,goBackwards:this.goBackwards,stateful:this.stateful,unroll:this.unroll};this.numConstants!=null&&(t.numConstants=this.numConstants);let n=this.cell.getConfig();return this.getClassName()===ur.className&&(t.cell={className:this.cell.getClassName(),config:n}),Object.assign({},n,e,t)}static fromConfig(e,t,n={}){let s=t.cell,r=Us(s,n);return new e(Object.assign(t,{cell:r}))}};ur.className="RNN";oe.registerClass(ur);var Oc=class extends Ze{},Xp=class extends Oc{constructor(e){super(e);this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",this.units=e.units,Qt(this.units,"units"),this.activation=ia(e.activation==null?this.DEFAULT_ACTIVATION:e.activation),this.useBias=e.useBias==null?!0:e.useBias,this.kernelInitializer=wt(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=wt(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=wt(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelRegularizer=kt(e.kernelRegularizer),this.recurrentRegularizer=kt(e.recurrentRegularizer),this.biasRegularizer=kt(e.biasRegularizer),this.kernelConstraint=Xt(e.kernelConstraint),this.recurrentConstraint=Xt(e.recurrentConstraint),this.biasConstraint=Xt(e.biasConstraint),this.dropout=Gl([1,ra([0,e.dropout==null?0:e.dropout])]),this.recurrentDropout=Gl([1,ra([0,e.recurrentDropout==null?0:e.recurrentDropout])]),this.stateSize=this.units,this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){e=at(e),this.kernel=this.addWeight("kernel",[e[e.length-1],this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return H(()=>{if(e=e,e.length!==2)throw new G(`SimpleRNNCell expects 2 input Tensors, got ${e.length}.`);let n=e[1];e=e[0];let s=t.training==null?!1:t.training;0ps(e),rate:this.dropout,training:s})),0ps(n),rate:this.recurrentDropout,training:s}));let r,a=this.dropoutMask,o=this.recurrentDropoutMask;a!=null?r=or(L(e,a),this.kernel.read()):r=or(e,this.kernel.read()),this.bias!=null&&(r=Ws(r,this.bias.read())),o!=null&&(n=L(n,o));let i=ae(r,or(n,this.recurrentKernel.read()));return this.activation!=null&&(i=this.activation.apply(i)),[i,i]})}getConfig(){let e=super.getConfig(),t={units:this.units,activation:oa(this.activation),useBias:this.useBias,kernelInitializer:Nt(this.kernelInitializer),recurrentInitializer:Nt(this.recurrentInitializer),biasInitializer:Nt(this.biasInitializer),kernelRegularizer:dt(this.kernelRegularizer),recurrentRegularizer:dt(this.recurrentRegularizer),biasRegularizer:dt(this.biasRegularizer),activityRegularizer:dt(this.activityRegularizer),kernelConstraint:qt(this.kernelConstraint),recurrentConstraint:qt(this.recurrentConstraint),biasConstraint:qt(this.biasConstraint),dropout:this.dropout,recurrentDropout:this.recurrentDropout};return Object.assign({},e,t)}};Xp.className="SimpleRNNCell";oe.registerClass(Xp);var a1=class extends ur{constructor(e){e.cell=new Xp(e);super(e)}call(e,t){return H(()=>{this.cell.dropoutMask!=null&&(Z(this.cell.dropoutMask),this.cell.dropoutMask=null),this.cell.recurrentDropoutMask!=null&&(Z(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);let n=t==null?null:t.mask,s=t==null?null:t.training,r=t==null?null:t.initialState;return super.call(e,{mask:n,training:s,initialState:r})})}static fromConfig(e,t){return new e(t)}};a1.className="SimpleRNN";oe.registerClass(a1);var Kp=class extends Oc{constructor(e){super(e);if(this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_RECURRENT_ACTIVATION="hardSigmoid",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",e.resetAfter)throw new G("GRUCell does not support reset_after parameter set to true.");this.units=e.units,Qt(this.units,"units"),this.activation=ia(e.activation===void 0?this.DEFAULT_ACTIVATION:e.activation),this.recurrentActivation=ia(e.recurrentActivation===void 0?this.DEFAULT_RECURRENT_ACTIVATION:e.recurrentActivation),this.useBias=e.useBias==null?!0:e.useBias,this.kernelInitializer=wt(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=wt(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=wt(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelRegularizer=kt(e.kernelRegularizer),this.recurrentRegularizer=kt(e.recurrentRegularizer),this.biasRegularizer=kt(e.biasRegularizer),this.kernelConstraint=Xt(e.kernelConstraint),this.recurrentConstraint=Xt(e.recurrentConstraint),this.biasConstraint=Xt(e.biasConstraint),this.dropout=Gl([1,ra([0,e.dropout==null?0:e.dropout])]),this.recurrentDropout=Gl([1,ra([0,e.recurrentDropout==null?0:e.recurrentDropout])]),this.implementation=e.implementation,this.stateSize=this.units,this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){e=at(e);let t=e[e.length-1];this.kernel=this.addWeight("kernel",[t,this.units*3],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,this.units*3],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[this.units*3],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return H(()=>{if(e=e,e.length!==2)throw new G(`GRUCell expects 2 input Tensors (inputs, h, c), got ${e.length}.`);let n=t.training==null?!1:t.training,s=e[1];e=e[0],0ps(e),rate:this.dropout,training:n,count:3})),0ps(s),rate:this.recurrentDropout,training:n,count:3}));let r=this.dropoutMask,a=this.recurrentDropoutMask,o,i,l;0{this.cell.dropoutMask!=null&&(Z(this.cell.dropoutMask),this.cell.dropoutMask=null),this.cell.recurrentDropoutMask!=null&&(Z(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);let n=t==null?null:t.mask,s=t==null?null:t.training,r=t==null?null:t.initialState;return super.call(e,{mask:n,training:s,initialState:r})})}static fromConfig(e,t){return t.implmentation===0&&(t.implementation=1),new e(t)}};o1.className="GRU";oe.registerClass(o1);var Pc=class extends Oc{constructor(e){super(e);this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_RECURRENT_ACTIVATION="hardSigmoid",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",this.units=e.units,Qt(this.units,"units"),this.activation=ia(e.activation===void 0?this.DEFAULT_ACTIVATION:e.activation),this.recurrentActivation=ia(e.recurrentActivation===void 0?this.DEFAULT_RECURRENT_ACTIVATION:e.recurrentActivation),this.useBias=e.useBias==null?!0:e.useBias,this.kernelInitializer=wt(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=wt(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=wt(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.unitForgetBias=e.unitForgetBias,this.kernelRegularizer=kt(e.kernelRegularizer),this.recurrentRegularizer=kt(e.recurrentRegularizer),this.biasRegularizer=kt(e.biasRegularizer),this.kernelConstraint=Xt(e.kernelConstraint),this.recurrentConstraint=Xt(e.recurrentConstraint),this.biasConstraint=Xt(e.biasConstraint),this.dropout=Gl([1,ra([0,e.dropout==null?0:e.dropout])]),this.recurrentDropout=Gl([1,ra([0,e.recurrentDropout==null?0:e.recurrentDropout])]),this.implementation=e.implementation,this.stateSize=[this.units,this.units],this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){var t;e=at(e);let n=e[e.length-1];this.kernel=this.addWeight("kernel",[n,this.units*4],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,this.units*4],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint);let s;if(this.useBias){if(this.unitForgetBias){let r=this.biasInitializer,a=this.units;s=new(t=class extends Es{apply(i,l){let u=r.apply([a]),c=new Tp().apply([a]),d=r.apply([a*2]);return y3(y3(u,c),d)}},t.className="CustomInit",t)}else s=this.biasInitializer;this.bias=this.addWeight("bias",[this.units*4],null,s,this.biasRegularizer,!0,this.biasConstraint)}else this.bias=null;this.built=!0}call(e,t){return H(()=>{let n=t.training==null?!1:t.training;if(e=e,e.length!==3)throw new G(`LSTMCell expects 3 input Tensors (inputs, h, c), got ${e.length}.`);let s=e[1],r=e[2];e=e[0],0ps(e),rate:this.dropout,training:n,count:4})),0ps(s),rate:this.recurrentDropout,training:n,count:4}));let a=this.dropoutMask,o=this.recurrentDropoutMask,i,l,u,c;0{this.cell.dropoutMask!=null&&(Z(this.cell.dropoutMask),this.cell.dropoutMask=null),this.cell.recurrentDropoutMask!=null&&(Z(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);let n=t==null?null:t.mask,s=t==null?null:t.training,r=t==null?null:t.initialState;return super.call(e,{mask:n,training:s,initialState:r})})}static fromConfig(e,t){return t.implmentation===0&&(t.implementation=1),new e(t)}};i1.className="LSTM";oe.registerClass(i1);var Zp=class extends Oc{constructor(e){super(e);this.cells=e.cells}get stateSize(){let e=[];for(let t of this.cells.slice().reverse())Array.isArray(t.stateSize)?e.push(...t.stateSize):e.push(t.stateSize);return e}call(e,t){return H(()=>{e=e;let n=e.slice(1),s=[];for(let o of this.cells.slice().reverse())Array.isArray(o.stateSize)?s.push(n.splice(0,o.stateSize.length)):s.push(n.splice(0,1));s.reverse();let r=[],a;for(let o=0;o{Ho(`RNNCell_${s}`,()=>{n.build(e),Array.isArray(n.stateSize)?t=n.stateSize[0]:t=n.stateSize,e=[e[0],t]})}),this.built=!0}getConfig(){let e=super.getConfig(),t=r=>({className:r.getClassName(),config:r.getConfig()}),s={cells:this.cells.map(t)};return Object.assign({},e,s)}static fromConfig(e,t,n={}){let s=[];for(let r of t.cells)s.push(Us(r,n));return new e({cells:s})}get trainableWeights(){if(!this.trainable)return[];let e=[];for(let t of this.cells)e.push(...t.trainableWeights);return e}get nonTrainableWeights(){let e=[];for(let t of this.cells)e.push(...t.nonTrainableWeights);if(!this.trainable){let t=[];for(let n of this.cells)t.push(...n.trainableWeights);return t.concat(e)}return e}getWeights(){let e=[];for(let t of this.cells)e.push(...t.weights);return TA(e)}setWeights(e){let t=[];for(let n of this.cells){let s=n.weights.length,r=e.splice(s);for(let a=0;ab3(t(),n),o=()=>Cc(a,t,s);return!r||r<=1?Jt(o().clone()):Array(r).fill(void 0).map(o).map(l=>Jt(l.clone()))}var vM=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,s=Object.getOwnPropertySymbols(e);r{if(this.cell.dropoutMask!=null&&(Z(this.cell.dropoutMask),this.cell.dropoutMask=null),this.cell.recurrentDropoutMask!=null&&(Z(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null),t&&t.constants)throw new G("ConvRNN2D cell does not support constants");let n=t==null?null:t.mask,s=t==null?null:t.training,r=t==null?null:t.initialState;return super.call(e,{mask:n,training:s,initialState:r})})}computeOutputShape(e){let t=this.computeSingleOutputShape(e);return this.returnSequences||(t=[t[0],...t.slice(2)]),this.returnState&&(t=[t,...Array(2).fill([e[0],...t.slice(-3)])]),t}getInitialState(e){return H(()=>{let{stateSize:t}=this.cell,n=e.shape,s=this.computeSingleOutputShape(n),r=[s[0],...s.slice(2)],a=Pt(r);return Array.isArray(t)?Array(t.length).fill(a):[a]})}resetStates(e,t=!1){H(()=>{if(!this.stateful)throw new Cr("Cannot call resetStates() on an RNN Layer that is not stateful.");let n=this.inputSpec[0].shape,s=this.computeSingleOutputShape(n),r=[s[0],...s.slice(2)];if(n[0]==null)throw new G("If an RNN is stateful, it needs to know its batch size. Specify the batch size of your input tensors: \n- If using a Sequential model, specify the batch size by passing a `batchInputShape` option to your first layer.\n- If using the functional API, specify the batch size by passing a `batchShape` option to your Input layer.");if(this.getStates()==null)Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map(()=>Pt(r)):this.states_=[Pt(r)];else if(e==null)Z(this.states_),this.keptStates!=null&&(Z(this.keptStates),this.keptStates=[]),Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map(()=>Pt(r)):this.states_[0]=Pt(r);else{if(Array.isArray(e)||(e=[e]),e.length!==this.states_.length)throw new G(`Layer ${this.name} expects ${this.states_.length} state(s), but it received ${e.length} state value(s). Input received: ${e}`);t?this.keptStates.push(this.states_.slice()):Z(this.states_);for(let o=0;oJt(o.clone()))})}computeSingleOutputShape(e){let{dataFormat:t,filters:n,kernelSize:s,padding:r,strides:a,dilationRate:o}=this.cell,i=t==="channelsFirst",l=e[i?3:2],u=e[i?4:3],c=Hs(l,s[0],r,a[0],o[0]),d=Hs(u,s[1],r,a[1],o[1]);return[...e.slice(0,2),...i?[n,c,d]:[c,d,n]]}};Iv.className="ConvRNN2D";var Yp=class extends Pc{constructor(e){let{filters:t,kernelSize:n,strides:s,padding:r,dataFormat:a,dilationRate:o}=e;super(Object.assign({},e,{units:t}));this.filters=t,Qt(this.filters,"filters"),this.kernelSize=Zl(n,2,"kernelSize"),this.kernelSize.forEach(i=>Qt(i,"kernelSize")),this.strides=Zl(s||1,2,"strides"),this.strides.forEach(i=>Qt(i,"strides")),this.padding=r||"valid",gs(this.padding),this.dataFormat=a||"channelsLast",Ft(this.dataFormat),this.dilationRate=Zl(o||1,2,"dilationRate"),this.dilationRate.forEach(i=>Qt(i,"dilationRate"))}build(e){var t;e=at(e);let n=this.dataFormat==="channelsFirst"?1:e.length-1;if(e[n]==null)throw new G(`The channel dimension of the input should be defined. Found ${e[n]}`);let s=e[n],r=4,a=this.kernelSize.concat([s,this.filters*r]);this.kernel=this.addWeight("kernel",a,null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint);let o=this.kernelSize.concat([this.filters,this.filters*r]);if(this.recurrentKernel=this.addWeight("recurrent_kernel",o,null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias){let i;if(this.unitForgetBias){let l=this.biasInitializer,u=this.filters;i=new(t=class extends Es{apply(d,h){let p=l.apply([u]),f=qn([u]),m=l.apply([u*2]);return gA([p,f,m])}},t.className="CustomInit",t)}else i=this.biasInitializer;this.bias=this.addWeight("bias",[this.filters*r],null,i,this.biasRegularizer,!0,this.biasConstraint)}this.built=!0}call(e,t){return H(()=>{if(e.length!==3)throw new G(`ConvLSTM2DCell expects 3 input Tensors (inputs, h, c), got ${e.length}.`);let n=t.training||!1,s=e[0],r=e[1],a=e[2],o=4;0ps(s),rate:this.dropout,training:n,count:o}));let i=this.dropoutMask,l=(ee,te,ne)=>!te||!te[ne]?ee:L(te[ne],ee),u=l(s,i,0),c=l(s,i,1),d=l(s,i,2),h=l(s,i,3);0ps(r),rate:this.recurrentDropout,training:n,count:o}));let p=this.recurrentDropoutMask,f=l(r,p,0),m=l(r,p,1),g=l(r,p,2),A=l(r,p,3),y=3,[x,b,v,k]=an(this.kernel.read(),o,y),[S,C,_,O]=this.useBias?an(this.bias.read(),o):[null,null,null,null];u=this.inputConv(u,x,S,this.padding),c=this.inputConv(c,b,C,this.padding),d=this.inputConv(d,v,_,this.padding),h=this.inputConv(h,k,O,this.padding);let[E,R,T,P]=an(this.recurrentKernel.read(),o,y);f=this.recurrentConv(f,E),m=this.recurrentConv(m,R),g=this.recurrentConv(g,T),A=this.recurrentConv(A,P);let V=this.recurrentActivation.apply(ae(u,f)),j=this.recurrentActivation.apply(ae(c,m)),q=ae(L(j,a),L(V,this.activation.apply(ae(d,g)))),X=L(this.recurrentActivation.apply(ae(h,A)),this.activation.apply(q));return[X,X,q]})}getConfig(){let e=super.getConfig(),{units:t}=e,n=vM(e,["units"]),s={filters:this.filters,kernelSize:this.kernelSize,padding:this.padding,dataFormat:this.dataFormat,dilationRate:this.dilationRate,strides:this.strides};return Object.assign({},n,s)}inputConv(e,t,n,s){let r=Jr(e,t,this.strides,s||"valid",this.dataFormat==="channelsFirst"?"NCHW":"NHWC",this.dilationRate);return n?Ws(r,n,this.dataFormat):r}recurrentConv(e,t){return Jr(e,t,1,"same",this.dataFormat==="channelsFirst"?"NCHW":"NHWC")}};Yp.className="ConvLSTM2DCell";oe.registerClass(Yp);var l1=class extends Iv{constructor(e){let t=new Yp(e);super(Object.assign({},e,{cell:t}))}static fromConfig(e,t){return new e(t)}};l1.className="ConvLSTM2D";oe.registerClass(l1);var Jp=class extends Ze{constructor(e){super(e);this.rate=Math.max(Math.min(e.rate,1),0),this.noiseShape=e.noiseShape,this.seed=e.seed,this.supportsMasking=!0}getNoiseShape(e){if(this.noiseShape==null)return this.noiseShape;let t=e.shape,n=[];for(let s=0;s{this.invokeCallHook(e,t);let n=ze(e);if(0b3(n,this.rate,r,this.seed),()=>n,s)}return e})}getConfig(){let e={rate:this.rate,noiseShape:this.noiseShape,seed:this.seed},t=super.getConfig();return Object.assign(e,t),e}dispose(){return super.dispose()}};Jp.className="Dropout";oe.registerClass(Jp);var u1=class extends Jp{constructor(e){super(e);this.inputSpec=[{ndim:3}]}getNoiseShape(e){let t=e.shape;return[t[0],1,t[2]]}};u1.className="SpatialDropout1D";oe.registerClass(u1);var c1=class extends Ze{constructor(e){super(e);if(this.activation=null,this.useBias=!0,this.kernel=null,this.bias=null,this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_BIAS_INITIALIZER="zeros",e.batchInputShape==null&&e.inputShape==null&&e.inputDim!=null){let t=null;e.batchSize!=null&&(t=e.batchSize),this.batchInputShape=[t,e.inputDim]}this.units=e.units,Qt(this.units,"units"),this.activation=ia(e.activation),e.useBias!=null&&(this.useBias=e.useBias),this.kernelInitializer=wt(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.biasInitializer=wt(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelConstraint=Xt(e.kernelConstraint),this.biasConstraint=Xt(e.biasConstraint),this.kernelRegularizer=kt(e.kernelRegularizer),this.biasRegularizer=kt(e.biasRegularizer),this.activityRegularizer=kt(e.activityRegularizer),this.supportsMasking=!0,this.inputSpec=[{minNDim:2}]}build(e){e=at(e);let t=e[e.length-1];this.kernel==null&&(this.kernel=this.addWeight("kernel",[t,this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint))),this.inputSpec=[{minNDim:2,axes:{[-1]:t}}],this.built=!0}computeOutputShape(e){e=at(e);let t=e.slice();return t[t.length-1]=this.units,t}call(e,t){return H(()=>{this.invokeCallHook(e,t);let n=ze(e),s=u3(this.activation.getClassName()),r;return s!=null?r=or(n,this.kernel.read(),s,this.bias?this.bias.read():null):(r=or(n,this.kernel.read()),this.bias!=null&&(r=Ws(r,this.bias.read())),this.activation!=null&&(r=this.activation.apply(r))),r})}getConfig(){let e={units:this.units,activation:oa(this.activation),useBias:this.useBias,kernelInitializer:Nt(this.kernelInitializer),biasInitializer:Nt(this.biasInitializer),kernelRegularizer:dt(this.kernelRegularizer),biasRegularizer:dt(this.biasRegularizer),activityRegularizer:dt(this.activityRegularizer),kernelConstraint:qt(this.kernelConstraint),biasConstraint:qt(this.biasConstraint)},t=super.getConfig();return Object.assign(e,t),e}};c1.className="Dense";oe.registerClass(c1);var d1=class extends Ze{constructor(e){e=e||{};super(e);this.inputSpec=[{minNDim:3}],this.dataFormat=e.dataFormat}computeOutputShape(e){e=at(e);for(let t of e.slice(1))if(t==null)throw new G(`The shape of the input to "Flatten" is not fully defined (got ${e.slice(1)}). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model.`);return[e[0],sa(e,1)]}call(e,t){return H(()=>{this.invokeCallHook(e,t);let n=ze(e);if(this.dataFormat==="channelsFirst"&&n.rank>1){let s=[0];for(let r=2;r{this.invokeCallHook(e,t);let n=ze(e);return this.activation.apply(n)})}getConfig(){let e={activation:oa(this.activation)},t=super.getConfig();return Object.assign(e,t),e}};h1.className="Activation";oe.registerClass(h1);var p1=class extends Ze{constructor(e){super(e);this.n=e.n,this.inputSpec=[{ndim:2}]}computeOutputShape(e){return[e[0],this.n,e[1]]}call(e,t){return H(()=>(e=ze(e),zO(e,this.n)))}getConfig(){let e={n:this.n},t=super.getConfig();return Object.assign(e,t),e}};p1.className="RepeatVector";oe.registerClass(p1);var f1=class extends Ze{constructor(e){super(e);this.targetShape=e.targetShape;for(let t=0;t{this.invokeCallHook(e,t);let n=ze(e),s=n.shape,r=s.slice(0,1).concat(this.fixUnknownDimension(s.slice(1),this.targetShape));return U(n,r)})}getConfig(){let e={targetShape:this.targetShape},t=super.getConfig();return Object.assign(e,t),e}};f1.className="Reshape";oe.registerClass(f1);var m1=class extends Ze{constructor(e){super(e);if(e.dims==null)throw new Error("Required configuration field `dims` is missing during Permute constructor call.");if(!Array.isArray(e.dims))throw new Error(`Permute constructor requires \`dims\` to be an Array, but received ${e.dims} instead.`);let t=Bs(1,e.dims.length+1);if(!w.arraysEqual(e.dims.slice().sort(),t))throw new Error("Invalid permutation `dims`: "+JSON.stringify(e.dims)+" `dims` must contain consecutive integers starting from 1.");this.dims=e.dims,this.dimsIncludingBatch=[0].concat(this.dims),this.inputSpec=[new zt({ndim:this.dims.length+1})]}computeOutputShape(e){e=at(e);let t=e.slice();return this.dims.forEach((n,s)=>{t[s+1]=e[n]}),t}call(e,t){return Xe(ze(e),this.dimsIncludingBatch)}getConfig(){let e={dims:this.dims},t=super.getConfig();return Object.assign(e,t),e}};m1.className="Permute";oe.registerClass(m1);var g1=class extends Ze{constructor(e){super(e==null?{}:e);this.supportsMasking=!0,e!=null?this.maskValue=e.maskValue==null?0:e.maskValue:this.maskValue=0}computeOutputShape(e){return e}getConfig(){let e=super.getConfig(),t={maskValue:this.maskValue};return Object.assign(t,e),t}computeMask(e,t){let n=ze(e),s=-1;return Hh(Bl(n,this.maskValue),s)}call(e,t){return H(()=>{this.invokeCallHook(e,t);let n=ze(e),s=-1,r=!0,a=Hh(Bl(n,this.maskValue),s,r);return L(n,ce(a,n.dtype))})}};g1.className="Masking";oe.registerClass(g1);var A1=class extends Ze{constructor(e){super(e);if(this.embeddings=null,this.DEFAULT_EMBEDDINGS_INITIALIZER="randomUniform",e.batchInputShape==null&&e.inputShape==null){let t=null;e.batchSize!=null&&(t=e.batchSize),e.inputLength==null?this.batchInputShape=[t,null]:this.batchInputShape=[t].concat(yt(e.inputLength))}this.inputDim=e.inputDim,Qt(this.inputDim,"inputDim"),this.outputDim=e.outputDim,Qt(this.outputDim,"outputDim"),this.embeddingsInitializer=wt(e.embeddingsInitializer||this.DEFAULT_EMBEDDINGS_INITIALIZER),this.embeddingsRegularizer=kt(e.embeddingsRegularizer),this.activityRegularizer=kt(e.activityRegularizer),this.embeddingsConstraint=Xt(e.embeddingsConstraint),this.maskZero=e.maskZero,this.supportsMasking=e.maskZero,this.inputLength=e.inputLength}build(e){this.embeddings=this.addWeight("embeddings",[this.inputDim,this.outputDim],this.dtype,this.embeddingsInitializer,this.embeddingsRegularizer,!0,this.embeddingsConstraint),this.built=!0}warnOnIncompatibleInputShape(e){}computeMask(e,t){return H(()=>this.maskZero?(e=ze(e),Bl(e,Ke(e))):null)}computeOutputShape(e){if(e=at(e),this.inputLength==null)return[...e,this.outputDim];let t=yt(this.inputLength);if(t.length!==e.length-1)throw new G(`"inputLength" is ${this.inputLength}, but received input shape has shape ${e}`);{let n=0;for(let s=0;s{this.invokeCallHook(e,t);let n=ze(e);n.dtype!=="int32"&&(n=Ip(n,"int32"));let s=x3(this.embeddings.read(),U(n,[n.size]));return U(s,at(this.computeOutputShape(n.shape)))})}getConfig(){let e={inputDim:this.inputDim,outputDim:this.outputDim,embeddingsInitializer:Nt(this.embeddingsInitializer),embeddingsRegularizer:dt(this.embeddingsRegularizer),activityRegularizer:dt(this.activityRegularizer),embeddingsConstraint:qt(this.embeddingsConstraint),maskZero:this.maskZero,inputLength:this.inputLength},t=super.getConfig();return Object.assign(e,t),e}};A1.className="Embedding";oe.registerClass(A1);var Ko=class extends Ze{constructor(e){super(e||{});this.supportsMasking=!0}mergeFunction(e){throw new Oe}computeElementwiseOpOutputShape(e,t){if(e==null||t==null)return null;if(e.length1)throw new G(`Can not merge tensors with different batch sizes. Got tensors with shapes: ${JSON.stringify(e)}.`);let n=e[0]==null?null:e[0].slice(1);for(let r=1;rr.length);e.indexOf(null)===-1&&na(s).length===1?this.reshapeRequired=!1:this.reshapeRequired=!0}call(e,t){return H(()=>{if(e=e,this.reshapeRequired){let n=[],s=e.map(r=>r.rank);if(s.indexOf(null)===-1){let r=ra(s);for(let a of e){let o=a.rank;for(let i=0;i1){let u=Bs(1,l).concat([0]);n.push(Xe(i,u)),r=!0}else n.push(i)}let a=this.mergeFunction(n),o=a.rank;if(r){if(o==null){let i=a.shape,l=i.length,u=i[l-1],c=[u].concat(i.slice(0,i.length-1));a=U(Xe(U(a,[-1,u]),[1,0]),c)}else if(o>1){let i=[o-1].concat(Bs(0,o-1));a=Xe(a,i)}}return a}}else return this.mergeFunction(e)})}computeOutputShape(e){e=e;let t;e[0]==null?t=null:t=e[0].slice(1);for(let s=1;s{if(t==null)return null;if(!Array.isArray(t))throw new G("`mask` should be an Array");if(!Array.isArray(e))throw new G("`inputs` should be an Array");if(t.length!==e.length)throw new G(`The Array 'inputs' and 'mask' are expected to have the same length, but have different lengths (${e.length} vs ${t.length})`);if(t.every(s=>s==null))return null;t=t.map(s=>s==null?s:Ot(s,0));let n=t[0];for(let s=1;s{let t=e[0].clone();for(let n=1;n{let t=e[0].clone();for(let n=1;n{let t=e[0].clone();for(let n=1;n{let t=e[0];for(let n=1;n{let t=e[0];for(let n=1;n1)throw new G("A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got input shapes: "+JSON.stringify(e))}mergeFunction(e){return H(()=>gA(e,this.axis))}computeOutputShape(e){if(!(Array.isArray(e)&&Array.isArray(e[0])))throw new G("A `Concatenate` layer should be called on a list of inputs.");let t=e,n=t[0].slice(),s=this.axis<0?n.length+this.axis:this.axis;for(let r of t.slice(1)){if(n[s]==null||r[s]==null){n[s]=null;break}n[s]+=r[s]}return n}computeMask(e,t){if(t==null)return null;if(!Array.isArray(t))throw new G("`mask` should be an array for Concatenate");if(!Array.isArray(e))throw new G("`inputs` should be an array for Concatenate");if(t.length!==e.length)throw new G(`Mismatch in the length of mask (${t.length}) and the legnth of inputs (${e.length})`);return H(()=>{let n=!0;if(t.forEach(a=>{if(a!=null){n=!1;return}}),n)return null;let s=[];for(let a=0;a3||t.shape.length>3)throw new Oe("batchDot is not implemented for tensors of 4D or higher rank yet");if(w.assert(e.shape.length>=2,()=>`batchDot requires the rank of x to be >= 2, but got ${e.shape.length}`),w.assert(e.shape.length>=2,()=>`batchDot requires the rank of y to be >= 2, but got ${t.shape.length}`),typeof n=="number"&&(n=[n,n]),e.dtype==="complex64"||t.dtype==="complex64")throw new Oe("batchDot is not implemented for complex64-type Tensors yet.");let s=e.shape.length,r=t.shape.length;n==null&&(n=[s-1,r-2]);let a=n;return H(()=>{let o;if(s>r){o=s-r;let l=[];for(let u=0;us){o=r-s;let l=[];for(let u=0;u0){let l;s>r?l=s+r-3:l=s-1;let u=[];for(let c=l;c"A `Dot` layer should be called on a list of exactly 2 inputs.");let t=e[0],n=e[1];if(t.length>3||n.length>3)throw new Oe("Dot layer does not support tensors of 4D or higher rank yet.");let s=this.interpretAxes(t,n);if(t[s[0]]!==n[s[1]])throw new G(`Dimension incompatibility: ${t[s[0]]} !== ${n[s[1]]}`)}mergeFunction(e){if(e.length!==2)throw new G(`A \`Dot\` layer must be called on exactly 2 inputs, but received ${e.length} input(s).`);let t=e[0],n=e[1],s;return Array.isArray(this.axes)?s=this.axes.map((r,a)=>Mc(r,e[a].shape.length)):s=[Mc(this.axes,t.shape.length),Mc(this.axes,n.shape.length)],this.normalize&&(t=Lp(t,s[0]),n=Lp(n,s[1])),wM(t,n,s)}interpretAxes(e,t){let n;return Array.isArray(this.axes)?n=this.axes:n=[Mc(this.axes,e.length),Mc(this.axes,t.length)],n}computeOutputShape(e){w.assert(Array.isArray(e)&&e.length===2&&Array.isArray(e[0])&&Array.isArray(e[1]),()=>"A `Dot` layer should be called on a list of exactly 2 inputs.");let t=e[0].slice(),n=e[1].slice();if(t.length>3||n.length>3)throw new Oe("Dot layer does not support tensors of 4D or higher rank yet.");let s=this.interpretAxes(t,n);t.splice(s[0],1),n.splice(s[1],1),n.splice(0,1);let r=t.concat(n);return r.length===1&&r.push(1),r}computeMask(e,t){return null}getConfig(){let e={axes:this.axes,normalize:this.normalize},t=super.getConfig();return Object.assign(e,t),e}};I1.className="Dot";oe.registerClass(I1);var S1=class extends Ze{constructor(e){super(e);this.supportsMasking=!0,this.stddev=e.stddev}computeOutputShape(e){return e}getConfig(){let e=super.getConfig(),t={stddev:this.stddev};return Object.assign(t,e),t}call(e,t){return H(()=>{this.invokeCallHook(e,t);let n=ze(e);return Cc(()=>ae(Cp(n.shape,0,this.stddev),n),()=>n,t.training||!1)})}};S1.className="GaussianNoise";oe.registerClass(S1);var C1=class extends Ze{constructor(e){super(e);this.supportsMasking=!0,this.rate=e.rate}computeOutputShape(e){return e}getConfig(){let e=super.getConfig(),t={rate:this.rate};return Object.assign(t,e),t}call(e,t){return H(()=>{this.invokeCallHook(e,t);let n=ze(e);return this.rate>0&&this.rate<1?Cc(()=>{let r=Math.sqrt(this.rate/(1-this.rate));return L(n,Cp(n.shape,1,r))},()=>n,t.training||!1):n})}};C1.className="GaussianDropout";oe.registerClass(C1);var T1=class extends Ze{constructor(e){super(e);this.supportsMasking=!0,this.rate=e.rate,this.noiseShape=e.noiseShape}_getNoiseShape(e){return this.noiseShape||ze(e).shape}computeOutputShape(e){return e}getConfig(){let e=super.getConfig(),t={rate:this.rate};return Object.assign(t,e),t}call(e,t){return H(()=>{if(this.rate<1&&this.rate>0){let n=this._getNoiseShape(e);return Cc(()=>{let r=ze(e),a=1.6732632423543772,o=1.0507009873554805,i=-a*o,l=Po(Wl(n),this.rate);l=Ip(l,"float32");let u=((1-this.rate)*(1+this.rate*i**2))**-.5,c=-u*i*this.rate,d=ae(L(r,l),L(ae(l,-1),i));return ae(L(d,u),c)},()=>ze(e),t.training||!1)}return e})}};T1.className="AlphaDropout";oe.registerClass(T1);function zc(e,t,n,s,r,a=.001){let o;if(e.rank===2)o=Gx(e,t,n,s,r,a);else if(e.rank===3)o=jx(e,t,n,s,r,a);else if(e.rank===4)o=qx(e,t,n,s,r,a);else throw new Oe(`batchNormalization is not implemented for array of rank ${e.rank} yet`);return o}function kM(e,t,n,s,r=.001){return H(()=>{let a=np(e,s),o=a.mean,i=a.variance;return[zc(e,o,i,n,t,r),o,i]})}function IM(e,t,n,s,r=.001){return H(()=>{let a=np(e,s),o=a.mean,i=a.variance,l=[];for(let f of Bs(0,e.rank))s.indexOf(f)!==-1?l.push(1):l.push(e.shape[f]);let u=U(o,l),c=U(i,l),d=t==null?null:U(t,l),h=n==null?null:U(n,l);return[zc(e,u,c,h,d,r),o,i]})}function SM(e,t,n,s,r=.001){return w.arraysEqual(s.slice().sort(),Bs(0,e.rank-1))?kM(e,t,n,s,r):IM(e,t,n,s,r)}var N1=class extends Ze{constructor(e){e==null&&(e={});super(e);this.supportsMasking=!0,this.axis=e.axis==null?-1:e.axis,this.momentum=e.momentum==null?.99:e.momentum,this.epsilon=e.epsilon==null?.001:e.epsilon,this.center=e.center==null?!0:e.center,this.scale=e.scale==null?!0:e.scale,this.betaInitializer=wt(e.betaInitializer||"zeros"),this.gammaInitializer=wt(e.gammaInitializer||"ones"),this.movingMeanInitializer=wt(e.movingMeanInitializer||"zeros"),this.movingVarianceInitializer=wt(e.movingVarianceInitializer||"ones"),this.betaConstraint=Xt(e.betaConstraint),this.gammaConstraint=Xt(e.gammaConstraint),this.betaRegularizer=kt(e.betaRegularizer),this.gammaRegularizer=kt(e.gammaRegularizer)}build(e){e=at(e);let t=this.axis>=0?this.axis:this.axis+e.length,n=e[t];if(n==null)throw new G(`Axis ${t} of input tensor should have a defined dimension but the layer received an input with shape ${JSON.stringify(e)}.`);this.inputSpec=[new zt({ndim:e.length,axes:{[t]:n}})];let s=[n];this.scale&&(this.gamma=this.addWeight("gamma",s,null,this.gammaInitializer,this.gammaRegularizer,!0,this.gammaConstraint)),this.center&&(this.beta=this.addWeight("beta",s,null,this.betaInitializer,this.betaRegularizer,!0,this.betaConstraint)),this.movingMean=this.addWeight("moving_mean",s,null,this.movingMeanInitializer,null,!1),this.movingVariance=this.addWeight("moving_variance",s,null,this.movingVarianceInitializer,null,!1),this.built=!0}call(e,t){return H(()=>{let n=t.training==null?!1:t.training,s=ze(e),r=s.shape,a=r.length,o=Bs(0,a),i=this.axis>=0?this.axis:this.axis+a;o.splice(i,1);let l=Wo(1,a);l[i]=r[i];let u=o.slice();u.sort();let c=!w.arraysEqual(u,Bs(0,a).slice(0,a-1)),d=()=>{if(c){let A=U(this.movingMean.read(),l),y=U(this.movingVariance.read(),l),x=this.center?U(this.beta.read(),l):null,b=this.scale?U(this.gamma.read(),l):null;return zc(s,A,y,x,b,this.epsilon)}else return zc(s,this.movingMean.read(),this.movingVariance.read(),this.beta==null?null:this.beta.read(),this.gamma==null?null:this.gamma.read(),this.epsilon)};if(!n)return d();let[h,p,f]=SM(s,this.gamma.read(),this.beta.read(),o,this.epsilon),m=(A,y,x)=>{H(()=>{let b=1-x,v=A.read(),k=L(ge(v,y),b);A.write(ge(v,k))})};return(()=>{m(this.movingMean,p,this.momentum),m(this.movingVariance,f,this.momentum)})(),h})}getConfig(){let e={axis:this.axis,momentum:this.momentum,epsilon:this.epsilon,center:this.center,scale:this.scale,betaInitializer:Nt(this.betaInitializer),gammaInitializer:Nt(this.gammaInitializer),movingMeanInitializer:Nt(this.movingMeanInitializer),movingVarianceInitializer:Nt(this.movingVarianceInitializer),betaRegularizer:dt(this.betaRegularizer),gammaRegularizer:dt(this.gammaRegularizer),betaConstraint:qt(this.betaConstraint),gammaConstraint:qt(this.gammaConstraint)},t=super.getConfig();return Object.assign(e,t),e}};N1.className="BatchNormalization";oe.registerClass(N1);var E1=class extends Ze{constructor(e){e==null&&(e={});super(e);if(this.axis=e.axis==null?-1:e.axis,typeof this.axis=="number"){if(!Number.isInteger(this.axis))throw new Error(`Expected axis to be an integer, but received ${this.axis}`)}else if(Array.isArray(this.axis)){for(let t of this.axis)if(!Number.isInteger(t))throw new Error(`Expected axis to be an array of integers, but received ${JSON.stringify(this.axis)}`)}else throw new Error(`Expected axis to be an integer or an array of integers, but received ${JSON.stringify(this.axis)}`);this.epsilon=e.epsilon==null?.001:e.epsilon,this.center=e.center==null?!0:e.center,this.scale=e.scale==null?!0:e.scale,this.betaInitializer=wt(e.betaInitializer||"zeros"),this.gammaInitializer=wt(e.gammaInitializer||"ones"),this.betaRegularizer=kt(e.betaRegularizer),this.gammaRegularizer=kt(e.gammaRegularizer),this.supportsMasking=!0}build(e){e=at(e);let t=e.length;typeof this.axis=="number"&&(this.axis=[this.axis]);for(let r=0;r=t)throw new Error(`Invalid axis: ${r}`);if(this.axis.length!==na(this.axis).length)throw new Error(`Found duplicate axes in: ${this.axis}`);let n=this.axis.map(r=>e[r]),s=!0;this.scale?this.gamma=this.addWeight("gamma",n,"float32",this.gammaInitializer,this.gammaRegularizer,s):this.gamma=null,this.center?this.beta=this.addWeight("beta",n,"float32",this.betaInitializer,this.betaRegularizer,s):this.beta=null,this.built=!0}call(e,t){let n=ze(e),s=n.shape,r=s.length;return H(()=>{let a=!0,{mean:o,variance:i}=np(n,this.axis,a),l=Wo(1,r);for(let f of this.axis)l[f]=s[f];let u=f=>f!=null&&f.shape.length!==r&&this.axis!==[r-1]?U(f,l):f,c=u(this.gamma.read()),d=u(this.beta.read()),h=[],p=[];for(let f=0;f{if(e.rank!==4)throw new G(`temporalPadding expects input tensor to be 4-D, but received a ${e.rank}-D tensor.`);if(t==null&&(t=[[1,1],[1,1]]),t.length!==2||t[0].length!==2||t[1].length!==2)throw new G("spatial2dPadding expects `padding` to be an Array of two Arrays, each of which is an Array of two integers.");if(n==null&&(n=zs()),n!=="channelsLast"&&n!=="channelsFirst")throw new G(`Unknown data format: ${n}. Supported data formats are 'channelsLast' and 'channelsFirst.`);let s;return n==="channelsFirst"?s=[[0,0],[0,0],t[0],t[1]]:s=[[0,0],t[0],t[1],[0,0]],Qr(e,s)})}var R1=class extends Ze{constructor(e){e==null&&(e={});super(e);if(this.dataFormat=e.dataFormat==null?zs():e.dataFormat,e.padding==null)this.padding=[[1,1],[1,1]];else if(typeof e.padding=="number")this.padding=[[e.padding,e.padding],[e.padding,e.padding]];else{if(e.padding=e.padding,e.padding.length!==2)throw new G(`ZeroPadding2D expects padding to be a length-2 array, but received a length-${e.padding.length} array.`);let t,n;if(typeof e.padding[0]=="number")t=[e.padding[0],e.padding[0]],n=[e.padding[1],e.padding[1]];else{if(e.padding=e.padding,e.padding[0].length!==2)throw new G(`ZeroPadding2D expects height padding to be a length-2 array, but received a length-${e.padding[0].length} array.`);if(t=e.padding[0],e.padding[1].length!==2)throw new G(`ZeroPadding2D expects width padding to be a length-2 array, but received a length-${e.padding[1].length} array.`);n=e.padding[1]}this.padding=[t,n]}this.inputSpec=[new zt({ndim:4})]}computeOutputShape(e){e=at(e);let t,n;return this.dataFormat==="channelsFirst"?(e[2]!=null&&e[2]>=0?t=e[2]+this.padding[0][0]+this.padding[0][1]:t=null,e[3]!=null&&e[3]>=0?n=e[3]+this.padding[1][0]+this.padding[1][1]:n=null,[e[0],e[1],t,n]):(e[1]!=null&&e[1]>=0?t=e[1]+this.padding[0][0]+this.padding[0][1]:t=null,e[2]!=null&&e[2]>=0?n=e[2]+this.padding[1][0]+this.padding[1][1]:n=null,[e[0],t,n,e[3]])}call(e,t){return H(()=>CM(ze(e),this.padding,this.dataFormat))}getConfig(){let e={padding:this.padding,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}};R1.className="ZeroPadding2D";oe.registerClass(R1);function Qp(e,t,n,s,r,a){return H(()=>{Ft(r),p3(a),gs(s),n==null&&(n=[1,1]),s==null&&(s="valid"),r==null&&(r=zs()),a==null&&(a="max"),e=YA(e,r);let o,i=s==="same"?"same":"valid";return a==="max"?o=ep(e,t,n,i):o=jh(e,t,n,i),r==="channelsFirst"&&(o=Xe(o,[0,3,1,2])),o})}function Sv(e,t,n,s,r,a){return H(()=>{Ft(r),p3(a),gs(s),n==null&&(n=[1,1,1]),s==null&&(s="valid"),r==null&&(r=zs()),a==null&&(a="max"),e=xv(e,r);let o,i=s==="same"?"same":"valid";return a==="max"?o=zg(e,t,n,i):o=Ig(e,t,n,i),r==="channelsFirst"&&(o=Xe(o,[0,4,1,2,3])),o})}var Cv=class extends Ze{constructor(e){e.poolSize==null&&(e.poolSize=2);super(e);if(typeof e.poolSize=="number")this.poolSize=[e.poolSize];else if(Array.isArray(e.poolSize)&&e.poolSize.length===1&&typeof e.poolSize[0]=="number")this.poolSize=e.poolSize;else throw new G(`poolSize for 1D convolutional layer must be a number or an Array of a single number, but received ${JSON.stringify(e.poolSize)}`);if(Qt(this.poolSize,"poolSize"),e.strides==null)this.strides=this.poolSize;else if(typeof e.strides=="number")this.strides=[e.strides];else if(Array.isArray(e.strides)&&e.strides.length===1&&typeof e.strides[0]=="number")this.strides=e.strides;else throw new G(`strides for 1D convolutional layer must be a number or an Array of a single number, but received ${JSON.stringify(e.strides)}`);Qt(this.strides,"strides"),this.padding=e.padding==null?"valid":e.padding,gs(this.padding),this.inputSpec=[new zt({ndim:3})]}computeOutputShape(e){e=at(e);let t=Hs(e[1],this.poolSize[0],this.padding,this.strides[0]);return[e[0],t,e[2]]}call(e,t){return H(()=>{this.invokeCallHook(e,t),e=Ic(ze(e),2);let n=this.poolingFunction(ze(e),[this.poolSize[0],1],[this.strides[0],1],this.padding,"channelsLast");return lt(n,[2])})}getConfig(){let e={poolSize:this.poolSize,padding:this.padding,strides:this.strides},t=super.getConfig();return Object.assign(e,t),e}},_1=class extends Cv{constructor(e){super(e)}poolingFunction(e,t,n,s,r){return Ft(r),gs(s),Qp(e,t,n,s,r,"max")}};_1.className="MaxPooling1D";oe.registerClass(_1);var D1=class extends Cv{constructor(e){super(e)}poolingFunction(e,t,n,s,r){return Ft(r),gs(s),Qp(e,t,n,s,r,"avg")}};D1.className="AveragePooling1D";oe.registerClass(D1);var Tv=class extends Ze{constructor(e){e.poolSize==null&&(e.poolSize=[2,2]);super(e);if(this.poolSize=Array.isArray(e.poolSize)?e.poolSize:[e.poolSize,e.poolSize],e.strides==null)this.strides=this.poolSize;else if(Array.isArray(e.strides)){if(e.strides.length!==2)throw new G(`If the strides property of a 2D pooling layer is an Array, it is expected to have a length of 2, but received length ${e.strides.length}.`);this.strides=e.strides}else this.strides=[e.strides,e.strides];Qt(this.poolSize,"poolSize"),Qt(this.strides,"strides"),this.padding=e.padding==null?"valid":e.padding,this.dataFormat=e.dataFormat==null?"channelsLast":e.dataFormat,Ft(this.dataFormat),gs(this.padding),this.inputSpec=[new zt({ndim:4})]}computeOutputShape(e){e=at(e);let t=this.dataFormat==="channelsFirst"?e[2]:e[1],n=this.dataFormat==="channelsFirst"?e[3]:e[2];return t=Hs(t,this.poolSize[0],this.padding,this.strides[0]),n=Hs(n,this.poolSize[1],this.padding,this.strides[1]),this.dataFormat==="channelsFirst"?[e[0],e[1],t,n]:[e[0],t,n,e[3]]}call(e,t){return H(()=>(this.invokeCallHook(e,t),this.poolingFunction(ze(e),this.poolSize,this.strides,this.padding,this.dataFormat)))}getConfig(){let e={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}},$1=class extends Tv{constructor(e){super(e)}poolingFunction(e,t,n,s,r){return Ft(r),gs(s),Qp(e,t,n,s,r,"max")}};$1.className="MaxPooling2D";oe.registerClass($1);var F1=class extends Tv{constructor(e){super(e)}poolingFunction(e,t,n,s,r){return Ft(r),gs(s),Qp(e,t,n,s,r,"avg")}};F1.className="AveragePooling2D";oe.registerClass(F1);var Nv=class extends Ze{constructor(e){e.poolSize==null&&(e.poolSize=[2,2,2]);super(e);if(this.poolSize=Array.isArray(e.poolSize)?e.poolSize:[e.poolSize,e.poolSize,e.poolSize],e.strides==null)this.strides=this.poolSize;else if(Array.isArray(e.strides)){if(e.strides.length!==3)throw new G(`If the strides property of a 3D pooling layer is an Array, it is expected to have a length of 3, but received length ${e.strides.length}.`);this.strides=e.strides}else this.strides=[e.strides,e.strides,e.strides];Qt(this.poolSize,"poolSize"),Qt(this.strides,"strides"),this.padding=e.padding==null?"valid":e.padding,this.dataFormat=e.dataFormat==null?"channelsLast":e.dataFormat,Ft(this.dataFormat),gs(this.padding),this.inputSpec=[new zt({ndim:5})]}computeOutputShape(e){e=at(e);let t=this.dataFormat==="channelsFirst"?e[2]:e[1],n=this.dataFormat==="channelsFirst"?e[3]:e[2],s=this.dataFormat==="channelsFirst"?e[4]:e[3];return t=Hs(t,this.poolSize[0],this.padding,this.strides[0]),n=Hs(n,this.poolSize[1],this.padding,this.strides[1]),s=Hs(s,this.poolSize[2],this.padding,this.strides[2]),this.dataFormat==="channelsFirst"?[e[0],e[1],t,n,s]:[e[0],t,n,s,e[4]]}call(e,t){return H(()=>(this.invokeCallHook(e,t),this.poolingFunction(ze(e),this.poolSize,this.strides,this.padding,this.dataFormat)))}getConfig(){let e={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}},O1=class extends Nv{constructor(e){super(e)}poolingFunction(e,t,n,s,r){return Ft(r),gs(s),Sv(e,t,n,s,r,"max")}};O1.className="MaxPooling3D";oe.registerClass(O1);var P1=class extends Nv{constructor(e){super(e)}poolingFunction(e,t,n,s,r){return Ft(r),gs(s),Sv(e,t,n,s,r,"avg")}};P1.className="AveragePooling3D";oe.registerClass(P1);var Ev=class extends Ze{constructor(e){super(e);this.inputSpec=[new zt({ndim:3})]}computeOutputShape(e){return[e[0],e[2]]}call(e,t){throw new Oe}},M1=class extends Ev{constructor(e){super(e||{})}call(e,t){return H(()=>{let n=ze(e);return _t(n,1)})}};M1.className="GlobalAveragePooling1D";oe.registerClass(M1);var z1=class extends Ev{constructor(e){super(e||{})}call(e,t){return H(()=>{let n=ze(e);return hs(n,1)})}};z1.className="GlobalMaxPooling1D";oe.registerClass(z1);var Rv=class extends Ze{constructor(e){super(e);this.dataFormat=e.dataFormat==null?"channelsLast":e.dataFormat,Ft(this.dataFormat),this.inputSpec=[new zt({ndim:4})]}computeOutputShape(e){return e=e,this.dataFormat==="channelsLast"?[e[0],e[3]]:[e[0],e[1]]}call(e,t){throw new Oe}getConfig(){let e={dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}},L1=class extends Rv{call(e,t){return H(()=>{let n=ze(e);return this.dataFormat==="channelsLast"?_t(n,[1,2]):_t(n,[2,3])})}};L1.className="GlobalAveragePooling2D";oe.registerClass(L1);var B1=class extends Rv{call(e,t){return H(()=>{let n=ze(e);return this.dataFormat==="channelsLast"?hs(n,[1,2]):hs(n,[2,3])})}};B1.className="GlobalMaxPooling2D";oe.registerClass(B1);var _v=class extends Ze{constructor(e){super(e);this.layer=e.layer}build(e){this.built=!0}get trainable(){return this.layer!=null?this.layer.trainable:!1}set trainable(e){this.layer!=null&&(this.layer.trainable=e)}get trainableWeights(){return this.layer.trainableWeights}get nonTrainableWeights(){return this.layer.nonTrainableWeights}get updates(){return this.layer._updates}get losses(){return this.layer.losses}getWeights(){return this.layer.getWeights()}setWeights(e){this.layer.setWeights(e)}getConfig(){let e={layer:{className:this.layer.getClassName(),config:this.layer.getConfig()}},t=super.getConfig();return Object.assign(e,t),e}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),this.layer!=null&&this.layer.setFastWeightInitDuringBuild(e)}static fromConfig(e,t,n={}){let s=t.layer,r=Us(s,n);delete t.layer;let a={layer:r};return Object.assign(a,t),new e(a)}},W1=class extends _v{constructor(e){super(e);this.supportsMasking=!0}build(e){if(e=at(e),e.length<3)throw new G(`TimeDistributed layer expects an input shape >= 3D, but received input shape ${JSON.stringify(e)}`);this.inputSpec=[{shape:e}];let t=[e[0]].concat(e.slice(2));this.layer.built||(this.layer.build(t),this.layer.built=!0),super.build(e)}computeOutputShape(e){e=at(e);let t=[e[0]].concat(e.slice(2)),n=this.layer.computeOutputShape(t),s=e[1];return[n[0],s].concat(n.slice(1))}call(e,t){return H(()=>(e=ze(e),kv((a,o)=>[ze(this.layer.call(a,t)),[]],e,[],!1,null,null,!1,!0)[1]))}};W1.className="TimeDistributed";oe.registerClass(W1);function TM(e){Uo($O,"BidirectionalMergeMode",e)}var NM="concat",V1=class extends _v{constructor(e){super(e);let t=e.layer.getConfig(),n={};n.className=e.layer.getClassName(),n.config=t,this.forwardLayer=Us(n),t.goBackwards=t.goBackwards!==!0;let s={};if(s.className=e.layer.getClassName(),s.config=t,this.backwardLayer=Us(s),this.forwardLayer.name="forward_"+this.forwardLayer.name,this.backwardLayer.name="backward_"+this.backwardLayer.name,this.mergeMode=e.mergeMode===void 0?NM:e.mergeMode,TM(this.mergeMode),e.weights)throw new Oe("weights support is not implemented for Bidirectional layer yet.");this._stateful=e.layer.stateful,this.returnSequences=e.layer.returnSequences,this.returnState=e.layer.returnState,this.supportsMasking=!0,this._trainable=!0,this.inputSpec=e.layer.inputSpec,this.numConstants=null}get trainable(){return this._trainable}set trainable(e){this._trainable=e,this.forwardLayer!=null&&(this.forwardLayer.trainable=e),this.backwardLayer!=null&&(this.backwardLayer.trainable=e)}getWeights(){return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights())}setWeights(e){let t=e.length,n=Math.floor(t/2);this.forwardLayer.setWeights(e.slice(0,n)),this.backwardLayer.setWeights(e.slice(n))}computeOutputShape(e){let t=this.forwardLayer.computeOutputShape(e);Array.isArray(t)&&Array.isArray(t[0])||(t=[t]),t=t;let n,s,r;return this.returnState&&(r=t.slice(1)),n=t[0],n=n,this.mergeMode==="concat"?(n[n.length-1]*=2,s=[n]):this.mergeMode==null?s=[n,n.slice()]:s=[n],this.returnState?this.mergeMode==null?s.concat(r).concat(r.slice()):[n].concat(r).concat(r.slice()):$n(s)}apply(e,t){let n=t==null?null:t.initialState,s=t==null?null:t.constants;t==null&&(t={});let r=wv(e,n,s,this.numConstants);if(e=r.inputs,n=r.initialState,s=r.constants,Array.isArray(e)&&(n=e.slice(1),e=e[0]),(n==null||n.length===0)&&s==null)return super.apply(e,t);let a=[],o=[];if(n!=null){let l=n.length;if(l%2>0)throw new G("When passing `initialState` to a Bidrectional RNN, the state should be an Array containing the states of the underlying RNNs.");t.initialState=n,a.push(...n);let u=n.map(c=>new zt({shape:c.shape}));this.forwardLayer.stateSpec=u.slice(0,l/2),this.backwardLayer.stateSpec=u.slice(l/2),o.push(...u)}if(s!=null)throw new Oe("Support for constants in Bidirectional layers is not implemented yet.");let i=a[0]instanceof Vs;for(let l of a)if(l instanceof Vs!==i)throw new G("The initial state of a Bidirectional layer cannot be specified as a mix of symbolic and non-symbolic tensors");if(i){let l=[e].concat(a),u=this.inputSpec.concat(o),c=this.inputSpec;this.inputSpec=u;let d=super.apply(l,t);return this.inputSpec=c,d}else return super.apply(e,t)}call(e,t){return H(()=>{let n=t.initialState,s,r;if(n==null)s=this.forwardLayer.call(e,t),r=this.backwardLayer.call(e,t);else{let i=n.slice(0,n.length/2),l=n.slice(n.length/2);s=this.forwardLayer.call(e,Object.assign(t,{initialState:i})),r=this.backwardLayer.call(e,Object.assign(t,{initialState:l}))}let a;this.returnState&&(Array.isArray(s)&&(a=s.slice(1).concat(r.slice(1))),s=s[0],r=r[0]),this.returnSequences&&(r=fs(r,1));let o;return this.mergeMode==="concat"?o=gA([s,r]):this.mergeMode==="sum"?o=ae(s,r):this.mergeMode==="ave"?o=L(.5,ae(s,r)):this.mergeMode==="mul"?o=L(s,r):this.mergeMode==null&&(o=[s,r]),this.returnState?this.mergeMode==null?o.concat(a):[o].concat(a):o})}resetStates(e){this.forwardLayer.resetStates(),this.backwardLayer.resetStates()}build(e){Ho(this.forwardLayer.name,()=>{this.forwardLayer.build(e)}),Ho(this.backwardLayer.name,()=>{this.backwardLayer.build(e)}),this.built=!0}computeMask(e,t){Array.isArray(t)&&(t=t[0]);let n;if(this.returnSequences?this.mergeMode==null?n=[t,t]:n=t:this.mergeMode==null?n=[null,null]:n=null,this.returnState){let r=this.forwardLayer.states.map(a=>null);return Array.isArray(n)?n.concat(r).concat(r):[n].concat(r).concat(r)}else return n}get trainableWeights(){return this.forwardLayer.trainableWeights.concat(this.backwardLayer.trainableWeights)}get nonTrainableWeights(){return this.forwardLayer.nonTrainableWeights.concat(this.backwardLayer.nonTrainableWeights)}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),this.forwardLayer!=null&&this.forwardLayer.setFastWeightInitDuringBuild(e),this.backwardLayer!=null&&this.backwardLayer.setFastWeightInitDuringBuild(e)}getConfig(){let e={mergeMode:this.mergeMode},t=super.getConfig();return Object.assign(e,t),e}static fromConfig(e,t){let n=Us(t.layer);if(delete t.layer,t.numConstants!=null)throw new Oe("Deserialization of a Bidirectional layer with numConstants present is not supported yet.");let s=t;return s.layer=n,new e(s)}};V1.className="Bidirectional";oe.registerClass(V1);function EM(e){return new jl(e)}function RM(e){return new XA(e)}function _M(e){return new GA(e)}function DM(e){return new jA(e)}function $M(e){return new qA(e)}function FM(e){return new ZA(e)}function OM(e){return new KA(e)}function PM(e){return new qp(e)}function MM(e){return new $c(e)}function zM(e){return new QA(e)}function LM(e){return new Fc(e)}function BM(e){return new e1(e)}function WM(e){return new t1(e)}function VM(e){return new n1(e)}function UM(e){return new s1(e)}function HM(e){return new r1(e)}function GM(e){return new h1(e)}function jM(e){return new c1(e)}function qM(e){return new Jp(e)}function XM(e){return new u1(e)}function KM(e){return new d1(e)}function ZM(e){return new p1(e)}function YM(e){return new f1(e)}function JM(e){return new m1(e)}function QM(e){return new A1(e)}function ez(e){return new y1(e)}function tz(e){return new b1(e)}function nz(e){return new k1(e)}function sz(e){return new v1(e)}function rz(e){return new w1(e)}function az(e){return new x1(e)}function oz(e){return new I1(e)}function iz(e){return new N1(e)}function lz(e){return new E1(e)}function uz(e){return new R1(e)}function U1(e){return new D1(e)}function cz(e){return U1(e)}function dz(e){return U1(e)}function H1(e){return new F1(e)}function hz(e){return H1(e)}function pz(e){return H1(e)}function G1(e){return new P1(e)}function fz(e){return G1(e)}function mz(e){return G1(e)}function gz(e){return new M1(e)}function Az(e){return new L1(e)}function Dv(e){return new z1(e)}function $v(e){return new B1(e)}function Fv(e){return new _1(e)}function Ov(e){return new $1(e)}function yz(e){return new O1(e)}function xz(e){return new o1(e)}function bz(e){return new Kp(e)}function vz(e){return new i1(e)}function wz(e){return new Pc(e)}function kz(e){return new a1(e)}function Iz(e){return new Xp(e)}function Sz(e){return new l1(e)}function Cz(e){return new Yp(e)}function Tz(e){return new ur(e)}function Nz(e){return new Zp(e)}function Ez(e){return new V1(e)}function Rz(e){return new W1(e)}var _z=Dv,Dz=$v,$z=Fv,Fz=Ov;function Oz(e){return new S1(e)}function Pz(e){return new C1(e)}function Mz(e){return new T1(e)}function zz(e){return new g1(e)}var Pv={};Pe(Pv,{MAPE:()=>Kz,MSE:()=>Jz,binaryAccuracy:()=>Lz,binaryCrossentropy:()=>Bz,categoricalAccuracy:()=>Vz,categoricalCrossentropy:()=>Uz,cosineProximity:()=>jz,mape:()=>Zz,meanAbsoluteError:()=>qz,meanAbsolutePercentageError:()=>Xz,meanSquaredError:()=>Yz,mse:()=>Qz,precision:()=>Hz,recall:()=>Gz,sparseCategoricalAccuracy:()=>Wz});function Lz(e,t){return _A(e,t)}function Bz(e,t){return z3(e,t)}function Wz(e,t){return L3(e,t)}function Vz(e,t){return DA(e,t)}function Uz(e,t){return $A(e,t)}function Hz(e,t){return M3(e,t)}function Gz(e,t){return NP(e,t)}function jz(e,t){return EA(e,t)}function qz(e,t){return Bp(e,t)}function Xz(e,t){return Xl(e,t)}function Kz(e,t){return Xl(e,t)}function Zz(e,t){return Xl(e,t)}function Yz(e,t){return jo(e,t)}function Jz(e,t){return jo(e,t)}function Qz(e,t){return jo(e,t)}var Mv={};Pe(Mv,{modelFromJSON:()=>lM});var zv={};Pe(zv,{l1:()=>tL,l1l2:()=>eL,l2:()=>nL});function eL(e){return new _c(e)}function tL(e){return gM(e)}function nL(e){return AM(e)}var Lv=class extends ql{constructor(){super(...arguments);this.model=null}setModel(e){if(!(e instanceof Nr))throw new Error("model must be a LayersModel, not some other Container");this.model=e}};function ef(e,t){return et}var Wv=class extends Lv{constructor(e){super();if(e==null&&(e={}),e.restoreBestWeights)throw new Oe("restoreBestWeights = True is not implemented in EarlyStopping yet.");this.monitor=e.monitor||"val_loss",this.minDelta=Math.abs(e.minDelta||0),this.patience=e.patience||0,this.verbose=e.verbose||0,this.mode=e.mode||"auto",this.baseline=e.baseline,["auto","min","max"].indexOf(this.mode)===-1&&(console.warn(`EarlyStopping mode '${this.mode}' is invalid. Falling back to mode 'auto'.`),this.mode="auto"),this.mode==="min"?this.monitorFunc=ef:this.mode==="max"?this.monitorFunc=Bv:this.monitor.indexOf("acc")!==-1?this.monitorFunc=Bv:this.monitorFunc=ef,this.monitorFunc===ef&&(this.minDelta*=-1)}async onTrainBegin(e){this.wait=0,this.stoppedEpoch=0,this.baseline!=null?this.best=this.baseline:this.best=this.monitorFunc===ef?1/0:-1/0}async onEpochEnd(e,t){await aa(t);let n=this.getMonitorValue(t);n!=null&&(this.monitorFunc(n-this.minDelta,this.best)?(this.best=n,this.wait=0):(this.wait++,this.wait>=this.patience&&(this.stoppedEpoch=e,this.model.stopTraining=!0)))}async onTrainEnd(e){this.stoppedEpoch>0&&this.verbose&&console.log(`Epoch ${this.stoppedEpoch}: early stopping.`)}getMonitorValue(e){e==null&&(e={});let t=e[this.monitor];return t==null&&console.warn(`Metric for EarlyStopping ${this.monitor} is not available. Available metrics are: ${Object.keys(e)}`),t}};function sL(e){return new Wv(e)}var rL={earlyStopping:sL},Gs;(function(e){e[e.DT_INVALID=0]="DT_INVALID",e[e.DT_FLOAT=1]="DT_FLOAT",e[e.DT_DOUBLE=2]="DT_DOUBLE",e[e.DT_INT32=3]="DT_INT32",e[e.DT_UINT8=4]="DT_UINT8",e[e.DT_INT16=5]="DT_INT16",e[e.DT_INT8=6]="DT_INT8",e[e.DT_STRING=7]="DT_STRING",e[e.DT_COMPLEX64=8]="DT_COMPLEX64",e[e.DT_INT64=9]="DT_INT64",e[e.DT_BOOL=10]="DT_BOOL",e[e.DT_QINT8=11]="DT_QINT8",e[e.DT_QUINT8=12]="DT_QUINT8",e[e.DT_QINT32=13]="DT_QINT32",e[e.DT_BFLOAT16=14]="DT_BFLOAT16",e[e.DT_FLOAT_REF=101]="DT_FLOAT_REF",e[e.DT_DOUBLE_REF=102]="DT_DOUBLE_REF",e[e.DT_INT32_REF=103]="DT_INT32_REF",e[e.DT_UINT8_REF=104]="DT_UINT8_REF",e[e.DT_INT16_REF=105]="DT_INT16_REF",e[e.DT_INT8_REF=106]="DT_INT8_REF",e[e.DT_STRING_REF=107]="DT_STRING_REF",e[e.DT_COMPLEX64_REF=108]="DT_COMPLEX64_REF",e[e.DT_INT64_REF=109]="DT_INT64_REF",e[e.DT_BOOL_REF=110]="DT_BOOL_REF",e[e.DT_QINT8_REF=111]="DT_QINT8_REF",e[e.DT_QUINT8_REF=112]="DT_QUINT8_REF",e[e.DT_QINT32_REF=113]="DT_QINT32_REF",e[e.DT_BFLOAT16_REF=114]="DT_BFLOAT16_REF"})(Gs||(Gs={}));var Vv;(function(e){let t;(function(n){n[n.LEGACY=0]="LEGACY",n[n.V1=1]="V1",n[n.V2=2]="V2"})(t=e.CheckpointFormatVersion||(e.CheckpointFormatVersion={}))})(Vv||(Vv={}));var j1={};function aL(e,t){let n={tfOpName:e,category:"custom",inputs:[],attrs:[],customExecutor:t};j1[e]=n}function Uv(e){return j1[e]}function oL(e){delete j1[e]}function I(e,t,n,s,r){let a=t.inputParams[e];if(a&&a.inputIndexStart!==void 0){let i=a.inputIndexStart,l=a.inputIndexEnd===0?void 0:a.inputIndexEnd===void 0?i+1:a.inputIndexEnd;if(a.type==="tensor")return wn(t.inputNames[a.inputIndexStart],n,s,r);if(a.type==="tensors")return t.inputNames.slice(i,l).map(h=>wn(h,n,s,r));let u=wn(t.inputNames.slice(i)[0],n,s,r),c=u.dataSync();return a.type==="number"?c[0]:w.toNestedArray(u.shape,c)}let o=t.attrParams[e];return o&&o.value}function wn(e,t,n,s){let[r,a]=Xn(e);if(s!=null){let i=s.getHashTableHandleByName(r);if(i!=null)return i}let o=n.currentContextIds.find(i=>!!t[tf(r,i)]);return o!==void 0?t[tf(r,o)][a]:void 0}function iL(e,t,n){return t[tf(e,n.currentContextId)]}function Er(e,t){let[n,s,r]=Xn(e);return[tf(n,t&&t.currentContextId),s,r]}function tf(e,t){return t?`${e}-${t}`:e}function Xn(e){let t=e.split(":");if(t.length===1)return[e,0,void 0];let n=t[0],s=t.length===3?t[1]:void 0,r=Number(t[t.length-1]);return[n,r,s]}function nf(e,t,n){let s=I("pad",e,t,n);if(s==="explicit"){s=I("explicitPaddings",e,t,n);let r=[[0,0],[0,0],[0,0],[0,0]];for(let a=0;a<4;a++)r[a][0]=s[a*2],r[a][1]=s[a*2+1];return r}return s}function Rr(e){return e.kept?e:Os(e)}var Hv={};Pe(Hv,{json:()=>lL});var lL=[{tfOpName:"Add",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddV2",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddN",category:"arithmetic",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"BiasAdd",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"Sub",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"RealDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Div",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"DivNoNan",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mul",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Maximum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Minimum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Pow",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SquaredDifference",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorMod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],Gv={};Pe(Gv,{json:()=>uL});var uL=[{tfOpName:"Abs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan2",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Ceil",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ClipByValue",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"clipValueMin",type:"number"},{start:2,name:"clipValueMax",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Complex",category:"basic_math",inputs:[{start:0,name:"real",type:"tensor"},{start:1,name:"imag",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ComplexAbs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Elu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Exp",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Floor",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Imag",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Neg",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Real",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Prelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"alpha",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu6",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Selu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sigmoid",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Rsqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Square",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sign",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Round",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Expm1",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log1p",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Reciprocal",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Softplus",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Erf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Prod",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axes",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LeakyRelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"alpha",name:"alpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsNan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],jv={};Pe(jv,{json:()=>cL});var cL=[{tfOpName:"EmptyTensorList",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"maxNumElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"LoopCond",category:"control",inputs:[{start:0,name:"pred",type:"tensor"}]},{tfOpName:"Switch",category:"control",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"pred",type:"tensor"}]},{tfOpName:"Merge",category:"control",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"Enter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"frame_name",name:"frameName",type:"string"},{tfName:"is_constant",name:"isConstant",type:"bool"}]},{tfOpName:"Exit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NextIteration",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayV3",category:"control",inputs:[{start:0,name:"size",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"dynamic_size",name:"dynamicSize",type:"bool"},{tfName:"clear_after_read",name:"clearAfterRead",type:"bool"},{tfName:"identical_element_shapes",name:"identicalElementShapes",type:"bool"},{tfName:"tensor_array_name",name:"name",type:"string"}]},{tfOpName:"TensorArrayWriteV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayReadV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayGatherV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"}]},{tfOpName:"TensorArrayScatterV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArrayConcatV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape_except0",name:"elementShapeExcept0",type:"shape",notSupported:!0}]},{tfOpName:"TensorArraySplitV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"tensor",type:"tensor"},{start:2,name:"lengths",type:"number[]"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArraySizeV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}]},{tfOpName:"TensorArrayCloseV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"}]},{tfOpName:"StatelessIf",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"If",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"StatelessWhile",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"While",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"TensorListScatter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListScatterV2",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"},{start:3,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGather",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListSetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListReserve",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListFromTensor",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListStack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"},{tfName:"num_elements",name:"numElements",type:"dtype"}]},{tfOpName:"TensorListSplit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"},{start:2,name:"lengths",type:"number[]"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcat",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPopBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPushBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]}],qv={};Pe(qv,{json:()=>dL});var dL=[{tfOpName:"AvgPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[],notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPoolWithArgmax",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"include_batch_in_index",name:"includeBatchInIndex",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AvgPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Conv1D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"stride",name:"stride",type:"number"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NWC"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"dilation",name:"dilation",type:"number",defaultValue:1}]},{tfOpName:"Conv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"useCudnnOnGpu",name:"useCudnnOnGpu",type:"bool"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"_FusedConv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"use_cudnn_on_gpu",name:"useCudnnOnGpu",type:"bool",defaultValue:!0},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number"}]},{tfOpName:"Conv2DBackpropInput",category:"convolution",inputs:[{start:2,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:0,name:"outputShape",type:"number[]"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]",notSupported:!0}]},{tfOpName:"DepthwiseConv2d",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"DepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"FusedDepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]}]},{tfOpName:"Conv3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"Dilation2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"rates",name:"dilations",type:"number[]"},{tfName:"padding",name:"pad",type:"string"}]}],Xv={};Pe(Xv,{json:()=>hL});var hL=[{tfOpName:"Fill",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"},{start:1,name:"value",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"LinSpace",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"num",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"OneHot",category:"creation",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"depth",type:"number"},{start:2,name:"onValue",type:"number",defaultValue:1},{start:3,name:"offValue",type:"number",defaultValue:0}],attrs:[{tfName:"axis",name:"axis",type:"number",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Ones",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"OnesLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"RandomUniform",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number",defaultValue:0},{tfName:"maxval",name:"maxval",type:"number",defaultValue:1},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Range",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"step",type:"number",defaultValue:0}],attrs:[{tfName:"Tidx",name:"dtype",type:"dtype"}]},{tfOpName:"TruncatedNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"means",name:"mean",type:"number",defaultValue:0},{tfName:"stddev",name:"stdDev",type:"number",defaultValue:1},{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Zeros",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"ZerosLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Multinomial",category:"creation",inputs:[{start:0,name:"logits",type:"tensor"},{start:1,name:"numSamples",type:"number"}],attrs:[{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number"},{tfName:"T",name:"dtype",type:"dtype"},{tfName:"output_dtype",name:"output_dtype",type:"dtype"}]}],Kv={};Pe(Kv,{json:()=>pL});var pL=[{tfOpName:"NonMaxSuppressionV2",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV3",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV4",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"T_threshold",name:"threshold",type:"dtype",notSupported:!0},{tfName:"pad_to_max_output_size",name:"padToMaxOutputSize",type:"bool"}]},{tfOpName:"NonMaxSuppressionV5",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"},{start:5,name:"softNmsSigma",type:"number"}]},{tfOpName:"Where",category:"dynamic",inputs:[{start:0,name:"condition",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ListDiff",category:"dynamic",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],Zv={};Pe(Zv,{json:()=>fL});var fL=[{tfOpName:"TopKV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"k",type:"number"}],attrs:[{tfName:"sorted",name:"sorted",type:"bool"}]},{tfOpName:"Unique",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"UniqueV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]}],Yv={};Pe(Yv,{json:()=>mL});var mL=[{tfOpName:"PlaceholderWithDefault",category:"graph",inputs:[{start:0,name:"default",type:"tensor"}],attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Placeholder",category:"graph",attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Const",category:"graph"},{tfOpName:"Identity",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IdentityN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Snapshot",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Rank",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Size",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Shape",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"ShapeN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Print",category:"graph",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"data",type:"tensors"}],attrs:[{tfName:"message",name:"message",type:"string"},{tfName:"first_n",name:"firstN",type:"number",notSupported:!0},{tfName:"summarize",name:"summarize",type:"number",defaultValue:3}]},{tfOpName:"NoOp",category:"graph",inputs:[]},{tfOpName:"StopGradient",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"FakeQuantWithMinMaxVars",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"min",name:"min",type:"number"},{tfName:"max",name:"max",type:"number"}]}],Jv={};Pe(Jv,{json:()=>gL});var gL=[{tfOpName:"HashTable",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"HashTableV2",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"LookupTableImport",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableImportV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFind",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFindV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableSize",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"LookupTableSizeV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]}],Qv={};Pe(Qv,{json:()=>AL});var AL=[{tfOpName:"ResizeBilinear",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ResizeNearestNeighbor",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"CropAndResize",category:"image",inputs:[{start:0,name:"image",type:"tensor"},{start:1,name:"boxes",type:"tensor"},{start:2,name:"boxInd",type:"tensor"},{start:3,name:"cropSize",type:"number[]"}],attrs:[{tfName:"method",name:"method",type:"string"},{tfName:"extrapolation_value",name:"extrapolationValue",type:"number"}]}],e7={};Pe(e7,{json:()=>yL});var yL=[{tfOpName:"Equal",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NotEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Greater",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"GreaterEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Less",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LessEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalAnd",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalNot",category:"logical",inputs:[{start:0,name:"a",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalOr",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Select",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SelectV2",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],t7={};Pe(t7,{json:()=>xL});var xL=[{tfOpName:"_FusedMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMulV2",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Transpose",category:"matrices",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"perm",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Einsum",category:"matrices",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"equation",name:"equation",type:"string"},{tfName:"N",name:"n",type:"number",defaultValue:2},{tfName:"T",name:"dtype",type:"dtype"}]}],n7={};Pe(n7,{json:()=>bL});var bL=[{tfOpName:"FusedBatchNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV2",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV3",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"LRN",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"depth_radius",name:"radius",type:"number",defaultValue:5},{tfName:"bias",name:"bias",type:"number",defaultValue:1},{tfName:"alpha",name:"alpha",type:"number",defaultValue:1},{tfName:"beta",name:"beta",type:"number",defaultValue:.5}]},{tfOpName:"Softmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"LogSoftmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"SparseToDense",category:"normalization",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!0,notSupported:!0}]}],s7={};Pe(s7,{json:()=>vL});var vL=[{tfOpName:"Bincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}]},{tfOpName:"DenseBincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}],attrs:[{tfName:"binary_output",name:"binaryOutput",type:"bool"}]},{tfOpName:"Max",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Mean",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Min",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Sum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"All",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Any",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"ArgMax",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"ArgMin",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"Prod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Cumsum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]}],r7={};Pe(r7,{json:()=>wL});var wL=[{tfOpName:"ConcatV2",category:"slice_join",inputs:[{start:0,end:-1,name:"tensors",type:"tensors"},{start:-1,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"Concat",category:"slice_join",inputs:[{start:1,end:0,name:"tensors",type:"tensors"},{start:0,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"GatherV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"axis",type:"number",defaultValue:0}],attrs:[{tfName:"batch_dims",name:"batchDims",type:"number",defaultValue:0}]},{tfOpName:"Gather",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",notSupported:!0}]},{tfOpName:"Reverse",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"dims",type:"bool[]"}]},{tfOpName:"ReverseV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}]},{tfOpName:"Slice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"size",type:"number[]"}]},{tfOpName:"StridedSlice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"end",type:"number[]"},{start:3,name:"strides",type:"number[]"}],attrs:[{tfName:"begin_mask",name:"beginMask",type:"number",defaultValue:0},{tfName:"end_mask",name:"endMask",type:"number",defaultValue:0},{tfName:"new_axis_mask",name:"newAxisMask",type:"number",defaultValue:0},{tfName:"ellipsis_mask",name:"ellipsisMask",type:"number",defaultValue:0},{tfName:"shrink_axis_mask",name:"shrinkAxisMask",type:"number",defaultValue:0}]},{tfOpName:"Pack",category:"slice_join",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0}]},{tfOpName:"Unpack",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0},{tfName:"num",name:"num",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Tile",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"reps",type:"number[]"}]},{tfOpName:"Split",category:"slice_join",inputs:[{start:0,name:"axis",type:"number",defaultValue:0},{start:1,name:"x",type:"tensor"}],attrs:[{tfName:"num_split",name:"numOrSizeSplits",type:"number",defaultValue:1}]},{tfOpName:"SplitV",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"numOrSizeSplits",type:"number[]"},{start:2,name:"axis",type:"number",defaultValue:0}]},{tfOpName:"ScatterNd",category:"slice_join",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"shape",type:"number[]"}]},{tfOpName:"GatherNd",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}]},{tfOpName:"SparseToDense",category:"slice_join",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!1,notSupported:!0}]}],a7={};Pe(a7,{json:()=>kL});var kL=[{tfOpName:"SparseFillEmptyRows",category:"sparse",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"denseShape",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}]},{tfOpName:"SparseReshape",category:"sparse",inputs:[{start:0,name:"inputIndices",type:"tensor"},{start:1,name:"inputShape",type:"tensor"},{start:2,name:"newShape",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SparseSegmentMean",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]},{tfOpName:"SparseSegmentSum",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]}],o7={};Pe(o7,{json:()=>IL});var IL=[{tfOpName:"FFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"RFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]},{tfOpName:"IRFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]}],i7={};Pe(i7,{json:()=>SL});var SL=[{tfOpName:"StringNGrams",category:"string",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"dataSplits",type:"tensor"}],attrs:[{tfName:"separator",name:"separator",type:"string"},{tfName:"ngram_widths",name:"nGramWidths",type:"number[]"},{tfName:"left_pad",name:"leftPad",type:"string"},{tfName:"right_pad",name:"rightPad",type:"string"},{tfName:"pad_width",name:"padWidth",type:"number"},{tfName:"preserve_short_sequences",name:"preserveShortSequences",type:"bool"}],outputs:["ngrams","ngrams_splits"]},{tfOpName:"StringSplit",category:"string",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"delimiter",type:"tensor"}],attrs:[{tfName:"skip_empty",name:"skipEmpty",type:"bool"}],outputs:["indices","values","shape"]},{tfOpName:"StringToHashBucketFast",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"num_buckets",name:"numBuckets",type:"number"}]}],l7={};Pe(l7,{json:()=>CL});var CL=[{tfOpName:"Cast",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"SrcT",name:"sdtype",type:"dtype",notSupported:!0},{tfName:"DstT",name:"dtype",type:"dtype"}]},{tfOpName:"ExpandDims",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"MirrorPad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"mode",name:"mode",type:"string"}]},{tfOpName:"Pad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"constant_value",name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"PadV2",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"},{start:2,name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"Reshape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"Squeeze",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"axis",tfDeprecatedName:"squeeze_dims",name:"axis",type:"number[]"}]},{tfOpName:"SpaceToBatchND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"paddings",type:"number[]"}]},{tfOpName:"BatchToSpaceND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"crops",type:"number[]"}]},{tfOpName:"DepthToSpace",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"block_size",name:"blockSize",type:"number"},{tfName:"data_format",name:"dataFormat",type:"string"}]},{tfOpName:"BroadcastTo",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}],attrs:[]},{tfOpName:"BroadcastArgs",category:"transformation",inputs:[{start:0,name:"s0",type:"tensor"},{start:1,name:"s1",type:"tensor"}],attrs:[]}],u7=class{static get Instance(){return this._instance||(this._instance=new this)}constructor(){let e=[Hv,Gv,jv,qv,Xv,Kv,Zv,Yv,Jv,Qv,e7,t7,n7,s7,r7,a7,o7,i7,l7],t=[].concat(...e.map(n=>n.json));this.opMappers=t.reduce((n,s)=>(n[s.tfOpName]=s,n),{})}transformGraph(e,t={}){let n=e.node,s=[],r=[],a=[],o=n.reduce((f,m)=>(f[m.name]=this.mapNode(m),m.op.startsWith("Placeholder")?s.push(f[m.name]):m.op==="Const"?r.push(f[m.name]):(m.input==null||m.input.length===0)&&a.push(f[m.name]),f),{}),i=[],l=[],u={},c={};t!=null&&(u=this.mapSignatureEntries(t.inputs),c=this.mapSignatureEntries(t.outputs));let d=Object.keys(o);d.forEach(f=>{let m=o[f];m.inputNames.forEach((g,A)=>{let[y,,x]=Er(g),b=o[y];if(b.outputs!=null){let v=b.outputs.indexOf(x);if(v!==-1){let k=`${y}:${v}`;m.inputNames[A]=k}}m.inputs.push(b),b.children.push(m)})}),Object.keys(c).length===0?d.forEach(f=>{let m=o[f];m.children.length===0&&l.push(m)}):Object.keys(c).forEach(f=>{let[m]=Er(f),g=o[m];g!=null&&(g.signatureKey=c[f],l.push(g))}),Object.keys(u).length>0?Object.keys(u).forEach(f=>{let[m]=Er(f),g=o[m];g&&(g.signatureKey=u[f],i.push(g))}):i=s;let h={};e.library!=null&&e.library.function!=null&&(h=e.library.function.reduce((f,m)=>(f[m.signature.name]=this.mapFunction(m),f),{}));let p={nodes:o,inputs:i,outputs:l,weights:r,placeholders:s,signature:t,functions:h};return a.length>0&&(p.initNodes=a),p}mapSignatureEntries(e){return Object.keys(e||{}).reduce((t,n)=>(t[e[n].name]=n,t),{})}mapNode(e){let t=Uv(e.op)||this.opMappers[e.op]||{};e.attr==null&&(e.attr={});let n={name:e.name,op:e.op,category:t.category,inputNames:(e.input||[]).map(s=>s.startsWith("^")?s.substr(1):s),inputs:[],children:[],inputParams:{},attrParams:{},rawAttrs:e.attr,outputs:t.outputs};return t.inputs!=null&&(n.inputParams=t.inputs.reduce((s,r)=>(s[r.name]={type:r.type,inputIndexStart:r.start,inputIndexEnd:r.end},s),{})),t.attrs!=null&&(n.attrParams=t.attrs.reduce((s,r)=>{let a=r.type,o;switch(r.type){case"string":o=q1(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=q1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"string[]":o=t2(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=t2(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"number":o=K1(e.attr,r.tfName,r.defaultValue||0),o===void 0&&!!r.tfDeprecatedName&&(o=K1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"number[]":o=e2(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=e2(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"bool":o=X1(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=X1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"bool[]":o=s2(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=s2(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"shape":o=Q1(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=Q1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"shape[]":o=n2(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=n2(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"dtype":o=Y1(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=Y1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"dtype[]":o=J1(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=J1(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"func":o=d7(e.attr,r.tfName,r.defaultValue),o===void 0&&!!r.tfDeprecatedName&&(o=d7(e.attr,r.tfDeprecatedName,r.defaultValue));break;case"tensor":case"tensors":break;default:throw new Error(`Unsupported param type: ${r.type} for op: ${e.op}`)}return s[r.name]={value:o,type:a},s},{})),n}mapFunction(e){let t=e.nodeDef,n=[],s=[],r={};t!=null&&(r=t.reduce((c,d)=>(c[d.name]=this.mapNode(d),d.op==="Const"&&s.push(c[d.name]),c),{}));let a=[],o=[];e.signature.inputArg.forEach(c=>{let[d]=Er(c.name),h={name:d,op:"Placeholder",inputs:[],inputNames:[],category:"graph",inputParams:{},attrParams:{dtype:{value:Z1(c.type),type:"dtype"}},children:[]};h.signatureKey=c.name,a.push(h),r[d]=h}),Object.keys(r).forEach(c=>{let d=r[c];d.inputNames.forEach((h,p)=>{let[f,,m]=Er(h),g=r[f];if(g.outputs!=null){let A=g.outputs.indexOf(m);if(A!==-1){let y=`${f}:${A}`;d.inputNames[p]=y}}d.inputs.push(g),g.children.push(d)})});let l=e.ret;e.signature.outputArg.forEach(c=>{let[d,h]=Er(l[c.name]),p=r[d];p!=null&&(p.defaultOutput=h,o.push(p))});let u=this.mapArgsToSignature(e);return{nodes:r,inputs:a,outputs:o,weights:s,placeholders:n,signature:u}}mapArgsToSignature(e){return{methodName:e.signature.name,inputs:e.signature.inputArg.reduce((t,n)=>(t[n.name]=this.mapArgToTensorInfo(n),t),{}),outputs:e.signature.outputArg.reduce((t,n)=>(t[n.name]=this.mapArgToTensorInfo(n,e.ret),t),{})}}mapArgToTensorInfo(e,t){let n=e.name;return t!=null&&(n=t[n]),{name:n,dtype:e.type}}};function TL(e){let t=Q().global;if(typeof t.atob!="undefined")return t.atob(e);if(typeof Buffer!="undefined")return new Buffer(e,"base64").toString();throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()")}function c7(e,t){let n=Array.isArray(e)?String.fromCharCode.apply(null,e):TL(e);return t?n:n.toLowerCase()}function q1(e,t,n,s=!1){let r=e[t];return r!=null?c7(r.s,s):n}function X1(e,t,n){let s=e[t];return s?s.b:n}function K1(e,t,n){let s=e[t]||{},r=s.i!=null?s.i:s.f!=null?s.f:n;return typeof r=="number"?r:parseInt(r,10)}function Z1(e){switch(typeof e=="string"&&(e=Gs[e]),e){case Gs.DT_FLOAT:return"float32";case Gs.DT_INT32:case Gs.DT_INT64:case Gs.DT_INT8:case Gs.DT_UINT8:return"int32";case Gs.DT_BOOL:return"bool";case Gs.DT_DOUBLE:return"float32";case Gs.DT_STRING:return"string";default:return null}}function d7(e,t,n){let s=e[t];return s&&s.func?s.func.name:n}function Y1(e,t,n){let s=e[t];return s&&s.type?Z1(s.type):n}function J1(e,t,n){let s=e[t];return s&&s.list&&s.list.type?s.list.type.map(r=>Z1(r)):n}function h7(e){if(!e.unknownRank)return e.dim!=null?e.dim.map(t=>typeof t.size=="number"?t.size:parseInt(t.size,10)):[]}function Q1(e,t,n){let s=e[t];return s&&s.shape?h7(s.shape):n}function e2(e,t,n){let s=e[t];return s?((s.list.f&&s.list.f.length?s.list.f:s.list.i)||[]).map(r=>typeof r=="number"?r:parseInt(r,10)):n}function t2(e,t,n,s=!1){let r=e[t];return r&&r.list&&r.list.s?r.list.s.map(a=>c7(a,s)):n}function n2(e,t,n){let s=e[t];return s&&s.list&&s.list.shape?s.list.shape.map(r=>h7(r)):n}function s2(e,t,n){let s=e[t];return s&&s.list&&s.list.b?s.list.b:n}var NL=class{constructor(e,t,n){this.node=e,this.tensorMap=t,this.context=n,this.inputs=[],this.attrs={},this.inputs=e.inputNames.map(s=>this.getInput(s)),e.rawAttrs!=null&&(this.attrs=Object.keys(e.rawAttrs).reduce((s,r)=>(s[r]=this.getAttr(r),s),{}))}getInput(e){return wn(e,this.tensorMap,this.context)}getAttr(e,t){let n=this.node.rawAttrs[e];if(n.tensor!=null)return wn(e,this.tensorMap,this.context);if(n.i!=null||n.f!=null)return K1(this.node.rawAttrs,e,t);if(n.s!=null)return q1(this.node.rawAttrs,e,t);if(n.b!=null)return X1(this.node.rawAttrs,e,t);if(n.shape!=null)return Q1(this.node.rawAttrs,e,t);if(n.type!=null)return Y1(this.node.rawAttrs,e,t);if(n.list!=null){if(n.list.i!=null||n.list.f!=null)return e2(this.node.rawAttrs,e,t);if(n.list.s!=null)return t2(this.node.rawAttrs,e,t);if(n.list.shape!=null)return n2(this.node.rawAttrs,e,t);if(n.list.b!=null)return s2(this.node.rawAttrs,e,t);if(n.list.type!=null)return J1(this.node.rawAttrs,e,t)}return t}},EL=(e,t,n)=>{switch(e.op){case"BiasAdd":case"AddV2":case"Add":return[ae(I("a",e,t,n),I("b",e,t,n))];case"AddN":return[Uh(I("tensors",e,t,n))];case"FloorMod":case"Mod":return[yb(I("a",e,t,n),I("b",e,t,n))];case"Mul":return[L(I("a",e,t,n),I("b",e,t,n))];case"RealDiv":case"Div":return[de(I("a",e,t,n),I("b",e,t,n))];case"DivNoNan":return[rb(I("a",e,t,n),I("b",e,t,n))];case"FloorDiv":return[bg(I("a",e,t,n),I("b",e,t,n))];case"Sub":return[ge(I("a",e,t,n),I("b",e,t,n))];case"Minimum":return[fc(I("a",e,t,n),I("b",e,t,n))];case"Maximum":return[kr(I("a",e,t,n),I("b",e,t,n))];case"Pow":return[ea(I("a",e,t,n),I("b",e,t,n))];case"SquaredDifference":return[Zg(I("a",e,t,n),I("b",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}},RL=(e,t,n)=>{switch(e.op){case"Abs":case"ComplexAbs":return[Ht(I("x",e,t,n))];case"Acos":return[Fx(I("x",e,t,n))];case"Acosh":return[Ox(I("x",e,t,n))];case"Asin":return[Mx(I("x",e,t,n))];case"Asinh":return[zx(I("x",e,t,n))];case"Atan":return[Lx(I("x",e,t,n))];case"Atan2":return[Bx(I("x",e,t,n),I("y",e,t,n))];case"Atanh":return[Wx(I("x",e,t,n))];case"Ceil":return[Kx(I("x",e,t,n))];case"Complex":return[qr(I("real",e,t,n),I("imag",e,t,n))];case"Cos":return[Xh(I("x",e,t,n))];case"Cosh":return[Rg(I("x",e,t,n))];case"Elu":return[hc(I("x",e,t,n))];case"Erf":return[ob(I("x",e,t,n))];case"Exp":return[cs(I("x",e,t,n))];case"Expm1":return[ib(I("x",e,t,n))];case"Floor":return[pc(I("x",e,t,n))];case"Log":return[ds(I("x",e,t,n))];case"Log1p":return[Yh(I("x",e,t,n))];case"Imag":return[Kh(I("x",e,t,n))];case"Neg":return[Tt(I("x",e,t,n))];case"Reciprocal":return[vb(I("x",e,t,n))];case"Real":return[mc(I("x",e,t,n))];case"Relu":return[sr(I("x",e,t,n))];case"Round":return[Ug(I("x",e,t,n))];case"Selu":return[Gg(I("x",e,t,n))];case"Sigmoid":return[Hn(I("x",e,t,n))];case"Sin":return[jg(I("x",e,t,n))];case"Sign":return[Ib(I("x",e,t,n))];case"Sinh":return[qg(I("x",e,t,n))];case"Softplus":return[Ll(I("x",e,t,n))];case"Sqrt":return[hn(I("x",e,t,n))];case"Square":return[ct(I("x",e,t,n))];case"Tanh":return[Fl(I("x",e,t,n))];case"Tan":return[Cb(I("x",e,t,n))];case"ClipByValue":return[Gn(I("x",e,t,n),I("clipValueMin",e,t,n),I("clipValueMax",e,t,n))];case"Relu6":return[Vg(I("x",e,t,n))];case"Rsqrt":return[Hg(wn(e.inputNames[0],t,n))];case"Prod":return[Lg(I("x",e,t,n),I("axes",e,t,n))];case"LeakyRelu":return[Zh(I("x",e,t,n),I("alpha",e,t,n))];case"Prelu":return[rp(I("x",e,t,n),I("alpha",e,t,n))];case"IsNan":return[lb(wn(e.inputNames[0],t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}};function _s(e,t,n=""){if(!(typeof e=="number"||typeof t=="number")){w.assert(e.length===t.length,()=>n+` Shapes ${e} and ${t} must match`);for(let s=0;sn+` Shapes ${e} and ${t} must match`)}}}function p7(e){return!(typeof e=="number"||e.some(t=>t<0))}function Lc(e,t,n){let s=r2(e,n),r=!p7(s);if(r&&t.length===0)throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${s}`);if(r&&t.forEach(a=>{s=r2(a.shape,s)}),!p7(s))throw new Error(`Non-fully-defined elementShape: ${s}`);return s}function r2(e,t){if(typeof e=="number")return t;if(typeof t=="number")return e;if(e.length!==t.length)throw new Error(`Incompatible ranks during merge: ${e} vs. ${t}`);let n=[];for(let s=0;s=0&&a>=0&&r!==a)throw new Error(`Incompatible shape during merge: ${e} vs. ${t}`);n[s]=r>=0?r:a}return n}var _L=class{constructor(e,t,n,s,r,a,o){this.name=e,this.dtype=t,this.maxSize=n,this.elementShape=s,this.identicalElementShapes=r,this.dynamicSize=a,this.clearAfterRead=o,this.tensors=[],this.closed_=!1,this.idTensor=Ie(0),Jt(this.idTensor)}get id(){return this.idTensor.id}get closed(){return this.closed_}clearAndClose(e){this.tensors.forEach(t=>{(e==null||!e.has(t.tensor.id))&&t.tensor.dispose()}),this.tensors=[],this.closed_=!0,this.idTensor.dispose()}size(){return this.tensors.length}read(e){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||e>=this.size())throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`);let t=this.tensors[e];if(t.cleared)throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`);return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor}readMany(e){return e.map(t=>this.read(t))}write(e,t){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`);let n=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, - because the value dtype is ${t.dtype}, but TensorArray dtype is ${this.dtype}.`);if(this.size()===0&&(this.elementShape==null||this.elementShape.length===0)&&(this.elementShape=t.shape),_s(this.elementShape,t.shape,`TensorArray ${this.name}: Could not write to TensorArray index ${e}.`),n.read)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`);if(n.written)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`);n.tensor=t,Jt(t),n.written=!0,this.tensors[e]=n}writeMany(e,t){if(e.length!==t.length)throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t.length}.`);e.forEach((n,s)=>this.write(n,t[s]))}gather(e,t){if(!!t&&t!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t}`);if(e)e=e.slice(0,this.size());else{e=[];for(let s=0;s=this.maxSize)throw new Error(`Max index must be < array size (${n} vs. ${this.maxSize})`);this.writeMany(e,ms(t,0))}split(e,t){if(t.dtype!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t.dtype}`);let n=0,s=e.map(i=>(n+=i,n));if(n!==t.shape[0])throw new Error(`Expected sum of lengths to be equal to +var __defProp = Object.defineProperty; +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __require = (x) => { + if (typeof require !== "undefined") + return require(x); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}; +var __export = (target, all6) => { + __markAsModule(target); + for (var name in all6) + __defProp(target, name, { get: all6[name], enumerable: true }); +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/helpers.ts +function join(folder, file) { + const separator = folder.endsWith("/") ? "" : "/"; + const skipJoin = file.startsWith(".") || file.startsWith("/") || file.startsWith("http:") || file.startsWith("https:") || file.startsWith("file:"); + const path = skipJoin ? `${file}` : `${folder}${separator}${file}`; + if (!path.toLocaleLowerCase().includes(".json")) + throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`); + return path; +} +function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/config.ts +var config = { + backend: "webgl", + modelBasePath: "../models/", + wasmPath: "", + debug: true, + async: true, + warmup: "full", + cacheSensitivity: 0.75, + skipFrame: false, + filter: { + enabled: true, + width: 0, + height: 0, + flip: false, + return: true, + brightness: 0, + contrast: 0, + sharpness: 0, + blur: 0, + saturation: 0, + hue: 0, + negative: false, + sepia: false, + vintage: false, + kodachrome: false, + technicolor: false, + polaroid: false, + pixelate: 0 + }, + gesture: { + enabled: true + }, + face: { + enabled: true, + detector: { + modelPath: "blazeface.json", + rotation: true, + maxDetected: 15, + skipFrames: 15, + minConfidence: 0.2, + iouThreshold: 0.1, + return: false + }, + mesh: { + enabled: true, + modelPath: "facemesh.json" + }, + iris: { + enabled: true, + modelPath: "iris.json" + }, + description: { + enabled: true, + modelPath: "faceres.json", + skipFrames: 11, + minConfidence: 0.1 + }, + emotion: { + enabled: true, + minConfidence: 0.1, + skipFrames: 17, + modelPath: "emotion.json" + } + }, + body: { + enabled: true, + modelPath: "movenet-lightning.json", + maxDetected: 1, + minConfidence: 0.2, + skipFrames: 1 + }, + hand: { + enabled: true, + rotation: true, + skipFrames: 18, + minConfidence: 0.8, + iouThreshold: 0.2, + maxDetected: 1, + landmarks: true, + detector: { + modelPath: "handdetect.json" + }, + skeleton: { + modelPath: "handskeleton.json" + } + }, + object: { + enabled: false, + modelPath: "mb3-centernet.json", + minConfidence: 0.2, + iouThreshold: 0.4, + maxDetected: 10, + skipFrames: 19 + }, + segmentation: { + enabled: false, + modelPath: "selfie.json" + } +}; + +// src/sysinfo.ts +function info() { + let platform = ""; + let agent = ""; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + const platformMatch = raw[0].match(/\(([^()]+)\)/g); + platform = platformMatch && platformMatch[0] ? platformMatch[0].replace(/\(|\)/g, "") : ""; + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return { platform, agent }; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastArgs: () => BroadcastArgs, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Einsum: () => Einsum, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseFillEmptyRows: () => SparseFillEmptyRows, + SparseReshape: () => SparseReshape, + SparseSegmentMean: () => SparseSegmentMean, + SparseSegmentSum: () => SparseSegmentSum, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + StringNGrams: () => StringNGrams, + StringSplit: () => StringSplit, + StringToHashBucketFast: () => StringToHashBucketFast, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastArgs: () => broadcastArgs, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + einsum: () => einsum, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log5, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + meshgrid: () => meshgrid, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparse: () => sparse, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + string: () => string, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version16, + version_converter: () => version11, + version_core: () => version9, + version_cpu: () => version13, + version_layers: () => version10, + version_wasm: () => version15, + version_webgl: () => version14, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike +}); +var __create = Object.create; +var __defProp2 = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __markAsModule2 = (target) => __defProp2(target, "__esModule", { value: true }); +var __require2 = (x) => { + if (typeof __require !== "undefined") + return __require(x); + throw new Error('Dynamic require of "' + x + '" is not supported'); +}; +var __commonJS = (cb, mod4) => function __require22() { + return mod4 || (0, cb[Object.keys(cb)[0]])((mod4 = { exports: {} }).exports, mod4), mod4.exports; +}; +var __export2 = (target, all52) => { + __markAsModule2(target); + for (var name in all52) + __defProp2(target, name, { get: all52[name], enumerable: true }); +}; +var __reExport = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp2(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module) => { + return __reExport(__markAsModule2(__defProp2(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? { get: () => module.default, enumerable: true } : { value: module, enumerable: true })), module); +}; +var require_long = __commonJS({ + "node_modules/.pnpm/long@4.0.0/node_modules/long/src/long.js"(exports, module) { + module.exports = Long2; + var wasm = null; + try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([ + 0, + 97, + 115, + 109, + 1, + 0, + 0, + 0, + 1, + 13, + 2, + 96, + 0, + 1, + 127, + 96, + 4, + 127, + 127, + 127, + 127, + 1, + 127, + 3, + 7, + 6, + 0, + 1, + 1, + 1, + 1, + 1, + 6, + 6, + 1, + 127, + 1, + 65, + 0, + 11, + 7, + 50, + 6, + 3, + 109, + 117, + 108, + 0, + 1, + 5, + 100, + 105, + 118, + 95, + 115, + 0, + 2, + 5, + 100, + 105, + 118, + 95, + 117, + 0, + 3, + 5, + 114, + 101, + 109, + 95, + 115, + 0, + 4, + 5, + 114, + 101, + 109, + 95, + 117, + 0, + 5, + 8, + 103, + 101, + 116, + 95, + 104, + 105, + 103, + 104, + 0, + 0, + 10, + 191, + 1, + 6, + 4, + 0, + 35, + 0, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 126, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 127, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 128, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 129, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 130, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11 + ])), {}).exports; + } catch (e) { + } + function Long2(low, high, unsigned) { + this.low = low | 0; + this.high = high | 0; + this.unsigned = !!unsigned; + } + Long2.prototype.__isLong__; + Object.defineProperty(Long2.prototype, "__isLong__", { value: true }); + function isLong(obj) { + return (obj && obj["__isLong__"]) === true; + } + Long2.isLong = isLong; + var INT_CACHE = {}; + var UINT_CACHE = {}; + function fromInt(value, unsigned) { + var obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if (cache = 0 <= value && value < 256) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } else { + value |= 0; + if (cache = -128 <= value && value < 128) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } + } + Long2.fromInt = fromInt; + function fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? UZERO : ZERO; + if (unsigned) { + if (value < 0) + return UZERO; + if (value >= TWO_PWR_64_DBL) + return MAX_UNSIGNED_VALUE; + } else { + if (value <= -TWO_PWR_63_DBL) + return MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return MAX_VALUE; + } + if (value < 0) + return fromNumber(-value, unsigned).neg(); + return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); + } + Long2.fromNumber = fromNumber; + function fromBits(lowBits, highBits, unsigned) { + return new Long2(lowBits, highBits, unsigned); + } + Long2.fromBits = fromBits; + var pow_dbl = Math.pow; + function fromString(str, unsigned, radix) { + if (str.length === 0) + throw Error("empty string"); + if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") + return ZERO; + if (typeof unsigned === "number") { + radix = unsigned, unsigned = false; + } else { + unsigned = !!unsigned; + } + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw RangeError("radix"); + var p2; + if ((p2 = str.indexOf("-")) > 0) + throw Error("interior hyphen"); + else if (p2 === 0) { + return fromString(str.substring(1), unsigned, radix).neg(); + } + var radixToPower = fromNumber(pow_dbl(radix, 8)); + var result = ZERO; + for (var i = 0; i < str.length; i += 8) { + var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + var power = fromNumber(pow_dbl(radix, size)); + result = result.mul(power).add(fromNumber(value)); + } else { + result = result.mul(radixToPower); + result = result.add(fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + Long2.fromString = fromString; + function fromValue(val, unsigned) { + if (typeof val === "number") + return fromNumber(val, unsigned); + if (typeof val === "string") + return fromString(val, unsigned); + return fromBits(val.low, val.high, typeof unsigned === "boolean" ? unsigned : val.unsigned); + } + Long2.fromValue = fromValue; + var TWO_PWR_16_DBL = 1 << 16; + var TWO_PWR_24_DBL = 1 << 24; + var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; + var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; + var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; + var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); + var ZERO = fromInt(0); + Long2.ZERO = ZERO; + var UZERO = fromInt(0, true); + Long2.UZERO = UZERO; + var ONE = fromInt(1); + Long2.ONE = ONE; + var UONE = fromInt(1, true); + Long2.UONE = UONE; + var NEG_ONE = fromInt(-1); + Long2.NEG_ONE = NEG_ONE; + var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false); + Long2.MAX_VALUE = MAX_VALUE; + var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true); + Long2.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; + var MIN_VALUE = fromBits(0, 2147483648 | 0, false); + Long2.MIN_VALUE = MIN_VALUE; + var LongPrototype = Long2.prototype; + LongPrototype.toInt = function toInt() { + return this.unsigned ? this.low >>> 0 : this.low; + }; + LongPrototype.toNumber = function toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + }; + LongPrototype.toString = function toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw RangeError("radix"); + if (this.isZero()) + return "0"; + if (this.isNegative()) { + if (this.eq(MIN_VALUE)) { + var radixLong = fromNumber(radix), div3 = this.div(radixLong), rem1 = div3.mul(radixLong).sub(this); + return div3.toString(radix) + rem1.toInt().toString(radix); + } else + return "-" + this.neg().toString(radix); + } + var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this; + var result = ""; + while (true) { + var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) + return digits + result; + else { + while (digits.length < 6) + digits = "0" + digits; + result = "" + digits + result; + } + } + }; + LongPrototype.getHighBits = function getHighBits() { + return this.high; + }; + LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { + return this.high >>> 0; + }; + LongPrototype.getLowBits = function getLowBits() { + return this.low; + }; + LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { + return this.low >>> 0; + }; + LongPrototype.getNumBitsAbs = function getNumBitsAbs() { + if (this.isNegative()) + return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + var val = this.high != 0 ? this.high : this.low; + for (var bit = 31; bit > 0; bit--) + if ((val & 1 << bit) != 0) + break; + return this.high != 0 ? bit + 33 : bit + 1; + }; + LongPrototype.isZero = function isZero() { + return this.high === 0 && this.low === 0; + }; + LongPrototype.eqz = LongPrototype.isZero; + LongPrototype.isNegative = function isNegative() { + return !this.unsigned && this.high < 0; + }; + LongPrototype.isPositive = function isPositive() { + return this.unsigned || this.high >= 0; + }; + LongPrototype.isOdd = function isOdd() { + return (this.low & 1) === 1; + }; + LongPrototype.isEven = function isEven2() { + return (this.low & 1) === 0; + }; + LongPrototype.equals = function equals(other) { + if (!isLong(other)) + other = fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + }; + LongPrototype.eq = LongPrototype.equals; + LongPrototype.notEquals = function notEquals(other) { + return !this.eq(other); + }; + LongPrototype.neq = LongPrototype.notEquals; + LongPrototype.ne = LongPrototype.notEquals; + LongPrototype.lessThan = function lessThan(other) { + return this.comp(other) < 0; + }; + LongPrototype.lt = LongPrototype.lessThan; + LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { + return this.comp(other) <= 0; + }; + LongPrototype.lte = LongPrototype.lessThanOrEqual; + LongPrototype.le = LongPrototype.lessThanOrEqual; + LongPrototype.greaterThan = function greaterThan(other) { + return this.comp(other) > 0; + }; + LongPrototype.gt = LongPrototype.greaterThan; + LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { + return this.comp(other) >= 0; + }; + LongPrototype.gte = LongPrototype.greaterThanOrEqual; + LongPrototype.ge = LongPrototype.greaterThanOrEqual; + LongPrototype.compare = function compare(other) { + if (!isLong(other)) + other = fromValue(other); + if (this.eq(other)) + return 0; + var thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1; + }; + LongPrototype.comp = LongPrototype.compare; + LongPrototype.negate = function negate() { + if (!this.unsigned && this.eq(MIN_VALUE)) + return MIN_VALUE; + return this.not().add(ONE); + }; + LongPrototype.neg = LongPrototype.negate; + LongPrototype.add = function add5(addend) { + if (!isLong(addend)) + addend = fromValue(addend); + var a48 = this.high >>> 16; + var a32 = this.high & 65535; + var a16 = this.low >>> 16; + var a00 = this.low & 65535; + var b48 = addend.high >>> 16; + var b32 = addend.high & 65535; + var b16 = addend.low >>> 16; + var b00 = addend.low & 65535; + var c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 65535; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 65535; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 65535; + c48 += a48 + b48; + c48 &= 65535; + return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); + }; + LongPrototype.subtract = function subtract(subtrahend) { + if (!isLong(subtrahend)) + subtrahend = fromValue(subtrahend); + return this.add(subtrahend.neg()); + }; + LongPrototype.sub = LongPrototype.subtract; + LongPrototype.multiply = function multiply4(multiplier) { + if (this.isZero()) + return ZERO; + if (!isLong(multiplier)) + multiplier = fromValue(multiplier); + if (wasm) { + var low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); + return fromBits(low, wasm.get_high(), this.unsigned); + } + if (multiplier.isZero()) + return ZERO; + if (this.eq(MIN_VALUE)) + return multiplier.isOdd() ? MIN_VALUE : ZERO; + if (multiplier.eq(MIN_VALUE)) + return this.isOdd() ? MIN_VALUE : ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) + return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + var a48 = this.high >>> 16; + var a32 = this.high & 65535; + var a16 = this.low >>> 16; + var a00 = this.low & 65535; + var b48 = multiplier.high >>> 16; + var b32 = multiplier.high & 65535; + var b16 = multiplier.low >>> 16; + var b00 = multiplier.low & 65535; + var c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 65535; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 65535; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 65535; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 65535; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 65535; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 65535; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 65535; + return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); + }; + LongPrototype.mul = LongPrototype.multiply; + LongPrototype.divide = function divide(divisor) { + if (!isLong(divisor)) + divisor = fromValue(divisor); + if (divisor.isZero()) + throw Error("division by zero"); + if (wasm) { + if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) { + return this; + } + var low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); + return fromBits(low, wasm.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? UZERO : ZERO; + var approx, rem, res; + if (!this.unsigned) { + if (this.eq(MIN_VALUE)) { + if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) + return MIN_VALUE; + else if (divisor.eq(MIN_VALUE)) + return ONE; + else { + var halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(ZERO)) { + return divisor.isNegative() ? ONE : NEG_ONE; + } else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } else if (divisor.eq(MIN_VALUE)) + return this.unsigned ? UZERO : ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = ZERO; + } else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return UZERO; + if (divisor.gt(this.shru(1))) + return UONE; + res = UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + var log22 = Math.ceil(Math.log(approx) / Math.LN2), delta = log22 <= 48 ? 1 : pow_dbl(2, log22 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + }; + LongPrototype.div = LongPrototype.divide; + LongPrototype.modulo = function modulo(divisor) { + if (!isLong(divisor)) + divisor = fromValue(divisor); + if (wasm) { + var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); + return fromBits(low, wasm.get_high(), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); + }; + LongPrototype.mod = LongPrototype.modulo; + LongPrototype.rem = LongPrototype.modulo; + LongPrototype.not = function not() { + return fromBits(~this.low, ~this.high, this.unsigned); + }; + LongPrototype.and = function and(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low & other.low, this.high & other.high, this.unsigned); + }; + LongPrototype.or = function or(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low | other.low, this.high | other.high, this.unsigned); + }; + LongPrototype.xor = function xor(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + }; + LongPrototype.shiftLeft = function shiftLeft(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned); + else + return fromBits(0, this.low << numBits - 32, this.unsigned); + }; + LongPrototype.shl = LongPrototype.shiftLeft; + LongPrototype.shiftRight = function shiftRight(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned); + else + return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned); + }; + LongPrototype.shr = LongPrototype.shiftRight; + LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) + return this; + else { + var high = this.high; + if (numBits < 32) { + var low = this.low; + return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned); + } else if (numBits === 32) + return fromBits(high, 0, this.unsigned); + else + return fromBits(high >>> numBits - 32, 0, this.unsigned); + } + }; + LongPrototype.shru = LongPrototype.shiftRightUnsigned; + LongPrototype.shr_u = LongPrototype.shiftRightUnsigned; + LongPrototype.toSigned = function toSigned() { + if (!this.unsigned) + return this; + return fromBits(this.low, this.high, false); + }; + LongPrototype.toUnsigned = function toUnsigned() { + if (this.unsigned) + return this; + return fromBits(this.low, this.high, true); + }; + LongPrototype.toBytes = function toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); + }; + LongPrototype.toBytesLE = function toBytesLE() { + var hi = this.high, lo = this.low; + return [ + lo & 255, + lo >>> 8 & 255, + lo >>> 16 & 255, + lo >>> 24, + hi & 255, + hi >>> 8 & 255, + hi >>> 16 & 255, + hi >>> 24 + ]; + }; + LongPrototype.toBytesBE = function toBytesBE() { + var hi = this.high, lo = this.low; + return [ + hi >>> 24, + hi >>> 16 & 255, + hi >>> 8 & 255, + hi & 255, + lo >>> 24, + lo >>> 16 & 255, + lo >>> 8 & 255, + lo & 255 + ]; + }; + Long2.fromBytes = function fromBytes(bytes, unsigned, le) { + return le ? Long2.fromBytesLE(bytes, unsigned) : Long2.fromBytesBE(bytes, unsigned); + }; + Long2.fromBytesLE = function fromBytesLE(bytes, unsigned) { + return new Long2(bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, unsigned); + }; + Long2.fromBytesBE = function fromBytesBE(bytes, unsigned) { + return new Long2(bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], unsigned); + }; + } +}); +var require_browser = __commonJS({ + "(disabled):node_modules/.pnpm/node-fetch@2.6.1/node_modules/node-fetch/browser.js"() { + } +}); +var require_alea = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/alea.js"(exports, module) { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data) { + data = data.toString(); + for (var i = 0; i < data.length; i++) { + n += data.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xor128 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor128.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xorwow = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorwow.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xorshift7 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorshift7.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xor4096 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor4096.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_tychei = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/tychei.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_crypto = __commonJS({ + "(disabled):crypto"() { + } +}); +var require_seedrandom = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/seedrandom.js"(exports, module) { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options3, callback) { + var key = []; + options3 = options3 == true ? { entropy: true } : options3 || {}; + var shortseed = mixkey(flatten4(options3.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options3.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options3 ? options3.global : this == math, options3.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count22) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count22--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); + } +}); +var require_seedrandom2 = __commonJS({ + "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/index.js"(exports, module) { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; + } +}); +var require_alea2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js"(exports, module) { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data) { + data = String(data); + for (var i = 0; i < data.length; i++) { + n += data.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xor1282 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xorwow2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xorshift72 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_xor40962 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_tychei2 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js"(exports, module) { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + } +}); +var require_seedrandom3 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js"(exports, module) { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options3, callback) { + var key = []; + options3 = options3 == true ? { entropy: true } : options3 || {}; + var shortseed = mixkey(flatten4(options3.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options3.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options3 ? options3.global : this == math, options3.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count22) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count22--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); + } +}); +var require_seedrandom4 = __commonJS({ + "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js"(exports, module) { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; + } +}); +var require_string_decoder = __commonJS({ + "(disabled):node_modules/.pnpm/string_decoder@1.1.1/node_modules/string_decoder/lib/string_decoder.js"() { + } +}); +var require_path = __commonJS({ + "(disabled):path"() { + } +}); +var require_worker_threads = __commonJS({ + "(disabled):worker_threads"() { + } +}); +var require_perf_hooks = __commonJS({ + "(disabled):perf_hooks"() { + } +}); +var require_tfjs_backend_wasm_threaded_simd = __commonJS({ + "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.9.0_@tensorflow+tfjs-core@3.9.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(exports, module) { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require2("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data = read(f, "binary"); + assert3(typeof data === "object"); + return data; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require2("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = { "string": function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, "array": function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + } }; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({ "initial": INITIAL_MEMORY / 65536, "maximum": 2147483648 / 65536, "shared": true }); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({ func: function() { + ___wasm_call_ctors(); + } }); + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = { "a": asmLibraryArg }; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module2; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = { 10024: function() { + throw "Canceled!"; + }, 10042: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + } }; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count22) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count22 < 0) + return -28; + if (count22 == 0) + return 0; + if (count22 >= 2147483647) + count22 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count22; + mainThreadWoken = 1; + if (count22 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count22); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({ "cmd": "cancel" }); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } + } + var PThread = { unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = Math.min(4, Math.max(1, (navigator.hardwareConcurrency || 1) / 2)); + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, runExitHandlersAndDeinitThread: function(tb, exitCode) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + PThread.runExitHandlersAndDeinitThread(tb, exitCode); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ "cmd": "exit" }); + } + } + }, threadCancel: function() { + PThread.runExitHandlersAndDeinitThread(_pthread_self(), -1); + postMessage({ "cmd": "cancelDone" }); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data) { + }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { + worker.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker.on("message", function(data) { + worker.onmessage({ data }); + }); + worker.on("error", function(data) { + worker.onerror(data); + }); + worker.on("exit", function(data) { + }); + } + worker.postMessage({ "cmd": "load", "urlOrBlob": Module["mainScriptUrlOrBlob"] || _scriptDir, "wasmMemory": wasmMemory, "wasmModule": wasmModule }); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + } }; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({ "cmd": "processQueuedMainThreadWork" }); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ "targetThread": targetThreadId, "cmd": "processThreadQueue" }); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({ "cmd": "processThreadQueue" }); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return __require2("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = { inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({ targetFunction, precedence, argsList }); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + } }; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count22, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count22, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count22, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count22, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = { counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count22, string3, length) { + var source = ""; + for (var i = 0; i < count22; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string3 + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = { handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx }; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = { uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1 }; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + } }; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = { "alpha": !!GROWABLE_HEAP_I32()[a + (0 >> 2)], "depth": !!GROWABLE_HEAP_I32()[a + (4 >> 2)], "stencil": !!GROWABLE_HEAP_I32()[a + (8 >> 2)], "antialias": !!GROWABLE_HEAP_I32()[a + (12 >> 2)], "premultipliedAlpha": !!GROWABLE_HEAP_I32()[a + (16 >> 2)], "preserveDrawingBuffer": !!GROWABLE_HEAP_I32()[a + (20 >> 2)], "powerPreference": __emscripten_webgl_power_preferences[powerPreference], "failIfMajorPerformanceCaveat": !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)] }; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + } }; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = { worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr }; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker.pthread = pthread; + var msg = { "cmd": "run", "start_routine": threadParams.startRoutine, "arg": threadParams.arg, "threadInfoStruct": threadParams.pthread_ptr, "stackBase": threadParams.stackBase, "stackSize": threadParams.stackSize }; + worker.runPthread = function() { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = { stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList }; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = { "e": ___assert_fail, "r": ___call_main, "x": __emscripten_notify_thread_queue, "b": _abort, "y": _emscripten_asm_const_int, "j": _emscripten_conditional_set_current_thread_status, "c": _emscripten_futex_wait, "d": _emscripten_futex_wake, "f": _emscripten_get_now, "p": _emscripten_memcpy_big, "z": _emscripten_num_logical_cores, "u": _emscripten_receive_on_main_thread_js, "q": _emscripten_resize_heap, "v": _emscripten_set_canvas_element_size, "i": _emscripten_set_current_thread_status, "t": _emscripten_set_thread_name, "w": _emscripten_webgl_create_context, "m": _fd_close, "n": _fd_seek, "g": _fd_write, "o": initPthreadsJS, "a": wasmMemory || Module["wasmMemory"], "k": _pthread_cleanup_pop, "l": _pthread_cleanup_push, "h": _pthread_create, "s": _sysconf }; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _All = Module["_All"] = function() { + return (_All = Module["_All"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Any = Module["_Any"] = function() { + return (_Any = Module["_Any"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Cosh = Module["_Cosh"] = function() { + return (_Cosh = Module["_Cosh"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Elu = Module["_Elu"] = function() { + return (_Elu = Module["_Elu"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _MirrorPad = Module["_MirrorPad"] = function() { + return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _Tan = Module["_Tan"] = function() { + return (_Tan = Module["_Tan"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var _Transform = Module["_Transform"] = function() { + return (_Transform = Module["_Transform"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["db"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["sb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["tb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["ub"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["vb"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["wb"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["xb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["yb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 10016; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11652; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + initRuntime(); + postMessage({ "cmd": "loaded" }); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ "cmd": "exitProcess", "returnCode": status }); + throw new ExitStatus(status); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; + } +}); +var require_tfjs_backend_wasm = __commonJS({ + "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.9.0_@tensorflow+tfjs-core@3.9.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(exports, module) { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = __require2("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data = read(f, "binary"); + assert3(typeof data === "object"); + return data; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = { "string": function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, "array": function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + } }; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({ func: function() { + ___wasm_call_ctors(); + } }); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = { "a": asmLibraryArg }; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["i"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["o"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + } }; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + function _pthread_create() { + return 6; + } + function setErrNo(value) { + HEAP32[___errno_location() >> 2] = value; + return value; + } + function _sysconf(name) { + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + var asmLibraryArg = { "a": _abort, "d": _emscripten_memcpy_big, "e": _emscripten_resize_heap, "f": _fd_close, "c": _fd_seek, "b": _fd_write, "g": _pthread_create, "h": _sysconf }; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["m"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _All = Module["_All"] = function() { + return (_All = Module["_All"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Any = Module["_Any"] = function() { + return (_Any = Module["_Any"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _Cosh = Module["_Cosh"] = function() { + return (_Cosh = Module["_Cosh"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Elu = Module["_Elu"] = function() { + return (_Elu = Module["_Elu"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _MirrorPad = Module["_MirrorPad"] = function() { + return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _Tan = Module["_Tan"] = function() { + return (_Tan = Module["_Tan"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Transform = Module["_Transform"] = function() { + return (_Transform = Module["_Transform"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["Va"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; + } +}); +var version = "3.9.0"; +var version2 = "3.9.0"; +var version3 = "3.9.0"; +var version4 = "3.9.0"; +var version5 = "3.9.0"; +var version6 = "3.9.0"; +var version7 = "3.9.0"; +var version8 = "3.9.0"; +var EPSILON_FLOAT32 = 1e-7; +var EPSILON_FLOAT16 = 1e-4; +var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } +}; +var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } +}; +function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); +} +function shuffle(array2) { + let counter = array2.length; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + swap(array2, counter, index); + } +} +function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + swap(array2, counter, index); + swap(array22, counter, index); + } +} +function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); +} +function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; +} +function swap(object2, left, right) { + const temp = object2[left]; + object2[left] = object2[right]; + object2[right] = temp; +} +function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; +} +function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; +} +function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; +} +function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } +} +function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); +} +function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); +} +function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; +} +function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; +} +function isScalarShape(shape) { + return shape.length === 0; +} +function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; +} +function isInt(a) { + return a % 1 === 0; +} +function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } +} +function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; +} +function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; +} +function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); +} +function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); +} +function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; +} +function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); +} +function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return { newShape, keptDims }; +} +function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } +} +function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; +} +function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; +} +function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; +} +function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } +} +function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; +} +function isString(value) { + return typeof value === "string" || value instanceof String; +} +function isBoolean(value) { + return typeof value === "boolean"; +} +function isNumber(value) { + return typeof value === "number"; +} +function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; +} +function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); +} +function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; +} +function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; +} +function createNestedArray(offset, shape, a, isComplex = false) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0] * (isComplex ? 2 : 1); + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a, isComplex); + } + } + return ret; +} +function toNestedArray(shape, a, isComplex = false) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? " for a complex tensor" : ""}.`); + } + return createNestedArray(0, shape, a, isComplex); +} +function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; +} +function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); +} +function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; +} +function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; +} +function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; +} +function warn(...msg) { + if (!(env().getBool("IS_TEST") || env().getBool("PROD"))) { + console.warn(...msg); + } +} +function log2(...msg) { + if (!(env().getBool("IS_TEST") || env().getBool("PROD"))) { + console.log(...msg); + } +} +var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; +var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.getQueryParams = getQueryParams; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = { evaluationFn, setHook }; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = this.getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } +}; +function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; +} +function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ""); +} +function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); +} +function env() { + return ENV; +} +var ENV = null; +function setEnvironmentGlobal(environment) { + ENV = environment; +} +var globalNameSpace; +function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; +} +function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; +} +function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } +} +var Abs = "Abs"; +var Acos = "Acos"; +var Acosh = "Acosh"; +var Add = "Add"; +var AddN = "AddN"; +var All = "All"; +var Any = "Any"; +var ArgMax = "ArgMax"; +var ArgMin = "ArgMin"; +var Asin = "Asin"; +var Asinh = "Asinh"; +var Atan = "Atan"; +var Atanh = "Atanh"; +var Atan2 = "Atan2"; +var AvgPool = "AvgPool"; +var AvgPoolGrad = "AvgPoolGrad"; +var AvgPool3D = "AvgPool3D"; +var AvgPool3DGrad = "AvgPool3DGrad"; +var BatchMatMul = "BatchMatMul"; +var BatchToSpaceND = "BatchToSpaceND"; +var Bincount = "Bincount"; +var BroadcastTo = "BroadcastTo"; +var BroadcastArgs = "BroadcastArgs"; +var Cast = "Cast"; +var Ceil = "Ceil"; +var ClipByValue = "ClipByValue"; +var Complex = "Complex"; +var ComplexAbs = "ComplexAbs"; +var Concat = "Concat"; +var Conv2D = "Conv2D"; +var Conv2DBackpropFilter = "Conv2DBackpropFilter"; +var Conv2DBackpropInput = "Conv2DBackpropInput"; +var Conv3D = "Conv3D"; +var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; +var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; +var Cos = "Cos"; +var Cosh = "Cosh"; +var Cumsum = "Cumsum"; +var CropAndResize = "CropAndResize"; +var DenseBincount = "DenseBincount"; +var DepthToSpace = "DepthToSpace"; +var DepthwiseConv2dNative = "DepthwiseConv2dNative"; +var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; +var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; +var Diag = "Diag"; +var Dilation2D = "Dilation2D"; +var Dilation2DBackpropInput = "Dilation2DBackpropInput"; +var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; +var RealDiv = "RealDiv"; +var Einsum = "Einsum"; +var Elu = "Elu"; +var EluGrad = "EluGrad"; +var Erf = "Erf"; +var Equal = "Equal"; +var Exp = "Exp"; +var ExpandDims = "ExpandDims"; +var Expm1 = "Expm1"; +var FFT = "FFT"; +var Fill = "Fill"; +var FlipLeftRight = "FlipLeftRight"; +var Floor = "Floor"; +var FloorDiv = "FloorDiv"; +var FusedBatchNorm = "FusedBatchNorm"; +var GatherV2 = "GatherV2"; +var GatherNd = "GatherNd"; +var Greater = "Greater"; +var GreaterEqual = "GreaterEqual"; +var Identity = "Identity"; +var IFFT = "IFFT"; +var Imag = "Imag"; +var IsFinite = "IsFinite"; +var IsInf = "IsInf"; +var IsNan = "IsNan"; +var LeakyRelu = "LeakyRelu"; +var Less = "Less"; +var LessEqual = "LessEqual"; +var LinSpace = "LinSpace"; +var Log = "Log"; +var Log1p = "Log1p"; +var LogicalAnd = "LogicalAnd"; +var LogicalNot = "LogicalNot"; +var LogicalOr = "LogicalOr"; +var LogSoftmax = "LogSoftmax"; +var LRN = "LRN"; +var LRNGrad = "LRNGrad"; +var Max = "Max"; +var Maximum = "Maximum"; +var MaxPool = "MaxPool"; +var MaxPoolGrad = "MaxPoolGrad"; +var MaxPool3D = "MaxPool3D"; +var MaxPool3DGrad = "MaxPool3DGrad"; +var MaxPoolWithArgmax = "MaxPoolWithArgmax"; +var Mean = "Mean"; +var Min = "Min"; +var Minimum = "Minimum"; +var MirrorPad = "MirrorPad"; +var Mod = "Mod"; +var Multinomial = "Multinomial"; +var Multiply = "Multiply"; +var Neg = "Neg"; +var NotEqual = "NotEqual"; +var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; +var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; +var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; +var OnesLike = "OnesLike"; +var OneHot = "OneHot"; +var Pack = "Pack"; +var PadV2 = "PadV2"; +var Pool = "Pool"; +var Pow = "Pow"; +var Prelu = "Prelu"; +var Prod = "Prod"; +var Range = "Range"; +var Real = "Real"; +var Reciprocal = "Reciprocal"; +var Relu = "Relu"; +var Reshape = "Reshape"; +var ResizeNearestNeighbor = "ResizeNearestNeighbor"; +var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; +var ResizeBilinear = "ResizeBilinear"; +var ResizeBilinearGrad = "ResizeBilinearGrad"; +var Relu6 = "Relu6"; +var Reverse = "Reverse"; +var Round = "Round"; +var Rsqrt = "Rsqrt"; +var ScatterNd = "ScatterNd"; +var Select = "Select"; +var Selu = "Selu"; +var Slice = "Slice"; +var Sin = "Sin"; +var Sinh = "Sinh"; +var Sign = "Sign"; +var Sigmoid = "Sigmoid"; +var Softplus = "Softplus"; +var Sqrt = "Sqrt"; +var Sum = "Sum"; +var SpaceToBatchND = "SpaceToBatchND"; +var SplitV = "SplitV"; +var Softmax = "Softmax"; +var SparseFillEmptyRows = "SparseFillEmptyRows"; +var SparseReshape = "SparseReshape"; +var SparseSegmentMean = "SparseSegmentMean"; +var SparseSegmentSum = "SparseSegmentSum"; +var SparseToDense = "SparseToDense"; +var SquaredDifference = "SquaredDifference"; +var Square = "Square"; +var StridedSlice = "StridedSlice"; +var StringNGrams = "StringNGrams"; +var StringSplit = "StringSplit"; +var StringToHashBucketFast = "StringToHashBucketFast"; +var Sub = "Sub"; +var Tan = "Tan"; +var Tanh = "Tanh"; +var Tile = "Tile"; +var TopK = "TopK"; +var Transform = "Transform"; +var Transpose = "Transpose"; +var Unique = "Unique"; +var Unpack = "Unpack"; +var UnsortedSegmentSum = "UnsortedSegmentSum"; +var ZerosLike = "ZerosLike"; +var Step = "Step"; +var FromPixels = "FromPixels"; +var RotateWithOffset = "RotateWithOffset"; +var _FusedMatMul = "_FusedMatMul"; +var FusedConv2D = "FusedConv2D"; +var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; +var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); +var gradRegistry = getGlobal("gradRegistry", () => new Map()); +function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); +} +function getGradient(kernelName) { + return gradRegistry.get(kernelName); +} +function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const { done, value } = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; +} +function registerKernel(config3) { + const { kernelName, backendName } = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); +} +function registerGradient(config3) { + const { kernelName } = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); +} +function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); +} +function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); +} +function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName }); + registerKernel(newKernelConfig); + }); +} +function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; +} +var util_exports = {}; +__export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch3, + fingerPrint64: () => fingerPrint64, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + hexToLong: () => hexToLong, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + swap: () => swap, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray +}); +var LongExports = __toModule(require_long()); +var Long = LongExports.default || LongExports; +function hexToLong(hex) { + return Long.fromString(hex, true, 16); +} +var k0 = hexToLong("c3a5c85c97cb3127"); +var k1 = hexToLong("b492b66fbe98f273"); +var k2 = hexToLong("9ae16a3b2f90404f"); +function shiftMix(val) { + return val.xor(val.shru(47)); +} +function fetch2(s, offset, numBytes) { + const bytes = s.slice(offset, offset + numBytes); + return Long.fromBytes(Array.from(bytes), true, true); +} +function fetch64(s, offset) { + return fetch2(s, offset, 8); +} +function fetch32(s, offset) { + return fetch2(s, offset, 4); +} +function rotate64(val, shift) { + return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift)); +} +function hashLen16(u, v, mul2 = hexToLong("9ddfea08eb382d69")) { + let a = u.xor(v).mul(mul2); + a = a.xor(a.shru(47)); + let b = v.xor(a).mul(mul2); + b = b.xor(b.shru(47)); + b = b.mul(mul2); + return b; +} +function weakHashLen32WithSeeds(w, x, y, z, a, b) { + a = a.add(w); + b = rotate64(b.add(a).add(z), 21); + const c = a; + a = a.add(x); + a = a.add(y); + b = b.add(rotate64(a, 44)); + return [a.add(z), b.add(c)]; +} +function weakHashLen32WithSeedsStr(s, offset, a, b) { + return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b); +} +function hashLen0to16(s, len = s.length) { + if (len >= 8) { + const mul2 = k2.add(len * 2); + const a = fetch64(s, 0).add(k2); + const b = fetch64(s, len - 8); + const c = rotate64(b, 37).mul(mul2).add(a); + const d = rotate64(a, 25).add(b).mul(mul2); + return hashLen16(c, d, mul2); + } + if (len >= 4) { + const mul2 = k2.add(len * 2); + const a = fetch32(s, 0); + return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul2); + } + if (len > 0) { + const a = s[0]; + const b = s[len >> 1]; + const c = s[len - 1]; + const y = a + (b << 8); + const z = len + (c << 2); + return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2); + } + return k2; +} +function hashLen17to32(s, len = s.length) { + const mul2 = k2.add(len * 2); + const a = fetch64(s, 0).mul(k1); + const b = fetch64(s, 8); + const c = fetch64(s, len - 8).mul(mul2); + const d = fetch64(s, len - 16).mul(k2); + return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul2); +} +function hashLen33to64(s, len = s.length) { + const mul2 = k2.add(len * 2); + const a = fetch64(s, 0).mul(k2); + const b = fetch64(s, 8); + const c = fetch64(s, len - 8).mul(mul2); + const d = fetch64(s, len - 16).mul(k2); + const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d); + const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul2); + const e = fetch64(s, 16).mul(mul2); + const f = fetch64(s, 24); + const g = y.add(fetch64(s, len - 32)).mul(mul2); + const h = z.add(fetch64(s, len - 24)).mul(mul2); + return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul2); +} +function fingerPrint64(s, len = s.length) { + const seed = Long.fromNumber(81, true); + if (len <= 32) { + if (len <= 16) { + return hashLen0to16(s, len); + } else { + return hashLen17to32(s, len); + } + } else if (len <= 64) { + return hashLen33to64(s, len); + } + let x = seed; + let y = seed.mul(k1).add(113); + let z = shiftMix(y.mul(k2).add(113)).mul(k2); + let v = [Long.UZERO, Long.UZERO]; + let w = [Long.UZERO, Long.UZERO]; + x = x.mul(k2).add(fetch64(s, 0)); + let offset = 0; + const end = (len - 1 >> 6) * 64; + const last64 = end + (len - 1 & 63) - 63; + do { + x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1); + y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1); + x = x.xor(w[1]); + y = y.add(v[0]).add(fetch64(s, offset + 40)); + z = rotate64(z.add(w[0]), 33).mul(k1); + v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0])); + w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16))); + [z, x] = [x, z]; + offset += 64; + } while (offset !== end); + const mul2 = k1.add(z.and(255).shl(1)); + offset = last64; + w[0] = w[0].add(len - 1 & 63); + v[0] = v[0].add(w[0]); + w[0] = w[0].add(v[0]); + x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul2); + y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul2); + x = x.xor(w[1].mul(9)); + y = y.add(v[0].mul(9).add(fetch64(s, offset + 40))); + z = rotate64(z.add(w[0]), 33).mul(mul2); + v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul2), x.add(w[0])); + w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16))); + [z, x] = [x, z]; + return hashLen16(hashLen16(v[0], w[0], mul2).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul2).add(x), mul2); +} +function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); +} +function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; +} +function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function now2() { + return env().platform.now(); +} +function fetch3(path, requestInits) { + return env().platform.fetch(path, requestInits); +} +function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); +} +function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); +} +var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({ kernelMs: now2() - start }); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } +}; +function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; +} +var Logger = class { + logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name2 in inputs) { + const input2 = inputs[name2]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } +}; +function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; +} +function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } +} +var FORMAT_LIMIT_NUM_VALS = 20; +var FORMAT_NUM_FIRST_LAST_VALS = 3; +var FORMAT_NUM_SIG_DIGITS = 7; +function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); +} +function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; +} +function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); +} +function boolNumToString(v) { + return v === 0 ? "false" : "true"; +} +function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; +} +function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; +} +var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "complex64") { + throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); + } + this.values = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } +}; +var trackerFn = null; +var opHandler = null; +var deprecationWarningFn = null; +function setTensorTracker(fn) { + trackerFn = fn; +} +function setOpHandler(handler) { + opHandler = handler; +} +function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; +} +var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals, this.dtype === "complex64"); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync(), this.dtype === "complex64"); + } + async data() { + this.throwIfDisposed(); + const data = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data; + } + dataSync() { + this.throwIfDisposed(); + const data = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data; + } + async bytes() { + this.throwIfDisposed(); + const data = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data; + } else { + return new Uint8Array(data.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name, dtype); + } +}; +Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance) => { + return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; + } +}); +function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); +} +getGlobalTensorClass(); +var Variable = class extends Tensor { + constructor(initialValue, trainable, name, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } +}; +Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance) => { + return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; + } +}); +var tensor_util_exports = {}; +__export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch +}); +var Rank; +(function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; +})(Rank || (Rank = {})); +var UpcastInt32AndMap; +(function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; +})(UpcastInt32AndMap || (UpcastInt32AndMap = {})); +var UpcastBoolAndMap; +(function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; +})(UpcastBoolAndMap || (UpcastBoolAndMap = {})); +var UpcastFloat32AndMap; +(function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; +})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); +var UpcastComplex64AndMap; +(function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; +})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); +var upcastTypeMap = { + "float32": UpcastFloat32AndMap, + "int32": UpcastInt32AndMap, + "bool": UpcastBoolAndMap, + "complex64": UpcastComplex64AndMap +}; +function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; +} +function sumOutType(type) { + return upcastType(type, "int32"); +} +function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; +} +function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); +} +function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); +} +function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; +} +function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } +} +function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; +} +function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; +} +var EngineState = class { + constructor() { + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + this.gradientDepth = 0; + this.kernelDepth = 0; + this.scopeStack = []; + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } +}; +var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const { name, asyncInit } = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const { asyncInit } = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = { factory, priority }; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const { success, asyncInit } = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + warn(`Initialization of backend ${backendName} failed`); + warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return { success, asyncInit: true }; + } else { + this.registry[backendName] = backend22; + return { success: true, asyncInit: false }; + } + } catch (err) { + warn(`Initialization of backend ${backendName} failed`); + warn(err.stack || err.message); + return { success: false, asyncInit: false }; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const { success, asyncInit } = this.initializeBackend(backendName); + if (asyncInit || success) { + return { name: backendName, asyncInit }; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, { x }); + const inputs = { x }; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = { x: dy }; + const attrs = { dtype }; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + if (this.backendName == null) { + this.backend; + } + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({ kernelName, inputs, attrs }); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const { kernelName, inputs: inputs2, attrs: attrs2 } = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({ inputs: inputs2, attrs: attrs2, backend: this.backend }); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const { dataId, shape, dtype } = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const { forwardFunc } = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const { inputs, attrs } = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved }; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); + } + return this.tidy("backward", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return { value: y, grads: grads2 }; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } +}; +Engine.nextTensorId = 0; +Engine.nextVariableId = 0; +function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); +} +function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; +} +var ENGINE = getOrMakeEngine(); +function add(a, b) { + const inputs = { a, b }; + return ENGINE.runKernel(Add, inputs); +} +var device_util_exports = {}; +__export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile +}); +function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; +} +function isMobile(nav) { + if (nav || _isNavigatorDefined()) { + if (!nav) { + nav = navigator; + } + if (nav.product === "ReactNative") { + return true; + } + const a = nav.userAgent || nav.vendor || (typeof window !== "undefined" ? window.opera : ""); + if (!a) { + const navAny = nav; + return navAny.userAgentData && navAny.userAgentData.mobile; + } + return /(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(a) || /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(a.substr(0, 4)); + } + return false; +} +function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; +} +var ENV2 = env(); +ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); + } +}); +ENV2.registerFlag("IS_BROWSER", () => isBrowser()); +ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); +ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +ENV2.registerFlag("PROD", () => false); +ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); +ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +ENV2.registerFlag("IS_TEST", () => false); +ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; +} +function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } +} +function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } +} +function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); +} +function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); +} +var OP_SCOPE_SUFFIX = "__op"; +function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", { value: opName, configurable: true }); + return f2; +} +function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = { real: $real, imag: $imag }; + return ENGINE.runKernel(Complex, inputs); +} +var complex = op({ complex_ }); +function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { + throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); + } + if (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); +} +function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); +} +var DTYPE_VALUE_SIZE_MAP = { + "float32": 4, + "float16": 2, + "int32": 4, + "uint16": 2, + "uint8": 1, + "bool": 1, + "complex64": 8 +}; +var NUM_BYTES_STRING_LENGTH = 4; +async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = { name, shape: t.shape, dtype: t.dtype }; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return { data: concatenateTypedArrays(tensorValues), specs }; +} +function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image32 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image32[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image32, shape, "float32"); + out[name] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name] = tensor(values, shape, dtype); + } + } + return out; +} +function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; +} +var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); +function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; +} +function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); +} +function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; +} +function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; +} +function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; +} +function getModelJSONForModelArtifacts(artifacts, manifest) { + const result = { + modelTopology: artifacts.modelTopology, + format: artifacts.format, + generatedBy: artifacts.generatedBy, + convertedBy: artifacts.convertedBy, + weightsManifest: manifest + }; + if (artifacts.signature != null) { + result.signature = artifacts.signature; + } + if (artifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = artifacts.userDefinedMetadata; + } + if (artifacts.modelInitializer != null) { + result.modelInitializer = artifacts.modelInitializer; + } + if (artifacts.trainingConfig != null) { + result.trainingConfig = artifacts.trainingConfig; + } + return result; +} +async function getModelArtifactsForJSON(modelJSON, loadWeights2) { + const modelArtifacts = { + modelTopology: modelJSON.modelTopology, + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.trainingConfig != null) { + modelArtifacts.trainingConfig = modelJSON.trainingConfig; + } + if (modelJSON.weightsManifest != null) { + const [weightSpecs, weightData] = await loadWeights2(modelJSON.weightsManifest); + modelArtifacts.weightSpecs = weightSpecs; + modelArtifacts.weightData = weightData; + } + if (modelJSON.signature != null) { + modelArtifacts.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + modelArtifacts.modelInitializer = modelJSON.modelInitializer; + } + return modelArtifacts; +} +function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; +} +function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; +} +function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; +} +function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; +} +function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; +} +var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } +}; +var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); +var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); +var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); +var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); +var DATABASE_NAME = "tensorflowjs"; +var DATABASE_VERSION = 1; +var MODEL_STORE_NAME = "models_store"; +var INFO_STORE_NAME = "model_info_store"; +function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; +} +function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, { keyPath: "modelPath" }); + db.createObjectStore(INFO_STORE_NAME, { keyPath: "modelPath" }); +} +var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo }); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo }); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +BrowserIndexedDB.URL_SCHEME = "indexeddb://"; +var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(indexedDBRouter); +IORouterRegistry.registerLoadRouter(indexedDBRouter); +function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; +} +var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +var PATH_SEPARATOR = "/"; +var PATH_PREFIX = "tensorflowjs_models"; +var INFO_SUFFIX = "info"; +var MODEL_TOPOLOGY_SUFFIX = "model_topology"; +var WEIGHT_SPECS_SUFFIX = "weight_specs"; +var WEIGHT_DATA_SUFFIX = "weight_data"; +var MODEL_METADATA_SUFFIX = "model_metadata"; +function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; +} +function removeItems(keys) { + for (const key of Object.values(keys)) { + window.localStorage.removeItem(key); + } +} +function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); +} +function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; +} +var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const metadata = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + signature: modelArtifacts.signature != null ? modelArtifacts.signature : void 0, + userDefinedMetadata: modelArtifacts.userDefinedMetadata != null ? modelArtifacts.userDefinedMetadata : void 0, + modelInitializer: modelArtifacts.modelInitializer != null ? modelArtifacts.modelInitializer : void 0, + trainingConfig: modelArtifacts.trainingConfig != null ? modelArtifacts.trainingConfig : void 0 + }; + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(metadata)); + return { modelArtifactsInfo }; + } catch (err) { + removeItems(this.keys); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata.format; + out.generatedBy = metadata.generatedBy; + out.convertedBy = metadata.convertedBy; + if (metadata.signature != null) { + out.signature = metadata.signature; + } + if (metadata.userDefinedMetadata != null) { + out.userDefinedMetadata = metadata.userDefinedMetadata; + } + if (metadata.modelInitializer != null) { + out.modelInitializer = metadata.modelInitializer; + } + if (metadata.trainingConfig != null) { + out.trainingConfig = metadata.trainingConfig; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } +}; +BrowserLocalStorage.URL_SCHEME = "localstorage://"; +var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(localStorageRouter); +IORouterRegistry.registerLoadRouter(localStorageRouter); +function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); +} +var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + removeItems(keys); + return info2; + } +}; +var URL_SCHEME_SUFFIX = "://"; +var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } +}; +function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; +} +async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; +} +async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; +} +async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); +} +async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } +} +var getNodeFetch = { + importFetch: () => require_browser() +}; +var systemFetch; +var PlatformNode = class { + constructor() { + this.util = __require2("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); +} +function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); +} +function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = { x: $x }; + const attrs = { dtype }; + return ENGINE.runKernel(Cast, inputs, attrs); +} +var cast = op({ cast_ }); +function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = { x: $x }; + return ENGINE.runKernel(Identity, inputs); +} +var clone = op({ clone_ }); +function print2(x, verbose = false) { + console.log(x.toString(verbose)); +} +getOrMakeEngine(); +var opHandler2 = { + buffer, + cast, + clone, + print: print2 +}; +setOpHandler(opHandler2); +var io_exports = {}; +__export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsForJSON: () => getModelArtifactsForJSON, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler +}); +var DEFAULT_FILE_NAME_PREFIX = "model"; +var DEFAULT_JSON_EXTENSION_NAME = ".json"; +var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; +function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); +} +var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelJsonFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: "application/octet-stream" })); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelJSON = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest); + const modelJsonURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelJSON)], { type: "application/json" })); + const jsonAnchor = this.modelJsonAnchor == null ? document.createElement("a") : this.modelJsonAnchor; + jsonAnchor.download = this.modelJsonFileName; + jsonAnchor.href = modelJsonURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) }; + } + } +}; +BrowserDownloads.URL_SCHEME = "downloads://"; +var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.jsonFile = files[0]; + this.weightsFiles = files.slice(1); + } + async load() { + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`)); + return; + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`)); + return; + } + if (this.weightsFiles.length === 0) { + resolve({ modelTopology }); + return; + } + const modelArtifactsPromise = getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2)); + resolve(modelArtifactsPromise); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(this.jsonFile); + }); + } + loadWeights(weightsManifest) { + const weightSpecs = []; + const paths = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + paths.push(...entry.paths); + } + const pathToFile = this.checkManifestAndWeightFiles(weightsManifest); + const promises = paths.map((path) => this.loadWeightsFile(path, pathToFile[path])); + return Promise.all(promises).then((buffers) => [weightSpecs, concatenateArrayBuffers(buffers)]); + } + loadWeightsFile(path, file) { + return new Promise((resolve, reject) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event) => { + const weightData = event.target.result; + resolve(weightData); + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(file); + }); + } + checkManifestAndWeightFiles(manifest) { + const basenames = []; + const fileNames = this.weightsFiles.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = this.weightsFiles[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== this.weightsFiles.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${this.weightsFiles.length}).`); + } + return pathToFile; + } +}; +var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(browserDownloadsRouter); +function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); +} +function browserFiles(files) { + return new BrowserFiles(files); +} +function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); +} +async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true })); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; +} +async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit }); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); +} +function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; +} +var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; +var JSON_TYPE = "application/json"; +var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); + this.fetch = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest); + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelJSON; + try { + modelJSON = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelJSON.modelTopology; + const weightsManifest = modelJSON.weightsManifest; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + return getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2)); + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } +}; +HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; +function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; +} +function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; +} +var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; +}; +IORouterRegistry.registerSaveRouter(httpRouter); +IORouterRegistry.registerLoadRouter(httpRouter); +function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); +} +function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); +} +var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } +}; +var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } +}; +function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ modelTopology: modelArtifacts }); + } + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } +} +function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); +} +var math_exports = {}; +__export2(math_exports, { + confusionMatrix: () => confusionMatrix +}); +function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = { a: $a, b: $b }; + const attrs = { transposeA, transposeB }; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); +} +var matMul = op({ matMul_ }); +function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = { indices: $indices }; + const attrs = { depth, onValue, offValue }; + return ENGINE.runKernel(OneHot, inputs, attrs); +} +var oneHot = op({ oneHot_ }); +function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = { x: $x }; + const attrs = { perm }; + return ENGINE.runKernel(Transpose, inputs, attrs); +} +var transpose = op({ transpose_ }); +function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); +} +var confusionMatrix = op({ confusionMatrix_ }); +var browser_exports = {}; +__export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels +}); +function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); +} +var fromPixels2DContext; +function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } else { + throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the